diff options
author | Gabe Black <gabeblack@google.com> | 2018-07-18 20:59:56 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-09-05 06:09:21 +0000 |
commit | 743a1b5cdd8e607f2e1bb5ad182047c512eae3f8 (patch) | |
tree | 646432533f331db140547ac1cb4f60feda5928bd /src/systemc/core/event.cc | |
parent | 91a6b128198515a7a29ee766715c9a1fe1bf7b0c (diff) | |
download | gem5-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.cc | 24 |
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 |