Skip to content

Commit c9fd000

Browse files
committed
sim.pysim: avoid redundant VCD updates.
This commit properly addresses a bug introduced in 2efeb05 and then temporarily fixed in 58f1d4b. Fixes #429.
1 parent 6e7dbe0 commit c9fd000

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

nmigen/sim/pysim.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -262,11 +262,13 @@ def remove_trigger(self, process, signal):
262262
def wait_interval(self, process, interval):
263263
self.timeline.delay(interval, process)
264264

265-
def commit(self):
265+
def commit(self, changed=None):
266266
converged = True
267267
for signal_state in self.pending:
268268
if signal_state.commit():
269269
converged = False
270+
if changed is not None:
271+
changed.update(self.pending)
270272
self.pending.clear()
271273
return converged
272274

@@ -294,6 +296,8 @@ def reset(self):
294296
process.reset()
295297

296298
def _step(self):
299+
changed = set() if self._vcd_writers else None
300+
297301
# Performs the two phases of a delta cycle in a loop:
298302
converged = False
299303
while not converged:
@@ -303,13 +307,13 @@ def _step(self):
303307
process.runnable = False
304308
process.run()
305309

306-
for vcd_writer in self._vcd_writers:
307-
for signal_state in self._state.pending:
308-
vcd_writer.update(self._timeline.now,
309-
signal_state.signal, signal_state.next)
310-
311310
# 2. commit: apply every queued signal change, waking up any waiting processes
312-
converged = self._state.commit()
311+
converged = self._state.commit(changed)
312+
313+
for vcd_writer in self._vcd_writers:
314+
for signal_state in changed:
315+
vcd_writer.update(self._timeline.now,
316+
signal_state.signal, signal_state.curr)
313317

314318
def advance(self):
315319
self._step()

0 commit comments

Comments
 (0)