diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc index 6bb67d136b..5174627d08 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 3ac7f419f7..73d660e9e8 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;