From a470ef51456fe05e8d8ae6a95493e1da5a088a0d Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Mon, 27 Aug 2018 21:20:18 -0700 Subject: [PATCH] systemc: Report errors when proc ctrl funcs are called during elab. Change-Id: I19475b86d04af5b3e4e907d9e24cb15666fb7bb1 Reviewed-on: https://gem5-review.googlesource.com/12274 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/core/process.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/systemc/core/process.cc b/src/systemc/core/process.cc index 94e49a8af..0784ab49f 100644 --- a/src/systemc/core/process.cc +++ b/src/systemc/core/process.cc @@ -32,6 +32,7 @@ #include "base/logging.hh" #include "systemc/core/event.hh" #include "systemc/core/scheduler.hh" +#include "systemc/ext/core/sc_main.hh" #include "systemc/ext/core/sc_process_handle.hh" #include "systemc/ext/utils/sc_report_handler.hh" @@ -212,6 +213,12 @@ Process::enable(bool inc_kids) void Process::kill(bool inc_kids) { + if (::sc_core::sc_get_status() != ::sc_core::SC_RUNNING) { + SC_REPORT_ERROR( + "(E572) a process may not be killed before it is initialized", + name()); + } + // Propogate the kill to our children no matter what happens to us. if (inc_kids) forEachKid([](Process *p) { p->kill(true); }); @@ -235,6 +242,12 @@ Process::kill(bool inc_kids) void Process::reset(bool inc_kids) { + if (::sc_core::sc_get_status() != ::sc_core::SC_RUNNING) { + SC_REPORT_ERROR( + "(E573) a process may not be asynchronously reset while" + "the simulation is not running", name()); + } + // Propogate the reset to our children no matter what happens to us. if (inc_kids) forEachKid([](Process *p) { p->reset(true); }); @@ -257,6 +270,12 @@ Process::reset(bool inc_kids) void Process::throw_it(ExceptionWrapperBase &exc, bool inc_kids) { + if (::sc_core::sc_get_status() != ::sc_core::SC_RUNNING) { + SC_REPORT_ERROR( + "(E574) throw_it not allowed unless simulation is running ", + name()); + } + if (inc_kids) forEachKid([&exc](Process *p) { p->throw_it(exc, true); }); -- 2.30.2