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:
Gabe Black
2018-09-07 16:53:12 -07:00
parent c524f21396
commit 442d556fbf
4 changed files with 27 additions and 14 deletions

View 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() >

View 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);
}

View 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();
}

View 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