From dd8b71b413fb511477358b65c7668e6e2574257e Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Wed, 22 Aug 2018 22:45:29 -0700 Subject: [PATCH] systemc: Make sc_process_b less hokey, and make WAIT* work. This change puts sc_process_b into the inheritance hierarchy for the Process types. It also adds the nonstandard sc_set_location function and calls it from the nonstandard WAIT* macros. Change-Id: Ic997dcf74d262774dd7b53504146e372e03af2e0 Reviewed-on: https://gem5-review.googlesource.com/12259 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/core/process.cc | 2 +- src/systemc/core/process.hh | 2 +- src/systemc/core/sc_process_handle.cc | 18 +++++++----------- src/systemc/ext/core/sc_module.hh | 18 +++++++++++------- src/systemc/ext/core/sc_process_handle.hh | 14 ++++++++++---- 5 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/systemc/core/process.cc b/src/systemc/core/process.cc index 5d5c5216f..1a101f749 100644 --- a/src/systemc/core/process.cc +++ b/src/systemc/core/process.cc @@ -371,7 +371,7 @@ Process::lastReport(::sc_core::sc_report *report) ::sc_core::sc_report *Process::lastReport() const { return _lastReport.get(); } Process::Process(const char *name, ProcessFuncWrapper *func, bool _dynamic) : - ::sc_core::sc_object(name), excWrapper(nullptr), func(func), + ::sc_core::sc_process_b(name), excWrapper(nullptr), func(func), _needsStart(true), _dynamic(_dynamic), _isUnwinding(false), _terminated(false), _suspended(false), _disabled(false), _syncReset(false), refCount(0), stackSize(::Fiber::DefaultStackSize), diff --git a/src/systemc/core/process.hh b/src/systemc/core/process.hh index fe75aa7de..17f417b6e 100644 --- a/src/systemc/core/process.hh +++ b/src/systemc/core/process.hh @@ -266,7 +266,7 @@ class PendingSensitivityFinder : public PendingSensitivity typedef std::vector PendingSensitivities; -class Process : public ::sc_core::sc_object, public ListNode +class Process : public ::sc_core::sc_process_b, public ListNode { public: virtual ::sc_core::sc_curr_proc_kind procKind() const = 0; diff --git a/src/systemc/core/sc_process_handle.cc b/src/systemc/core/sc_process_handle.cc index 256d64989..8c756afa2 100644 --- a/src/systemc/core/sc_process_handle.cc +++ b/src/systemc/core/sc_process_handle.cc @@ -55,18 +55,14 @@ sc_unwind_exception::sc_unwind_exception(const sc_unwind_exception &e) : sc_unwind_exception::~sc_unwind_exception() throw() {} -const char * -sc_process_b::name() -{ - warn("%s not implemented.\n", __PRETTY_FUNCTION__); - return ""; -} - -const char * -sc_process_b::kind() +void +sc_set_location(const char *file, int lineno) { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); - return ""; + sc_process_b *current = ::sc_gem5::scheduler.current(); + if (!current) + return; + current->file = file; + current->lineno = lineno; } diff --git a/src/systemc/ext/core/sc_module.hh b/src/systemc/ext/core/sc_module.hh index 7088c4e60..8de57b575 100644 --- a/src/systemc/ext/core/sc_module.hh +++ b/src/systemc/ext/core/sc_module.hh @@ -33,6 +33,7 @@ #include #include "sc_object.hh" +#include "sc_process_handle.hh" #include "sc_sensitive.hh" #include "sc_time.hh" @@ -337,17 +338,20 @@ sc_module *sc_module_sc_new(sc_module *); #define SC_NEW(x) ::sc_core::sc_module_sc_new(new x); // Nonstandard -// In the Accellera implementation, this macro calls sc_set_location to record -// the current file and line, calls wait, and then calls it again to clear the -// file and line. We'll ignore the sc_set_location calls for now. -#define SC_WAIT() ::sc_core::wait(); +#define SC_WAIT() \ + ::sc_core::sc_set_location(__FILE__, __LINE__); \ + ::sc_core::wait(); \ + ::sc_core::sc_set_location(NULL, 0) // Nonstandard -// Same as above, but passes through an argument. -#define SC_WAITN(n) ::sc_core::wait(n); +#define SC_WAITN(n) \ + ::sc_core::sc_set_location(__FILE__, __LINE__); \ + ::sc_core::wait(n); \ + ::sc_core::sc_set_location(NULL, 0) // Nonstandard -#define SC_WAIT_UNTIL(expr) do { SC_WAIT(); } while (!(expr)) +#define SC_WAIT_UNTIL(expr) \ + do { SC_WAIT(); } while (!(expr)) } // namespace sc_core diff --git a/src/systemc/ext/core/sc_process_handle.hh b/src/systemc/ext/core/sc_process_handle.hh index 818690318..04df4728f 100644 --- a/src/systemc/ext/core/sc_process_handle.hh +++ b/src/systemc/ext/core/sc_process_handle.hh @@ -33,6 +33,8 @@ #include #include +#include "systemc/ext/core/sc_object.hh" + namespace sc_gem5 { @@ -78,7 +80,6 @@ namespace sc_core { class sc_event; -class sc_object; enum sc_curr_proc_kind { @@ -114,15 +115,20 @@ class sc_unwind_exception : public std::exception // Deprecated // An incomplete version of sc_process_b to satisfy the tests. -class sc_process_b +class sc_process_b : public sc_object { public: + sc_process_b(const char *name) : sc_object(name), file(nullptr), lineno(0) + {} + sc_process_b() : sc_object(), file(nullptr), lineno(0) {} + const char *file; int lineno; - const char *name(); - const char *kind(); }; +// Nonstandard +void sc_set_location(const char *file, int lineno); + // Deprecated sc_process_b *sc_get_curr_process_handle(); static inline sc_process_b * -- 2.30.2