Skip to content

Commit

Permalink
transform/unroll_sync: autodetect in/out
Browse files Browse the repository at this point in the history
  • Loading branch information
Sebastien Bourdeauducq committed Oct 15, 2012
1 parent fecab55 commit daee4fb
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 7 deletions.
2 changes: 1 addition & 1 deletion examples/basic/multi_accumulator.py
Expand Up @@ -19,5 +19,5 @@
accs = [Signal(BV(4)) for i in range(n)]
zs = [Signal() for i in range(n)]

sync_u = unroll_sync(sync, {x: xs, y: ys}, {acc: accs, z: zs})
sync_u = unroll_sync(sync, {x: xs, y: ys, acc: accs, z: zs})
print(verilog.convert(Fragment(sync=sync_u), ios=set(xs+ys+zs)))
30 changes: 24 additions & 6 deletions migen/transform/unroll.py
Expand Up @@ -2,10 +2,11 @@

from migen.fhdl.structure import *
from migen.fhdl.structure import _Operator, _Slice, _Assign, _ArrayProxy
from migen.fhdl.tools import list_targets

# y <= y + a + b
#
# unroll_sync(sync, {b: [b1, b2], c: [c1, c2]}, {y: [y1, y2]})
# unroll_sync(sync, {b: [b1, b2], c: [c1, c2], y: [y1, y2]})
#
# ==>
#
Expand Down Expand Up @@ -72,6 +73,17 @@ def _list_step_dicts(d):
pass
return r

def _classify_repl(statements, replacements):
targets = list_targets(statements)
inputs = {}
outputs = {}
for k, v in replacements.items():
if k in targets:
outputs[k] = v
else:
inputs[k] = v
return inputs, outputs

def _variable_for(s, n):
sn = s.backtrace[-1][0]
if isinstance(sn, str):
Expand All @@ -80,7 +92,12 @@ def _variable_for(s, n):
name = "v"
return Signal(s.bv, name=name, variable=True)

def unroll_sync(statements, inputs, outputs):
def unroll_sync(statements, replacements):
if isinstance(statements, list):
sl = statements
else:
sl = statements(0)
inputs, outputs = _classify_repl(sl, replacements)
assert(inputs or outputs)
if inputs:
sd_in = _list_step_dicts(inputs)
Expand All @@ -106,10 +123,11 @@ def unroll_sync(statements, inputs, outputs):

# replace signals with intermediate variables and copy statements
io_var_dict.update(di)
if isinstance(statements, list):
sl = statements
else:
sl = statements(n)
if n: # done for n = 0 at the beginning of function
if isinstance(statements, list):
sl = statements
else:
sl = statements(n)
r += _replace(sl, io_var_dict, do_var)

# assign to output signals
Expand Down

0 comments on commit daee4fb

Please sign in to comment.