module SMEX1 
title 'PLD Version of Example State Machine' 

" Input and output pins 
CLOCK, RESET_L, A, B            pin;
Q1..Q3                          pin istype 'reg';
Z                               pin istype 'com';

" Definitions 
QSTATE = [Q1,Q2,Q3];           " State variables 
INIT   = [ 0, 0, 0]; 
A0     = [ 1, 0, 0]; 
A1     = [ 1, 0, 1]; 
OK0    = [ 1, 1, 0]; 
OK1    = [ 1, 1, 1]; 
XTRA1  = [ 0, 0, 1]; 
XTRA2  = [ 0, 1, 0]; 
XTRA3  = [ 0, 1, 1];
RESET = !RESET_L;

state_diagram QSTATE

state INIT: IF RESET THEN INIT
            ELSE IF (A==0) THEN A0
            ELSE A1;

state A0:   IF RESET THEN INIT
            ELSE IF (A==0) THEN OK0
            ELSE A1;

state A1:   IF RESET THEN INIT
            ELSE IF (A==0) THEN A0
            ELSE OK1;

state OK0:  IF RESET THEN INIT
            ELSE IF (B==1)&(A==0) THEN OK0
            ELSE IF (B==1)&(A==1) THEN OK1
            ELSE IF (A==0) THEN OK0
            ELSE IF (A==1) THEN A1;

state OK1:  IF RESET THEN INIT
            ELSE IF (B==1)&(A==0) THEN OK0
            ELSE IF (B==1)&(A==1) THEN OK1
            ELSE IF (A==0) THEN A0
            ELSE IF (A==1) THEN OK1;

state XTRA1: GOTO INIT;
state XTRA2: GOTO INIT;
state XTRA3: GOTO INIT;

equations

QSTATE.CLK = CLOCK; " QSTATE.OE = 1;
Z = (QSTATE == OK0) # (QSTATE == OK1);

END SMEX1
