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