(* This file includes normal standard ST and IL code.
 * This code is then included into other tests, once
 * possibly strange things have been defined.
 *
 * Including this normal code will test whether the strange
 * things somehow breack the correct parsing and compiling
 * of normal code.
 *
 * Code in this file must not use the XXXX identfier!
 *)



(***************************************************************************)
(* Test if generic IL code is not affected by any previous declarations... *)
(***************************************************************************)


(* Test each IL operator *)
(* Since our compiler needs to distinguish
 * between IL and ST code, we place each IL
 * operator in a distinct function, to test whether
 * the use of that IL operator as the first IL
 * instruction does not confuse the logic
 * use to determine whether ST or IL is being parsed.
 *)

function bar0005 : int
 var
  e_1, f_1 : int;
 end_var
 & 10
end_function



function bar0006 : int
 var
  e_1, f_1 : int;
 end_var
 &N 10
end_function



function bar0007 : int
 var
  e_1, f_1 : int;
 end_var
 ADD 10
end_function



function bar0008 : int
 var
  e_1, f_1 : int;
 end_var
 AND TRUE
end_function


function bar0009 : int
 var
  e_1, f_1 : int;
 end_var
 ANDN TRUE
end_function


function_block bar0010
 var
  e_1, f_1 : int;
  tt : TP;
 end_var
 CAL tt
end_function_block


function_block bar0011
 var
  e_1, f_1 : int;
  tt : TP;
 end_var
 CALC tt
end_function_block


function_block bar0012
 var
  e_1, f_1 : int;
  tt : TP;
 end_var
 CALCN tt
end_function_block


function_block bar0013
 var
  e_1, f_1 : int;
  tt : CTUD;
 end_var
 CU tt
end_function_block


function_block bar0014
 var
  e_1, f_1 : int;
  tt : CTUD;
 end_var
 CD tt
end_function_block


function_block bar0015
 var
  e_1, f_1 : int;
  tt : R_TRIG;
 end_var
 CLK tt
end_function_block


function bar0016 : int
 var
  e_1, f_1 : int;
 end_var
 DIV e_1
end_function


function bar0017 : int
 var
  e_1, f_1 : int;
 end_var
 EQ e_1
end_function


function bar0018 : int
 var
  e_1, f_1 : int;
 end_var
 GE e_1
end_function


function bar0019 : int
 var
  e_1, f_1 : int;
 end_var
 GT e_1
end_function


function_block bar0020
 var
  e_1, f_1 : int;
  tt : TP;
 end_var
 IN tt
end_function_block


function bar0021 : int
 var
  e_1, f_1 : int;
 end_var
 JMP ll
 ll: LD FALSE
end_function



function bar0022 : int
 var
  e_1, f_1 : int;
 end_var
 JMPC ll
 ll: LD FALSE
end_function


function bar0023 : int
 var
  e_1, f_1 : int;
 end_var
 JMPCN ll
 ll: LD FALSE
end_function



function bar0024 : int
 var
  e_1, f_1 : int;
 end_var
 LD TRUE
end_function


function bar0025 : int
 var
  e_1, f_1 : int;
 end_var
 LDN TRUE
end_function


function bar0026 : int
 var
  e_1, f_1 : int;
 end_var
 LE e_1
end_function


function bar0027 : int
 var
  e_1, f_1 : int;
 end_var
 LT e_1
end_function


function bar0028 : int
 var
  e_1, f_1 : int;
 end_var
 MOD e_1
end_function


function bar0029 : int
 var
  e_1, f_1 : int;
 end_var
 MUL e_1
end_function


function bar0030 : int
 var
  e_1, f_1 : int;
 end_var
 NE e_1
end_function


function bar0031 : int
 var
  e_1, f_1 : int;
 end_var
 NOT TRUE
end_function


function bar0032 : int
 var
  e_1, f_1 : int;
 end_var
 OR TRUE
end_function


function bar0033 : int
 var
  e_1, f_1 : int;
 end_var
 ORN TRUE
end_function


function_block bar0034
 var
  e_1, f_1 : int;
  tt : TP;
 end_var
 PT tt
end_function_block


function_block bar0035
 var
  e_1, f_1 : int;
  tt : CTUD;
 end_var
 PV tt
end_function_block


function bar0036 : int
 var
  e_1, f_1 : bool;
 end_var
 R e_1     (* IL operand *)
end_function


