module ggame
Title 'Guessing-Game State Machine'
"GGAME device 'P16V8R';

" Inputs and outputs
CLOCK, RESET, G1..G4          pin 1, 2, 3..6;
L1..L4, ERR                   pin 12..15, 19 istype 'com';
Q2..Q0                        pin 16..18 istype 'reg';

" Sets
G = [G1..G4];
L = [L1..L4];

" States
QSTATE = [Q2,Q1,Q0];
S1     = [ 0, 0, 0];
S2     = [ 0, 0, 1];
S3     = [ 0, 1, 1];
S4     = [ 0, 1, 0];
SOK    = [ 1, 0, 0];
SERR   = [ 1, 0, 0];
EXTRA1 = [ 1, 1, 0];
EXTRA2 = [ 1, 1, 1];

state_diagram QSTATE

state S1:  IF RESET THEN SOK ELSE IF G2 # G3 # G4 THEN SERR
           ELSE IF G1 THEN SOK ELSE S2;

state S2:  IF RESET THEN SOK ELSE IF G1 # G3 # G4 THEN SERR
           ELSE IF G2 THEN SOK ELSE S3;

state S3:  IF RESET THEN SOK ELSE IF G1 # G2 # G4 THEN SERR
           ELSE IF G3 THEN SOK ELSE S4;

state S4:  IF RESET THEN SOK ELSE IF G1 # G2 # G3 THEN SERR
           ELSE IF G4 THEN SOK ELSE S1;

state SOK:  IF RESET THEN SOK 
            ELSE IF G1 # G2 # G3 # G4 THEN SOK ELSE S1;

state SERR:  IF RESET THEN SOK 
             ELSE IF G1 # G2 # G3 # G4 THEN SERR ELSE S1;

state EXTRA1:  GOTO SOK;
state EXTRA2:  GOTO SOK;

equations

QSTATE.CLK = CLOCK;

L1  = (QSTATE == S1);
L2  = (QSTATE == S2);
L3  = (QSTATE == S3);
L4  = (QSTATE == S4);
ERR = (QSTATE == SERR);

end ggame
