From de45562a8abae66ada57a3fc06078fadbd9f625b Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Wed, 8 Aug 2018 02:02:25 -0700 Subject: [PATCH] systemc: Track the module in the end_of_elaboration callback. sc_objects constructed during that callback are considered children of the module the callback belongs to. Change-Id: I164863a10beef6d0e2c6d9c5e8f2642d80769dca Reviewed-on: https://gem5-review.googlesource.com/12076 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/core/kernel.cc | 5 ++++- src/systemc/core/module.cc | 5 +++++ src/systemc/core/module.hh | 3 +++ src/systemc/core/object.cc | 4 +++- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/systemc/core/kernel.cc b/src/systemc/core/kernel.cc index 3e3bdbdde..4eb0bb765 100644 --- a/src/systemc/core/kernel.cc +++ b/src/systemc/core/kernel.cc @@ -64,8 +64,11 @@ void Kernel::init() { status(::sc_core::SC_BEFORE_END_OF_ELABORATION); - for (auto m: sc_gem5::allModules) + for (auto m: sc_gem5::allModules) { + callbackModule(m); m->sc_mod()->before_end_of_elaboration(); + } + callbackModule(nullptr); if (stopAfterCallbacks) stopWork(); diff --git a/src/systemc/core/module.cc b/src/systemc/core/module.cc index e41e93285..986ad25a7 100644 --- a/src/systemc/core/module.cc +++ b/src/systemc/core/module.cc @@ -43,6 +43,8 @@ namespace std::list _modules; Module *_new_module; +Module *_callbackModule = nullptr; + } // anonymous namespace Module::Module(const char *name) : _name(name), _sc_mod(nullptr), _obj(nullptr) @@ -90,6 +92,9 @@ newModule() return _new_module; } +void callbackModule(Module *m) { _callbackModule = m; } +Module *callbackModule() { return _callbackModule; } + std::set allModules; } // namespace sc_gem5 diff --git a/src/systemc/core/module.hh b/src/systemc/core/module.hh index 8aebff251..7e54e29d5 100644 --- a/src/systemc/core/module.hh +++ b/src/systemc/core/module.hh @@ -106,6 +106,9 @@ class Module Module *currentModule(); Module *newModule(); +void callbackModule(Module *m); +Module *callbackModule(); + extern std::set allModules; } // namespace sc_gem5 diff --git a/src/systemc/core/object.cc b/src/systemc/core/object.cc index 13476619b..e066a239f 100644 --- a/src/systemc/core/object.cc +++ b/src/systemc/core/object.cc @@ -78,6 +78,8 @@ Object::Object(sc_core::sc_object *_sc_obj, const char *obj_name) : _basename = "object"; Module *p = currentModule(); + if (!p) + p = callbackModule(); Module *n = newModule(); if (n) { @@ -87,7 +89,7 @@ Object::Object(sc_core::sc_object *_sc_obj, const char *obj_name) : if (p) { // We're "within" a parent module, ie we're being created while its - // constructor is running. + // constructor or end_of_elaboration callback is running. parent = p->obj()->_sc_obj; addObject(&parent->_gem5_object->children, _sc_obj); } else if (scheduler.current()) { -- 2.30.2