summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-08-08 02:02:25 -0700
committerGabe Black <gabeblack@google.com>2018-09-20 01:42:51 +0000
commitde45562a8abae66ada57a3fc06078fadbd9f625b (patch)
tree7624047d4e5e96c42d826e3df5a741191d3333c9
parent3c9da9cdfb1612062f7a7537de00b819cc4300b6 (diff)
downloadgem5-de45562a8abae66ada57a3fc06078fadbd9f625b.tar.xz
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 <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
-rw-r--r--src/systemc/core/kernel.cc5
-rw-r--r--src/systemc/core/module.cc5
-rw-r--r--src/systemc/core/module.hh3
-rw-r--r--src/systemc/core/object.cc4
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<Module *> _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<Module *> 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<Module *> 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()) {