systemc: Rework the init phase for the new way delta notes are handled.
authorGabe Black <gabeblack@google.com>
Fri, 17 Aug 2018 03:59:29 +0000 (20:59 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 25 Sep 2018 23:51:06 +0000 (23:51 +0000)
The initialization phase had been done in a somewhat adhoc way,
partially because delta notifications were being handled as top level
gem5 events which were ordered based on their priorities. This change
makes the initialization phase happen more explicitly, and more in the
order in the spec.

Change-Id: I91d56b63fefcb81c845c52c97826a976a7559fad
Reviewed-on: https://gem5-review.googlesource.com/12217
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/core/kernel.cc
src/systemc/core/scheduler.cc
src/systemc/core/scheduler.hh

index 84bdfd13f6b45aab05395a976e5a5146e0850900..2594bcc64191ab55d5e3425a80432f705fcd5e17 100644 (file)
@@ -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);
 }
index ceaa5f474c18a3723d6fa0126f8d6eed056df54b..77015dd46da5f9375ff95eaf2898cf02a891c880 100644 (file)
@@ -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);
     }
index b221e67d9957bdbe4245502f7c0933a331113069..2843b68290a61682831c2cdc6cbc76e39f0ef86b 100644 (file)
@@ -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;