-- 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: tc522.vhd,v 1.2 2001-10-26 16:29:56 paw Exp $
-- $Revision: 1.2 $
--
-- ---------------------------------------------------------------------

ENTITY c03s03b00x00p03n01i00522ent IS
END c03s03b00x00p03n01i00522ent;

ARCHITECTURE c03s03b00x00p03n01i00522arch OF c03s03b00x00p03n01i00522ent IS

BEGIN
  TESTING: PROCESS
    -- Declare access types and access objects everywhere.
    -- Enumerated types.
    type    SWITCH_LEVEL is ('0', '1', 'X');
    type    AC1 is access SWITCH_LEVEL;

    subtype LOGIC_SWITCH is SWITCH_LEVEL range '0' to '1';
    type    AC2 is access LOGIC_SWITCH;

    -- Access types.
    type    AC3 is access AC2;

    -- array types.  Constrained.
    type WORD   is array(0 to 31) of BIT;
    type    AC4 is access WORD;

    -- record types.
    type DATE is
      record
        DAY           : INTEGER range 1 to 31;
        MONTH         : INTEGER range 1 to 12;
        YEAR          : INTEGER range -10000 to 1988;
      end record;
    type AC5 is access DATE;

    -- INTEGER types.
    type AC6 is access INTEGER;
    
    type POSITIVE        is range 0 to INTEGER'HIGH;
    type AC7 is access POSITIVE;
    
    -- Physical types.
    type AC8 is access TIME;
    
    type DISTANCE is range 0 to 1E9
      units
        -- Base units.
        A;                    -- angstrom
        
        -- Metric lengths.
        nm       = 10 A;      -- nanometer
        um       = 1000 nm;   -- micrometer (or micron)
        mm       = 1000 um;   -- millimeter
        cm       = 10 mm;     -- centimeter
        
        -- English lengths.
        mil      = 254000 A;  -- mil
        inch     = 1000 mil;  -- inch
      end units;
    type AC10 is access DISTANCE;
    
    -- floating point types.
    type AC11 is access REAL;
    
    type POSITIVE_R    is range 0.0 to REAL'HIGH;
    type AC12 is access POSITIVE_R;
    -- Predefined enumerated types.
    type AC13 is access BIT;
    
    type AC14 is access SEVERITY_LEVEL;
    
    type AC15 is access BOOLEAN;
    
    type AC16 is access CHARACTER;
    
    -- Other predefined types.
    type AC17 is access NATURAL;
    
    type AC18 is access STRING;
    
    type AC19 is access BIT_VECTOR;
    
    type MEMORY is array(0 to 64) of WORD;
    type AC20 is access MEMORY;
    
    -- Declare all the variables.
    variable VAR1 : AC1;
    variable VAR2 : AC2;
    variable VAR3 : AC3;
    variable VAR4 : AC4;
    variable VAR5 : AC5;
    variable VAR6 : AC6;
    variable VAR7 : AC7;
    variable VAR8 : AC8;
    variable VAR10: AC10;
    variable VAR11: AC11;
    variable VAR12: AC12;
    variable VAR13: AC13;
    variable VAR14: AC14;
    variable VAR15: AC15;
    variable VAR16: AC16;
    variable VAR17: AC17;
    variable VAR18: AC18;
    variable VAR19: AC19;
    variable VAR20: AC20;
  BEGIN
    -- Assert that all variables are initially NULL.
    assert (VAR1 = null)
      report "VAR1 has not been set to NULL.";
    assert (VAR2 = null)
      report "VAR2 has not been set to NULL.";
    assert (VAR3 = null)
      report "VAR3 has not been set to NULL.";
    assert (VAR4 = null)
      report "VAR4 has not been set to NULL.";
    assert (VAR5 = null)
      report "VAR5 has not been set to NULL.";
    assert (VAR6 = null)
      report "VAR6 has not been set to NULL.";
    assert (VAR7 = null)
      report "VAR7 has not been set to NULL.";
    assert (VAR8 = null)
      report "VAR8 has not been set to NULL.";
    assert (VAR10 = null)
      report "VAR10 has not been set to NULL.";
    assert (VAR11 = null)
      report "VAR11 has not been set to NULL.";
    assert (VAR12 = null)
      report "VAR12 has not been set to NULL.";
    assert (VAR13 = null)
      report "VAR13 has not been set to NULL.";
    assert (VAR14 = null)
      report "VAR14 has not been set to NULL.";
    assert (VAR15 = null)
      report "VAR15 has not been set to NULL.";
    assert (VAR16 = null)
      report "VAR16 has not been set to NULL.";
    assert (VAR17 = null)
      report "VAR17 has not been set to NULL.";
    assert (VAR18 = null)
      report "VAR18 has not been set to NULL.";
    assert (VAR19 = null)
      report "VAR19 has not been set to NULL.";
    assert (VAR20 = null)
      report "VAR20 has not been set to NULL.";
    assert   NOT(      (VAR1 = null)
                       and (VAR2 = null)
                       and (VAR3 = null)
                       and (VAR4 = null)
                       and (VAR5 = null)
                       and (VAR6 = null)
                       and (VAR7 = null)
                       and (VAR8 = null)
                       and (VAR10 = null)
                       and (VAR11 = null)
                       and (VAR12 = null)
                       and (VAR13 = null)
                       and (VAR14 = null)
                       and (VAR15 = null)
                       and (VAR16 = null)
                       and (VAR17 = null)
                       and (VAR18 = null)
                       and (VAR19 = null)
                       and (VAR20 = null))
      report "***PASSED TEST: c03s03b00x00p03n01i00522"
      severity NOTE;
    assert   (      (VAR1 = null)
                    and (VAR2 = null)
                    and (VAR3 = null)
                    and (VAR4 = null)
                    and (VAR5 = null)
                    and (VAR6 = null)
                    and (VAR7 = null)
                    and (VAR8 = null)
                    and (VAR10 = null)
                    and (VAR11 = null)
                    and (VAR12 = null)
                    and (VAR13 = null)
                    and (VAR14 = null)
                    and (VAR15 = null)
                    and (VAR16 = null)
                    and (VAR17 = null)
                    and (VAR18 = null)
                    and (VAR19 = null)
                    and (VAR20 = null))
      report "***FAILED TEST: c03s03b00x00p03n01i00522 - The null value of an access type is the default initial value of the type."
      severity ERROR;
    wait;
  END PROCESS TESTING;

END c03s03b00x00p03n01i00522arch;