-- Copyright (C) 2001 Bill Billowitch.

-- Some of the work to develop this test suite was done with Air Force
-- support.  The Air Force and Bill Billowitch assume no
-- responsibilities for this software.

-- This file is part of VESTs (Vhdl tESTs).

-- VESTs is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the
-- Free Software Foundation; either version 2 of the License, or (at
-- your option) any later version. 

-- VESTs is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-- for more details. 

-- You should have received a copy of the GNU General Public License
-- along with VESTs; if not, write to the Free Software Foundation,
-- Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 

-- ---------------------------------------------------------------------
--
-- $Id: tc1910.vhd,v 1.2 2001-10-26 16:29:43 paw Exp $
-- $Revision: 1.2 $
--
-- ---------------------------------------------------------------------

ENTITY c07s02b00x00p09n01i01910ent IS
END c07s02b00x00p09n01i01910ent;

ARCHITECTURE c07s02b00x00p09n01i01910arch OF c07s02b00x00p09n01i01910ent IS

BEGIN
  TESTING: PROCESS
    -- Local declarations.
    variable ValueB1 : BOOLEAN;
    variable ValueB2 : BOOLEAN;
    variable ValueB3 : BOOLEAN;
    variable ValueB4 : BOOLEAN;
    variable ValueI1, SameValueI1, DifferentValueI1 : INTEGER;
    variable ValueI2, SameValueI2, DifferentValueI2 : INTEGER;
    variable ValueI3, SameValueI3, DifferentValueI3 : INTEGER;
    variable ValueI4, SameValueI4, DifferentValueI4 : INTEGER;
    variable ValueI5, SameValueI5, DifferentValueI5 : INTEGER;
    variable ValueI6, SameValueI6, DifferentValueI6 : INTEGER;
    variable ValueI7, SameValueI7, DifferentValueI7 : INTEGER;
  BEGIN
    -- "+" (addition) operator, and the "-" operator.
    --     - NOTE:  The following expression would not be able to parse
    --              if the precedence used was such that the "=" operator
    --              had a higher precedence than the "+" operator.  Thus,
    --              if this parses you are guaranteed that the precedence
    --              relative to these two levels is correctly defined.Same
    --              goes for the "-" operator.
    ValueB1         := 1 + 3 = 3 + 1;
    assert (ValueB1)
      report "The expression has not been processed correctly.(5)";
    ValueB2         := 3 - 1 = 5 - 3;
    assert (ValueB2)
      report "The expression has not been processed correctly.(6)";
    
    -- "+" (sign) operator, and the "-" (sign) operator.
    --     - NOTE:  The following expression would not be able to parse
    --              if the precedence used was such that the "=" operator
    --              had a higher precedence than the "+" operator.  Thus,
    --              if this parses you are guaranteed that the precedence
    --              relative to these two levels is correctly defined.Same
    --              goes for the "-" operator.
    ValueB3         := + 1 = + 1;
    assert (ValueB3)
      report "The expression has not been processed correctly.(7)";
    ValueB4         := - 3 = - 3;
    assert (ValueB4)
      report "The expression has not been processed correctly.(8)";

    ValueI1         := -3 + 4;
    SameValueI1     := (-3) + 4;
    DifferentValueI1:= -(3 + 4);
    assert (ValueI1 = SameValueI1)
      report "Values of lower precedence associated before those of higher precedence.(9)";
    assert (ValueI1 /= DifferentValueI1)
      report "Values of lower precedence associated before those of higher precedence.(10)";
    
    -- "*" operator.
    ValueI2         := 3 + 4 * 5;
    SameValueI2     := 3 + (4 * 5);
    DifferentValueI2:= (3 + 4) * 5;
    assert (ValueI2 = SameValueI2)
      report "Values of lower precedence associated before those of higher precedence.(13)";
    assert (ValueI2 /= DifferentValueI2)
      report "Values of lower precedence associated before those of higher precedence.(14)";
    
    -- "/" operator.
    ValueI3         := 5 + 10 / 5;
    SameValueI3     := 5 + (10 / 5);
    DifferentValueI3:= (5 + 10) / 5;
    assert (ValueI3 = SameValueI3)
      report "Values of lower precedence associated before those of higher precedence.(15)";
    assert (ValueI3 /= DifferentValueI3)
      report "Values of lower precedence associated before those of higher precedence.(16)";
    
    -- "mod" operator.
    ValueI4         := 4 + 11 mod 3;
    SameValueI4     := 4 + (11 mod 3);
    DifferentValueI4:= (4 + 11) mod 3;
    assert (ValueI4 = SameValueI4)
      report "Values of lower precedence associated before those of higher precedence.(17)";
    assert (ValueI4 /= DifferentValueI4)
      report "Values of lower precedence associated before those of higher precedence.(18)";
    
    -- "rem" operator.
    ValueI5         := 4 + 11 rem 3;
    SameValueI5     := 4 + (11 rem 3);
    DifferentValueI5:= (4 + 11) rem 3;
    assert (ValueI5 = SameValueI5)
      report "Values of lower precedence associated before those of higher precedence.(19)";
    assert (ValueI5 /= DifferentValueI5)
      report "Values of lower precedence associated before those of higher precedence.(20)";

    -- "**" operator.
    ValueI6         := 3 * 4 ** 2;
    SameValueI6     := 3 * (4 ** 2);
    DifferentValueI6:= (3 * 4) ** 2;
    assert (ValueI6 = SameValueI6)
      report "Values of lower precedence associated before those of higher precedence.(21)";
    assert (ValueI6 /= DifferentValueI6)
      report "Values of lower precedence associated before those of higher precedence.(22)";
    
    -- "abs" operator.
    ValueI7         := abs (-5) * (-7);
    SameValueI7     := (abs (-5)) * (-7);
    DifferentValueI7:= abs((-5) * (-7));
    assert (ValueI7 = SameValueI7)
      report "Values of lower precedence associated before those of higher precedence.(23)";
    assert (ValueI7 /= DifferentValueI7)
      report "Values of lower precedence associated before those of higher precedence.(24)";

    wait for 5 ns;

    assert NOT(   (ValueB1)   and
                  (ValueB2)   and 
                  (ValueB3)   and 
                  (ValueB4)   and 
                  (ValueI1 = SameValueI1)      and
                  (ValueI1 /= DifferentValueI1)   and
                  (ValueI2 = SameValueI2)      and
                  (ValueI2 /= DifferentValueI2)   and
                  (ValueI3 = SameValueI3)      and
                  (ValueI3 /= DifferentValueI3)   and
                  (ValueI4 = SameValueI4)      and
                  (ValueI4 /= DifferentValueI4)   and
                  (ValueI5 = SameValueI5)      and
                  (ValueI5 /= DifferentValueI5)   and
                  (ValueI6 = SameValueI6)      and
                  (ValueI6 /= DifferentValueI6)   and
                  (ValueI7 = SameValueI7)      and
                  (ValueI7 /= DifferentValueI7)   )
      report "***PASSED TEST: c07s02b00x00p09n01i01910"
      severity NOTE;
    assert (   (ValueB1)   and
               (ValueB2)   and 
               (ValueB3)   and 
               (ValueB4)   and 
               (ValueI1 = SameValueI1)      and
               (ValueI1 /= DifferentValueI1)   and
               (ValueI2 = SameValueI2)      and
               (ValueI2 /= DifferentValueI2)   and
               (ValueI3 = SameValueI3)      and
               (ValueI3 /= DifferentValueI3)   and
               (ValueI4 = SameValueI4)      and
               (ValueI4 /= DifferentValueI4)   and
               (ValueI5 = SameValueI5)      and
               (ValueI5 /= DifferentValueI5)   and
               (ValueI6 = SameValueI6)      and
               (ValueI6 /= DifferentValueI6)   and
               (ValueI7 = SameValueI7)      and
               (ValueI7 /= DifferentValueI7)   )
      report "***FAILED TEST: c07s02b00x00p09n01i01910 - Operators of higher precedence are associated with their operands before operators of lower precedence."
      severity ERROR;
    wait;
  END PROCESS TESTING;

END c07s02b00x00p09n01i01910arch;