systemc: Ignore immediate self notifications.

Change-Id: If5140bd86159e9257eb9e6ccb8301dd6349dacff
Reviewed-on: https://gem5-review.googlesource.com/c/13310
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2018-10-06 00:57:48 -07:00
parent 05f2a5f4f6
commit d6c3453025
2 changed files with 26 additions and 14 deletions

View File

@@ -55,14 +55,31 @@ Sensitivity::satisfy()
}
bool
Sensitivity::notify(Event *e)
Sensitivity::notifyWork(Event *e)
{
if (process->disabled())
return false;
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;
return notifyWork(e);
}
bool
Sensitivity::ofMethod()
{
@@ -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.

View File

@@ -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