From 5a5f768667736d683bd1555b72d410e32db307a3 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Fri, 7 Sep 2018 15:19:44 -0700 Subject: systemc: Track the scheduler status using an enum instead of bools. The scheduler tracked whether it was paused or stopped with two bools which are mutually exclusive. It's useful to be able to also check for some other mutually exclusive states like what phase the scheduler is currently running. Rather than adding a bunch of additional bools, this change switches those mutually exclusive states over to an enum, and adds some methods to access and maintain that enum. Change-Id: Ia9696b2853d1b122c1100c9df0e12b018fe9b84b Reviewed-on: https://gem5-review.googlesource.com/c/12605 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/core/scheduler.cc | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) (limited to 'src/systemc/core/scheduler.cc') diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc index 5348e6665..beec87d9d 100644 --- a/src/systemc/core/scheduler.cc +++ b/src/systemc/core/scheduler.cc @@ -46,7 +46,7 @@ Scheduler::Scheduler() : stopEvent(this, false, StopPriority), scMain(nullptr), _throwToScMain(nullptr), starvationEvent(this, false, StarvationPriority), - _started(false), _paused(false), _stopped(false), _stopNow(false), + _started(false), _stopNow(false), _status(StatusOther), maxTickEvent(this, false, MaxTickPriority), _numCycles(0), _changeStamp(0), _current(nullptr), initDone(false), runOnce(false), readyList(nullptr) @@ -123,10 +123,8 @@ Scheduler::initPhase() p->ready(); } - update(); - - while (!deltas.empty()) - deltas.front()->run(); + runUpdate(); + runDelta(); for (auto ets: eventsToSchedule) eq->schedule(ets.first, ets.second); @@ -139,6 +137,8 @@ Scheduler::initPhase() } initDone = true; + + status(StatusOther); } void @@ -311,23 +311,23 @@ Scheduler::runReady() if (_stopNow) return; - // The update phase. - update(); - - // The delta phase. - while (!deltas.empty()) - deltas.front()->run(); + runUpdate(); + runDelta(); if (!runToTime && starved()) scheduleStarvationEvent(); if (runOnce) schedulePause(); + + status(StatusOther); } void -Scheduler::update() +Scheduler::runUpdate() { + status(StatusUpdate); + Channel *channel = updateList.getNext(); while (channel) { channel->popListNode(); @@ -336,10 +336,18 @@ Scheduler::update() } } +void +Scheduler::runDelta() +{ + status(StatusDelta); + while (!deltas.empty()) + deltas.front()->run(); +} + void Scheduler::pause() { - _paused = true; + status(StatusPaused); kernel->status(::sc_core::SC_PAUSED); runOnce = false; if (scMain && !scMain->finished()) @@ -349,7 +357,7 @@ Scheduler::pause() void Scheduler::stop() { - _stopped = true; + status(StatusStopped); kernel->stop(); clear(); @@ -367,8 +375,7 @@ Scheduler::start(Tick max_tick, bool run_to_time) scMain = Fiber::currentFiber(); _started = true; - _paused = false; - _stopped = false; + status(StatusOther); runToTime = run_to_time; maxTick = max_tick; -- cgit v1.2.3