diff options
-rw-r--r-- | src/systemc/core/kernel.cc | 46 | ||||
-rw-r--r-- | src/systemc/core/kernel.hh | 17 | ||||
-rw-r--r-- | src/systemc/core/sc_main.cc | 6 |
3 files changed, 39 insertions, 30 deletions
diff --git a/src/systemc/core/kernel.cc b/src/systemc/core/kernel.cc index dac2229e2..9eed325ec 100644 --- a/src/systemc/core/kernel.cc +++ b/src/systemc/core/kernel.cc @@ -36,44 +36,58 @@ namespace sc_gem5 { +namespace +{ + +bool stopAfterCallbacks = false; +bool startComplete = false; +bool endComplete = false; + +sc_core::sc_status _status = sc_core::SC_ELABORATION; + +} // anonymous namespace + +bool Kernel::startOfSimulationComplete() { return startComplete; } +bool Kernel::endOfSimulationComplete() { return endComplete; } + +sc_core::sc_status Kernel::status() { return _status; } +void Kernel::status(sc_core::sc_status s) { _status = s; } + Kernel::Kernel(Params *params) : - SimObject(params), _stopAfterCallbacks(false), - _startComplete(false), _endComplete(false), - _status(sc_core::SC_ELABORATION), - t0Event(this, false, EventBase::Default_Pri - 1) {} + SimObject(params), t0Event(this, false, EventBase::Default_Pri - 1) {} void Kernel::init() { - kernel->status(::sc_core::SC_BEFORE_END_OF_ELABORATION); + status(::sc_core::SC_BEFORE_END_OF_ELABORATION); for (auto m: sc_gem5::allModules) m->sc_mod()->before_end_of_elaboration(); - if (_stopAfterCallbacks) + if (stopAfterCallbacks) stopWork(); } void Kernel::regStats() { - kernel->status(::sc_core::SC_END_OF_ELABORATION); + status(::sc_core::SC_END_OF_ELABORATION); for (auto m: sc_gem5::allModules) m->sc_mod()->end_of_elaboration(); - if (_stopAfterCallbacks) + if (stopAfterCallbacks) stopWork(); } void Kernel::startup() { - kernel->status(::sc_core::SC_START_OF_SIMULATION); + status(::sc_core::SC_START_OF_SIMULATION); for (auto m: sc_gem5::allModules) m->sc_mod()->start_of_simulation(); - _startComplete = true; + startComplete = true; - if (_stopAfterCallbacks) + if (stopAfterCallbacks) stopWork(); kernel->status(::sc_core::SC_RUNNING); @@ -89,7 +103,7 @@ void Kernel::stop() { if (status() < ::sc_core::SC_RUNNING) - _stopAfterCallbacks = true; + stopAfterCallbacks = true; else stopWork(); } @@ -97,15 +111,15 @@ Kernel::stop() void Kernel::stopWork() { - kernel->status(::sc_core::SC_END_OF_SIMULATION); + status(::sc_core::SC_END_OF_SIMULATION); for (auto m: sc_gem5::allModules) m->sc_mod()->end_of_simulation(); - _endComplete = true; + endComplete = true; - kernel->status(::sc_core::SC_STOPPED); + status(::sc_core::SC_STOPPED); - if (_stopAfterCallbacks) + if (stopAfterCallbacks) fatal("Simulation called sc_stop during elaboration.\n"); } diff --git a/src/systemc/core/kernel.hh b/src/systemc/core/kernel.hh index 15641c510..b9a37d00a 100644 --- a/src/systemc/core/kernel.hh +++ b/src/systemc/core/kernel.hh @@ -56,21 +56,16 @@ class Kernel : public SimObject void t0Handler(); - sc_core::sc_status status() { return _status; } - void status(sc_core::sc_status s) { _status = s; } + static sc_core::sc_status status(); + static void status(sc_core::sc_status s); - void stop(); + static void stop(); - bool startOfSimulationComplete() { return _startComplete; } - bool endOfSimulationComplete() { return _endComplete; } + static bool startOfSimulationComplete(); + static bool endOfSimulationComplete(); private: - bool _stopAfterCallbacks; - void stopWork(); - - bool _startComplete; - bool _endComplete; - sc_core::sc_status _status; + static void stopWork(); EventWrapper<Kernel, &Kernel::t0Handler> t0Event; }; diff --git a/src/systemc/core/sc_main.cc b/src/systemc/core/sc_main.cc index 8e92c9403..45ca728c3 100644 --- a/src/systemc/core/sc_main.cc +++ b/src/systemc/core/sc_main.cc @@ -147,7 +147,7 @@ sc_start() void sc_pause() { - if (::sc_gem5::kernel->status() == SC_RUNNING) + if (::sc_gem5::Kernel::status() == SC_RUNNING) ::sc_gem5::scheduler.schedulePause(); } @@ -178,14 +178,14 @@ sc_get_stop_mode() void sc_stop() { - if (::sc_gem5::kernel->status() == SC_STOPPED) + if (::sc_gem5::Kernel::status() == SC_STOPPED) return; if (sc_is_running()) { bool finish_delta = (_stop_mode == SC_STOP_FINISH_DELTA); ::sc_gem5::scheduler.scheduleStop(finish_delta); } else { - ::sc_gem5::kernel->stop(); + ::sc_gem5::Kernel::stop(); } } |