summaryrefslogtreecommitdiff
path: root/src/systemc/core
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2019-02-14 01:54:20 -0800
committerGabe Black <gabeblack@google.com>2019-02-21 22:35:23 +0000
commit71b617b647dd83d9b8865c3ae1390c34e0e6abd2 (patch)
treee83422eb59c0ecce993e6c490d20e29de9995ff3 /src/systemc/core
parente15e12134e1149a358e9ab28b3b8affbb75f53d0 (diff)
downloadgem5-71b617b647dd83d9b8865c3ae1390c34e0e6abd2.tar.xz
systemc: Make sc_(pause|stop) exit to python when not using sc_main.
In those cases, there's no sc_main to return control to. The python config script is serving more or less the same purpose, so we can return control to there instead. Change-Id: I3cf0623ae51d989b883fb8556ebbf44651bbec99 Reviewed-on: https://gem5-review.googlesource.com/c/16445 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/systemc/core')
-rw-r--r--src/systemc/core/scheduler.cc23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/systemc/core/scheduler.cc b/src/systemc/core/scheduler.cc
index da1dd2d03..d06ddfb58 100644
--- a/src/systemc/core/scheduler.cc
+++ b/src/systemc/core/scheduler.cc
@@ -32,6 +32,7 @@
#include "base/fiber.hh"
#include "base/logging.hh"
#include "sim/eventq.hh"
+#include "sim/sim_exit.hh"
#include "systemc/core/kernel.hh"
#include "systemc/core/sc_main_fiber.hh"
#include "systemc/ext/core/messages.hh"
@@ -352,8 +353,15 @@ Scheduler::pause()
status(StatusPaused);
kernel->status(::sc_core::SC_PAUSED);
runOnce = false;
- if (scMainFiber.called() && !scMainFiber.finished())
- scMainFiber.run();
+ if (scMainFiber.called()) {
+ if (!scMainFiber.finished())
+ scMainFiber.run();
+ } else {
+ if (scMainFiber.finished())
+ fatal("Pausing systemc after sc_main completed.");
+ else
+ exitSimLoopNow("systemc pause");
+ }
}
void
@@ -365,8 +373,15 @@ Scheduler::stop()
clear();
runOnce = false;
- if (scMainFiber.called() && !scMainFiber.finished())
- scMainFiber.run();
+ if (scMainFiber.called()) {
+ if (!scMainFiber.finished())
+ scMainFiber.run();
+ } else {
+ if (scMainFiber.finished())
+ fatal("Stopping systemc after sc_main completed.");
+ else
+ exitSimLoopNow("systemc stop");
+ }
}
void