-- 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: tc757.vhd,v 1.2 2001-10-26 16:30:00 paw Exp $
-- $Revision: 1.2 $
--
-- ---------------------------------------------------------------------

ENTITY c01s01b01x01p05n02i00757ent IS
  generic(
    zero : integer := 0;
    one  : integer := 1;
    two  : integer := 2;
    three: integer := 3;
    four : integer := 4;
    five : integer := 5;
    six  : integer := 6;
    seven: integer := 7;
    eight: integer := 8;
    nine : integer := 9;
    fifteen:integer:= 15;
    C1 : boolean := true;
    C2 : bit := '1';
    C3 : character := 's';
    C4 : severity_level := note;
    C5 : integer := 3;
    C6 : real := 3.0;
    C7 : time := 3 ns;
    C8 : natural := 1;
    C9 : positive := 1;
    C10 : string := "shishir";
    C11 : bit_vector := B"0011"
    );
END c01s01b01x01p05n02i00757ent;

ARCHITECTURE c01s01b01x01p05n02i00757arch OF c01s01b01x01p05n02i00757ent IS
  subtype hi_to_low_range is integer range zero to seven;

  type boolean_vector is array (natural range <>) of boolean;
  type severity_level_vector is array (natural range <>) of severity_level;
  type integer_vector is array (natural range <>) of integer;
  type real_vector is array (natural range <>) of real;
  type time_vector is array (natural range <>) of time;
  type natural_vector is array (natural range <>) of natural;
  type positive_vector is array (natural range <>) of positive;

  subtype boolean_vector_st is boolean_vector(zero to fifteen);
  subtype severity_level_vector_st is  severity_level_vector(zero to fifteen);
  subtype integer_vector_st is  integer_vector(zero to fifteen);
  subtype real_vector_st is  real_vector(zero to fifteen);
  subtype time_vector_st is  time_vector(zero to fifteen);
  subtype natural_vector_st is  natural_vector(zero to fifteen);
  subtype positive_vector_st is  positive_vector(zero to fifteen);

  type boolean_cons_vector is array (fifteen downto zero) of boolean;
  type severity_level_cons_vector is array (fifteen downto zero) of severity_level;
  type integer_cons_vector is array (fifteen downto zero) of integer;
  type real_cons_vector is array (fifteen downto zero) of real;
  type time_cons_vector is array (fifteen downto zero) of time;
  type natural_cons_vector is array (fifteen downto zero) of natural;
  type positive_cons_vector is array (fifteen downto zero) of positive;
  
  type boolean_cons_vectorofvector is array (zero to fifteen) of boolean_cons_vector;
  type severity_level_cons_vectorofvector is array (zero to fifteen) of severity_level_cons_vector;
  type integer_cons_vectorofvector is array (zero to fifteen) of integer_cons_vector ;
  type real_cons_vectorofvector is array (zero to fifteen) of real_cons_vector;
  type time_cons_vectorofvector is array (zero to fifteen) of time_cons_vector;
  type natural_cons_vectorofvector is array (zero to fifteen) of natural_cons_vector;
  type positive_cons_vectorofvector is array (zero to fifteen) of positive_cons_vector; 
  subtype column is integer range one to two;
  subtype row is integer range one to eight;
  type s2boolean_cons_vector is array (row,column) of boolean;
  type s2bit_cons_vector is array (row,column) of bit;
  type s2char_cons_vector is array (row,column) of character;
  type s2severity_level_cons_vector is array (row,column) of severity_level;
  type s2integer_cons_vector is array (row,column) of integer;
  type s2real_cons_vector is array (row,column) of real;
  type s2time_cons_vector is array (row,column) of time;
  type s2natural_cons_vector is array (row,column) of natural;
  type s2positive_cons_vector is array (row,column) of positive;
  
  type record_std_package is record
                               a: boolean;
                               b: bit;
                               c:character;
                               d:severity_level;
                               e:integer;
                               f:real;
                               g:time;
                               h:natural;
                               i:positive;
                               j:string(one to seven);
                               k:bit_vector(zero to three);
                             end record;

  type record_array_st is record
                            a:boolean_vector_st;
                            b:severity_level_vector_st;
                            c:integer_vector_st;
                            d:real_vector_st;
                            e:time_vector_st;
                            f:natural_vector_st;
                            g:positive_vector_st;
                          end record;
  
  type record_cons_array is record
                              a:boolean_cons_vector;
                              b:severity_level_cons_vector;
                              c:integer_cons_vector;
                              d:real_cons_vector;
                              e:time_cons_vector;
                              f:natural_cons_vector;
                              g:positive_cons_vector;
                            end record;
  
  type record_2cons_array is record
                               a:s2boolean_cons_vector;
                               b:s2bit_cons_vector;
                               c:s2char_cons_vector;
                               d:s2severity_level_cons_vector;
                               e:s2integer_cons_vector;
                               f:s2real_cons_vector;
                               g:s2time_cons_vector;
                               h:s2natural_cons_vector;
                               i:s2positive_cons_vector;
                             end record;
  
  type record_cons_arrayofarray is record
                                     a:boolean_cons_vectorofvector;
                                     b:severity_level_cons_vectorofvector;
                                     c:integer_cons_vectorofvector;
                                     d:real_cons_vectorofvector;
                                     e:time_cons_vectorofvector;
                                     f:natural_cons_vectorofvector;
                                     g:positive_cons_vectorofvector;
                                   end record;
  
  type record_array_new is record
                             a:boolean_vector(zero to fifteen);
                             b:severity_level_vector(zero to fifteen);
                             c:integer_vector(zero to fifteen);
                             d:real_vector(zero to fifteen);
                             e:time_vector(zero to fifteen);
                             f:natural_vector(zero to fifteen);
                             g:positive_vector(zero to fifteen);
                           end record;
  
  type record_of_records is record
                              a: record_std_package;
                              c: record_cons_array;
                              e: record_2cons_array;
                              g: record_cons_arrayofarray;
                              i: record_array_st;
                              j: record_array_new;
                            end record;
  subtype boolean_vector_range is boolean_vector(hi_to_low_range);
  subtype severity_level_vector_range is severity_level_vector(hi_to_low_range);
  subtype integer_vector_range is integer_vector(hi_to_low_range);
  subtype real_vector_range is real_vector(hi_to_low_range);
  subtype time_vector_range is time_vector(hi_to_low_range);
  subtype natural_vector_range is natural_vector(hi_to_low_range);
  subtype positive_vector_range is positive_vector(hi_to_low_range);
  
  type array_rec_std is array (integer range <>) of record_std_package;
  type array_rec_cons is array (integer range <>) of record_cons_array;
  type array_rec_2cons is array (integer range <>) of record_2cons_array;
  type array_rec_rec is array (integer range <>) of record_of_records;
  
  subtype array_rec_std_st is array_rec_std (hi_to_low_range);
  subtype array_rec_cons_st is array_rec_cons (hi_to_low_range);
  subtype array_rec_2cons_st is  array_rec_2cons (hi_to_low_range);
  subtype array_rec_rec_st is array_rec_rec (hi_to_low_range);
  
  type record_of_arr_of_record is record
                                    a: array_rec_std(zero to seven);
                                    b: array_rec_cons(zero to seven);
                                    c: array_rec_2cons(zero to seven);
                                    d: array_rec_rec(zero to seven);
                                  end record;
  
  type four_value is ('Z','0','1','X');                                 --enumerated type
  type four_value_vector is array (natural range <>) of four_value;
  subtype four_value_vector_range is four_value_vector(hi_to_low_range);
  
  type current is range -2147483647 to +2147483647
    units
      nA;
      uA = 1000 nA;
      mA = 1000 uA;
      A  = 1000 mA;
    end units;
  
  type current_vector is array (natural range <>) of current;
  subtype current_vector_range is current_vector(hi_to_low_range);
  
  
  type resistance is range -2147483647 to +2147483647
    units
      uOhm;
      mOhm = 1000 uOhm;
      Ohm = 1000 mOhm;
      KOhm  = 1000 Ohm;
    end units;
  
  type resistance_vector is array (natural range <>) of resistance;
  subtype resistance_vector_range is resistance_vector(hi_to_low_range);
