diff options
author | whitequark <whitequark@whitequark.org> | 2020-06-08 16:36:26 +0000 |
---|---|---|
committer | whitequark <whitequark@whitequark.org> | 2020-06-08 17:10:45 +0000 |
commit | d5c07e5b6f5c91666867751233f5c537068a7136 (patch) | |
tree | 4528ec4bdca26e99a172b30974102f104a5b29ca /backends | |
parent | 9b39c6f7442a525c8dbfd94f1af65a0b606e648b (diff) | |
download | yosys-d5c07e5b6f5c91666867751233f5c537068a7136.tar.gz yosys-d5c07e5b6f5c91666867751233f5c537068a7136.tar.bz2 yosys-d5c07e5b6f5c91666867751233f5c537068a7136.zip |
cxxrtl: track aliases in VCD writer.
This commit changes the VCD writer such that for all signals that
share `debug_item.curr`, it would only emit a single VCD identifier,
and sample the value once.
Commit 9b39c6f7 added redundancy to debug information by including
alias wires, and increased the size of VCD files proportionally; this
commit eliminates the redundancy from VCD files so that their size
is the same as before.
Diffstat (limited to 'backends')
-rw-r--r-- | backends/cxxrtl/cxxrtl_vcd.h | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/backends/cxxrtl/cxxrtl_vcd.h b/backends/cxxrtl/cxxrtl_vcd.h index 5706917ca..8ba94ea77 100644 --- a/backends/cxxrtl/cxxrtl_vcd.h +++ b/backends/cxxrtl/cxxrtl_vcd.h @@ -34,6 +34,7 @@ class vcd_writer { std::vector<std::string> current_scope; std::vector<variable> variables; std::vector<chunk_t> cache; + std::map<chunk_t*, size_t> aliases; bool streaming = false; void emit_timescale(unsigned number, const std::string &unit) { @@ -103,10 +104,16 @@ class vcd_writer { buffer += '\n'; } - void append_variable(size_t width, chunk_t *curr) { - const size_t chunks = (width + (sizeof(chunk_t) * 8 - 1)) / (sizeof(chunk_t) * 8); - variables.emplace_back(variable { variables.size(), width, curr, cache.size() }); - cache.insert(cache.end(), &curr[0], &curr[chunks]); + const variable ®ister_variable(size_t width, chunk_t *curr) { + if (aliases.count(curr)) { + return variables[aliases[curr]]; + } else { + const size_t chunks = (width + (sizeof(chunk_t) * 8 - 1)) / (sizeof(chunk_t) * 8); + aliases[curr] = variables.size(); + variables.emplace_back(variable { variables.size(), width, curr, cache.size() }); + cache.insert(cache.end(), &curr[0], &curr[chunks]); + return variables.back(); + } } bool test_variable(const variable &var) { @@ -151,20 +158,17 @@ public: switch (item.type) { // Not the best naming but oh well... case debug_item::VALUE: - append_variable(item.width, item.curr); - emit_var(variables.back(), "wire", name); + emit_var(register_variable(item.width, item.curr), "wire", name); break; case debug_item::WIRE: - append_variable(item.width, item.curr); - emit_var(variables.back(), "reg", name); + emit_var(register_variable(item.width, item.curr), "reg", name); break; case debug_item::MEMORY: { const size_t stride = (item.width + (sizeof(chunk_t) * 8 - 1)) / (sizeof(chunk_t) * 8); for (size_t index = 0; index < item.depth; index++) { chunk_t *nth_curr = &item.curr[stride * index]; std::string nth_name = name + '[' + std::to_string(index) + ']'; - append_variable(item.width, nth_curr); - emit_var(variables.back(), "reg", nth_name); + emit_var(register_variable(item.width, nth_curr), "reg", nth_name); } break; } |