/* * Copyright 2018 Google, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer; * redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution; * neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Authors: Gabe Black */ #include "base/logging.hh" #include "systemc/core/event.hh" #include "systemc/ext/core/sc_event.hh" namespace sc_core { /* * sc_event_finder */ void sc_event_finder::warn_unimpl(const char *func) const { warn("%s not implemented.\n", __PRETTY_FUNCTION__); } /* * sc_event_and_list */ sc_event_and_list::sc_event_and_list() : autoDelete(false), busy(0) {} sc_event_and_list::sc_event_and_list(const sc_event_and_list &eal) : events(eal.events), autoDelete(false), busy(0) {} sc_event_and_list::sc_event_and_list(const sc_event &e) : sc_event_and_list() { insert(e); } sc_event_and_list::sc_event_and_list(bool auto_delete) : autoDelete(auto_delete), busy(0) {} sc_event_and_list::~sc_event_and_list() {} sc_event_and_list & sc_event_and_list::operator = (const sc_event_and_list &eal) { events = eal.events; return *this; } int sc_event_and_list::size() const { return events.size(); } void sc_event_and_list::swap(sc_event_and_list &eal) { events.swap(eal.events); } sc_event_and_list & sc_event_and_list::operator &= (const sc_event &e) { insert(e); return *this; } sc_event_and_list & sc_event_and_list::operator &= (const sc_event_and_list &eal) { insert(eal); return *this; } sc_event_and_expr sc_event_and_list::operator & (const sc_event &e) const { sc_event_and_expr expr; expr.insert(*this); expr.insert(e); return expr; } sc_event_and_expr sc_event_and_list::operator & (const sc_event_and_list &eal) { sc_event_and_expr expr; expr.insert(*this); expr.insert(eal); return expr; } void sc_event_and_list::insert(sc_event const &e) { events.insert(&e); } void sc_event_and_list::insert(sc_event_and_list const &eal) { events.insert(eal.events.begin(), eal.events.end()); } /* * sc_event_or_list */ sc_event_or_list::sc_event_or_list() : autoDelete(false), busy(0) {} sc_event_or_list::sc_event_or_list(const sc_event_or_list &eol) : events(eol.events), autoDelete(false), busy(0) {} sc_event_or_list::sc_event_or_list(const sc_event &e) : sc_event_or_list() { insert(e); } sc_event_or_list::sc_event_or_list(bool auto_delete) : autoDelete(auto_delete), busy(0) {} sc_event_or_list & sc_event_or_list::operator = (const sc_event_or_list &eol) { events = eol.events; return *this; } sc_event_or_list::~sc_event_or_list() {} int sc_event_or_list::size() const { return events.size(); } void sc_event_or_list::swap(sc_event_or_list &eol) { events.swap(eol.events); } sc_event_or_list & sc_event_or_list::operator |= (const sc_event &e) { insert(e); return *this; } sc_event_or_list & sc_event_or_list::operator |= (const sc_event_or_list &eol) { insert(eol); return *this; } sc_event_or_expr sc_event_or_list::operator | (const sc_event &e) const { sc_event_or_expr expr; expr.insert(*this); expr.insert(e); return expr; } sc_event_or_expr sc_event_or_list::operator | (const sc_event_or_list &eol) const { sc_event_or_expr expr; expr.insert(*this); expr.insert(eol); return expr; } void sc_event_or_list::insert(sc_event const &e) { events.insert(&e); } void sc_event_or_list::insert(sc_event_or_list const &eol) { events.insert(eol.events.begin(), eol.events.end()); } /* * sc_event_and_expr */ // Move semantics sc_event_and_expr::sc_event_and_expr(sc_event_and_expr const &e) : list(e.list) { e.list = nullptr; } sc_event_and_expr::operator const sc_event_and_list &() const { sc_event_and_list *temp = list; list = nullptr; return *temp; } void sc_event_and_expr::insert(sc_event const &e) const { assert(list); list->insert(e); } void sc_event_and_expr::insert(sc_event_and_list const &eal) const { assert(list); list->insert(eal); } sc_event_and_expr::~sc_event_and_expr() { delete list; } sc_event_and_expr::sc_event_and_expr() : list(new sc_event_and_list(true)) {} sc_event_and_expr operator & (sc_event_and_expr expr, sc_event const &e) { expr.insert(e); return expr; } sc_event_and_expr operator & (sc_event_and_expr expr, sc_event_and_list const &eal) { expr.insert(eal); return expr; } /* * sc_event_or_expr */ // Move semantics sc_event_or_expr::sc_event_or_expr(sc_event_or_expr const &e) : list(e.list) { e.list = nullptr; } sc_event_or_expr::operator const sc_event_or_list &() const { sc_event_or_list *temp = list; list = NULL; return *temp; } void sc_event_or_expr::insert(sc_event const &e) const { assert(list); list->insert(e); } void sc_event_or_expr::insert(sc_event_or_list const &eol) const { assert(list); list->insert(eol); } sc_event_or_expr::~sc_event_or_expr() { delete list; } sc_event_or_expr::sc_event_or_expr() : list(new sc_event_or_list(true)) {} sc_event_or_expr operator | (sc_event_or_expr expr, sc_event const &e) { expr.insert(e); return expr; } sc_event_or_expr operator | (sc_event_or_expr expr, sc_event_or_list const &eol) { expr.insert(eol); return expr; } /* * sc_event */ sc_event::sc_event() : _gem5_event(new ::sc_gem5::Event(this)) {} sc_event::sc_event(const char *_name) : _gem5_event(new ::sc_gem5::Event(this, _name)) {} sc_event::~sc_event() { delete _gem5_event; } const char *sc_event::name() const { return _gem5_event->name().c_str(); } const char * sc_event::basename() const { return _gem5_event->basename().c_str(); } bool sc_event::in_hierarchy() const { return _gem5_event->inHierarchy(); } sc_object * sc_event::get_parent_object() const { return _gem5_event->getParentObject(); } void sc_event::notify() { _gem5_event->notify(); } void sc_event::notify(const sc_time &t) { _gem5_event->notify(t); } void sc_event::notify(double d, sc_time_unit u) { _gem5_event->notify(d, u); } void sc_event::cancel() { _gem5_event->cancel(); } bool sc_event::triggered() const { return _gem5_event->triggered(); } void sc_event::notify_delayed() { _gem5_event->notify(SC_ZERO_TIME); } void sc_event::notify_delayed(const sc_time &t) { _gem5_event->notify(t); } sc_event_and_expr sc_event::operator & (const sc_event &e) const { sc_event_and_expr expr; expr.insert(*this); expr.insert(e); return expr; } sc_event_and_expr sc_event::operator & (const sc_event_and_list &eal) const { sc_event_and_expr expr; expr.insert(*this); expr.insert(eal); return expr; } sc_event_or_expr sc_event::operator | (const sc_event &e) const { sc_event_or_expr expr; expr.insert(*this); expr.insert(e); return expr; } sc_event_or_expr sc_event::operator | (const sc_event_or_list &eol) const { sc_event_or_expr expr; expr.insert(*this); expr.insert(eol); return expr; } const std::vector & sc_get_top_level_events() { return ::sc_gem5::topLevelEvents; } sc_event * sc_find_event(const char *name) { std::string str(name); ::sc_gem5::EventsIt it = ::sc_gem5::findEvent(str); return it == ::sc_gem5::allEvents.end() ? nullptr : *it; } } // namespace sc_core