systemc: Implement the deprecated "timed_out" function.
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>
This commit is contained in:
@@ -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() >
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user