diff --git a/.cproject b/.cproject
index 67a12ff..04b9909 100644
--- a/.cproject
+++ b/.cproject
@@ -72,7 +72,7 @@
-
+
@@ -155,7 +155,7 @@
-
+
diff --git a/.gitignore b/.gitignore
index a3c39fc..4d498bb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,28 +6,26 @@
/avr-gdb.cmd
/main.cpp
/Debug/
-/Reelease/
/core
/*.launch
/*.csv
/Release/
/*.vcd
/*.ods
-/build/
+/build*/
/*.logs
language.settings.xml
/*.gtkw
/Debug wo LLVM/
-/atmega.txdb
-/atmega.txlgz
-/atmega.txlog
+/*.txdb
+/*.txlgz
+/*.txlog
/.??*bdb.d.0
/.??*bdb.i.0
/.??*bdb.t
/tmp/
-/test1.elf
+/*.elf
/logs/
/*.log
/.gdbinit
/*.out
-/*.txlog
diff --git a/dbt-core b/dbt-core
index 3b05de8..53d78d9 160000
--- a/dbt-core
+++ b/dbt-core
@@ -1 +1 @@
-Subproject commit 3b05de8c14f5d7b5d1ff55f5f244f797992be83d
+Subproject commit 53d78d993a8d3310a8b73fec0b601457b3c0ef75
diff --git a/riscv.sc/incl/sysc/SiFive/gpio.h b/riscv.sc/incl/sysc/SiFive/gpio.h
index 9bc0b7b..57c98b8 100644
--- a/riscv.sc/incl/sysc/SiFive/gpio.h
+++ b/riscv.sc/incl/sysc/SiFive/gpio.h
@@ -18,6 +18,7 @@
#define _GPIO_H_
#include "scc/tlm_target.h"
+#include "scc/ext_attribute.h"
#include
namespace sysc {
@@ -35,11 +36,13 @@ public:
gpio(sc_core::sc_module_name nm);
virtual ~gpio() override; // need to keep it in source file because of fwd declaration of gpio_regs
+ scc::ext_attribute write_to_ws;
protected:
void clock_cb();
void reset_cb();
void update_pins();
void pins_cb();
+ void before_end_of_elaboration();
sc_core::sc_time clk;
std::unique_ptr regs;
std::shared_ptr handler;
diff --git a/riscv.sc/incl/sysc/SiFive/uart.h b/riscv.sc/incl/sysc/SiFive/uart.h
index 095f9d4..80a255f 100644
--- a/riscv.sc/incl/sysc/SiFive/uart.h
+++ b/riscv.sc/incl/sysc/SiFive/uart.h
@@ -17,6 +17,7 @@
#ifndef _UART_H_
#define _UART_H_
+#include "scc/ext_attribute.h"
#include "scc/tlm_target.h"
namespace sysc {
@@ -32,10 +33,12 @@ public:
uart(sc_core::sc_module_name nm);
virtual ~uart() override;
+ scc::ext_attribute write_to_ws;
protected:
void clock_cb();
void reset_cb();
void transmit_data();
+ void before_end_of_elaboration();
sc_core::sc_time clk;
std::unique_ptr regs;
std::vector queue;
diff --git a/riscv.sc/incl/sysc/sc_comm_singleton.h b/riscv.sc/incl/sysc/sc_comm_singleton.h
index d6c4aa9..6eba890 100644
--- a/riscv.sc/incl/sysc/sc_comm_singleton.h
+++ b/riscv.sc/incl/sysc/sc_comm_singleton.h
@@ -75,7 +75,8 @@ private:
std::unique_ptr m_serv;
std::thread t;
void thread_func();
- bool client_started;
+ bool needs_client, client_started;
+ std::vector endpoints;
};
} /* namespace sysc */
diff --git a/riscv.sc/src/sc_main.cpp b/riscv.sc/src/sc_main.cpp
index 5e5e076..c99aeee 100644
--- a/riscv.sc/src/sc_main.cpp
+++ b/riscv.sc/src/sc_main.cpp
@@ -112,7 +112,16 @@ int sc_main(int argc, char *argv[]) {
// sr_report_handler::add_sc_object_to_filter(&i_simple_system.i_master,
// sc_core::SC_WARNING, sc_core::SC_MEDIUM);
// cfg.dump_hierarchy();
- if (vm.count("elf")) cfg.set_value("i_simple_system.i_core_complex.elf_file", vm["elf"].as());
+ cfg.configure();
+ // overwrite with command line settings
+ if (vm.count("gdb-port"))
+ cfg.set_value("i_simple_system.i_core_complex.gdb_server_port", vm["gdb-port"].as());
+ if (vm.count("dump-ir"))
+ cfg.set_value("i_simple_system.i_core_complex.dump_ir", vm.count("dump-ir") != 0);
+ if (vm.count("elf"))
+ cfg.set_value("i_simple_system.i_core_complex.elf_file", vm["elf"].as());
+ if (vm.count("quantum"))
+ tlm::tlm_global_quantum::instance().set(sc_core::sc_time(vm["quantum"].as(), sc_core::SC_NS));
if (vm.count("reset")) {
auto str = vm["reset"].as();
uint64_t start_address = str.find("0x") == 0 ? std::stoull(str.substr(2), 0, 16) : std::stoull(str, 0, 10);
@@ -128,11 +137,6 @@ int sc_main(int argc, char *argv[]) {
LOGGER(disass)::print_severity() = false;
}
}
- cfg.set_value("i_simple_system.i_core_complex.gdb_server_port", vm["gdb-port"].as());
- cfg.set_value("i_simple_system.i_core_complex.dump_ir", vm.count("dump-ir") != 0);
- if (vm.count("quantum")) {
- tlm::tlm_global_quantum::instance().set(sc_core::sc_time(vm["quantum"].as(), sc_core::SC_NS));
- }
///////////////////////////////////////////////////////////////////////////
// run simulation
///////////////////////////////////////////////////////////////////////////
diff --git a/riscv.sc/src/sysc/gpio.cpp b/riscv.sc/src/sysc/gpio.cpp
index 2b761e0..92d5df6 100644
--- a/riscv.sc/src/sysc/gpio.cpp
+++ b/riscv.sc/src/sysc/gpio.cpp
@@ -29,7 +29,8 @@ gpio::gpio(sc_core::sc_module_name nm)
, NAMED(clk_i)
, NAMED(rst_i)
, NAMED(pins_io)
-, NAMEDD(gpio_regs, regs) {
+, NAMEDD(gpio_regs, regs)
+, NAMED(write_to_ws, true, this){
regs->registerResources(*this);
SC_METHOD(clock_cb);
sensitive << clk_i;
@@ -56,14 +57,18 @@ gpio::gpio(sc_core::sc_module_name nm)
}
return true;
});
- LOG(TRACE)<<"Adding WS handler for "<<(std::string{"/ws/"}+name());
- handler=std::make_shared();
- sc_comm_singleton::inst().registerWebSocketHandler((std::string{"/ws/"}+name()).c_str(), handler);
-
}
gpio::~gpio() {}
+void gpio::before_end_of_elaboration() {
+ if(write_to_ws.value) {
+ LOG(TRACE)<<"Adding WS handler for "<<(std::string{"/ws/"}+name());
+ handler=std::make_shared();
+ sc_comm_singleton::inst().registerWebSocketHandler((std::string{"/ws/"}+name()).c_str(), handler);
+ }
+}
+
void gpio::reset_cb() {
if (rst_i.read())
regs->reset_start();
@@ -79,9 +84,8 @@ void gpio::pins_cb(){
auto inval=pins_io.read();
std::string msg(inval.to_string());
sc_core::sc_time now = sc_core::sc_time_stamp();
- sc_comm_singleton::inst().execute([this, msg, now](){
+ if(handler) sc_comm_singleton::inst().execute([this, msg, now](){
std::stringstream os;
- //os << "[" << std::setw(20) << now << "] "<handler->send(os.str());
});
diff --git a/riscv.sc/src/sysc/sc_comm_singleton.cpp b/riscv.sc/src/sysc/sc_comm_singleton.cpp
index 73a474c..0fb93e3 100644
--- a/riscv.sc/src/sysc/sc_comm_singleton.cpp
+++ b/riscv.sc/src/sysc/sc_comm_singleton.cpp
@@ -35,6 +35,7 @@ inline void die(){perror(nullptr);exit(errno);}
sc_comm_singleton::sc_comm_singleton(sc_core::sc_module_name nm)
: sc_core::sc_module(nm)
, m_serv(new Server(std::make_shared(Logger::Level::WARNING)))
+, needs_client(false)
, client_started(false){
m_serv->addPageHandler(std::make_shared(*this));
}
@@ -47,7 +48,7 @@ sc_comm_singleton::~sc_comm_singleton() {
void sc_comm_singleton::start_of_simulation() {
//Launch a thread
t=std::thread(&sc_comm_singleton::thread_func, this);
- start_client();
+ if(needs_client) start_client();
}
void sc_comm_singleton::end_of_simulation() {
@@ -112,6 +113,8 @@ void sc_comm_singleton::registerWebSocketHandler(const char* endpoint,
std::shared_ptr handler,
bool allowCrossOriginRequests) {
get_server().addWebSocketHandler(endpoint, handler, allowCrossOriginRequests);
+ endpoints.push_back(endpoint);
+ needs_client=true;
}
void sc_comm_singleton::execute(std::function f) {
@@ -136,7 +139,6 @@ std::shared_ptr sc_comm_singleton::DefaultPageHandler::handle(const Re
void WsHandler::onConnect(WebSocket* connection) {
_connections.insert(connection);
- //connection->send("Connection established");;
}
void WsHandler::onData(WebSocket* connection, const char* data) {
diff --git a/riscv.sc/src/sysc/uart.cpp b/riscv.sc/src/sysc/uart.cpp
index 2176a32..dc15dbe 100644
--- a/riscv.sc/src/sysc/uart.cpp
+++ b/riscv.sc/src/sysc/uart.cpp
@@ -36,7 +36,8 @@ uart::uart(sc_core::sc_module_name nm)
, tlm_target<>(clk)
, NAMED(clk_i)
, NAMED(rst_i)
-, NAMEDD(uart_regs, regs) {
+, NAMEDD(uart_regs, regs)
+, NAMED(write_to_ws, false, this) {
regs->registerResources(*this);
SC_METHOD(clock_cb);
sensitive << clk_i;
@@ -50,13 +51,18 @@ uart::uart(sc_core::sc_module_name nm)
}
return true;
});
- LOG(TRACE)<<"Adding WS handler for "<<(std::string{"/ws/"}+name());
- handler=std::make_shared();
- sc_comm_singleton::inst().registerWebSocketHandler((std::string{"/ws/"}+name()).c_str(), handler);
}
uart::~uart() {}
+void uart::before_end_of_elaboration() {
+ if(write_to_ws.value) {
+ LOG(TRACE)<<"Adding WS handler for "<<(std::string{"/ws/"}+name());
+ handler=std::make_shared();
+ sc_comm_singleton::inst().registerWebSocketHandler((std::string{"/ws/"}+name()).c_str(), handler);
+ }
+}
+
void uart::clock_cb() {
this->clk = clk_i.read();
}
@@ -74,11 +80,12 @@ void uart::transmit_data() {
std::string msg(queue.begin(), queue.end()-1);
LOG(INFO) << this->name() << " transmit: '" << msg << "'";
sc_core::sc_time now = sc_core::sc_time_stamp();
- sc_comm_singleton::inst().execute([this, msg, now](){
- std::stringstream os;
- os << "{\"time\":\"" << now << "\",\"message\":\""<handler->send(os.str());
- });
+ if(handler)
+ sc_comm_singleton::inst().execute([this, msg, now](){
+ std::stringstream os;
+ os << "{\"time\":\"" << now << "\",\"message\":\""<handler->send(os.str());
+ });
queue.clear();
}
}
diff --git a/sc-components b/sc-components
index 174e0f5..251a735 160000
--- a/sc-components
+++ b/sc-components
@@ -1 +1 @@
-Subproject commit 174e0f55f11fa932c88b99e352e5e9b58cb9ce71
+Subproject commit 251a735cea414b4a79da99ca438da4335bb0fbc5
diff --git a/simple-system.json b/simple-system.json
new file mode 100644
index 0000000..0eebd11
--- /dev/null
+++ b/simple-system.json
@@ -0,0 +1,10 @@
+{
+ "i_simple_system":{
+ "i_uart0":{
+ "write_to_ws": true
+ },
+ "i_gpio0":{
+ "write_to_ws": true
+ }
+ }
+}