diff options
Diffstat (limited to 'src/systemc')
-rw-r--r-- | src/systemc/core/kernel.cc | 9 | ||||
-rw-r--r-- | src/systemc/core/scheduler.cc | 18 | ||||
-rw-r--r-- | src/systemc/core/scheduler.hh | 9 |
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; |