event.cc revision 13303
16019Shines@cs.fsu.edu/* 27416SAli.Saidi@ARM.com * Copyright 2018 Google, Inc. 37416SAli.Saidi@ARM.com * 47416SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 57416SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 67416SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 77416SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer; 87416SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright 97416SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the 107416SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution; 117416SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its 127416SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from 137416SAli.Saidi@ARM.com * 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#include "systemc/core/event.hh" 316019Shines@cs.fsu.edu 326019Shines@cs.fsu.edu#include <algorithm> 336019Shines@cs.fsu.edu#include <cstring> 346019Shines@cs.fsu.edu#include <utility> 356019Shines@cs.fsu.edu 366019Shines@cs.fsu.edu#include "base/logging.hh" 376019Shines@cs.fsu.edu#include "sim/core.hh" 386019Shines@cs.fsu.edu#include "systemc/core/module.hh" 396019Shines@cs.fsu.edu#include "systemc/core/scheduler.hh" 406019Shines@cs.fsu.edu#include "systemc/ext/core/sc_main.hh" 417416SAli.Saidi@ARM.com#include "systemc/ext/core/sc_module.hh" 427416SAli.Saidi@ARM.com 436019Shines@cs.fsu.edunamespace sc_gem5 446019Shines@cs.fsu.edu{ 456019Shines@cs.fsu.edu 466019Shines@cs.fsu.eduEvent::Event(sc_core::sc_event *_sc_event, bool internal) : 476019Shines@cs.fsu.edu Event(_sc_event, nullptr, internal) 486019Shines@cs.fsu.edu{} 496019Shines@cs.fsu.edu 506019Shines@cs.fsu.eduEvent::Event(sc_core::sc_event *_sc_event, const char *_basename_cstr, 516019Shines@cs.fsu.edu bool internal) : 526019Shines@cs.fsu.edu _sc_event(_sc_event), _basename(_basename_cstr ? _basename_cstr : ""), 536019Shines@cs.fsu.edu _inHierarchy(!internal), delayedNotify([this]() { this->notify(); }), 546019Shines@cs.fsu.edu _triggeredStamp(~0ULL) 556019Shines@cs.fsu.edu{ 566019Shines@cs.fsu.edu if (_basename == "" && ::sc_core::sc_is_running()) 576019Shines@cs.fsu.edu _basename = ::sc_core::sc_gen_unique_name("event"); 586019Shines@cs.fsu.edu 596019Shines@cs.fsu.edu parent = internal ? nullptr : pickParentObj(); 606019Shines@cs.fsu.edu 616019Shines@cs.fsu.edu if (internal) { 627416SAli.Saidi@ARM.com _basename = globalNameGen.gen(_basename); 637416SAli.Saidi@ARM.com _name = _basename; 647416SAli.Saidi@ARM.com } else { 657416SAli.Saidi@ARM.com std::string original_name = _basename; 667416SAli.Saidi@ARM.com _basename = pickUniqueName(parent, _basename); 677416SAli.Saidi@ARM.com 687416SAli.Saidi@ARM.com if (parent) { 697416SAli.Saidi@ARM.com Object *obj = Object::getFromScObject(parent); 706019Shines@cs.fsu.edu obj->addChildEvent(_sc_event); 716341Sjack-m5ml2@cs.york.ac.uk } else { 726341Sjack-m5ml2@cs.york.ac.uk topLevelEvents.emplace(topLevelEvents.end(), _sc_event); 736341Sjack-m5ml2@cs.york.ac.uk } 746341Sjack-m5ml2@cs.york.ac.uk 756341Sjack-m5ml2@cs.york.ac.uk std::string path = parent ? (std::string(parent->name()) + ".") : ""; 766341Sjack-m5ml2@cs.york.ac.uk 776341Sjack-m5ml2@cs.york.ac.uk if (original_name != "" && _basename != original_name) { 786341Sjack-m5ml2@cs.york.ac.uk std::string message = path + original_name + 796341Sjack-m5ml2@cs.york.ac.uk ". Latter declaration will be renamed to " + 806341Sjack-m5ml2@cs.york.ac.uk path + _basename; 816341Sjack-m5ml2@cs.york.ac.uk SC_REPORT_WARNING("(W505) object already exists", message.c_str()); 826341Sjack-m5ml2@cs.york.ac.uk } 836341Sjack-m5ml2@cs.york.ac.uk 846341Sjack-m5ml2@cs.york.ac.uk _name = path + _basename; 856341Sjack-m5ml2@cs.york.ac.uk } 866341Sjack-m5ml2@cs.york.ac.uk 876019Shines@cs.fsu.edu allEvents.emplace(allEvents.end(), _sc_event); 886019Shines@cs.fsu.edu 896019Shines@cs.fsu.edu // Determine if we're in the hierarchy (created once initialization starts 906413Ssaidi@eecs.umich.edu // means no). 916019Shines@cs.fsu.edu} 926019Shines@cs.fsu.edu 936019Shines@cs.fsu.eduEvent::~Event() 946019Shines@cs.fsu.edu{ 956019Shines@cs.fsu.edu if (parent) { 966019Shines@cs.fsu.edu Object *obj = Object::getFromScObject(parent); 976019Shines@cs.fsu.edu obj->delChildEvent(_sc_event); 986019Shines@cs.fsu.edu } else if (inHierarchy()) { 996019Shines@cs.fsu.edu EventsIt it = find(topLevelEvents.begin(), topLevelEvents.end(), 1006019Shines@cs.fsu.edu _sc_event); 1016415Ssaidi@eecs.umich.edu assert(it != topLevelEvents.end()); 1026019Shines@cs.fsu.edu std::swap(*it, topLevelEvents.back()); 1036019Shines@cs.fsu.edu topLevelEvents.pop_back(); 1046019Shines@cs.fsu.edu } 1056019Shines@cs.fsu.edu 1066019Shines@cs.fsu.edu EventsIt it = findEvent(_name); 1076019Shines@cs.fsu.edu std::swap(*it, allEvents.back()); 1086019Shines@cs.fsu.edu allEvents.pop_back(); 1096019Shines@cs.fsu.edu 1106689Stjones1@inf.ed.ac.uk if (delayedNotify.scheduled()) 1116019Shines@cs.fsu.edu scheduler.deschedule(&delayedNotify); 1126019Shines@cs.fsu.edu} 1136019Shines@cs.fsu.edu 1146019Shines@cs.fsu.educonst std::string & 1156019Shines@cs.fsu.eduEvent::name() const 1166019Shines@cs.fsu.edu{ 1176019Shines@cs.fsu.edu return _name; 1186019Shines@cs.fsu.edu} 1196019Shines@cs.fsu.edu 1206019Shines@cs.fsu.educonst std::string & 1216019Shines@cs.fsu.eduEvent::basename() const 1226019Shines@cs.fsu.edu{ 1236413Ssaidi@eecs.umich.edu return _basename; 1246413Ssaidi@eecs.umich.edu} 1256413Ssaidi@eecs.umich.edu 1266413Ssaidi@eecs.umich.edubool 1276413Ssaidi@eecs.umich.eduEvent::inHierarchy() const 1286019Shines@cs.fsu.edu{ 1296019Shines@cs.fsu.edu return _inHierarchy; 1306019Shines@cs.fsu.edu} 1317416SAli.Saidi@ARM.com 1327416SAli.Saidi@ARM.comsc_core::sc_object * 1337416SAli.Saidi@ARM.comEvent::getParentObject() const 1347416SAli.Saidi@ARM.com{ 1357416SAli.Saidi@ARM.com return parent; 1367416SAli.Saidi@ARM.com} 1377416SAli.Saidi@ARM.com 1387416SAli.Saidi@ARM.comvoid 1397416SAli.Saidi@ARM.comEvent::notify(StaticSensitivities &senses) 1407416SAli.Saidi@ARM.com{ 1417416SAli.Saidi@ARM.com for (auto s: senses) 1427416SAli.Saidi@ARM.com s->notify(this); 1437416SAli.Saidi@ARM.com} 1447416SAli.Saidi@ARM.com 1457416SAli.Saidi@ARM.comvoid 1467416SAli.Saidi@ARM.comEvent::notify(DynamicSensitivities &senses) 1477416SAli.Saidi@ARM.com{ 1487416SAli.Saidi@ARM.com int size = senses.size(); 1497416SAli.Saidi@ARM.com int pos = 0; 1506395Ssaidi@eecs.umich.edu while (pos < size) { 1516395Ssaidi@eecs.umich.edu if (senses[pos]->notify(this)) 1526395Ssaidi@eecs.umich.edu senses[pos] = senses[--size]; 1536395Ssaidi@eecs.umich.edu else 1546395Ssaidi@eecs.umich.edu pos++; 1556395Ssaidi@eecs.umich.edu } 1566395Ssaidi@eecs.umich.edu senses.resize(size); 1576395Ssaidi@eecs.umich.edu} 1586395Ssaidi@eecs.umich.edu 1596395Ssaidi@eecs.umich.eduvoid 1606395Ssaidi@eecs.umich.eduEvent::notify() 1616395Ssaidi@eecs.umich.edu{ 1626395Ssaidi@eecs.umich.edu if (scheduler.inUpdate()) { 1636395Ssaidi@eecs.umich.edu SC_REPORT_ERROR("(E521) immediate notification is not allowed " 1646395Ssaidi@eecs.umich.edu "during update phase or elaboration", ""); 1656395Ssaidi@eecs.umich.edu } 1666395Ssaidi@eecs.umich.edu 1676395Ssaidi@eecs.umich.edu // An immediate notification overrides any pending delayed notification. 1686395Ssaidi@eecs.umich.edu if (delayedNotify.scheduled()) 1696395Ssaidi@eecs.umich.edu scheduler.deschedule(&delayedNotify); 1706395Ssaidi@eecs.umich.edu 1716395Ssaidi@eecs.umich.edu _triggeredStamp = scheduler.changeStamp(); 1726395Ssaidi@eecs.umich.edu notify(staticSenseMethod); 1736395Ssaidi@eecs.umich.edu notify(dynamicSenseMethod); 1746395Ssaidi@eecs.umich.edu notify(staticSenseThread); 1756395Ssaidi@eecs.umich.edu notify(dynamicSenseThread); 1766395Ssaidi@eecs.umich.edu} 1776395Ssaidi@eecs.umich.edu 1786395Ssaidi@eecs.umich.eduvoid 1796395Ssaidi@eecs.umich.eduEvent::notify(const sc_core::sc_time &t) 1806395Ssaidi@eecs.umich.edu{ 1816395Ssaidi@eecs.umich.edu if (delayedNotify.scheduled()) { 1826395Ssaidi@eecs.umich.edu if (scheduler.delayed(t) >= delayedNotify.when()) 1836395Ssaidi@eecs.umich.edu return; 1846395Ssaidi@eecs.umich.edu 1856395Ssaidi@eecs.umich.edu scheduler.deschedule(&delayedNotify); 1866395Ssaidi@eecs.umich.edu } 1876395Ssaidi@eecs.umich.edu scheduler.schedule(&delayedNotify, t); 1886395Ssaidi@eecs.umich.edu} 1896395Ssaidi@eecs.umich.edu 1906395Ssaidi@eecs.umich.eduvoid 1916640Svince@csl.cornell.eduEvent::notifyDelayed(const sc_core::sc_time &t) 1926640Svince@csl.cornell.edu{ 1936640Svince@csl.cornell.edu if (delayedNotify.scheduled()) { 1946640Svince@csl.cornell.edu SC_REPORT_ERROR("(E531) notify_delayed() cannot be called on events " 1956640Svince@csl.cornell.edu "that have pending notifications", ""); 1966640Svince@csl.cornell.edu } 1976640Svince@csl.cornell.edu notify(t); 1986640Svince@csl.cornell.edu} 1996640Svince@csl.cornell.edu 2006640Svince@csl.cornell.eduvoid 2016640Svince@csl.cornell.eduEvent::cancel() 2026640Svince@csl.cornell.edu{ 2036640Svince@csl.cornell.edu if (delayedNotify.scheduled()) 2046640Svince@csl.cornell.edu scheduler.deschedule(&delayedNotify); 2056640Svince@csl.cornell.edu} 2067416SAli.Saidi@ARM.com 2077416SAli.Saidi@ARM.combool 2087416SAli.Saidi@ARM.comEvent::triggered() const 2097416SAli.Saidi@ARM.com{ 2107416SAli.Saidi@ARM.com return _triggeredStamp == scheduler.changeStamp(); 2117416SAli.Saidi@ARM.com} 2127416SAli.Saidi@ARM.com 2137416SAli.Saidi@ARM.comvoid 2147416SAli.Saidi@ARM.comEvent::clearParent() 2157416SAli.Saidi@ARM.com{ 2167416SAli.Saidi@ARM.com if (!parent) 2177416SAli.Saidi@ARM.com return; 2187416SAli.Saidi@ARM.com Object::getFromScObject(parent)->delChildEvent(sc_event()); 2197416SAli.Saidi@ARM.com parent = nullptr; 2207416SAli.Saidi@ARM.com topLevelEvents.emplace(topLevelEvents.end(), sc_event()); 2217416SAli.Saidi@ARM.com} 2227416SAli.Saidi@ARM.com 2237416SAli.Saidi@ARM.comEvents topLevelEvents; 2247416SAli.Saidi@ARM.comEvents allEvents; 2257416SAli.Saidi@ARM.com 2267416SAli.Saidi@ARM.comEventsIt 2277416SAli.Saidi@ARM.comfindEvent(const std::string &name) 2287416SAli.Saidi@ARM.com{ 2297416SAli.Saidi@ARM.com EventsIt it; 2307416SAli.Saidi@ARM.com for (it = allEvents.begin(); it != allEvents.end(); it++) 2317416SAli.Saidi@ARM.com if (!strcmp((*it)->name(), name.c_str())) 2327416SAli.Saidi@ARM.com break; 2337416SAli.Saidi@ARM.com 2346395Ssaidi@eecs.umich.edu return it; 2356019Shines@cs.fsu.edu} 2366019Shines@cs.fsu.edu 2376019Shines@cs.fsu.edu} // namespace sc_gem5 238