function_block bar0037
 var
  e_1, f_1 : int;
  tt : SR;
 end_var
 R tt     (* FB call *)
end_function_block


function_block bar0038
 var
  e_1, f_1 : int;
  tt : SR;
 end_var
 R1 tt     (* FB call *)
end_function_block


function bar0039 : int
 var
  e_1, f_1 : bool;
 end_var
 RET
end_function


function bar0040 : int
 var
  e_1, f_1 : bool;
 end_var
 RETC
end_function


function bar0041 : int
 var
  e_1, f_1 : bool;
 end_var
 RETCN
end_function


function bar0042 : int
 var
  e_1, f_1 : bool;
 end_var
 S e_1
end_function


function_block bar0043
 var
  e_1, f_1 : int;
  tt : SR;
 end_var
 S1 tt     (* FB call *)
end_function_block


function bar0044 : int
 var
  e_1, f_1 : bool;
 end_var
 ST e_1
end_function


function bar0045 : int
 var
  e_1, f_1 : bool;
 end_var
 STN e_1
end_function


function bar0046 : int
 var
  e_1, f_1 : int;
 end_var
 SUB e_1
end_function


function bar0047 : int
 var
  e_1, f_1 : bool;
 end_var
 XOR e_1
end_function


function bar0048 : int
 var
  e_1, f_1 : bool;
 end_var
 XORN e_1
end_function









(***************************************************************************)
(* Test if generic ST code is not affected by any previous declarations... *)
(***************************************************************************)

(* A helper FUNCTION BLOCK declaration *)
function_block bar1000
 var_input
  a_1, b_1: int;
 end_var
 var_output
  c_1, d_1: int;
 end_var
  c_1 := 10 + b_1;
end_function_block


(* A FUNCTION declaration *)
function bar1001 : int
 var_input
  a_1, b_1: int;
 end_var
 var_output
  c_1, d_1: int;
 end_var
  c_1 := 10 + b_1;
end_function


(* Generic ST code *)

function_block bar1002
 var
  e_1, f_1 : int;
  g_1 : int;
  fb : bar1000;
 end_var
  fb(g_1, 20);
  fb (10, g_1, e_1, f_1);
  fb (a_1 := g_1, b_1:=g_1, c_1=>g_1, d_1=>f_1);
  fb(a_1 := 10, b_1:=20, c_1=>e_1, d_1=>g_1);
  fb (c_1=>g_1, a_1:=20, d_1=>f_1);
  g_1 := fb.c_1;
  fb.a_1 := g_1 + g_1 * 2 * (g_1) / bar1001(g_1, 10, g_1, e_1) MOD g_1 MOD g_1 ** g_1;
  IF (g_1 >= 10) THEN g_1 := 10; END_IF;
  CASE (g_1 + 10) OF
    10: g_1 := 10; 
    10..20:g_1 := 20;
    ELSE g_1 := 20;
  END_CASE;
  FOR g_1 := 10 TO 20 BY 2 DO
    g_1 := g_1 + 1;
  END_FOR;
  FOR e_1 := g_1 TO 20 DO
    g_1 := g_1 + 1;
  END_FOR;
  FOR e_1 := 10 TO g_1 BY 2 DO
    g_1 := g_1 + 1;
  END_FOR;
  FOR e_1 := 10 TO g_1 DO
    g_1 := g_1 + 1;
  END_FOR;
  FOR e_1 := 10 TO 20 BY g_1 DO
    g_1 := g_1 + 1;
  END_FOR;
  WHILE (g_1 >= 10) DO 
    g_1 := 10; 
  END_WHILE;
  REPEAT g_1 := 10; UNTIL (g_1 >= 10) END_REPEAT;
end_function_block










(****************************************************************************)
(* Test if generic SFC code is not affected by any previous declarations... *)
(****************************************************************************)

