From f2ab5e7a9e11783da3b9d7338775cf4b5fe2c29c Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Mon, 16 Jul 2018 16:14:33 -0700 Subject: systemc: Implement the sensitivity mechanism. This change lets processes be sensitive to events, timeouts, etc. Change-Id: If30a256dfa8a2e92192c1f9c96b48e2aa28ec27e Reviewed-on: https://gem5-review.googlesource.com/11713 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/core/event.cc | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'src/systemc/core/event.cc') diff --git a/src/systemc/core/event.cc b/src/systemc/core/event.cc index 63fcabe4f..5008074f6 100644 --- a/src/systemc/core/event.cc +++ b/src/systemc/core/event.cc @@ -32,6 +32,8 @@ #include #include +#include "base/logging.hh" +#include "sim/core.hh" #include "systemc/core/module.hh" #include "systemc/core/scheduler.hh" @@ -41,7 +43,7 @@ namespace sc_gem5 Event::Event(sc_core::sc_event *_sc_event) : Event(_sc_event, "") {} Event::Event(sc_core::sc_event *_sc_event, const char *_basename) : - _sc_event(_sc_event), _basename(_basename) + _sc_event(_sc_event), _basename(_basename), delayedNotify(this) { Module *p = currentModule(); @@ -81,6 +83,9 @@ Event::~Event() EventsIt it = findEvent(_name); std::swap(*it, allEvents.back()); allEvents.pop_back(); + + if (delayedNotifyEvent.scheduled()) + scheduler.deschedule(&delayedNotifyEvent); } const std::string & @@ -110,16 +115,34 @@ Event::getParentObject() const void Event::notify() { + auto local_sensitivities = sensitivities; + for (auto s: local_sensitivities) + s->notify(this); } void Event::notify(const sc_core::sc_time &t) { + //XXX We're assuming the systemc time resolution is in ps. + Tick new_tick = t.value() * SimClock::Int::ps + + scheduler.eventQueue().getCurTick(); + if (delayedNotify.scheduled()) { + Tick old_tick = delayedNotify.when(); + + if (new_tick >= old_tick) + return; + + scheduler.eventQueue().deschedule(&delayedNotify); + } + + scheduler.eventQueue().schedule(&delayedNotify, new_tick); } void Event::cancel() { + if (delayedNotify.scheduled()) + scheduler.eventQueue().deschedule(&delayedNotify); } bool -- cgit v1.2.3