1 from migen
.fhdl
import visit
as fhdl
2 from migen
.corelogic
.fsm
import FSM
4 class AbstractNextState
:
5 def __init__(self
, target_state
):
6 self
.target_state
= target_state
8 # entry state is first state returned
14 def assemble(self
, n_states
, n_exit_states
):
15 self
.states
+= n_states
16 for exit_state
in self
.exit_states
:
17 exit_state
.insert(0, AbstractNextState(n_states
[0]))
18 self
.exit_states
= n_exit_states
21 return self
.states
, self
.exit_states
23 # like list.index, but using "is" instead of comparison
25 for i
, e
in enumerate(l
):
29 class _LowerAbstractNextState(fhdl
.NodeTransformer
):
30 def __init__(self
, fsm
, states
, stnames
):
33 self
.stnames
= stnames
35 def visit_unknown(self
, node
):
36 if isinstance(node
, AbstractNextState
):
37 index
= _index_is(self
.states
, node
.target_state
)
38 estate
= getattr(self
.fsm
, self
.stnames
[index
])
39 return self
.fsm
.next_state(estate
)
43 def implement_fsm(states
):
44 stnames
= ["S" + str(i
) for i
in range(len(states
))]
46 lans
= _LowerAbstractNextState(fsm
, states
, stnames
)
47 for i
, state
in enumerate(states
):
48 actions
= lans
.visit(state
)
49 fsm
.act(getattr(fsm
, stnames
[i
]), *actions
)