--   function resolution14(i:in four_value_vector) return four_value;        --bus resolution
--   subtype four_value_state is resolution14 four_value;                    --function type
  type four_value_map is array(four_value) of boolean;
  subtype binary is four_value range '0' to '1';
  type byte is array(zero to seven) of bit;
  subtype word is bit_vector(zero to fifteen);                                 --constrained array
  constant size :integer := seven;
  type primary_memory is array(zero to size) of word;                     --array of an array
  type primary_memory_module is                                       --record with field
    record                                                               --as an array
      enable:binary;
      memory_number:primary_memory;
    end record;
  type whole_memory is array(0 to size) of primary_memory_module;     --array of a complex record
  subtype delay is integer range one to 10;
  
  
  constant     C12 : boolean_vector := (C1,false);
  constant     C13 : severity_level_vector := (C4,error);
  constant     C14 : integer_vector := (one,two,three,four);
  constant     C15 : real_vector := (1.0,2.0,C6,4.0);
  constant     C16 : time_vector := (1 ns, 2 ns,C7, 4 ns);
  constant     C17 : natural_vector := (one,2,3,4);
  constant     C18 : positive_vector := (one,2,3,4);
  constant C19 : boolean_cons_vector := (others => C1);
  constant C20 : severity_level_cons_vector := (others => C4);
  constant C21 : integer_cons_vector := (others => C5);
  constant C22 : real_cons_vector := (others => C6);
  constant C23 : time_cons_vector :=  (others => C7);
  constant C24 : natural_cons_vector :=  (others => C8);
  constant C25 : positive_cons_vector :=  (others => C9);
  constant C26 : boolean_cons_vectorofvector := (others => (others => C1));
  constant C27 : severity_level_cons_vectorofvector :=  (others => (others => C4));
  constant C28 : integer_cons_vectorofvector := (others => (others => C5));
  constant C29 : real_cons_vectorofvector := (others => (others => C6));
  constant C30 : time_cons_vectorofvector := (others => (others => C7));
  constant C31 : natural_cons_vectorofvector := (others => (others => C8));
  constant C32 : positive_cons_vectorofvector := (others => (others => C9));
  
