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

ENTITY c07s03b02x02p01n01i02439ent IS
END c07s03b02x02p01n01i02439ent;

ARCHITECTURE c07s03b02x02p01n01i02439arch OF c07s03b02x02p01n01i02439ent IS

BEGIN
  TESTING: PROCESS
    -- Range types are all predefined enumerated types.
    type CHAR_ARR    is ARRAY( CHARACTER )       of BIT;
    type BIT_ARR    is ARRAY( BIT )       of BIT;
    type BOOL_ARR    is ARRAY( BOOLEAN )       of BIT;
    type SEV_ARR    is ARRAY( SEVERITY_LEVEL )    of BIT;

    -- Declare variables of these types.
    variable CHARV : CHAR_ARR;
    variable BITV  : BIT_ARR;
    variable BOOLV : BOOL_ARR;
    variable SEVV  : SEV_ARR;
    variable OKtest: integer := 0;
  BEGIN
    -- Assign each of these arrays using aggregates.
    -- 1. Individual aggregates.
    CHARV := CHAR_ARR'( 'a' => '1', 'b' => '0', NUL to '`' => '1',
                        'c' to character'high => '1' );
    for C in CHARACTER loop
      if  (C = 'a') then
        assert( CHARV( C ) = '1' );
        if NOT( CHARV( C ) = '1' ) then
          OKtest := 1;
        end if;
      elsif (C = 'b') then
        assert( CHARV( C ) = '0' );
        if NOT( CHARV( C ) = '0' ) then
          OKtest := 1;
        end if;
      else
        assert( CHARV( C ) = '1' );
        if NOT( CHARV( C ) = '1' ) then
          OKtest := 1;
        end if;
      end if;
    end loop;
    BITV  := BIT_ARR'( '0' => '0', '1' => '1' );
    assert( BITV( '0' ) = '0' );
    if NOT( BITV( '0' ) = '0' ) then
      OKtest := 1;
    end if;
    assert( BITV( '1' ) = '1' );
    if NOT( BITV( '1' ) = '1' ) then
      OKtest := 1;
    end if;
    BOOLV  := BOOL_ARR'( FALSE => '0', TRUE => '1' );
    assert( BOOLV( FALSE ) = '0' );
    if NOT( BOOLV( FALSE ) = '0' ) then
      OKtest := 1;
    end if;
    assert( BOOLV( TRUE ) = '1' );
    if NOT( BOOLV( TRUE ) = '1' ) then
      OKtest := 1;
    end if;
    SEVV  := SEV_ARR'( NOTE => '0', WARNING => '1', ERROR => '0',
                       FAILURE => '1' );
    assert( SEVV( NOTE ) = '0' );
    assert( SEVV( WARNING ) = '1' );
    assert( SEVV( ERROR ) = '0' );
    assert( SEVV( FAILURE ) = '1' );
    if NOT((SEVV(NOTE)='0')and(SEVV(WARNING) ='1')and(SEVV(ERROR)='0')and(SEVV(FAILURE)='1')) then
      OKtest := 1;
    end if;
    
    -- 2. Groups of aggregates.
    CHARV := CHAR_ARR'( 'a' | 'b' => '1', NUL to '`' => '0',
                        'c' to character'high => '0' );
    for C in CHARACTER loop
      if  (C = 'a') then
        assert( CHARV( C ) = '1' );
        if NOT( CHARV( C ) = '1' ) then
          OKtest := 1;
        end if;
      elsif (C = 'b') then
        assert( CHARV( C ) = '1' );
        if NOT( CHARV( C ) = '1' ) then
          OKtest := 1;
        end if;
      else
        assert( CHARV( C ) = '0' );
        if NOT( CHARV( C ) = '0' ) then
          OKtest := 1;
        end if;
      end if;
    end loop;
    BITV  := BIT_ARR'( '0' | '1' => '0' );
    assert( BITV( '0' ) = '0' );
    assert( BITV( '1' ) = '0' );
    if NOT((BITV('0')='0') and (BITV('1')='0')) then
      OKtest := 1;
    end if;
    BOOLV  := BOOL_ARR'( FALSE | TRUE => '1' );
    assert( BOOLV( FALSE ) = '1' );
    assert( BOOLV( TRUE ) = '1' );
    if NOT((BOOLV(FALSE)='1') and (BOOLV(TRUE)='1')) then
      OKtest := 1;
    end if;
    SEVV  := SEV_ARR'( NOTE | ERROR => '0', WARNING | FAILURE => '1' );
    assert( SEVV( NOTE ) = '0' );
    assert( SEVV( WARNING ) = '1' );
    assert( SEVV( ERROR ) = '0' );
    assert( SEVV( FAILURE ) = '1' );
    if NOT((SEVV(NOTE)='0')and(SEVV(WARNING) ='1')and(SEVV(ERROR)='0')and(SEVV(FAILURE)='1')) then
      OKtest := 1;
    end if;

    -- 3. Use of 'others' in these aggregates.
    CHARV := CHAR_ARR'( 'a' | 'b' => '0', others => '1' );
    for C in CHARACTER loop
      if  (C = 'a') then
        assert( CHARV( C ) = '0' );
        if NOT( CHARV( C ) = '0' ) then
          OKtest := 1;
        end if;
      elsif (C = 'b') then
        assert( CHARV( C ) = '0' );
        if NOT( CHARV( C ) = '0' ) then
          OKtest := 1;
        end if;
      else
        assert( CHARV( C ) = '1' );
        if NOT( CHARV( C ) = '1' ) then
          OKtest := 1;
        end if;
      end if;
    end loop;
    BITV  := BIT_ARR'( others => '1' );
    assert( BITV( '0' ) = '1' );
    assert( BITV( '1' ) = '1' );
    if NOT(( BITV( '0' ) = '1' )and( BITV( '1' ) = '1' ))then
      OKtest := 1;
    end if;
    BOOLV  := BOOL_ARR'( FALSE => '1', others => '0' );
    assert( BOOLV( FALSE ) = '1' );
    assert( BOOLV( TRUE ) = '0' );
    if NOT(( BOOLV( FALSE ) = '1' )and( BOOLV( TRUE ) = '0' ))then
      OKtest := 1;
    end if;
    SEVV  := SEV_ARR'( NOTE | ERROR => '0', others => '1' );
    assert( SEVV( NOTE ) = '0' );
    assert( SEVV( WARNING ) = '1' );
    assert( SEVV( ERROR ) = '0' );
    assert( SEVV( FAILURE ) = '1' );
    if NOT((SEVV(NOTE)='0')and(SEVV(WARNING) ='1')and(SEVV(ERROR)='0')and(SEVV(FAILURE)='1')) then
      OKtest := 1;
    end if;
    wait for 5 ns;
    assert NOT(OKtest = 0) 
      report "***PASSED TEST: c07s03b02x02p01n01i02439" 
      severity NOTE;
    assert (OKtest = 0) 
      report "***FAILED TEST: c07s03b02x02p01n01i02439 - Aggregates with different range types test failed."
      severity ERROR;
    wait;
  END PROCESS TESTING;

END c07s03b02x02p01n01i02439arch;