with Instrument;
use Instrument;
--     WITH CORE_FUNCTIONS; USE CORE_FUNCTIONS;
--     WITH TRIG_FUNCTIONS; USE TRIG_FUNCTIONS;
procedure Wheta3 is


    pragma Suppress (Access_Check);
    pragma Suppress (Discriminant_Check);
    pragma Suppress (Index_Check);
    pragma Suppress (Length_Check);
    pragma Suppress (Range_Check);
    pragma Suppress (Division_Check);
    pragma Suppress (Overflow_Check);
    pragma Suppress (Elaboration_Check);
    pragma Suppress (Storage_Check);

    X1, X2, X3, X4, X, Y, Z : Float;
    --  INITIALIZE CONSTANTS
    T : constant Float := 0.499975;
    T1 : constant Float := 0.50025;       --  THAT IS WHAT IT SAYS
    T2 : constant Float := 2.0;
    type E_Type is array (1 .. 4) of Float;
    E1 : E_Type;
    I, J, K, L, N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11 : Integer;


    procedure Pa (E : in out E_Type) is
    begin
        while J in 1 .. 5 loop
            E (1) := (E (1) + E (2) + E (3) - E (4)) * T;
            E (2) := (E (1) + E (2) - E (3) + E (4)) * T;
            E (3) := (E (1) - E (2) + E (3) + E (4)) * T;
            E (4) := (-E (1) + E (2) + E (3) + E (4)) / T2;
        end loop;
    end Pa;

    procedure P0 is
    begin
        E1 (J) := E1 (K);
        E1 (K) := E1 (L);
        E1 (L) := E1 (J);
    end P0;

    procedure P3 (X, Y : in out Float; Z : out Float) is
    begin
        X := T * (X + Y);
        Y := T * (X + Y);
        Z := (X + Y) / T2;
    end P3;

begin
    Start ("WHETA3", "WHETSTONE INSTRUCTIONS WITH FLOATS");

    --  READ VALUE OF I, CONTROLLING TOTAL WEIGHT
    --IF I=10, THE TOTAL WEIGHT IS ONE MILLION WHETSTONE INSTRUCTIONS
    -- PUT(" WHETSTONE WANTS AN INTEGER - 10 MAKES A MILLION WHETSTONES ->")
    I := 100;

    N1 := 0;
    N2 := 12 * I;
    N3 := 14 * I;
    N4 := 345 * I;
    N5 := 0;
    N6 := 210 * I;
    N7 := 32 * I;
    N8 := 899 * I;
    N9 := 616 * I;
    N10 := 0;
    N11 := 93 * I;

    --  MODULE 1: SIMPLE IDENTIFIERS;
    X1 := 1.0;
    X2 := -1.0;
    X3 := -1.0;
    X4 := -1.0;
    for I in 1 .. N1 loop
        X1 := (X1 + X2 + X3 - X4) * T;
        X2 := (X1 + X2 - X3 + X4) * T;
        X3 := (X1 - X2 + X3 + X4) * T;
        X4 := (-X1 + X2 + X3 + X4) * T;

    end loop;

    --  MODULE 2: ARRAY ELEMENTS;
    E1 (1) := 1.0;
    E1 (2) := -1.0;
    E1 (3) := -1.0;
    E1 (4) := -1.0;
    for I in 1 .. N2 loop
        E1 (1) := (E1 (1) + E1 (2) + E1 (3) - E1 (4)) * T;
        E1 (2) := (E1 (1) + E1 (2) - E1 (3) + E1 (4)) * T;
        E1 (3) := (E1 (1) - E1 (2) + E1 (3) + E1 (4)) * T;
        E1 (4) := (-E1 (1) + E1 (2) + E1 (3) + E1 (4)) * T;
    end loop;

    --  MODULE 3: ARRAY AS PARAMETER;
    for I in 1 .. N3 loop
        Pa (E1);
    end loop;

    --  MODULE 4: CONDITIONAL JUMPS;
    J := 1;
    for I in 1 .. N4 loop
        if J = 1 then
            J := 2;
        else
            J := 3;
        end if;
        if J > 2 then
            J := 0;
        else
            J := 1;
        end if;
        if J < 1 then
            J := 1;
        else
            J := 0;
        end if;
    end loop;

    --  MODULE 5: OMITTED;

    --  MODULE 6: INTEGER ARITHMETIC;
    J := 1;
    K := 2;
    L := 3;
    for I in 1 .. N6 loop
        J := J * (K - J) * (L - K);
        K := L * K - (L - J) * K;
        L := (L - K) * (K + J);
        E1 (L - 1) := Float (J + K + L);
        E1 (K - 1) := Float (J * K * L);
    end loop;

    --  MODULE 7: TRIG FUNCTIONS;
    --          X := 0.5;
    --          Y := 0.5;
    --          FOR I IN 1..N7  LOOP
    --             X:=T*ATAN(T2*SIN(X)*COS(X)/(COS(X+Y)+COS(X-Y)-1.0));
    --             Y:=T*ATAN(T2*SIN(Y)*COS(Y)/(COS(X+Y)+COS(X-Y)-1.0));
    --          END LOOP;

    --  MODULE 8:
    X := 1.0;
    Y := 1.0;
    Z := 1.0;
    for I in 1 .. N8 loop
        P3 (X, Y, Z);
    end loop;

    --  MODULE 9: ARRAY REFERENCES;
    J := 1;
    K := 2;
    L := 3;
    E1 (1) := 1.0;
    E1 (2) := 2.0;
    E1 (3) := 3.0;
    for I in 1 .. N9 loop
        P0;
    end loop;

    --  MODULE 10: INTEGER ARITHMETIC
    J := 2;
    K := 3;
    for I in 1 .. N10 loop
        J := J + K;
        K := J + K;
        J := K - J;
        K := K - J - J;
    end loop;

    --  MODULE 11: STANDARD FUNCTIONS;
    --          X:= 0.75;
    --          FOR I IN 1..N11  LOOP
    --             X:=SQRT(EXP(LOG(X)/T1));
    --          END LOOP;
    Stop;


end Wheta3;