From fc0e22461e51eebcc6919672802fd9f1a3bc860c Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Tue, 4 Sep 2018 15:09:48 -0700 Subject: [PATCH] systemc: Ensure sc_stop during callbacks actually stops. Make sure calling sc_stop during the appropriate callbacks will actually skip future action by skipping later callbacks, by flushing the scheduler before running init (so it doesn't really do anything but record that it's in running mode now), and schedule the stop event. Change-Id: I5edfbceda457df88d15bfcac4d97e8578205ec5b Reviewed-on: https://gem5-review.googlesource.com/c/12468 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/core/kernel.cc | 25 ++++++++++++++----------- 1 file 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; -- 2.30.2