summaryrefslogtreecommitdiff
path: root/src/systemc/core/kernel.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/core/kernel.cc')
-rw-r--r--src/systemc/core/kernel.cc80
1 files changed, 48 insertions, 32 deletions
diff --git a/src/systemc/core/kernel.cc b/src/systemc/core/kernel.cc
index 08ccf0767..dc5a86148 100644
--- a/src/systemc/core/kernel.cc
+++ b/src/systemc/core/kernel.cc
@@ -94,22 +94,28 @@ Kernel::regStats()
if (scMainDone || stopAfterCallbacks)
return;
- for (auto m: sc_gem5::allModules)
- for (auto p: m->ports)
- 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();
+ try {
+ for (auto m: sc_gem5::allModules)
+ for (auto p: m->ports)
+ 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 c: sc_gem5::allChannels)
+ c->sc_chan()->end_of_elaboration();
+ } catch (...) {
+ ::sc_gem5::scheduler.throwToScMain();
}
- callbackModule(nullptr);
- for (auto c: sc_gem5::allChannels)
- c->sc_chan()->end_of_elaboration();
+
+ ::sc_gem5::scheduler.elaborationDone(true);
}
void
@@ -123,16 +129,21 @@ Kernel::startup()
if (stopAfterCallbacks)
return;
- 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();
+ 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 c: sc_gem5::allChannels)
+ c->sc_chan()->start_of_simulation();
+ } catch (...) {
+ ::sc_gem5::scheduler.throwToScMain();
}
- for (auto c: sc_gem5::allChannels)
- c->sc_chan()->start_of_simulation();
startComplete = true;
@@ -155,15 +166,20 @@ void
Kernel::stopWork()
{
status(::sc_core::SC_END_OF_SIMULATION);
- 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();
+ 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 c: sc_gem5::allChannels)
+ c->sc_chan()->end_of_simulation();
+ } catch (...) {
+ ::sc_gem5::scheduler.throwToScMain();
}
- for (auto c: sc_gem5::allChannels)
- c->sc_chan()->end_of_simulation();
endComplete = true;