1: // Example of a state machine: an R-S flip flop. 05/25/98 r@elilabs.com 3: #include "rs_ff_session.H" 4: #include "rs_ff_state.H" 7: // An active instance of a state machine is a session traversing a 8: // state graph. A state machine is created by injecting a session 9: // into a state of a state graph. A state machine proceeds by 10: // responding to events. Events are messages passed by function call. 11: // Every session object has a virtual member function corresponding to 12: // every possible event in the state graph's domain. 15: // Make a state graph to simulate the behavior of an RS flip-flop. 16: // 17: // 18: // 19: // LOGIC SYMBOL GATE LEVEL IMPLEMENTATION 20: // 21: // 22: // >------+ 23: // | 24: // | ______ 25: // __o___ | \ 26: // | | S >----------| \ 27: // | S | | NAND )o---+-----> Q 28: // | Q |-----> +---| / | 29: // | | | |______/ | 30: // | | | | 31: // | _ | +----\ /----------+ 32: // | Q |-----> X 33: // | R | +----/ \----------+ 34: // |______| | ______ | 35: // o | | \ | 36: // | +---| \ | _ 37: // | | NAND )o---+-----> Q 38: // >------+ R >---------| / 39: // |______/ 40: // 41: // 42: // 43: // 44: // STATE TRANSITION DIAGRAM 45: // 46: // 47: // _ 48: // _______ S __________ 49: // / \------------------------>/ \ 50: // ( Set_S ) ( Set_Sbar ) 51: // \_______/<------------------------\__________/ 52: // | S _ / ^ ^ 53: // | R / | | 54: // | __________ / / | 55: // _ | /-----/ \<--' / | _ 56: // R | S / ( Squashed ) / R | S 57: // | / -->\__________/-----' | 58: // | / /_ | 59: // | | / S _ | 60: // ___v_v___/__ R ____|____ 61: // / \<-------------------/ \ 62: // ( Reset_Rbar ) ( Reset_R ) 63: // \____________/------------------->\_________/ 64: // R 65: // 66: // 67: // 68: // OUTPUT TRUTH TABLE 69: // _ 70: // State Output Q Output Q 71: // ----- -------- -------- 72: // Set_S T F 73: // Set_Sbar T F 74: // Squashed T T 75: // Reset_Rbar F T 76: // Reset_R F T 77: // 78: // 79: // 80: // STATE TRANSITION TABLE 81: // 82: // \ Events _ _ 83: // States \ S S R R 84: // ----------\------------------------------------------------- 85: // Set_S | ignored Set_Sbar ignored Reset_Rbar 86: // Set_Sbar | Set_S ignored ignored Squashed 87: // Squashed | Reset_Rbar ignored Set_Sbar ignored 88: // Reset_Rbar | ignored Squashed Reset_R ignored 89: // Reset_R | ignored Set_Sbar ignored Reset_Rbar 92: // The main line entry point. 93: // 94: int main(int nargs, char* arg[]) { 95: int x = 0; 97: // THE STATE NODES 98: // 99: rs_ff_state Set_S; 100: rs_ff_state Set_Sbar; 101: rs_ff_state Squashed; 102: rs_ff_state Reset_Rbar; 103: rs_ff_state Reset_R; 105: // THE STATE TRANSITION GRAPH 106: // 107: // Output Guard Next State 108: // -------- ---------------- ------------------------------------------------- 109: // State Q Qbar S Sbar R Rbar S Sbar R Rbar 110: // ------ - ---- - ---- - ---- ---------- ---------- ---------- ---------- 111: Set_S .set( T, F, F, T, F, T, &Set_S, &Set_Sbar, &Set_S, &Reset_Rbar ); 112: Set_Sbar .set( T, F, T, F, F, T, &Set_S, &Set_Sbar, &Set_Sbar, &Squashed ); 113: Squashed .set( T, T, T, F, T, F, &Reset_Rbar, &Squashed, &Set_Sbar, &Squashed ); 114: Reset_Rbar .set( F, T, F, T, T, F, &Reset_Rbar, &Squashed, &Reset_R, &Reset_Rbar ); 115: Reset_R .set( F, T, F, T, F, T, &Reset_R, &Set_Sbar, &Reset_R, &Reset_Rbar ); 116: // 117: // NOTES: 118: // 1. The '.set' method establishes initial values for a state node. 119: // 2. Exits marked "ignored" are implemented by FALSE guards. 121: // An RS flip-flop in an indeterminate state, such as during power-up. 122: // 123: rs_ff_session flop(&Squashed); 125: flop.S(); // raise S -- go to Reset_Rbar -- Q = lo; Qbar = hi; 126: flop.Sbar(); // lower S -- back to squashed -- Q = Qbar = hi; 128: flop.R(); // raise R -- go to Set_Sbar -- Q = hi; Qbar = lo; 129: flop.Rbar(); // lower R -- back to squashed -- Q = Qbar = hi; 131: flop.S(); // raise S -- go to Reset_Rbar -- Q = lo; Qbar = hi; 132: flop.R(); // raise R -- go to Reset_R -- Q = lo; Qbar = hi; 134: flop.Rbar(); // lower R -- go to Reset_Rbar -- Q = lo; Qbar = hi; 135: flop.R(); // raise R -- go to Reset_R -- Q = lo; Qbar = hi; 137: flop.Sbar(); // lower S -- go to Set_Sbar -- Q = hi; Qbar = lo; 138: flop.S(); // raise S -- go to Set_S -- Q = hi; Qbar = lo; 140: flop.Rbar(); // lower R -- go to Reset_Rbar -- Q = lo; Qbar = hi; 141: flop.R(); // raise R -- go to Reset_R -- Q = lo; Qbar = hi; 143: return x; 144: }