diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/systemc/core/sc_prim.cc | 8 | ||||
-rw-r--r-- | src/systemc/core/scheduler.cc | 8 | ||||
-rw-r--r-- | src/systemc/core/scheduler.hh | 14 | ||||
-rw-r--r-- | src/systemc/ext/core/sc_prim.hh | 2 |
4 files changed, 29 insertions, 3 deletions
diff --git a/src/systemc/core/sc_prim.cc b/src/systemc/core/sc_prim.cc index 91befa836..170abb541 100644 --- a/src/systemc/core/sc_prim.cc +++ b/src/systemc/core/sc_prim.cc @@ -29,8 +29,16 @@ #include "base/logging.hh" #include "systemc/core/channel.hh" +#include "systemc/core/scheduler.hh" #include "systemc/ext/core/sc_prim.hh" +namespace sc_gem5 +{ + +uint64_t getChangeStamp() { return scheduler.changeStamp(); } + +} // namespace sc_gem5 + namespace sc_core { diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc index 9b431acba..e2d8e62f4 100644 --- a/src/systemc/core/scheduler.cc +++ b/src/systemc/core/scheduler.cc @@ -46,7 +46,7 @@ Scheduler::Scheduler() : starvationEvent(this, false, StarvationPriority), _started(false), _paused(false), _stopped(false), maxTickEvent(this, false, MaxTickPriority), - _numCycles(0), _current(nullptr), initDone(false), + _numCycles(0), _changeStamp(0), _current(nullptr), initDone(false), runOnce(false) {} @@ -265,14 +265,17 @@ void Scheduler::runReady() { bool empty = readyList.empty(); + lastReadyTick = getCurTick(); // The evaluation phase. do { yield(); } while (!readyList.empty()); - if (!empty) + if (!empty) { _numCycles++; + _changeStamp++; + } // The update phase. update(); @@ -334,6 +337,7 @@ Scheduler::start(Tick max_tick, bool run_to_time) runToTime = run_to_time; maxTick = max_tick; + lastReadyTick = getCurTick(); if (initDone) { if (!runToTime && starved()) diff --git a/src/systemc/core/scheduler.hh b/src/systemc/core/scheduler.hh index f55ff1f83..2bee0b090 100644 --- a/src/systemc/core/scheduler.hh +++ b/src/systemc/core/scheduler.hh @@ -275,6 +275,7 @@ class Scheduler void completeTimeSlot(TimeSlot *ts) { + _changeStamp++; assert(ts == timeSlots.begin()->second); timeSlots.erase(timeSlots.begin()); if (!runToTime && starved()) @@ -327,6 +328,8 @@ class Scheduler bool paused() { return _paused; } bool stopped() { return _stopped; } + uint64_t changeStamp() { return _changeStamp; } + private: typedef const EventBase::Priority Priority; static Priority DefaultPriority = EventBase::Default_Pri; @@ -388,9 +391,18 @@ class Scheduler bool _stopped; Tick maxTick; - EventWrapper<Scheduler, &Scheduler::pause> maxTickEvent; + Tick lastReadyTick; + void + maxTickFunc() + { + if (lastReadyTick != getCurTick()) + _changeStamp++; + pause(); + } + EventWrapper<Scheduler, &Scheduler::maxTickFunc> maxTickEvent; uint64_t _numCycles; + uint64_t _changeStamp; Process *_current; diff --git a/src/systemc/ext/core/sc_prim.hh b/src/systemc/ext/core/sc_prim.hh index 99e231456..73b8784a6 100644 --- a/src/systemc/ext/core/sc_prim.hh +++ b/src/systemc/ext/core/sc_prim.hh @@ -38,6 +38,8 @@ namespace sc_gem5 class Channel; +uint64_t getChangeStamp(); + } // namespace sc_gem5 namespace sc_core |