systemc: Make some functions of the kernel static.
This makes it possible to call them without having to have a kernel instance available. The kernel is a singleton anyway, so there should only ever be a single instance of any of these values. Change-Id: I3610d60cc72e9f3114997fe63db94b96ccaac3cd Reviewed-on: https://gem5-review.googlesource.com/12041 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user