diff options
-rw-r--r-- | src/systemc/core/scheduler.cc | 4 | ||||
-rw-r--r-- | src/systemc/core/scheduler.hh | 14 |
2 files changed, 16 insertions, 2 deletions
diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc index 6bb67d136..5174627d0 100644 --- a/src/systemc/core/scheduler.cc +++ b/src/systemc/core/scheduler.cc @@ -60,6 +60,10 @@ Scheduler::prepareForInit() p->ready(); } + for (auto ets: eventsToSchedule) + eq->schedule(ets.first, ets.second); + eventsToSchedule.clear(); + if (_started) eq->schedule(&maxTickEvent, maxTick); diff --git a/src/systemc/core/scheduler.hh b/src/systemc/core/scheduler.hh index 3ac7f419f..73d660e9e 100644 --- a/src/systemc/core/scheduler.hh +++ b/src/systemc/core/scheduler.hh @@ -187,7 +187,11 @@ class Scheduler schedule(::Event *event, Tick tick) { pendingTicks[tick]++; - eq->schedule(event, tick); + + if (initReady) + eq->schedule(event, tick); + else + eventsToSchedule[event] = tick; } // For descheduling delayed/timed notifications/timeouts. @@ -197,7 +201,11 @@ class Scheduler auto it = pendingTicks.find(event->when()); if (--it->second == 0) pendingTicks.erase(it); - eq->deschedule(event); + + if (initReady) + eq->deschedule(event); + else + eventsToSchedule.erase(event); } // Tell the scheduler than an event fired for bookkeeping purposes. @@ -302,6 +310,8 @@ class Scheduler ProcessList readyList; ChannelList updateList; + + std::map<::Event *, Tick> eventsToSchedule; }; extern Scheduler scheduler; |