systemc: Check whether the simulation is running when creating sensitivities.
authorGabe Black <gabeblack@google.com>
Sat, 15 Sep 2018 04:38:45 +0000 (21:38 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 9 Oct 2018 21:51:33 +0000 (21:51 +0000)
Change-Id: I499cde0d0eb45ba3287a8719174e1c794c1fb634
Reviewed-on: https://gem5-review.googlesource.com/c/12810
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/core/sc_sensitive.cc
src/systemc/tests/systemc/kernel/sc_sensitive/test04/expected_returncode [new file with mode: 0644]

index 9b8ae2de45a63585934933a9401d639ef8aa3a04..2accc93c1ef1bc3350a83829c7636246a0e60b45 100644 (file)
 #include "systemc/ext/channel/sc_inout.hh"
 #include "systemc/ext/channel/sc_signal_in_if.hh"
 #include "systemc/ext/core/sc_interface.hh"
+#include "systemc/ext/core/sc_main.hh"
 #include "systemc/ext/core/sc_sensitive.hh"
+#include "systemc/ext/utils/sc_report_handler.hh"
 
 namespace sc_core
 {
 
+namespace
+{
+
+void
+checkIfRunning()
+{
+    if (sc_is_running())
+        SC_REPORT_ERROR("(E526) make sensitive failed", "simulation running");
+}
+
+} // anonymous namespace
+
 sc_sensitive::sc_sensitive() : currentProcess(nullptr) {}
 
 sc_sensitive &
 sc_sensitive::operator << (const sc_event &e)
 {
+    checkIfRunning();
     sc_gem5::newStaticSensitivityEvent(currentProcess, &e);
     return *this;
 }
@@ -50,6 +65,7 @@ sc_sensitive::operator << (const sc_event &e)
 sc_sensitive &
 sc_sensitive::operator << (const sc_interface &i)
 {
+    checkIfRunning();
     sc_gem5::newStaticSensitivityInterface(currentProcess, &i);
     return *this;
 }
@@ -57,6 +73,7 @@ sc_sensitive::operator << (const sc_interface &i)
 sc_sensitive &
 sc_sensitive::operator << (const sc_port_base &b)
 {
+    checkIfRunning();
     sc_gem5::newStaticSensitivityPort(currentProcess, &b);
     return *this;
 }
@@ -64,6 +81,7 @@ sc_sensitive::operator << (const sc_port_base &b)
 sc_sensitive &
 sc_sensitive::operator << (sc_event_finder &f)
 {
+    checkIfRunning();
     sc_gem5::newStaticSensitivityFinder(currentProcess, &f);
     return *this;
 }
@@ -80,6 +98,7 @@ void
 sc_sensitive::operator () (::sc_gem5::Process *p,
                            const sc_signal_in_if<bool> &i)
 {
+    checkIfRunning();
     sc_gem5::newStaticSensitivityEvent(p, &i.posedge_event());
 }
 
@@ -87,12 +106,14 @@ void
 sc_sensitive::operator () (::sc_gem5::Process *p,
                            const sc_signal_in_if<sc_dt::sc_logic> &i)
 {
+    checkIfRunning();
     sc_gem5::newStaticSensitivityEvent(p, &i.posedge_event());
 }
 
 void
 sc_sensitive::operator () (::sc_gem5::Process *p, const sc_in<bool> &port)
 {
+    checkIfRunning();
     sc_gem5::newStaticSensitivityFinder(p, &port.pos());
 }
 
@@ -100,12 +121,14 @@ void
 sc_sensitive::operator () (::sc_gem5::Process *p,
                            const sc_in<sc_dt::sc_logic> &port)
 {
+    checkIfRunning();
     sc_gem5::newStaticSensitivityFinder(p, &port.pos());
 }
 
 void
 sc_sensitive::operator () (::sc_gem5::Process *p, const sc_inout<bool> &port)
 {
+    checkIfRunning();
     sc_gem5::newStaticSensitivityFinder(p, &port.pos());
 }
 
@@ -113,12 +136,14 @@ void
 sc_sensitive::operator () (::sc_gem5::Process *p,
                            const sc_inout<sc_dt::sc_logic> &port)
 {
+    checkIfRunning();
     sc_gem5::newStaticSensitivityFinder(p, &port.pos());
 }
 
 void
 sc_sensitive::operator () (::sc_gem5::Process *p, sc_event_finder &f)
 {
+    checkIfRunning();
     sc_gem5::newStaticSensitivityFinder(p, &f);
 }
 
diff --git a/src/systemc/tests/systemc/kernel/sc_sensitive/test04/expected_returncode b/src/systemc/tests/systemc/kernel/sc_sensitive/test04/expected_returncode
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1