228ca258232fbf2c1745db5a39fd935e710685a5 migen/genlib/fsm.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/migen/genlib/fsm.py b/migen/genlib/fsm.py index 85f3a40..3d5bac4 100644 --- a/migen/genlib/fsm.py +++ b/migen/genlib/fsm.py @@ -6,6 +6,7 @@ class FSM: self._state = Signal(max=nstates) self._next_state = Signal(max=nstates) + self._last_state = Signal(max=nstates) for n, state in enumerate(states): setattr(self, state, n) self.actions = [[] for i in range(len(states))] @@ -31,6 +32,15 @@ class FSM: def act(self, state, *statements): self.actions[state] += statements + def entering(self, state): + return (self._state == state) & (self._last_state != state) + + def ongoing(self, state): + return self._state == state + + def exiting(self, state): + return (self._state != state) & (self._last_state == state) + def get_fragment(self): cases = dict((s, a) for s, a in enumerate(self.actions) if a) comb = [ @@ -38,4 +48,5 @@ class FSM: Case(self._state, cases) ] sync = [self._state.eq(self._next_state)] + sync += [self._last_state.eq(self._state)] return Fragment(comb, sync)