sim.pysim: use VCD aliases to reduce space and time overhead.

On Minerva SoC, this reduces VCD file size by about 35%, and reduces
runtime overhead of writing VCDs by 10% or less.
This commit is contained in:
whitequark 2020-07-11 12:25:31 +00:00
parent 30e2f91176
commit 0a90aa1b17
2 changed files with 13 additions and 12 deletions

View file

@ -111,23 +111,25 @@ class _VCDWaveformWriter(_WaveformWriter):
var_name_suffix = var_name var_name_suffix = var_name
else: else:
var_name_suffix = "{}${}".format(var_name, suffix) var_name_suffix = "{}${}".format(var_name, suffix)
vcd_var = self.vcd_writer.register_var( if signal not in self.vcd_vars:
scope=var_scope, name=var_name_suffix, vcd_var = self.vcd_writer.register_var(
var_type=var_type, size=var_size, init=var_init) scope=var_scope, name=var_name_suffix,
var_type=var_type, size=var_size, init=var_init)
self.vcd_vars[signal] = vcd_var
else:
self.vcd_writer.register_alias(
scope=var_scope, name=var_name_suffix,
var=self.vcd_vars[signal])
break break
except KeyError: except KeyError:
suffix = (suffix or 0) + 1 suffix = (suffix or 0) + 1
if signal not in self.vcd_vars:
self.vcd_vars[signal] = set()
self.vcd_vars[signal].add(vcd_var)
if signal not in self.gtkw_names: if signal not in self.gtkw_names:
self.gtkw_names[signal] = (*var_scope, var_name_suffix) self.gtkw_names[signal] = (*var_scope, var_name_suffix)
def update(self, timestamp, signal, value): def update(self, timestamp, signal, value):
vcd_vars = self.vcd_vars.get(signal) vcd_var = self.vcd_vars.get(signal)
if vcd_vars is None: if vcd_var is None:
return return
vcd_timestamp = self.timestamp_to_vcd(timestamp) vcd_timestamp = self.timestamp_to_vcd(timestamp)
@ -135,8 +137,7 @@ class _VCDWaveformWriter(_WaveformWriter):
var_value = self.decode_to_vcd(signal, value) var_value = self.decode_to_vcd(signal, value)
else: else:
var_value = value var_value = value
for vcd_var in vcd_vars: self.vcd_writer.change(vcd_var, vcd_timestamp, var_value)
self.vcd_writer.change(vcd_var, vcd_timestamp, var_value)
def close(self, timestamp): def close(self, timestamp):
if self.vcd_writer is not None: if self.vcd_writer is not None:

View file

@ -40,7 +40,7 @@ setup(
install_requires=[ install_requires=[
"importlib_metadata; python_version<'3.8'", # for __version__ and nmigen._yosys "importlib_metadata; python_version<'3.8'", # for __version__ and nmigen._yosys
"importlib_resources; python_version<'3.9'", # for nmigen._yosys "importlib_resources; python_version<'3.9'", # for nmigen._yosys
"pyvcd~=0.2.0", # for nmigen.pysim "pyvcd~=0.2.2", # for nmigen.pysim
"Jinja2~=2.11", # for nmigen.build "Jinja2~=2.11", # for nmigen.build
], ],
extras_require={ extras_require={