summaryrefslogtreecommitdiff
path: root/src/systemc/core/kernel.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/core/kernel.cc')
-rw-r--r--src/systemc/core/kernel.cc25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/systemc/core/kernel.cc b/src/systemc/core/kernel.cc
index fd51b4c52..cc65fcc20 100644
--- a/src/systemc/core/kernel.cc
+++ b/src/systemc/core/kernel.cc
@@ -86,15 +86,12 @@ Kernel::init()
callbackModule(nullptr);
for (auto c: sc_gem5::allChannels)
c->sc_chan()->before_end_of_elaboration();
-
- if (stopAfterCallbacks)
- stopWork();
}
void
Kernel::regStats()
{
- if (scMainDone)
+ if (scMainDone || stopAfterCallbacks)
return;
for (auto m: sc_gem5::allModules)
@@ -113,9 +110,6 @@ Kernel::regStats()
callbackModule(nullptr);
for (auto c: sc_gem5::allChannels)
c->sc_chan()->end_of_elaboration();
-
- if (stopAfterCallbacks)
- stopWork();
}
void
@@ -124,6 +118,11 @@ Kernel::startup()
if (scMainDone)
return;
+ schedule(t0Event, curTick());
+
+ if (stopAfterCallbacks)
+ return;
+
status(::sc_core::SC_START_OF_SIMULATION);
for (auto m: sc_gem5::allModules) {
m->sc_mod()->start_of_simulation();
@@ -142,7 +141,6 @@ Kernel::startup()
kernel->status(::sc_core::SC_RUNNING);
- schedule(t0Event, curTick());
// Run update once before the event queue starts.
::sc_gem5::scheduler.update();
}
@@ -178,9 +176,14 @@ Kernel::stopWork()
void
Kernel::t0Handler()
{
- ::sc_gem5::scheduler.initPhase();
-
- status(::sc_core::SC_RUNNING);
+ if (stopAfterCallbacks) {
+ scheduler.clear();
+ ::sc_gem5::scheduler.initPhase();
+ scheduler.scheduleStop(false);
+ } else {
+ ::sc_gem5::scheduler.initPhase();
+ status(::sc_core::SC_RUNNING);
+ }
}
Kernel *kernel;