summaryrefslogtreecommitdiff
path: root/src/systemc/core/module.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/core/module.cc')
-rw-r--r--src/systemc/core/module.cc37
1 files changed, 27 insertions, 10 deletions
diff --git a/src/systemc/core/module.cc b/src/systemc/core/module.cc
index 97a4a9ffa..3b7e922e3 100644
--- a/src/systemc/core/module.cc
+++ b/src/systemc/core/module.cc
@@ -29,42 +29,59 @@
#include "systemc/core/module.hh"
+#include <cassert>
#include <list>
#include "base/logging.hh"
-namespace SystemC
+namespace sc_gem5
{
namespace
{
std::list<Module *> _modules;
-
-Module *_top_module = nullptr;
+Module *_new_module;
} // anonymous namespace
+Module::Module(const char *name) : _name(name), _sc_mod(nullptr), _obj(nullptr)
+{
+ panic_if(_new_module, "Previous module not finished.\n");
+ _new_module = this;
+}
+
void
-Module::push()
+Module::finish(Object *this_obj)
{
- if (!_top_module)
- _top_module = this;
+ assert(!_obj);
+ _obj = this_obj;
_modules.push_back(this);
+ _new_module = nullptr;
}
void
Module::pop()
{
- panic_if(_modules.size(), "Popping from empty module list.\n");
+ panic_if(!_modules.size(), "Popping from empty module list.\n");
panic_if(_modules.back() != this,
"Popping module which isn't at the end of the module list.\n");
+ panic_if(_new_module, "Pop with unfinished module.\n");
+ _modules.pop_back();
+}
+
+Module *
+currentModule()
+{
+ if (_modules.empty())
+ return nullptr;
+ return _modules.back();
}
Module *
-topModule()
+newModule()
{
- return _top_module;
+ return _new_module;
}
-} // namespace SystemC
+} // namespace sc_gem5