PROGRAM bar2001
  VAR
    QX1 AT %QX1 : BOOL := 1;
    QX2 AT %QX2 : BOOL := 0;
    QX3 AT %QX3 : BOOL;
    IX1 AT %IX1 : BOOL;
    IX2 AT %IX2 : BOOL;
    IX3 AT %IX3 : BOOL;
  END_VAR
  VAR
    delta_1 : TIME := T#1s;
  END_VAR

  INITIAL_STEP GO:
  END_STEP

  TRANSITION FROM GO TO STEP1
    := IX1 = FALSE;
  END_TRANSITION

  STEP STEP1:
    ONSTEP1();
  END_STEP

  ACTION ONSTEP1:
    QX1 := TRUE;
    QX2 := TRUE;
  END_ACTION

  TRANSITION (PRIORITY := 4) FROM STEP1 TO STEP2
    := IX2 = TRUE;
  END_TRANSITION

  STEP STEP2:
    INLINE1(D, T#1s);
  END_STEP

  ACTION INLINE1:
    QX1 := QX2 XOR QX1; QX2 := NOT QX2;
  END_ACTION

  TRANSITION transition_id1 FROM STEP2 TO A1
    := QX1 = FALSE AND QX2 = FALSE;
  END_TRANSITION

  STEP A1:
    INLINE2(DS, T#1s);
  END_STEP

  ACTION INLINE2:
    IX1 := TRUE;
  END_ACTION

  TRANSITION transition_id2 (PRIORITY := 3) FROM A1 TO STEP2
    := IX1 = TRUE;
  END_TRANSITION

  TRANSITION FROM STEP2 TO (D1, D2, D3)
    := QX1 = TRUE AND QX2 = TRUE;
  END_TRANSITION

  STEP D1:
    INLINE5(L, T#1s);
  END_STEP

  ACTION INLINE5:
    QX1 := FALSE;
  END_ACTION

  TRANSITION FROM D1 TO E1
    := NOT ( QX1 OR QX2 OR QX3 );
  END_TRANSITION

  STEP E1:
    INLINE8(N);
  END_STEP

  ACTION INLINE8:
    QX1 := TRUE;
  END_ACTION

  TRANSITION FROM (E1, E2, E3) TO GO
    := QX1 AND QX2 AND QX3;
  END_TRANSITION

  STEP D2:
    INLINE6(P);
  END_STEP

  ACTION INLINE6:
    QX2 := FALSE;
  END_ACTION

  TRANSITION FROM D2 TO E2
    := NOT ( QX1 OR QX2 OR QX3 );
  END_TRANSITION

  STEP E2:
    INLINE9(R);
  END_STEP

  ACTION INLINE9:
    QX2 := TRUE;
  END_ACTION

  STEP D3:
    INLINE7(S);
  END_STEP

  ACTION INLINE7:
    QX2 := FALSE;
  END_ACTION

  TRANSITION FROM D3 TO E3
    := NOT ( QX1 OR QX2 OR QX3 );
  END_TRANSITION

  STEP E3:
    INLINE10(SD, T#1s);
  END_STEP

  ACTION INLINE10:
    QX3 := TRUE;
  END_ACTION

  TRANSITION FROM STEP2 TO A3
    := QX1 = TRUE AND QX2 = FALSE;
  END_TRANSITION

  STEP A3:
    INLINE4(SL, T#1s);
  END_STEP

  ACTION INLINE4:
    IX1 := TRUE;
  END_ACTION

  TRANSITION FROM A3 TO STEP2
    := IX1 = TRUE;
  END_TRANSITION

  TRANSITION FROM STEP2 TO A2
    := QX1 = FALSE AND QX2 = TRUE;
  END_TRANSITION

  STEP A2:
    INLINE3(L, delta_1);
  END_STEP

  ACTION INLINE3:
    IX1 := FALSE;
  END_ACTION

  TRANSITION FROM A2 TO STEP2
    := IX1 = FALSE;
  END_TRANSITION

  STEP A01:
    INLINE01(L, delta_1, IX1, QX1);
  END_STEP

  ACTION INLINE01:
    IX1 := FALSE;
  END_ACTION

  TRANSITION FROM STEP2 TO A01
    := IX1 = FALSE;
  END_TRANSITION

  STEP A02:
    INLINE01(L, delta_1, IX1, QX1);
    INLINE1 (L, delta_1, IX1, QX1);
    INLINE2 (S);
    INLINE3 ();
  END_STEP

  TRANSITION FROM STEP2 TO A02
    := IX1 = FALSE;
  END_TRANSITION
END_PROGRAM






(*********************************************************************************)
(* Test if generic CONFIGURATION is not affected by any previous declarations... *)
(*********************************************************************************)

CONFIGURATION CONF0001
  RESOURCE STD_RESSOURCE ON BEREMIZ
    TASK STD_TASK(INTERVAL := t#100ms,PRIORITY := 0);
    PROGRAM MAIN_INSTANCE : bar2001;
  END_RESOURCE
END_CONFIGURATION
