sc_event.hh revision 13303
16019Shines@cs.fsu.edu/* 213882Sgiacomo.travaglini@arm.com * Copyright 2018 Google, Inc. 37093Sgblack@eecs.umich.edu * 47093Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 57093Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 67093Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 77093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 87093Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 97093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 107093Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 117093Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 127093Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 137093Sgblack@eecs.umich.edu * this software without specific prior written permission. 146019Shines@cs.fsu.edu * 156019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 166019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 176019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 186019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 196019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 206019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 216019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 226019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 236019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 246019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 256019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 266019Shines@cs.fsu.edu * 276019Shines@cs.fsu.edu * Authors: Gabe Black 286019Shines@cs.fsu.edu */ 296019Shines@cs.fsu.edu 306019Shines@cs.fsu.edu#ifndef __SYSTEMC_EXT_CORE_SC_EVENT_HH__ 316019Shines@cs.fsu.edu#define __SYSTEMC_EXT_CORE_SC_EVENT_HH__ 326019Shines@cs.fsu.edu 336019Shines@cs.fsu.edu#include <cassert> 346019Shines@cs.fsu.edu#include <set> 356019Shines@cs.fsu.edu#include <sstream> 366019Shines@cs.fsu.edu#include <vector> 376019Shines@cs.fsu.edu 386019Shines@cs.fsu.edu#include "../utils/sc_report_handler.hh" 396019Shines@cs.fsu.edu#include "sc_port.hh" 407399SAli.Saidi@ARM.com#include "sc_time.hh" 417399SAli.Saidi@ARM.com 426019Shines@cs.fsu.edunamespace sc_gem5 436019Shines@cs.fsu.edu{ 446019Shines@cs.fsu.edu 4510873Sandreas.sandberg@arm.comclass Event; 4610873Sandreas.sandberg@arm.comclass DynamicSensitivityEventAndList; 4710474Sandreas.hansson@arm.comclass DynamicSensitivityEventOrList; 486019Shines@cs.fsu.educlass InternalScEvent; 496019Shines@cs.fsu.edu 506019Shines@cs.fsu.edu} 516116Snate@binkert.org 526019Shines@cs.fsu.edunamespace sc_core 5311793Sbrandon.potter@amd.com{ 5411793Sbrandon.potter@amd.com 558782Sgblack@eecs.umich.educlass sc_event; 568756Sgblack@eecs.umich.educlass sc_event_and_expr; 576019Shines@cs.fsu.educlass sc_event_or_expr; 5812005Sandreas.sandberg@arm.comclass sc_interface; 596019Shines@cs.fsu.educlass sc_object; 606019Shines@cs.fsu.educlass sc_port_base; 616019Shines@cs.fsu.edu 6210024Sdam.sunwoo@arm.comclass sc_event_and_list 636019Shines@cs.fsu.edu{ 648232Snate@binkert.org public: 658232Snate@binkert.org sc_event_and_list(); 668232Snate@binkert.org sc_event_and_list(const sc_event_and_list &); 676116Snate@binkert.org sc_event_and_list(const sc_event &); 6811608Snikos.nikoleris@arm.com sc_event_and_list &operator = (const sc_event_and_list &); 696116Snate@binkert.org ~sc_event_and_list(); 708756Sgblack@eecs.umich.edu 716019Shines@cs.fsu.edu int size() const; 726019Shines@cs.fsu.edu void swap(sc_event_and_list &); 736019Shines@cs.fsu.edu 746019Shines@cs.fsu.edu sc_event_and_list &operator &= (const sc_event &); 756019Shines@cs.fsu.edu sc_event_and_list &operator &= (const sc_event_and_list &); 7610037SARM gem5 Developers 7710037SARM gem5 Developers sc_event_and_expr operator & (const sc_event &) const; 7813374Sanouk.vanlaer@arm.com sc_event_and_expr operator & (const sc_event_and_list &); 7910418Sandreas.hansson@arm.com 8011395Sandreas.sandberg@arm.com private: 8110537Sandreas.hansson@arm.com friend class sc_event_and_expr; 8213453Srekai.gonzalezalberquilla@arm.com friend class sc_gem5::DynamicSensitivityEventAndList; 8311152Smitch.hayenga@arm.com 846019Shines@cs.fsu.edu explicit sc_event_and_list(bool auto_delete); 8512005Sandreas.sandberg@arm.com 8612005Sandreas.sandberg@arm.com void insert(sc_event const &e); 8710037SARM gem5 Developers void insert(sc_event_and_list const &eal); 887399SAli.Saidi@ARM.com 8910037SARM gem5 Developers std::set<const sc_event *> events; 9010037SARM gem5 Developers bool autoDelete; 9110037SARM gem5 Developers mutable unsigned busy; 9210037SARM gem5 Developers}; 9312005Sandreas.sandberg@arm.com 9412005Sandreas.sandberg@arm.comclass sc_event_or_list 9512005Sandreas.sandberg@arm.com{ 966019Shines@cs.fsu.edu public: 976019Shines@cs.fsu.edu sc_event_or_list(); 986019Shines@cs.fsu.edu sc_event_or_list(const sc_event_or_list &); 996019Shines@cs.fsu.edu sc_event_or_list(const sc_event &); 10010037SARM gem5 Developers sc_event_or_list& operator = (const sc_event_or_list &); 10110037SARM gem5 Developers ~sc_event_or_list(); 10210037SARM gem5 Developers 10310037SARM gem5 Developers int size() const; 10410037SARM gem5 Developers void swap(sc_event_or_list &); 10510037SARM gem5 Developers 10610037SARM gem5 Developers sc_event_or_list &operator |= (const sc_event &); 10710037SARM gem5 Developers sc_event_or_list &operator |= (const sc_event_or_list &); 10810037SARM gem5 Developers 10910037SARM gem5 Developers sc_event_or_expr operator | (const sc_event &) const; 11010037SARM gem5 Developers sc_event_or_expr operator | (const sc_event_or_list &) const; 11110717Sandreas.hansson@arm.com 11210037SARM gem5 Developers private: 11310037SARM gem5 Developers friend class sc_event_or_expr; 11410717Sandreas.hansson@arm.com friend class sc_gem5::DynamicSensitivityEventOrList; 1156019Shines@cs.fsu.edu 1166019Shines@cs.fsu.edu explicit sc_event_or_list(bool auto_delete); 1177694SAli.Saidi@ARM.com 1187694SAli.Saidi@ARM.com void insert(sc_event const &e); 1197694SAli.Saidi@ARM.com void insert(sc_event_or_list const &eol); 12010037SARM gem5 Developers 12110037SARM gem5 Developers std::set<const sc_event *> events; 12210037SARM gem5 Developers bool autoDelete; 12310037SARM gem5 Developers mutable unsigned busy; 12410037SARM gem5 Developers}; 12510037SARM gem5 Developers 12610037SARM gem5 Developersclass sc_event_and_expr 12710037SARM gem5 Developers{ 12810037SARM gem5 Developers public: 1297694SAli.Saidi@ARM.com sc_event_and_expr(sc_event_and_expr const &e); 1307694SAli.Saidi@ARM.com operator const sc_event_and_list &() const; 1317694SAli.Saidi@ARM.com 1327694SAli.Saidi@ARM.com void insert(sc_event const &e) const; 1337694SAli.Saidi@ARM.com void insert(sc_event_and_list const &eal) const; 1347694SAli.Saidi@ARM.com 1359738Sandreas@sandberg.pp.se ~sc_event_and_expr(); 13612749Sgiacomo.travaglini@arm.com 13712749Sgiacomo.travaglini@arm.com private: 1389738Sandreas@sandberg.pp.se friend class sc_event_and_list; 13912005Sandreas.sandberg@arm.com friend class sc_event; 14012005Sandreas.sandberg@arm.com 14112005Sandreas.sandberg@arm.com sc_event_and_expr(); 14212005Sandreas.sandberg@arm.com mutable sc_event_and_list *list; 14312005Sandreas.sandberg@arm.com}; 14412005Sandreas.sandberg@arm.com 14512005Sandreas.sandberg@arm.comsc_event_and_expr operator & (sc_event_and_expr, sc_event const &); 14612005Sandreas.sandberg@arm.comsc_event_and_expr operator & (sc_event_and_expr, sc_event_and_list const &); 14712005Sandreas.sandberg@arm.com 1489738Sandreas@sandberg.pp.seclass sc_event_or_expr 1499738Sandreas@sandberg.pp.se{ 1509738Sandreas@sandberg.pp.se public: 1517404SAli.Saidi@ARM.com sc_event_or_expr(sc_event_or_expr const &e); 15210037SARM gem5 Developers operator const sc_event_or_list &() const; 15310037SARM gem5 Developers 1546019Shines@cs.fsu.edu void insert(sc_event const &e) const; 1557404SAli.Saidi@ARM.com void insert(sc_event_or_list const &eol) const; 1567404SAli.Saidi@ARM.com 1577404SAli.Saidi@ARM.com ~sc_event_or_expr(); 15810037SARM gem5 Developers 1597404SAli.Saidi@ARM.com private: 1607404SAli.Saidi@ARM.com friend class sc_event_or_list; 16110037SARM gem5 Developers friend class sc_event; 16210037SARM gem5 Developers 16310037SARM gem5 Developers sc_event_or_expr(); 16410037SARM gem5 Developers mutable sc_event_or_list *list; 16510037SARM gem5 Developers}; 1669535Smrinmoy.ghosh@arm.com 1677697SAli.Saidi@ARM.comsc_event_or_expr operator | (sc_event_or_expr, sc_event const &); 16811321Ssteve.reinhardt@amd.comsc_event_or_expr operator | (sc_event_or_expr, sc_event_or_list const &); 16910037SARM gem5 Developers 1707697SAli.Saidi@ARM.comclass sc_event 1717697SAli.Saidi@ARM.com{ 1727697SAli.Saidi@ARM.com public: 1737697SAli.Saidi@ARM.com sc_event(); 1747697SAli.Saidi@ARM.com explicit sc_event(const char *); 1757404SAli.Saidi@ARM.com ~sc_event(); 1767404SAli.Saidi@ARM.com 17710037SARM gem5 Developers const char *name() const; 1787404SAli.Saidi@ARM.com const char *basename() const; 1797404SAli.Saidi@ARM.com bool in_hierarchy() const; 18010037SARM gem5 Developers sc_object *get_parent_object() const; 18110037SARM gem5 Developers 18210037SARM gem5 Developers void notify(); 18310037SARM gem5 Developers void notify(const sc_time &); 18410037SARM gem5 Developers void notify(double, sc_time_unit); 18510037SARM gem5 Developers void cancel(); 18610037SARM gem5 Developers 18710037SARM gem5 Developers // Nonstandard 18810367SAndrew.Bardsley@arm.com // Returns whether this event is currently triggered. 18910037SARM gem5 Developers bool triggered() const; 1907404SAli.Saidi@ARM.com 1916019Shines@cs.fsu.edu // Deprecated 1926019Shines@cs.fsu.edu void notify_delayed(); 1936019Shines@cs.fsu.edu void notify_delayed(const sc_time &); 1946019Shines@cs.fsu.edu 1957404SAli.Saidi@ARM.com sc_event_and_expr operator & (const sc_event &) const; 1966019Shines@cs.fsu.edu sc_event_and_expr operator & (const sc_event_and_list &) const; 1977404SAli.Saidi@ARM.com sc_event_or_expr operator | (const sc_event &) const; 19810037SARM gem5 Developers sc_event_or_expr operator | (const sc_event_or_list &) const; 19910037SARM gem5 Developers 20010037SARM gem5 Developers protected: 20110037SARM gem5 Developers explicit sc_event(bool); 20210037SARM gem5 Developers explicit sc_event(bool, const char *); 20310037SARM gem5 Developers 2047404SAli.Saidi@ARM.com private: 20510037SARM gem5 Developers // Disabled 20610037SARM gem5 Developers sc_event(const sc_event &) {} 20710037SARM gem5 Developers sc_event &operator = (const sc_event &) { return *this; } 2087697SAli.Saidi@ARM.com 20910037SARM gem5 Developers friend class ::sc_gem5::Event; 21010037SARM gem5 Developers ::sc_gem5::Event *_gem5_event; 21110037SARM gem5 Developers}; 21210037SARM gem5 Developers 2137404SAli.Saidi@ARM.comclass sc_event_finder 2147697SAli.Saidi@ARM.com{ 2157404SAli.Saidi@ARM.com protected: 21610037SARM gem5 Developers virtual ~sc_event_finder() {} 21710037SARM gem5 Developers 2187697SAli.Saidi@ARM.com public: 2197734SAli.Saidi@ARM.com // Should be "implementation defined" but used in the tests. 2207734SAli.Saidi@ARM.com virtual const sc_event &find_event(sc_interface *if_p=NULL) const = 0; 22110463SAndreas.Sandberg@ARM.com virtual const sc_port_base *port() const = 0; 2226019Shines@cs.fsu.edu}; 2236019Shines@cs.fsu.edu 2246019Shines@cs.fsu.edutemplate <class IF> 22510037SARM gem5 Developersclass sc_event_finder_t : public sc_event_finder 2267404SAli.Saidi@ARM.com{ 2277404SAli.Saidi@ARM.com public: 2287404SAli.Saidi@ARM.com sc_event_finder_t(const sc_port_base &p, 2297404SAli.Saidi@ARM.com const sc_event & (IF::*_method)() const) : 2307404SAli.Saidi@ARM.com _method(_method) 23110037SARM gem5 Developers { 23210037SARM gem5 Developers _port = dynamic_cast<const sc_port_b<IF> *>(&p); 23310037SARM gem5 Developers assert(_port); 23410037SARM gem5 Developers } 2357404SAli.Saidi@ARM.com 2367404SAli.Saidi@ARM.com virtual ~sc_event_finder_t() {} 2377404SAli.Saidi@ARM.com 2387404SAli.Saidi@ARM.com const sc_port_base *port() const { return _port; } 23910037SARM gem5 Developers 2406019Shines@cs.fsu.edu const sc_event & 24110037SARM gem5 Developers find_event(sc_interface *if_p=NULL) const override 24210037SARM gem5 Developers { 2437404SAli.Saidi@ARM.com static const sc_gem5::InternalScEvent none; 2447404SAli.Saidi@ARM.com const IF *iface = if_p ? dynamic_cast<const IF *>(if_p) : 2457404SAli.Saidi@ARM.com dynamic_cast<const IF *>(_port->get_interface()); 24610037SARM gem5 Developers if (!iface) { 24710037SARM gem5 Developers std::ostringstream ss; 24810037SARM gem5 Developers ss << "port is not bound: port '" << _port->name() << "' (" << 24910037SARM gem5 Developers _port->kind() << ")"; 25010037SARM gem5 Developers SC_REPORT_ERROR("(E118) find event failed", ss.str().c_str()); 25110037SARM gem5 Developers return none; 25210037SARM gem5 Developers } 25310037SARM gem5 Developers return (const_cast<IF *>(iface)->*_method)(); 25410037SARM gem5 Developers } 25510037SARM gem5 Developers 2567404SAli.Saidi@ARM.com private: 2577404SAli.Saidi@ARM.com const sc_port_b<IF> *_port; 25810037SARM gem5 Developers const sc_event &(IF::*_method)() const; 25910037SARM gem5 Developers}; 26010037SARM gem5 Developers 26110037SARM gem5 Developersconst std::vector<sc_event *> &sc_get_top_level_events(); 26210037SARM gem5 Developerssc_event *sc_find_event(const char *); 26310037SARM gem5 Developers 26410037SARM gem5 Developers} // namespace sc_core 26510037SARM gem5 Developers 26610037SARM gem5 Developersnamespace sc_gem5 26710037SARM gem5 Developers{ 26813882Sgiacomo.travaglini@arm.com 26910037SARM gem5 Developersclass InternalScEvent : public ::sc_core::sc_event 27013882Sgiacomo.travaglini@arm.com{ 27113882Sgiacomo.travaglini@arm.com public: 27210037SARM gem5 Developers InternalScEvent(); 27310037SARM gem5 Developers InternalScEvent(const char *); 27410037SARM gem5 Developers}; 27510037SARM gem5 Developers 27610037SARM gem5 Developers} // namespace sc_gem5 27710037SARM gem5 Developers 27810037SARM gem5 Developers#endif //__SYSTEMC_EXT_CORE_SC_INTERFACE_HH__ 27910037SARM gem5 Developers