aboutsummaryrefslogtreecommitdiffstats
path: root/backends/cxxrtl/cxxrtl_vcd.h
diff options
context:
space:
mode:
authorwhitequark <whitequark@whitequark.org>2020-06-08 17:38:11 +0000
committerwhitequark <whitequark@whitequark.org>2020-06-08 17:38:11 +0000
commit467152d79fd4c8e25b48481f742fe318b1395728 (patch)
treeb36e0098256c79776c8df3952b90862c5b707fe6 /backends/cxxrtl/cxxrtl_vcd.h
parentf2d7a18756088f4167b91c5ec4735bb694f36567 (diff)
downloadyosys-467152d79fd4c8e25b48481f742fe318b1395728.tar.gz
yosys-467152d79fd4c8e25b48481f742fe318b1395728.tar.bz2
yosys-467152d79fd4c8e25b48481f742fe318b1395728.zip
cxxrtl: don't check immutable values for changes in VCD writer.
This commit changes the VCD writer such that for all signals that have `debug_item.type == VALUE && debug_item.next == nullptr`, it would only sample the value once. Commit f2d7a187 added more debug information by including constant wires, and decreased the performance of VCD writer proportionally because the constant wires were still repeatedly sampled; this commit eliminates the performance hit.
Diffstat (limited to 'backends/cxxrtl/cxxrtl_vcd.h')
-rw-r--r--backends/cxxrtl/cxxrtl_vcd.h14
1 files changed, 10 insertions, 4 deletions
diff --git a/backends/cxxrtl/cxxrtl_vcd.h b/backends/cxxrtl/cxxrtl_vcd.h
index 8ba94ea77..5f5f612b5 100644
--- a/backends/cxxrtl/cxxrtl_vcd.h
+++ b/backends/cxxrtl/cxxrtl_vcd.h
@@ -104,19 +104,25 @@ class vcd_writer {
buffer += '\n';
}
- const variable &register_variable(size_t width, chunk_t *curr) {
+ const variable &register_variable(size_t width, chunk_t *curr, bool immutable = false) {
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]);
+ if (immutable) {
+ variables.emplace_back(variable { variables.size(), width, curr, (size_t)-1 });
+ } else {
+ 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) {
+ if (var.prev_off == (size_t)-1)
+ return false; // immutable
const size_t chunks = (var.width + (sizeof(chunk_t) * 8 - 1)) / (sizeof(chunk_t) * 8);
if (std::equal(&var.curr[0], &var.curr[chunks], &cache[var.prev_off])) {
return false;
@@ -158,7 +164,7 @@ public:
switch (item.type) {
// Not the best naming but oh well...
case debug_item::VALUE:
- emit_var(register_variable(item.width, item.curr), "wire", name);
+ emit_var(register_variable(item.width, item.curr, /*immutable=*/item.next == nullptr), "wire", name);
break;
case debug_item::WIRE:
emit_var(register_variable(item.width, item.curr), "reg", name);