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)