systemc: Track the module in the end_of_elaboration callback.
authorGabe Black <gabeblack@google.com>
Wed, 8 Aug 2018 09:02:25 +0000 (02:02 -0700)
committerGabe Black <gabeblack@google.com>
Thu, 20 Sep 2018 01:42:51 +0000 (01:42 +0000)
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>

src/systemc/core/kernel.cc
src/systemc/core/module.cc
src/systemc/core/module.hh
src/systemc/core/object.cc

index 3e3bdbdde94b52a75be235c69ac70c32b3c0fbd0..4eb0bb7653f1c8b6303be701ac0ad4c2658464fb 100644 (file)
@@ -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();
index e41e93285eb72efd6cbcff6f0f948e91f124404d..986ad25a7fa0c26b1fee6b94ce4f6e740343596d 100644 (file)
@@ -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
index 8aebff251435a73d04e5109aacd3cbc1a1897b2c..7e54e29d522312cc3a5341d1d473258f64c48533 100644 (file)
@@ -106,6 +106,9 @@ class Module
 Module *currentModule();
 Module *newModule();
 
+void callbackModule(Module *m);
+Module *callbackModule();
+
 extern std::set<Module *> allModules;
 
 } // namespace sc_gem5
index 13476619b88b9d67b5d5de35e345a48d410f9b28..e066a239f41b120b6a7d041879addd30ac68245a 100644 (file)
@@ -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()) {