Browse Source

fix deferred assignments

devel
Stefan Holst 1 week ago
parent
commit
3b7106be80
  1. 9
      src/kyupy/verilog.py

9
src/kyupy/verilog.py

@ -144,6 +144,7 @@ class VerilogTransformer(Transformer):
c.io_nodes[positions[name]] = n c.io_nodes[positions[name]] = n
if sd.kind == 'input': if sd.kind == 'input':
Line(c, n, Node(c, name)) Line(c, n, Node(c, name))
deferred_assignments = set()
while len(assignments) > 0: while len(assignments) > 0:
more_assignments = [] more_assignments = []
for target, source in assignments: # pass 1.5: process signal assignments for target, source in assignments: # pass 1.5: process signal assignments
@ -163,7 +164,7 @@ class VerilogTransformer(Transformer):
source_sigs.append(s) source_sigs.append(s)
for t, s in zip(target_sigs, source_sigs): for t, s in zip(target_sigs, source_sigs):
if t in c.forks: if t in c.forks:
assert s not in c.forks, 'assignment between two driven signals' assert s not in c.forks, f'assignment between two driven signals: source={s} target={t}'
Line(c, c.forks[t], Node(c, s)) Line(c, c.forks[t], Node(c, s))
elif s in c.forks: elif s in c.forks:
assert t not in c.forks, 'assignment between two driven signals' assert t not in c.forks, 'assignment between two driven signals'
@ -173,7 +174,11 @@ class VerilogTransformer(Transformer):
const_count += 1 const_count += 1
Line(c, cnode, Node(c, t)) Line(c, cnode, Node(c, t))
else: else:
more_assignments.append((target, source)) if (t, s) in deferred_assignments:
log.info(f'ignoring: assign {t} = {s}')
else:
more_assignments.append((t, s))
deferred_assignments.add((t, s))
assignments = more_assignments assignments = more_assignments
for stmt in args[2:]: # pass 2: connect signals to readers for stmt in args[2:]: # pass 2: connect signals to readers
if isinstance(stmt, Instantiation): if isinstance(stmt, Instantiation):

Loading…
Cancel
Save