summaryrefslogtreecommitdiff
path: root/src/mem/slicc/symbols/StateMachine.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/slicc/symbols/StateMachine.py')
-rw-r--r--src/mem/slicc/symbols/StateMachine.py13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py
index 174d66e0f..8a4d7d9b5 100644
--- a/src/mem/slicc/symbols/StateMachine.py
+++ b/src/mem/slicc/symbols/StateMachine.py
@@ -1310,8 +1310,17 @@ ${ident}_Controller::doTransitionWorker(${ident}_Event event,
case = self.symtab.codeFormatter()
# Only set next_state if it changes
if trans.state != trans.nextState:
- ns_ident = trans.nextState.ident
- case('next_state = ${ident}_State_${ns_ident};')
+ if trans.nextState.isWildcard():
+ # When * is encountered as an end state of a transition,
+ # the next state is determined by calling the
+ # machine-specific getNextState function. The next state
+ # is determined before any actions of the transition
+ # execute, and therefore the next state calculation cannot
+ # depend on any of the transitionactions.
+ case('next_state = getNextState(addr);')
+ else:
+ ns_ident = trans.nextState.ident
+ case('next_state = ${ident}_State_${ns_ident};')
actions = trans.actions
request_types = trans.request_types