summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/systemc/core/sc_prim.cc8
-rw-r--r--src/systemc/core/scheduler.cc8
-rw-r--r--src/systemc/core/scheduler.hh14
-rw-r--r--src/systemc/ext/core/sc_prim.hh2
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