AnnexF/stack_int_st.txt
changeset 0 fb772792efd1
equal deleted inserted replaced
-1:000000000000 0:fb772792efd1
       
     1 FUNCTION_BLOCK STACK_INT
       
     2   VAR_INPUT PUSH, POP: BOOL R_EDGE; (* Basic stack operations *)
       
     3             R1 : BOOL ;          (* Over-riding reset *)
       
     4             IN : INT ;           (* Input to be pushed *)
       
     5             N  : INT ;           (* Maximum depth after reset *)
       
     6   END_VAR
       
     7   VAR_OUTPUT EMPTY : BOOL := 1 ;     (* Stack empty *)
       
     8              OFLO  : BOOL := 0 ;     (* Stack overflow *)
       
     9              OUT   : INT  := 0 ;     (* Top of stack data *)
       
    10   END_VAR
       
    11   VAR STK : ARRAY[0..127] OF INT; (* Internal stack *)
       
    12       NI : INT :=128  ;           (* Storage for N upon reset *)
       
    13       PTR : INT := -1 ;           (* Stack pointer *)
       
    14   END_VAR
       
    15     (* Function Block body *)
       
    16     IF R1 THEN
       
    17        OFLO := 0; EMPTY := 1; PTR := -1;
       
    18        NI := LIMIT (MN:=1,IN:=N,MX:=128); OUT := 0;
       
    19     ELSIF POP & NOT EMPTY THEN
       
    20        OFLO := 0; PTR := PTR-1; EMPTY := PTR < 0;
       
    21        IF EMPTY THEN OUT := 0;
       
    22        ELSE OUT := STK[PTR];
       
    23        END_IF ;
       
    24     ELSIF PUSH & NOT OFLO THEN
       
    25        EMPTY := 0; PTR := PTR+1; OFLO := (PTR = NI);
       
    26        IF NOT OFLO THEN OUT := IN ; STK[PTR] := IN;
       
    27        ELSE OUT := 0;
       
    28        END_IF ;
       
    29     END_IF ;
       
    30 
       
    31   END_FUNCTION_BLOCK