fix deferred assignments
This commit is contained in:
1 parent
d2357859f6
commit
3b7106be80
1 file changed
+7
-2
@@ -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):
|
||||||
|
|||||||
Reference in new issue
Block a user