diff --git a/dbt-rise-core b/dbt-rise-core
index c3c48b0..9b1791a 160000
--- a/dbt-rise-core
+++ b/dbt-rise-core
@@ -1 +1 @@
-Subproject commit c3c48b095dd5f0a9a45d6a488cd0d0375db33813
+Subproject commit 9b1791a9b74ae796adfad19c96b7736bdd5df3fd
diff --git a/dbt-rise-riscv b/dbt-rise-riscv
index 76456a4..4be6176 160000
--- a/dbt-rise-riscv
+++ b/dbt-rise-riscv
@@ -1 +1 @@
-Subproject commit 76456a4fca91bf4817a5c114df98cb76d9e129bf
+Subproject commit 4be6176695a5d2ea426a17333028c18bb95d7c73
diff --git a/scc b/scc
index 726a432..2d5b268 160000
--- a/scc
+++ b/scc
@@ -1 +1 @@
-Subproject commit 726a43247ca0cf5693658dde24fcff8f8988c3d7
+Subproject commit 2d5b268615924c4c4a980909dc8f669bbab0bc9b
diff --git a/src/sc_main.cpp b/src/sc_main.cpp
index f432a30..b730803 100644
--- a/src/sc_main.cpp
+++ b/src/sc_main.cpp
@@ -84,38 +84,7 @@ int sc_main(int argc, char* argv[]) {
SCCERR() << "Invalid parameter specification '" << p << "', should be '='";
}
///////////////////////////////////////////////////////////////////////////
- // set up tracing & transaction recording
- ///////////////////////////////////////////////////////////////////////////
- std::unique_ptr tracer;
- if(auto trace_level = parser.get("trace-level")) {
- auto file_name = parser.get("trace-file");
- auto trace_default_on = parser.is_set("trace-default-on");
- auto enable_tx_trace = static_cast(trace_level & 0x2);
- cfg.set_value("scc_tracer.default_trace_enable", !parser.is_set("trace-default-off"));
- cfg.set_value("scc_tracer.tx_trace_type", static_cast(scc::tracer::file_type::FTR));
- cfg.set_value("scc_tracer.sig_trace_type", static_cast(scc::tracer::file_type::FST));
- tracer = scc::make_unique(file_name, enable_tx_trace, static_cast(trace_level & 0x1));
- if(enable_tx_trace)
- cfg.set_value(core_path + ".enable_instr_trace", true);
- }
- ///////////////////////////////////////////////////////////////////////////
- // instantiate top level
- ///////////////////////////////////////////////////////////////////////////
- auto i_system = scc::make_unique("tb");
- ///////////////////////////////////////////////////////////////////////////
- // dump configuration if requested and/or structure
- ///////////////////////////////////////////////////////////////////////////
- if(parser.get("dump-config").size() > 0) {
- std::ofstream of{parser.get("dump-config")};
- if(of.is_open())
- cfg.dump_configuration(of, true);
- }
- cfg.configure();
- std::unique_ptr dumper;
- if(parser.is_set("dump-structure"))
- dumper.reset(new scc::hierarchy_dumper(parser.get("dump-structure"), scc::hierarchy_dumper::D3JSON));
- ///////////////////////////////////////////////////////////////////////////
- // overwrite config with command line settings
+ // rocess CLI switche and set/overwrite config from command line settings
///////////////////////////////////////////////////////////////////////////
cfg.set_value(core_path + ".gdb_server_port", parser.get("gdb-port"));
cfg.set_value(core_path + ".dump_ir", parser.is_set("dump-ir"));
@@ -144,10 +113,52 @@ int sc_main(int argc, char* argv[]) {
}
}
///////////////////////////////////////////////////////////////////////////
+ // set up tracing & transaction recording
+ ///////////////////////////////////////////////////////////////////////////
+ std::unique_ptr tracer;
+ if(auto trace_level = parser.get("trace-level")) {
+ auto file_name = parser.get("trace-file");
+ auto trace_default_on = parser.is_set("trace-default-on");
+ auto enable_tx_trace = static_cast(trace_level & 0x2);
+ cfg.set_value("scc_tracer.default_trace_enable", !parser.is_set("trace-default-off"));
+ cfg.set_value("scc_tracer.tx_trace_type", static_cast(scc::tracer::file_type::FTR));
+ cfg.set_value("scc_tracer.sig_trace_type", static_cast(scc::tracer::file_type::FST));
+ tracer = scc::make_unique(file_name, enable_tx_trace, static_cast(trace_level & 0x1));
+ if(enable_tx_trace)
+ cfg.set_value(core_path + ".enable_instr_trace", true);
+ }
+ ///////////////////////////////////////////////////////////////////////////
+ // instantiate top level
+ ///////////////////////////////////////////////////////////////////////////
+ auto i_system = scc::make_unique("tb");
+ ///////////////////////////////////////////////////////////////////////////
+ // dump configuration and/or hierarchical structure if requested
+ ///////////////////////////////////////////////////////////////////////////
+ if(parser.get("dump-config").size() > 0) {
+ std::ofstream of{parser.get("dump-config")};
+ if(of.is_open())
+ cfg.dump_configuration(of, true);
+ }
+ cfg.configure();
+ std::unique_ptr dumper;
+ if(parser.is_set("dump-structure"))
+ dumper.reset(new scc::hierarchy_dumper(parser.get("dump-structure"), scc::hierarchy_dumper::D3JSON));
+ ///////////////////////////////////////////////////////////////////////////
// run simulation
///////////////////////////////////////////////////////////////////////////
if(auto res = setjmp(abrt)) {
- SCCERR() << "Simulation aborted with signal " << res << "!";
+ switch(res) {
+ case SIGHUP:
+ case SIGINT:
+ case SIGQUIT:
+ case SIGTERM:
+ case SIGUSR1:
+ case SIGUSR2:
+ SCCINFO() << "Simulation stopped with signal " << res << ".";
+ break;
+ default:
+ SCCERR() << "Simulation aborted with signal " << res << "!";
+ }
} else {
try {
if(parser.is_set("max_time")) {