systemc: Warn if a process is dont_initialize with no static sensitivieis.
authorGabe Black <gabeblack@google.com>
Thu, 6 Sep 2018 02:28:44 +0000 (19:28 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 9 Oct 2018 21:38:23 +0000 (21:38 +0000)
Change-Id: I4db64f42872a6fb459faa401abdad3f168297347
Reviewed-on: https://gem5-review.googlesource.com/c/12599
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/channel/sc_clock.cc
src/systemc/core/process.cc
src/systemc/core/process.hh
src/systemc/core/process_types.hh
src/systemc/core/sc_spawn.cc
src/systemc/core/scheduler.cc

index 7cdd1c1d1d25645982bd3f56541dd829e6fc10d3..25c07b3b2328c2f608a913c437858fcd8aa045b0 100644 (file)
@@ -61,7 +61,7 @@ class ClockTick : public ScEvent
     {
         _name += (to ? ".up_tick" : ".down_tick");
         _procName = _name + ".p";
-        p = new Method(_procName.c_str(), &funcWrapper);
+        p = new Method(_procName.c_str(), &funcWrapper, true);
         scheduler.reg(p);
         scheduler.dontInitialize(p);
     }
index b8eab3cde399b394d04ed72a1617adf13196461e..317e8c3a28cb5f902cb27e59c037b587a663f2d9 100644 (file)
@@ -396,11 +396,12 @@ Process::lastReport(::sc_core::sc_report *report)
 
 ::sc_core::sc_report *Process::lastReport() const { return _lastReport.get(); }
 
-Process::Process(const char *name, ProcessFuncWrapper *func) :
+Process::Process(const char *name, ProcessFuncWrapper *func, bool internal) :
     ::sc_core::sc_process_b(name), excWrapper(nullptr), func(func),
-    _needsStart(true), _isUnwinding(false), _terminated(false),
-    _suspended(false), _disabled(false), _syncReset(false), refCount(0),
-    stackSize(::Fiber::DefaultStackSize), dynamicSensitivity(nullptr)
+    _internal(internal), _needsStart(true), _isUnwinding(false),
+    _terminated(false), _suspended(false), _disabled(false), _syncReset(false),
+    refCount(0), stackSize(::Fiber::DefaultStackSize),
+    dynamicSensitivity(nullptr)
 {
     _dynamic =
             (::sc_core::sc_get_status() >
index d28d46396e303f78bf39df36a43ee4ee43af9fa6..4b43e1b7bb64c63760e1bb4e23e0a755ac236281 100644 (file)
@@ -336,8 +336,11 @@ class Process : public ::sc_core::sc_process_b, public ListNode
     void lastReport(::sc_core::sc_report *report);
     ::sc_core::sc_report *lastReport() const;
 
+    bool hasStaticSensitivities() { return !staticSensitivities.empty(); }
+    bool internal() { return _internal; }
+
   protected:
-    Process(const char *name, ProcessFuncWrapper *func);
+    Process(const char *name, ProcessFuncWrapper *func, bool internal=false);
 
     static Process *_newest;
 
@@ -354,6 +357,9 @@ class Process : public ::sc_core::sc_process_b, public ListNode
 
     ProcessFuncWrapper *func;
     sc_core::sc_curr_proc_kind _procKind;
+
+    bool _internal;
+
     bool _needsStart;
     bool _dynamic;
     bool _isUnwinding;
index 5fbab8038b293979e3347c7541ac97eb2e348455..6f603e73f63f2065ac300be0ab9bd8c0e5bbb946 100644 (file)
@@ -39,7 +39,9 @@ namespace sc_gem5
 class Method : public Process
 {
   public:
-    Method(const char *name, ProcessFuncWrapper *func) : Process(name, func) {}
+    Method(const char *name, ProcessFuncWrapper *func, bool internal=false) :
+        Process(name, func, internal)
+    {}
 
     const char *kind() const override { return "sc_method_process"; }
 
@@ -53,8 +55,8 @@ class Method : public Process
 class Thread : public Process
 {
   public:
-    Thread(const char *name, ProcessFuncWrapper *func) :
-        Process(name, func), ctx(nullptr)
+    Thread(const char *name, ProcessFuncWrapper *func, bool internal=false) :
+        Process(name, func, internal), ctx(nullptr)
     {}
 
     ~Thread() { delete ctx; }
@@ -103,7 +105,8 @@ class Thread : public Process
 class CThread : public Thread
 {
   public:
-    CThread(const char *name, ProcessFuncWrapper *func) : Thread(name, func)
+    CThread(const char *name, ProcessFuncWrapper *func, bool internal=false) :
+        Thread(name, func, internal)
     {
         // We'll be in the initialization list now, but we shouldn't be.
         popListNode();
index b0570a663eb33b80a0d18b4c3b9690af8b1496be..00fe502e67077e54009a13232ec3165ae5c060bb 100644 (file)
@@ -83,6 +83,16 @@ spawnWork(ProcessFuncWrapper *func, const char *name,
             proc->addStatic(new PendingSensitivityFinder(proc, f));
     }
 
+    if (opts && opts->_dontInitialize &&
+            opts->_events.empty() && opts->_ports.empty() &&
+            opts->_exports.empty() && opts->_interfaces.empty() &&
+            opts->_finders.empty()) {
+        SC_REPORT_WARNING(
+                "(W558) disable() or dont_initialize() called on process "
+                "with no static sensitivity, it will be orphaned",
+                proc->name());
+    }
+
     scheduler.reg(proc);
 
     if (dontInitialize)
index 78b47cd4d88338778dcd706368a9eb9ac13f61b4..4c98b68aa78af96630dffc91ba91b8dff2788e53 100644 (file)
@@ -106,6 +106,13 @@ Scheduler::initPhase()
     for (Process *p = toFinalize.getNext(); p; p = toFinalize.getNext()) {
         p->finalize();
         p->popListNode();
+
+        if (!p->hasStaticSensitivities() && !p->internal()) {
+            SC_REPORT_WARNING(
+                    "(W558) disable() or dont_initialize() called on process "
+                    "with no static sensitivity, it will be orphaned",
+                    p->name());
+        }
     }
 
     for (Process *p = initList.getNext(); p; p = initList.getNext()) {