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