diff options
-rw-r--r-- | src/systemc/core/sensitivity.cc | 31 | ||||
-rw-r--r-- | src/systemc/core/sensitivity.hh | 7 |
2 files changed, 25 insertions, 13 deletions
diff --git a/src/systemc/core/sensitivity.cc b/src/systemc/core/sensitivity.cc index 4f84ce0e9..11e04a100 100644 --- a/src/systemc/core/sensitivity.cc +++ b/src/systemc/core/sensitivity.cc @@ -55,12 +55,29 @@ Sensitivity::satisfy() } bool +Sensitivity::notifyWork(Event *e) +{ + satisfy(); + return true; +} + +bool Sensitivity::notify(Event *e) { + if (scheduler.current() == process) { + static bool warned = false; + if (!warned) { + SC_REPORT_WARNING("(W536) immediate self-notification ignored " + "as of IEEE 1666-2011", process->name()); + warned = true; + } + return false; + } + if (process->disabled()) return false; - satisfy(); - return true; + + return notifyWork(e); } bool @@ -203,11 +220,8 @@ DynamicSensitivityEventOrList::DynamicSensitivityEventOrList( {} bool -DynamicSensitivityEventOrList::notify(Event *e) +DynamicSensitivityEventOrList::notifyWork(Event *e) { - if (process->disabled()) - return false; - events.erase(e->sc_event()); // All the other events need this deleted from their lists since this @@ -225,11 +239,8 @@ DynamicSensitivityEventAndList::DynamicSensitivityEventAndList( {} bool -DynamicSensitivityEventAndList::notify(Event *e) +DynamicSensitivityEventAndList::notifyWork(Event *e) { - if (process->disabled()) - return false; - events.erase(e->sc_event()); // This sensitivity is satisfied if all events have triggered. diff --git a/src/systemc/core/sensitivity.hh b/src/systemc/core/sensitivity.hh index 7a065d2a8..e0244828b 100644 --- a/src/systemc/core/sensitivity.hh +++ b/src/systemc/core/sensitivity.hh @@ -76,7 +76,8 @@ class Sensitivity virtual void clear() = 0; void satisfy(); - virtual bool notify(Event *e); + virtual bool notifyWork(Event *e); + bool notify(Event *e); enum Category { @@ -276,7 +277,7 @@ class DynamicSensitivityEventOrList : DynamicSensitivityEventOrList( Process *p, const sc_core::sc_event_or_list *eol); - bool notify(Event *e) override; + bool notifyWork(Event *e) override; }; //XXX This sensitivity can't be reused. To reset it, it has to be deleted and @@ -292,7 +293,7 @@ class DynamicSensitivityEventAndList : DynamicSensitivityEventAndList( Process *p, const sc_core::sc_event_and_list *eal); - bool notify(Event *e) override; + bool notifyWork(Event *e) override; }; } // namespace sc_gem5 |