sensitivity.hh revision 13208:6703cb024823
12623SN/A/*
22623SN/A * Copyright 2018 Google, Inc.
32623SN/A *
42623SN/A * Redistribution and use in source and binary forms, with or without
52623SN/A * modification, are permitted provided that the following conditions are
62623SN/A * met: redistributions of source code must retain the above copyright
72623SN/A * notice, this list of conditions and the following disclaimer;
82623SN/A * redistributions in binary form must reproduce the above copyright
92623SN/A * notice, this list of conditions and the following disclaimer in the
102623SN/A * documentation and/or other materials provided with the distribution;
112623SN/A * neither the name of the copyright holders nor the names of its
122623SN/A * contributors may be used to endorse or promote products derived from
132623SN/A * this software without specific prior written permission.
142623SN/A *
152623SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
162623SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
172623SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
182623SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
192623SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
202623SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
212623SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
222623SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
232623SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
242623SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
252623SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
262623SN/A *
272665Ssaidi@eecs.umich.edu * Authors: Gabe Black
282665Ssaidi@eecs.umich.edu */
292623SN/A
302623SN/A#ifndef __SYSTEMC_CORE_SENSITIVITY_HH__
312623SN/A#define __SYSTEMC_CORE_SENSITIVITY_HH__
322623SN/A
332623SN/A#include <set>
342623SN/A#include <vector>
352623SN/A
362901Ssaidi@eecs.umich.edu#include "sim/eventq.hh"
372623SN/A#include "systemc/core/sched_event.hh"
382623SN/A#include "systemc/ext/core/sc_module.hh"
392623SN/A
402623SN/Anamespace sc_core
412623SN/A{
422623SN/A
432623SN/Aclass sc_event;
442623SN/Aclass sc_event_and_list;
452623SN/Aclass sc_event_or_list;
462623SN/Aclass sc_event_finder;
472623SN/Aclass sc_export_base;
482623SN/Aclass sc_interface;
492623SN/Aclass sc_port_base;
502623SN/A
512623SN/A} // namespace sc_core
522623SN/A
532623SN/Anamespace sc_gem5
542623SN/A{
552623SN/A
562623SN/Aclass Process;
572623SN/Aclass Event;
582623SN/A
592856Srdreslin@umich.edu/*
602856Srdreslin@umich.edu * Common sensitivity interface.
612856Srdreslin@umich.edu */
622856Srdreslin@umich.edu
632856Srdreslin@umich.educlass Sensitivity
642856Srdreslin@umich.edu{
652856Srdreslin@umich.edu  protected:
662856Srdreslin@umich.edu    Process *process;
672856Srdreslin@umich.edu
682856Srdreslin@umich.edu    Sensitivity(Process *p) : process(p) {}
692623SN/A    virtual ~Sensitivity() {}
702623SN/A
712623SN/A    virtual void addToEvent(const ::sc_core::sc_event *e) = 0;
722623SN/A    virtual void delFromEvent(const ::sc_core::sc_event *e) = 0;
732623SN/A
742856Srdreslin@umich.edu    virtual bool
752856Srdreslin@umich.edu    notifyWork(Event *e)
762856Srdreslin@umich.edu    {
772623SN/A        satisfy();
782856Srdreslin@umich.edu        return true;
792856Srdreslin@umich.edu    }
802856Srdreslin@umich.edu
812623SN/A  public:
822623SN/A    virtual void clear() = 0;
832623SN/A
842680Sktlim@umich.edu    void satisfy();
852680Sktlim@umich.edu    bool notify(Event *e);
862623SN/A
872623SN/A    virtual bool dynamic() = 0;
882680Sktlim@umich.edu
892623SN/A    bool ofMethod();
902623SN/A};
912623SN/A
922623SN/A
932623SN/A/*
942630SN/A * Dynamic vs. static sensitivity.
952623SN/A */
962623SN/A
972623SN/Aclass DynamicSensitivity : virtual public Sensitivity
982623SN/A{
992623SN/A  protected:
1002623SN/A    DynamicSensitivity(Process *p) : Sensitivity(p) {}
1012630SN/A
1022623SN/A    void addToEvent(const ::sc_core::sc_event *e) override;
1032623SN/A    void delFromEvent(const ::sc_core::sc_event *e) override;
1042623SN/A
1052623SN/A  public:
1062623SN/A    bool dynamic() override { return true; }
1072623SN/A};
1082630SN/A
1092623SN/Atypedef std::vector<DynamicSensitivity *> DynamicSensitivities;
1102623SN/A
1112623SN/A
1122623SN/Aclass StaticSensitivity : virtual public Sensitivity
1132623SN/A{
1142623SN/A  protected:
1152623SN/A    StaticSensitivity(Process *p) : Sensitivity(p) {}
1162626SN/A
1172626SN/A    void addToEvent(const ::sc_core::sc_event *e) override;
1182626SN/A    void delFromEvent(const ::sc_core::sc_event *e) override;
1192623SN/A
1202623SN/A  public:
1212623SN/A    bool dynamic() override { return false; }
1222657Ssaidi@eecs.umich.edu};
1232623SN/A
1242623SN/Atypedef std::vector<StaticSensitivity *> StaticSensitivities;
1252623SN/A
1262623SN/A
1272623SN/A/*
1282623SN/A * Sensitivity to an event or events, which can be static or dynamic.
1292623SN/A */
1302623SN/A
1312623SN/Aclass SensitivityEvent : virtual public Sensitivity
1322640Sstever@eecs.umich.edu{
1332623SN/A  protected:
1342623SN/A    const ::sc_core::sc_event *event;
1352623SN/A
1362663Sstever@eecs.umich.edu    SensitivityEvent(Process *p, const ::sc_core::sc_event *e=nullptr) :
1372663Sstever@eecs.umich.edu        Sensitivity(p), event(e)
1382827Srdreslin@umich.edu    {}
1392641Sstever@eecs.umich.edu
1402623SN/A  public:
1412623SN/A    void clear() override { delFromEvent(event); }
1422663Sstever@eecs.umich.edu};
1432827Srdreslin@umich.edu
1442641Sstever@eecs.umich.educlass SensitivityEvents : virtual public Sensitivity
1452641Sstever@eecs.umich.edu{
1462623SN/A  protected:
1472623SN/A    std::set<const ::sc_core::sc_event *> events;
1482663Sstever@eecs.umich.edu
1492827Srdreslin@umich.edu    SensitivityEvents(Process *p) : Sensitivity(p) {}
1502641Sstever@eecs.umich.edu    SensitivityEvents(
1512641Sstever@eecs.umich.edu            Process *p, const std::set<const ::sc_core::sc_event *> &s) :
1522623SN/A        Sensitivity(p), events(s)
1532623SN/A    {}
1542623SN/A
1552623SN/A  public:
1562623SN/A    void
1572623SN/A    clear() override
1582623SN/A    {
1592623SN/A        for (auto event: events)
1602623SN/A            delFromEvent(event);
1612623SN/A    }
1622915Sktlim@umich.edu
1632915Sktlim@umich.edu    void
1643145Shsul@eecs.umich.edu    addEvent(const ::sc_core::sc_event *event)
1652623SN/A    {
1662623SN/A        events.insert(event);
1672623SN/A        addToEvent(event);
1682623SN/A    }
1692623SN/A};
1702623SN/A
1712623SN/A
1722915Sktlim@umich.edu/*
1732915Sktlim@umich.edu * Static sensitivities.
1743145Shsul@eecs.umich.edu */
1752915Sktlim@umich.edu
1762915Sktlim@umich.eduvoid newStaticSensitivityEvent(Process *p, const sc_core::sc_event *e);
1772915Sktlim@umich.eduvoid newStaticSensitivityInterface(Process *p, const sc_core::sc_interface *i);
1782915Sktlim@umich.eduvoid newStaticSensitivityPort(Process *p, const sc_core::sc_port_base *pb);
1792915Sktlim@umich.eduvoid newStaticSensitivityExport(
1802915Sktlim@umich.edu        Process *p, const sc_core::sc_export_base *exp);
1812926Sktlim@umich.eduvoid newStaticSensitivityFinder(
1822926Sktlim@umich.edu        Process *p, const sc_core::sc_event_finder *f);
1832915Sktlim@umich.edu
1842915Sktlim@umich.edu
1852915Sktlim@umich.educlass StaticSensitivityEvent :
1862915Sktlim@umich.edu    public StaticSensitivity, public SensitivityEvent
1872623SN/A{
1882623SN/A    friend void newStaticSensitivityEvent(
1892623SN/A            Process *p, const sc_core::sc_event *e);
1902798Sktlim@umich.edu
1912623SN/A  protected:
1922798Sktlim@umich.edu    StaticSensitivityEvent(Process *p, const sc_core::sc_event *e) :
1932798Sktlim@umich.edu        Sensitivity(p), StaticSensitivity(p), SensitivityEvent(p, e)
1942623SN/A    {}
1952798Sktlim@umich.edu};
1962623SN/A
1972623SN/Aclass StaticSensitivityInterface :
1982623SN/A    public StaticSensitivity, public SensitivityEvent
1992623SN/A{
2002623SN/A    friend void newStaticSensitivityInterface(
2012623SN/A            Process *p, const sc_core::sc_interface *i);
2022623SN/A  protected:
2032623SN/A    StaticSensitivityInterface(Process *p, const sc_core::sc_interface *i);
2042623SN/A};
2052623SN/A
2062680Sktlim@umich.educlass StaticSensitivityPort :
2072623SN/A    public StaticSensitivity, public SensitivityEvents
2082680Sktlim@umich.edu{
2092680Sktlim@umich.edu    friend void newStaticSensitivityPort(
2102680Sktlim@umich.edu            Process *p, const sc_core::sc_port_base *pb);
2112623SN/A
2122623SN/A  protected:
2132623SN/A    StaticSensitivityPort(Process *p) :
2142623SN/A        Sensitivity(p), StaticSensitivity(p), SensitivityEvents(p)
2152623SN/A    {}
2162623SN/A};
2172623SN/A
2182623SN/Aclass StaticSensitivityExport :
2192623SN/A    public StaticSensitivity, public SensitivityEvent
2202623SN/A{
2212623SN/A  private:
2222623SN/A    friend void newStaticSensitivityExport(
2232683Sktlim@umich.edu            Process *p, const sc_core::sc_export_base *exp);
2242623SN/A
2252623SN/A    StaticSensitivityExport(Process *p, const sc_core::sc_export_base *exp);
2262623SN/A};
2272623SN/A
2282623SN/A
2292623SN/Aclass StaticSensitivityFinder :
2302623SN/A    public StaticSensitivity, public SensitivityEvents
2312623SN/A{
2322623SN/A  private:
2332623SN/A    const sc_core::sc_event_finder *finder;
2342623SN/A
2352623SN/A    friend void newStaticSensitivityFinder(
2362623SN/A            Process *p, const sc_core::sc_event_finder *f);
2372623SN/A
2382683Sktlim@umich.edu    StaticSensitivityFinder(Process *p, const sc_core::sc_event_finder *f) :
2392623SN/A        Sensitivity(p), StaticSensitivity(p), SensitivityEvents(p), finder(f)
2402623SN/A    {}
2412626SN/A
2422626SN/A  public:
2432626SN/A    const ::sc_core::sc_event &find(::sc_core::sc_interface *i);
2442626SN/A};
2452626SN/A
2462623SN/A
2472623SN/A/*
2482623SN/A * Dynamic sensitivities.
2492623SN/A */
2502623SN/A
2512623SN/Avoid newDynamicSensitivityEvent(Process *p, const sc_core::sc_event *e);
2522623SN/Avoid newDynamicSensitivityEventOrList(
2532623SN/A        Process *p, const sc_core::sc_event_or_list *eol);
2542623SN/Avoid newDynamicSensitivityEventAndList(
2552623SN/A        Process *p, const sc_core::sc_event_and_list *eal);
2562683Sktlim@umich.edu
2572623SN/Aclass DynamicSensitivityEvent :
2582623SN/A    public DynamicSensitivity, public SensitivityEvent
2592623SN/A{
2602623SN/A  private:
2612623SN/A    friend void newDynamicSensitivityEvent(
2622623SN/A            Process *p, const sc_core::sc_event *e);
2632683Sktlim@umich.edu
2642623SN/A    DynamicSensitivityEvent(Process *p, const sc_core::sc_event *e) :
2652623SN/A        Sensitivity(p), DynamicSensitivity(p), SensitivityEvent(p, e)
2662623SN/A    {}
2672641Sstever@eecs.umich.edu};
2682623SN/A
2692662Sstever@eecs.umich.educlass DynamicSensitivityEventOrList :
2702623SN/A    public DynamicSensitivity, public SensitivityEvents
2712623SN/A{
2722641Sstever@eecs.umich.edu  private:
2732623SN/A    friend void newDynamicSensitivityEventOrList(
2742623SN/A            Process *p, const sc_core::sc_event_or_list *eol);
2752623SN/A
2762623SN/A    DynamicSensitivityEventOrList(
2772623SN/A            Process *p, const sc_core::sc_event_or_list *eol);
2782623SN/A
2792623SN/A    bool notifyWork(Event *e) override;
2802623SN/A};
2812623SN/A
2822623SN/A//XXX This sensitivity can't be reused. To reset it, it has to be deleted and
2832623SN/A//recreated. That works for dynamic sensitivities, but not for static.
2842623SN/A//Fortunately processes can't be statically sensitive to sc_event_and_lists.
2852623SN/Aclass DynamicSensitivityEventAndList :
2862623SN/A    public DynamicSensitivity, public SensitivityEvents
2872623SN/A{
2882623SN/A  private:
2892623SN/A    friend void newDynamicSensitivityEventAndList(
2902623SN/A            Process *p, const sc_core::sc_event_and_list *eal);
2912623SN/A
2922623SN/A    DynamicSensitivityEventAndList(
2932623SN/A            Process *p, const sc_core::sc_event_and_list *eal);
2942623SN/A
2952623SN/A    bool notifyWork(Event *e) override;
2962623SN/A};
2972623SN/A
2982623SN/A} // namespace sc_gem5
2992623SN/A
3002623SN/A#endif  //__SYSTEMC_CORE_SENSITIVITY_HH__
3012623SN/A