summaryrefslogtreecommitdiff
path: root/src/systemc/core/event.cc
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-07-18 20:59:56 -0700
committerGabe Black <gabeblack@google.com>2018-09-05 06:09:21 +0000
commit743a1b5cdd8e607f2e1bb5ad182047c512eae3f8 (patch)
tree646432533f331db140547ac1cb4f60feda5928bd /src/systemc/core/event.cc
parent91a6b128198515a7a29ee766715c9a1fe1bf7b0c (diff)
downloadgem5-743a1b5cdd8e607f2e1bb5ad182047c512eae3f8.tar.xz
systemc: Implement pending activity related functions
Track the number of notifications/timeouts that are scheduled at any given time. This lets us implement sc_pending_activity_at_current_time, sc_pending_activity_at_future_time, and sc_time_to_pending_activity. Change-Id: Ia3fcd29bdbfe1a6c77eb52ce4836982d4705263c Reviewed-on: https://gem5-review.googlesource.com/12032 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/systemc/core/event.cc')
-rw-r--r--src/systemc/core/event.cc24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/systemc/core/event.cc b/src/systemc/core/event.cc
index 5008074f6..1623cf9e8 100644
--- a/src/systemc/core/event.cc
+++ b/src/systemc/core/event.cc
@@ -43,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), delayedNotify(this)
+ _sc_event(_sc_event), _basename(_basename), delayedNotifyEvent(this)
{
Module *p = currentModule();
@@ -121,28 +121,34 @@ Event::notify()
}
void
+Event::delayedNotify()
+{
+ scheduler.eventHappened();
+ notify();
+}
+
+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();
+ Tick new_tick = t.value() * SimClock::Int::ps + scheduler.getCurTick();
+ if (delayedNotifyEvent.scheduled()) {
+ Tick old_tick = delayedNotifyEvent.when();
if (new_tick >= old_tick)
return;
- scheduler.eventQueue().deschedule(&delayedNotify);
+ scheduler.deschedule(&delayedNotifyEvent);
}
- scheduler.eventQueue().schedule(&delayedNotify, new_tick);
+ scheduler.schedule(&delayedNotifyEvent, new_tick);
}
void
Event::cancel()
{
- if (delayedNotify.scheduled())
- scheduler.eventQueue().deschedule(&delayedNotify);
+ if (delayedNotifyEvent.scheduled())
+ scheduler.deschedule(&delayedNotifyEvent);
}
bool