summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/systemc/core/kernel.cc9
-rw-r--r--src/systemc/core/scheduler.cc18
-rw-r--r--src/systemc/core/scheduler.hh9
3 files changed, 17 insertions, 19 deletions
diff --git a/src/systemc/core/kernel.cc b/src/systemc/core/kernel.cc
index 84bdfd13f..2594bcc64 100644
--- a/src/systemc/core/kernel.cc
+++ b/src/systemc/core/kernel.cc
@@ -163,14 +163,7 @@ Kernel::stopWork()
void
Kernel::t0Handler()
{
- // Now that the event queue has started, mark all the processes that
- // need to be initialized as ready to run.
- //
- // This event has greater priority than delta notifications and so will
- // happen before them, honoring the ordering for the initialization phase
- // in the spec. The delta phase will happen at normal priority, and then
- // the event which runs the processes which is at a lower priority.
- ::sc_gem5::scheduler.prepareForInit();
+ ::sc_gem5::scheduler.initPhase();
status(::sc_core::SC_RUNNING);
}
diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc
index ceaa5f474..77015dd46 100644
--- a/src/systemc/core/scheduler.cc
+++ b/src/systemc/core/scheduler.cc
@@ -46,12 +46,12 @@ Scheduler::Scheduler() :
starvationEvent(this, false, StarvationPriority),
_started(false), _paused(false), _stopped(false),
maxTickEvent(this, false, MaxTickPriority),
- _numCycles(0), _current(nullptr), initReady(false),
+ _numCycles(0), _current(nullptr), initDone(false),
runOnce(false)
{}
void
-Scheduler::prepareForInit()
+Scheduler::initPhase()
{
for (Process *p = toFinalize.getNext(); p; p = toFinalize.getNext()) {
p->finalize();
@@ -64,6 +64,12 @@ Scheduler::prepareForInit()
p->ready();
}
+ update();
+
+ for (auto &e: deltas)
+ e->run();
+ deltas.clear();
+
for (auto ets: eventsToSchedule)
eq->schedule(ets.first, ets.second);
eventsToSchedule.clear();
@@ -71,13 +77,13 @@ Scheduler::prepareForInit()
if (_started)
eq->schedule(&maxTickEvent, maxTick);
- initReady = true;
+ initDone = true;
}
void
Scheduler::reg(Process *p)
{
- if (initReady) {
+ if (initDone) {
// If we're past initialization, finalize static sensitivity.
p->finalize();
// Mark the process as ready.
@@ -92,7 +98,7 @@ Scheduler::reg(Process *p)
void
Scheduler::dontInitialize(Process *p)
{
- if (initReady) {
+ if (initDone) {
// Pop this process off of the ready list.
p->popListNode();
} else {
@@ -246,7 +252,7 @@ Scheduler::start(Tick max_tick, bool run_to_time)
if (starved() && !runToTime)
return;
- if (initReady) {
+ if (initDone) {
kernel->status(::sc_core::SC_RUNNING);
eq->schedule(&maxTickEvent, maxTick);
}
diff --git a/src/systemc/core/scheduler.hh b/src/systemc/core/scheduler.hh
index b221e67d9..2843b6829 100644
--- a/src/systemc/core/scheduler.hh
+++ b/src/systemc/core/scheduler.hh
@@ -165,8 +165,7 @@ class Scheduler
uint64_t numCycles() { return _numCycles; }
Process *current() { return _current; }
- // Prepare for initialization.
- void prepareForInit();
+ void initPhase();
// Register a process with the scheduler.
void reg(Process *p);
@@ -226,7 +225,7 @@ class Scheduler
TimeSlot *&ts = timeSlots[tick];
if (!ts) {
ts = new TimeSlot;
- if (initReady)
+ if (initDone)
eq->schedule(ts, tick);
else
eventsToSchedule[ts] = tick;
@@ -256,7 +255,7 @@ class Scheduler
// If no more events are happening at this time slot, get rid of it.
if (events.empty()) {
- if (initReady)
+ if (initDone)
eq->deschedule(ts);
else
eventsToSchedule.erase(ts);
@@ -363,7 +362,7 @@ class Scheduler
Process *_current;
- bool initReady;
+ bool initDone;
bool runToTime;
bool runOnce;