systemc: Make sure the right type process is running when calling wait.

That function is only allowed when running a thread or cthread.

Change-Id: Idf98b70018169d4f724aa8168f3c4e8161f0b83d
Reviewed-on: https://gem5-review.googlesource.com/c/12967
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2018-09-22 06:28:32 -07:00
parent 0f6961d200
commit 2ede803d7c
2 changed files with 34 additions and 0 deletions

View File

@@ -591,10 +591,29 @@ timed_out()
}
namespace
{
bool
waitErrorCheck(sc_gem5::Process *p)
{
if (p->procKind() == SC_METHOD_PROC_) {
SC_REPORT_ERROR(
"(E519) wait() is only allowed in SC_THREADs and SC_CTHREADs",
"\n in SC_METHODs use next_trigger() instead");
return true;
}
return false;
}
} // anonymous namespace
void
wait()
{
sc_gem5::Process *p = sc_gem5::scheduler.current();
if (waitErrorCheck(p))
return;
p->cancelTimeout();
p->clearDynamic();
sc_gem5::scheduler.yield();
@@ -615,6 +634,8 @@ void
wait(const sc_event &e)
{
sc_gem5::Process *p = sc_gem5::scheduler.current();
if (waitErrorCheck(p))
return;
p->cancelTimeout();
::sc_gem5::newDynamicSensitivityEvent(p, &e);
sc_gem5::scheduler.yield();
@@ -624,6 +645,8 @@ void
wait(const sc_event_or_list &eol)
{
sc_gem5::Process *p = sc_gem5::scheduler.current();
if (waitErrorCheck(p))
return;
p->cancelTimeout();
::sc_gem5::newDynamicSensitivityEventOrList(p, &eol);
sc_gem5::scheduler.yield();
@@ -633,6 +656,8 @@ void
wait(const sc_event_and_list &eal)
{
sc_gem5::Process *p = sc_gem5::scheduler.current();
if (waitErrorCheck(p))
return;
p->cancelTimeout();
::sc_gem5::newDynamicSensitivityEventAndList(p, &eal);
sc_gem5::scheduler.yield();
@@ -642,6 +667,8 @@ void
wait(const sc_time &t)
{
sc_gem5::Process *p = sc_gem5::scheduler.current();
if (waitErrorCheck(p))
return;
p->setTimeout(t);
p->clearDynamic();
sc_gem5::scheduler.yield();
@@ -657,6 +684,8 @@ void
wait(const sc_time &t, const sc_event &e)
{
sc_gem5::Process *p = sc_gem5::scheduler.current();
if (waitErrorCheck(p))
return;
p->setTimeout(t);
::sc_gem5::newDynamicSensitivityEvent(p, &e);
sc_gem5::scheduler.yield();
@@ -672,6 +701,8 @@ void
wait(const sc_time &t, const sc_event_or_list &eol)
{
sc_gem5::Process *p = sc_gem5::scheduler.current();
if (waitErrorCheck(p))
return;
p->setTimeout(t);
::sc_gem5::newDynamicSensitivityEventOrList(p, &eol);
sc_gem5::scheduler.yield();
@@ -687,6 +718,8 @@ void
wait(const sc_time &t, const sc_event_and_list &eal)
{
sc_gem5::Process *p = sc_gem5::scheduler.current();
if (waitErrorCheck(p))
return;
p->setTimeout(t);
::sc_gem5::newDynamicSensitivityEventAndList(p, &eal);
sc_gem5::scheduler.yield();