mem-ruby: expose transition info to actions
authorTiago Mück <tiago.muck@arm.com>
Thu, 16 Jul 2020 16:14:40 +0000 (11:14 -0500)
committerTiago Mück <tiago.muck@arm.com>
Mon, 12 Oct 2020 14:09:55 +0000 (14:09 +0000)
SLICC compiler generates the curTransitionEvent and
curTransitionNextState functions, which allows actions to check which
event triggered the current transition and what's the next state.

Change-Id: I79c8c4f2839633b7fb3b23cbbdbb32f25db90eab
Signed-off-by: Tiago Mück <tiago.muck@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/31420
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/mem/slicc/symbols/StateMachine.py

index 1399d0040167d27f20631065827ddabdf359fd99..c019e1b3ccf83444ade8e9934d9591576c226702 100644 (file)
@@ -380,6 +380,12 @@ TransitionResult doTransitionWorker(${ident}_Event event,
         code('''
                                     Addr addr);
 
+${ident}_Event m_curTransitionEvent;
+${ident}_State m_curTransitionNextState;
+
+${ident}_Event curTransitionEvent() { return m_curTransitionEvent; }
+${ident}_State curTransitionNextState() { return m_curTransitionNextState; }
+
 int m_counters[${ident}_State_NUM][${ident}_Event_NUM];
 int m_event_counters[${ident}_Event_NUM];
 bool m_possible[${ident}_State_NUM][${ident}_Event_NUM];
@@ -1407,6 +1413,8 @@ ${ident}_Controller::doTransitionWorker(${ident}_Event event,
         code('''
                                         Addr addr)
 {
+    m_curTransitionEvent = event;
+    m_curTransitionNextState = next_state;
     switch(HASH_FUN(state, event)) {
 ''')
 
@@ -1427,10 +1435,12 @@ ${ident}_Controller::doTransitionWorker(${ident}_Event event,
                     # 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);')
+                    case('next_state = getNextState(addr); '
+                         'm_curTransitionNextState = next_state;')
                 else:
                     ns_ident = trans.nextState.ident
-                    case('next_state = ${ident}_State_${ns_ident};')
+                    case('next_state = ${ident}_State_${ns_ident}; '
+                         'm_curTransitionNextState = next_state;')
 
             actions = trans.actions
             request_types = trans.request_types