diff options
Diffstat (limited to 'src/systemc')
-rw-r--r-- | src/systemc/core/scheduler.cc | 21 | ||||
-rw-r--r-- | src/systemc/core/scheduler.hh | 31 |
2 files changed, 31 insertions, 21 deletions
diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc index e18855c4d..cdebd9986 100644 --- a/src/systemc/core/scheduler.cc +++ b/src/systemc/core/scheduler.cc @@ -77,7 +77,7 @@ Scheduler::initPhase() if (_started) { if (starved() && !runToTime) scheduleStarvationEvent(); - eq->schedule(&maxTickEvent, maxTick); + kernel->status(::sc_core::SC_RUNNING); } initDone = true; @@ -153,8 +153,7 @@ void Scheduler::requestUpdate(Channel *c) { updateList.pushLast(c); - if (eq) - scheduleReadyEvent(); + scheduleReadyEvent(); } void @@ -162,10 +161,9 @@ Scheduler::scheduleReadyEvent() { // Schedule the evaluate and update phases. if (!readyEvent.scheduled()) { - panic_if(!eq, "Need to schedule ready, but no event manager.\n"); - eq->schedule(&readyEvent, eq->getCurTick()); + schedule(&readyEvent); if (starvationEvent.scheduled()) - eq->deschedule(&starvationEvent); + deschedule(&starvationEvent); } } @@ -173,13 +171,9 @@ void Scheduler::scheduleStarvationEvent() { if (!starvationEvent.scheduled()) { - Tick now = getCurTick(); - if (initDone) - eq->schedule(&starvationEvent, now); - else - eventsToSchedule[&starvationEvent] = now; + schedule(&starvationEvent); if (readyEvent.scheduled()) - eq->deschedule(&readyEvent); + deschedule(&readyEvent); } } @@ -258,9 +252,10 @@ Scheduler::start(Tick max_tick, bool run_to_time) if (starved() && !runToTime) scheduleStarvationEvent(); kernel->status(::sc_core::SC_RUNNING); - eq->schedule(&maxTickEvent, maxTick); } + schedule(&maxTickEvent, maxTick); + // Return to gem5 to let it run events, etc. Fiber::primaryFiber()->run(); diff --git a/src/systemc/core/scheduler.hh b/src/systemc/core/scheduler.hh index 2843b6829..c22bdf870 100644 --- a/src/systemc/core/scheduler.hh +++ b/src/systemc/core/scheduler.hh @@ -225,10 +225,7 @@ class Scheduler TimeSlot *&ts = timeSlots[tick]; if (!ts) { ts = new TimeSlot; - if (initDone) - eq->schedule(ts, tick); - else - eventsToSchedule[ts] = tick; + schedule(ts, tick); } ts->events.insert(event); } @@ -255,10 +252,7 @@ class Scheduler // If no more events are happening at this time slot, get rid of it. if (events.empty()) { - if (initDone) - eq->deschedule(ts); - else - eventsToSchedule.erase(ts); + deschedule(ts); timeSlots.erase(tsit); } } @@ -328,6 +322,27 @@ class Scheduler EventQueue *eq; + // For gem5 style events. + void + schedule(::Event *event, Tick tick) + { + if (initDone) + eq->schedule(event, tick); + else + eventsToSchedule[event] = tick; + } + + void schedule(::Event *event) { schedule(event, getCurTick()); } + + void + deschedule(::Event *event) + { + if (initDone) + eq->deschedule(event); + else + eventsToSchedule.erase(event); + } + ScEvents deltas; TimeSlots timeSlots; |