systemc: Implement the deprecated "timed_out" function.
authorGabe Black <gabeblack@google.com>
Fri, 7 Sep 2018 23:53:12 +0000 (16:53 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 9 Oct 2018 21:43:06 +0000 (21:43 +0000)
This function requires some slightly annoying bookkeeping since it
doesn't just report whether the current process is running as a result
of a timeout, it reports whether it's running as a result of a timeout
*and* it could have been running from some other sensitivity instead.
Pure timeouts don't count as timeouts which makes it harder to handle
in a general way.

Change-Id: I533d97fe66d20d7b83aba80f2ef45a8944668070
Reviewed-on: https://gem5-review.googlesource.com/c/12608
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/core/process.cc
src/systemc/core/process.hh
src/systemc/core/sc_module.cc
src/systemc/core/sc_prim.cc

index cc2eff5128807ca206f42b33f189a4770f507837..e4d213bc17c42ab9076acc5de54dbb017dd290f8 100644 (file)
@@ -88,7 +88,7 @@ SensitivityEventAndList::notifyWork(Event *e)
     e->delSensitivity(this);
     count++;
     if (count == list->events.size())
-        process->satisfySensitivity(this);
+        satisfy();
 }
 
 SensitivityEventOrList::SensitivityEventOrList(
@@ -113,7 +113,7 @@ SensitivityTimeoutAndEventAndList::notifyWork(Event *e)
         SensitivityEventAndList::notifyWork(e);
     } else {
         // There's no inciting event, so this must be a timeout.
-        SensitivityTimeout::notifyWork(e);
+        satisfy(true);
     }
 }
 
@@ -400,10 +400,10 @@ Process::lastReport(::sc_core::sc_report *report)
 
 Process::Process(const char *name, ProcessFuncWrapper *func, bool internal) :
     ::sc_core::sc_process_b(name), excWrapper(nullptr), func(func),
-    _internal(internal), _needsStart(true), _isUnwinding(false),
-    _terminated(false), _suspended(false), _disabled(false), _syncReset(false),
-    refCount(0), stackSize(::Fiber::DefaultStackSize),
-    dynamicSensitivity(nullptr)
+    _internal(internal), _timedOut(false), _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 4b43e1b7bb64c63760e1bb4e23e0a755ac236281..1ea59974724d6f494a23f72bc5332fa29d51b4a5 100644 (file)
@@ -64,7 +64,9 @@ class Sensitivity
     Sensitivity(Process *p) : process(p) {}
     virtual ~Sensitivity() {}
 
-    virtual void notifyWork(Event *e);
+    void satisfy(bool timedOut=false);
+
+    virtual void notifyWork(Event *e) { satisfy(); }
     void notify(Event *e);
     void notify() { notify(nullptr); }
 
@@ -130,6 +132,8 @@ class SensitivityTimeoutAndEvent :
             Process *p, ::sc_core::sc_time t, const ::sc_core::sc_event *e) :
         Sensitivity(p), SensitivityTimeout(p, t), SensitivityEvent(p, e)
     {}
+
+    void notifyWork(Event *e) override { satisfy(e == nullptr); }
 };
 
 class SensitivityTimeoutAndEventAndList :
@@ -156,6 +160,8 @@ class SensitivityTimeoutAndEventOrList :
         Sensitivity(p), SensitivityTimeout(p, t),
         SensitivityEventOrList(p, eol)
     {}
+
+    void notifyWork(Event *e) override { satisfy(e == nullptr); }
 };
 
 typedef std::vector<Sensitivity *> Sensitivities;
@@ -338,6 +344,8 @@ class Process : public ::sc_core::sc_process_b, public ListNode
 
     bool hasStaticSensitivities() { return !staticSensitivities.empty(); }
     bool internal() { return _internal; }
+    bool timedOut() { return _timedOut; }
+    void timedOut(bool to) { _timedOut = to; }
 
   protected:
     Process(const char *name, ProcessFuncWrapper *func, bool internal=false);
@@ -360,6 +368,9 @@ class Process : public ::sc_core::sc_process_b, public ListNode
 
     bool _internal;
 
+    // Needed to support the deprecated "timed_out" function.
+    bool _timedOut;
+
     bool _needsStart;
     bool _dynamic;
     bool _isUnwinding;
@@ -386,8 +397,9 @@ class Process : public ::sc_core::sc_process_b, public ListNode
 };
 
 inline void
-Sensitivity::notifyWork(Event *e)
+Sensitivity::satisfy(bool timedOut)
 {
+    process->timedOut(timedOut);
     process->satisfySensitivity(this);
 }
 
index 2ba0fa221dafad5286fe9afe584e58ae4e04f73d..3cceff119a9537aac34380f9f9025c7d765b21f9 100644 (file)
@@ -361,8 +361,7 @@ sc_module::next_trigger(double d, sc_time_unit u, const sc_event_and_list &eal)
 bool
 sc_module::timed_out()
 {
-    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
-    return false;
+    return ::sc_core::timed_out();
 }
 
 
@@ -561,8 +560,11 @@ next_trigger(double d, sc_time_unit u, const sc_event_and_list &eal)
 bool
 timed_out()
 {
-    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
-    return false;
+    ::sc_gem5::Process *p = sc_gem5::scheduler.current();
+    if (!p)
+        return false;
+    else
+        return p->timedOut();
 }
 
 
index 170abb541efff60d9ad972f69fbfc7969949c866..0f441016185aa6daa56f7760914eb4e6090a9795 100644 (file)
@@ -141,8 +141,7 @@ sc_prim_channel::next_trigger(
 bool
 sc_prim_channel::timed_out()
 {
-    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
-    return false;
+    return ::sc_core::timed_out();
 }
 
 void