mirror of
https://github.com/enjoy-digital/litex.git
synced 2025-01-04 09:52:26 -05:00
corelogic/fsm: delayed enters
This commit is contained in:
parent
a4294762d0
commit
5f28103769
1 changed files with 16 additions and 2 deletions
|
@ -1,13 +1,27 @@
|
|||
from migen.fhdl.structure import *
|
||||
|
||||
class FSM:
|
||||
def __init__(self, *states):
|
||||
self._state_bv = BV(bits_for(len(states)-1))
|
||||
def __init__(self, *states, delayed_enters=[]):
|
||||
nstates = len(states) + sum([d[2] for d in delayed_enters])
|
||||
|
||||
self._state_bv = BV(bits_for(nstates-1))
|
||||
self._state = Signal(self._state_bv)
|
||||
self._next_state = Signal(self._state_bv)
|
||||
for n, state in enumerate(states):
|
||||
setattr(self, state, Constant(n, self._state_bv))
|
||||
self.actions = [[] for i in range(len(states))]
|
||||
|
||||
for name, target, delay in delayed_enters:
|
||||
target_state = getattr(self, target)
|
||||
if delay:
|
||||
name_state = len(self.actions)
|
||||
setattr(self, name, Constant(name_state, self._state_bv))
|
||||
for i in range(delay-1):
|
||||
self.actions.append([self.next_state(Constant(name_state+i+1), self._state_bv)])
|
||||
self.actions.append([self.next_state(target_state)])
|
||||
else:
|
||||
# alias
|
||||
setattr(self, name, getattr(self, target_state))
|
||||
|
||||
def reset_state(self, state):
|
||||
self._state.reset = state
|
||||
|
|
Loading…
Reference in a new issue