diff options
Diffstat (limited to 'src/systemc/core')
-rw-r--r-- | src/systemc/core/kernel.cc | 42 | ||||
-rw-r--r-- | src/systemc/core/module.cc | 59 | ||||
-rw-r--r-- | src/systemc/core/module.hh | 9 | ||||
-rw-r--r-- | src/systemc/core/sc_module.cc | 21 |
4 files changed, 94 insertions, 37 deletions
diff --git a/src/systemc/core/kernel.cc b/src/systemc/core/kernel.cc index dc5a86148..ca99e1932 100644 --- a/src/systemc/core/kernel.cc +++ b/src/systemc/core/kernel.cc @@ -75,15 +75,8 @@ Kernel::init() fatal("Simulation called sc_stop during elaboration.\n"); status(::sc_core::SC_BEFORE_END_OF_ELABORATION); - for (auto m: sc_gem5::allModules) { - callbackModule(m); - m->sc_mod()->before_end_of_elaboration(); - for (auto p: m->ports) - p->before_end_of_elaboration(); - for (auto e: m->exports) - e->before_end_of_elaboration(); - } - callbackModule(nullptr); + for (auto m: sc_gem5::allModules) + m->beforeEndOfElaboration(); for (auto c: sc_gem5::allChannels) c->sc_chan()->before_end_of_elaboration(); } @@ -100,15 +93,8 @@ Kernel::regStats() p->_gem5Finalize(); status(::sc_core::SC_END_OF_ELABORATION); - for (auto m: sc_gem5::allModules) { - callbackModule(m); - m->sc_mod()->end_of_elaboration(); - for (auto p: m->ports) - p->end_of_elaboration(); - for (auto e: m->exports) - e->end_of_elaboration(); - } - callbackModule(nullptr); + for (auto m: sc_gem5::allModules) + m->endOfElaboration(); for (auto c: sc_gem5::allChannels) c->sc_chan()->end_of_elaboration(); } catch (...) { @@ -131,14 +117,8 @@ Kernel::startup() try { status(::sc_core::SC_START_OF_SIMULATION); - for (auto m: sc_gem5::allModules) { - m->sc_mod()->start_of_simulation(); - for (auto p: m->ports) - p->start_of_simulation(); - for (auto e: m->exports) - e->start_of_simulation(); - } - callbackModule(nullptr); + for (auto m: sc_gem5::allModules) + m->startOfSimulation(); for (auto c: sc_gem5::allChannels) c->sc_chan()->start_of_simulation(); } catch (...) { @@ -167,14 +147,8 @@ Kernel::stopWork() { status(::sc_core::SC_END_OF_SIMULATION); try { - for (auto m: sc_gem5::allModules) { - m->sc_mod()->end_of_simulation(); - for (auto p: m->ports) - p->end_of_simulation(); - for (auto e: m->exports) - e->end_of_simulation(); - } - callbackModule(nullptr); + for (auto m: sc_gem5::allModules) + m->endOfSimulation(); for (auto c: sc_gem5::allChannels) c->sc_chan()->end_of_simulation(); } catch (...) { diff --git a/src/systemc/core/module.cc b/src/systemc/core/module.cc index 78ce2c6fb..dcd6faa53 100644 --- a/src/systemc/core/module.cc +++ b/src/systemc/core/module.cc @@ -32,6 +32,7 @@ #include <cassert> #include "base/logging.hh" +#include "systemc/ext/core/sc_export.hh" #include "systemc/ext/core/sc_port.hh" #include "systemc/ext/utils/sc_report_handler.hh" @@ -48,7 +49,9 @@ Module *_callbackModule = nullptr; } // anonymous namespace -Module::Module(const char *name) : _name(name), _sc_mod(nullptr), _obj(nullptr) +Module::Module(const char *name) : + _name(name), _sc_mod(nullptr), _obj(nullptr), _ended(false), + _deprecatedConstructor(false) { panic_if(_new_module, "Previous module not finished.\n"); _new_module = this; @@ -105,6 +108,60 @@ Module::bindPorts(std::vector<const ::sc_core::sc_bind_proxy *> &proxies) } } +void +Module::beforeEndOfElaboration() +{ + callbackModule(this); + _sc_mod->before_end_of_elaboration(); + for (auto p: ports) + p->before_end_of_elaboration(); + for (auto e: exports) + e->before_end_of_elaboration(); + callbackModule(nullptr); +} + +void +Module::endOfElaboration() +{ + if (_deprecatedConstructor && !_ended) { + std::string msg = csprintf("module '%s'", name()); + SC_REPORT_WARNING("(W509) module construction not properly completed: " + "did you forget to add a sc_module_name parameter to " + "your module constructor?", msg.c_str()); + } + callbackModule(this); + _sc_mod->end_of_elaboration(); + for (auto p: ports) + p->end_of_elaboration(); + for (auto e: exports) + e->end_of_elaboration(); + callbackModule(nullptr); +} + +void +Module::startOfSimulation() +{ + callbackModule(this); + _sc_mod->start_of_simulation(); + for (auto p: ports) + p->start_of_simulation(); + for (auto e: exports) + e->start_of_simulation(); + callbackModule(nullptr); +} + +void +Module::endOfSimulation() +{ + callbackModule(this); + _sc_mod->end_of_simulation(); + for (auto p: ports) + p->end_of_simulation(); + for (auto e: exports) + e->end_of_simulation(); + callbackModule(nullptr); +} + Module * currentModule() { diff --git a/src/systemc/core/module.hh b/src/systemc/core/module.hh index e60018e2b..aa723368a 100644 --- a/src/systemc/core/module.hh +++ b/src/systemc/core/module.hh @@ -74,6 +74,8 @@ class Module const char *_name; sc_core::sc_module *_sc_mod; Object *_obj; + bool _ended; + bool _deprecatedConstructor; UniqueNameGen nameGen; @@ -85,6 +87,8 @@ class Module void finish(Object *this_obj); const char *name() const { return _name; } + void endModule() { _ended = true; } + void deprecatedConstructor() { _deprecatedConstructor = true; } sc_core::sc_module * sc_mod() const @@ -115,6 +119,11 @@ class Module std::vector<::sc_core::sc_port_base *> ports; std::vector<::sc_core::sc_export_base *> exports; + + void beforeEndOfElaboration(); + void endOfElaboration(); + void startOfSimulation(); + void endOfSimulation(); }; Module *currentModule(); diff --git a/src/systemc/core/sc_module.cc b/src/systemc/core/sc_module.cc index 3cceff119..2fc6e8c75 100644 --- a/src/systemc/core/sc_module.cc +++ b/src/systemc/core/sc_module.cc @@ -221,10 +221,27 @@ sc_module::sc_module() : {} sc_module::sc_module(const sc_module_name &) : sc_module() {} -sc_module::sc_module(const char *_name) : sc_module(sc_module_name(_name)) {} +sc_module::sc_module(const char *_name) : sc_module(sc_module_name(_name)) +{ + _gem5_module->deprecatedConstructor(); + SC_REPORT_WARNING("(W569) sc_module(const char*), " + "sc_module(const std::string&) have been deprecated, use " + "sc_module(const sc_module_name&)", _name); +} sc_module::sc_module(const std::string &_name) : sc_module(sc_module_name(_name.c_str())) -{} +{ + _gem5_module->deprecatedConstructor(); + SC_REPORT_WARNING("(W569) sc_module(const char*), " + "sc_module(const std::string&) have been deprecated, use " + "sc_module(const sc_module_name&)", _name.c_str()); +} + +void +sc_module::end_module() +{ + _gem5_module->endModule(); +} void sc_module::reset_signal_is(const sc_in<bool> &, bool) |