BEGIN
  assert (hi_to_low_range'left = 0) report "generic for left bound of hi_to_low_range not working" severity failure;
  assert (hi_to_low_range'right = 7) report "generic for right bound of hi_to_low_range not working" severity failure;
  assert (row'left = 1) report "generic constrained for left bound of row not working" severity failure;
  assert (row'right = 8) report "generic constrained for right bound of row not working" severity failure;
  assert (column'left = 1) report "generic constrained for left bound of column not working" severity failure;
  assert (column'right = 2) report "generic constrained for right bound of column not working" severity failure;
  assert (boolean_cons_vector'left = 15) report "generic constrained for left bound of array not working" severity failure;
  assert (severity_level_cons_vector'left = 15) report "generic constrained for left bound of array not working" severity failure;
  assert (integer_cons_vector'left = 15) report "generic constrained for left bound of array not working" severity failure;
  assert (real_cons_vector'left = 15) report "generic constrained for left bound of array not working" severity failure;
  assert (time_cons_vector'left = 15) report "generic constrained for left bound of array not working" severity failure;
  assert (natural_cons_vector'left = 15) report "generic constrained for left bound of array not working" severity failure;
  assert (positive_cons_vector'left = 15) report "generic constrained for left bound of array not working" severity failure;
  assert (boolean_cons_vector'right = 0) report "generic constrained for right bound of array not working" severity failure;
  assert (severity_level_cons_vector'right = 0) report "generic constrained for right bound of array not working" severity failure;
  assert (integer_cons_vector'right = 0) report "generic constrained for right bound of array not working" severity failure;
  assert (real_cons_vector'right = 0) report "generic constrained for right bound of array not working" severity failure;
  assert (time_cons_vector'right = 0) report "generic constrained for right bound of array not working" severity failure;
  assert (natural_cons_vector'right = 0) report "generic constrained for right bound of array not working" severity failure;
  assert (positive_cons_vector'right = 0) report "generic constrained for right bound of array not working" severity failure;
  assert  (boolean_cons_vectorofvector'left = 0) report "generic constrained for left bound of array not working" severity failure;
  assert  (severity_level_cons_vectorofvector'left = 0) report "generic constrained for left bound of array not working" severity failure;
  assert  (integer_cons_vectorofvector'left = 0) report "generic constrained for left bound of array not working" severity failure;
  assert  (real_cons_vectorofvector'left = 0) report "generic constrained for left bound of array not working" severity failure;
  assert  (time_cons_vectorofvector'left = 0) report "generic constrained for left bound of array not working" severity failure;
  assert  (natural_cons_vectorofvector'left = 0) report "generic constrained for left bound of array not working" severity failure;
  assert  (positive_cons_vectorofvector'left = 0) report "generic constrained for left bound of array not working" severity failure;
  assert  (boolean_cons_vectorofvector'right = 15) report "generic constrained for right bound of array not working" severity failure;
  assert  (severity_level_cons_vectorofvector'right = 15) report "generic constrained for right bound of array not working" severity failure;
  assert  (integer_cons_vectorofvector'right = 15) report "generic constrained for right bound of array not working" severity failure;
  assert  (real_cons_vectorofvector'right = 15) report "generic constrained for right bound of array not working" severity failure;
  assert  (time_cons_vectorofvector'right = 15) report "generic constrained for right bound of array not working" severity failure;
  assert  (natural_cons_vectorofvector'right = 15) report "generic constrained for right bound of array not working" severity failure;
  assert  (positive_cons_vectorofvector'right = 15) report "generic constrained for right bound of array not working" severity failure;

  TESTING: PROCESS
  BEGIN

    assert    NOT(    (hi_to_low_range'left = 0) and 
                      (hi_to_low_range'right = 7) and 
                      (row'left = 1) and 
                      (row'right = 8) and 
                      (column'left = 1) and 
                      (column'right = 2) and 
                      (boolean_cons_vector'left = 15) and 
                      (severity_level_cons_vector'left = 15)   and 
                      (integer_cons_vector'left = 15) and 
                      (real_cons_vector'left = 15)    and 
                      (time_cons_vector'left = 15)    and 
                      (natural_cons_vector'left = 15) and 
                      (positive_cons_vector'left = 15) and 
                      (boolean_cons_vector'right = 0) and 
                      (severity_level_cons_vector'right = 0)   and 
                      (integer_cons_vector'right = 0) and 
                      (real_cons_vector'right = 0)    and 
                      (time_cons_vector'right = 0)    and 
                      (natural_cons_vector'right = 0) and 
                      (positive_cons_vector'right = 0) and 
                      (boolean_cons_vectorofvector'left = 0) and 
                      (severity_level_cons_vectorofvector'left = 0) and 
                      (integer_cons_vectorofvector'left = 0) and 
                      (real_cons_vectorofvector'left = 0)    and 
                      (time_cons_vectorofvector'left = 0)    and 
                      (natural_cons_vectorofvector'left = 0) and 
                      (positive_cons_vectorofvector'left = 0) and 
                      (boolean_cons_vectorofvector'right = 15) and 
                      (severity_level_cons_vectorofvector'right = 15) and 
                      (integer_cons_vectorofvector'right = 15) and 
                      (real_cons_vectorofvector'right = 15)    and 
                      (time_cons_vectorofvector'right = 15)    and 
                      (natural_cons_vectorofvector'right = 15) and 
                      (positive_cons_vectorofvector'right = 15)    ) 
      report "***PASSED TEST: c01s01b01x01p05n02i00757"
      severity NOTE;
    assert    (    (hi_to_low_range'left = 0) and 
                   (hi_to_low_range'right = 7) and 
                   (row'left = 1) and 
                   (row'right = 8) and 
                   (column'left = 1) and 
                   (column'right = 2) and 
                   (boolean_cons_vector'left = 15) and 
                   (severity_level_cons_vector'left = 15)   and 
                   (integer_cons_vector'left = 15) and 
                   (real_cons_vector'left = 15)    and 
                   (time_cons_vector'left = 15)    and 
                   (natural_cons_vector'left = 15) and 
                   (positive_cons_vector'left = 15) and 
                   (boolean_cons_vector'right = 0) and 
                   (severity_level_cons_vector'right = 0)   and 
                   (integer_cons_vector'right = 0) and 
                   (real_cons_vector'right = 0)    and 
                   (time_cons_vector'right = 0)    and 
                   (natural_cons_vector'right = 0) and 
                   (positive_cons_vector'right = 0) and 
                   (boolean_cons_vectorofvector'left = 0) and 
                   (severity_level_cons_vectorofvector'left = 0) and 
                   (integer_cons_vectorofvector'left = 0) and 
                   (real_cons_vectorofvector'left = 0)    and 
                   (time_cons_vectorofvector'left = 0)    and 
                   (natural_cons_vectorofvector'left = 0) and 
                   (positive_cons_vectorofvector'left = 0) and 
                   (boolean_cons_vectorofvector'right = 15) and 
                   (severity_level_cons_vectorofvector'right = 15) and 
                   (integer_cons_vectorofvector'right = 15) and 
                   (real_cons_vectorofvector'right = 15)    and 
                   (time_cons_vectorofvector'right = 15)    and 
                   (natural_cons_vectorofvector'right = 15) and 
                   (positive_cons_vectorofvector'right = 15)    ) 
      report "***FAILED TEST: c01s01b01x01p05n02i00757 - Generic can be used to specify the size of ports."
      severity ERROR;
    wait;
  END PROCESS TESTING;

END c01s01b01x01p05n02i00757arch;