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

package c08s04b00x00p07n01i01309pkg is

  -- Type declarations.
  subtype     BV2  is BIT_VECTOR( 0 to 1 );
  subtype     CH2  is STRING( 1 to 2 );

  -- Constant declarations.
  constant BVC  : BV2 := B"00";
  constant CHC  : CH2 := "bb";

  -- Function returns BV2.
  function  returnBV2 return BV2;

  -- Function returns CH2.
  function  returnCH2 return CH2;

end c08s04b00x00p07n01i01309pkg;

package body c08s04b00x00p07n01i01309pkg is
  
  -- Function returns BV2.
  function  returnBV2 return BV2 is
  begin
    return ( BVC );
  end returnBV2;
  
  -- Function returns CH2.
  function  returnCH2 return CH2 is
  begin
    return( CHC );
  end returnCH2;
  
end c08s04b00x00p07n01i01309pkg;

use work.c08s04b00x00p07n01i01309pkg.all;
ENTITY c08s04b00x00p07n01i01309ent IS
END c08s04b00x00p07n01i01309ent;

ARCHITECTURE c08s04b00x00p07n01i01309arch OF c08s04b00x00p07n01i01309ent IS
  -- Local signals.
  signal S       : BIT;
  signal T       : BIT;
  
  signal C1, C2  : CHARACTER;
BEGIN
  TESTING: PROCESS
    
    -- local variables
    variable BITV     : BV2 := B"11";
    variable STRV     : CH2 := "ab";
    variable ShouldBeTime : TIME;
    
    variable k : integer := 0;
    
  BEGIN
    -- Assign with a variable as the expression.
    ( S, T )  <= BITV after 10 ns;
    ShouldBeTime := NOW + 10 ns;
    wait on S,T;
    if (ShouldBeTime /= Now or S /= BITV(0) or T /= BITV(1)) then
      k := 1;
    end if;
    assert (ShouldBeTime = NOW);
    assert ((S = BITV( 0 )) and (T = BITV( 1 )));
    
    ( C1,C2 ) <= STRV after 10 ns;
    ShouldBeTime := NOW + 10 ns;
    wait on C1,C2;
    if (ShouldBeTime /= Now or C1 /= STRV(1) or C2 /= STRV(2)) then
      k := 1;
    end if;
    assert (ShouldBeTime = NOW);
    assert ((C1 = STRV( 1 )) and (C2 = STRV( 2 )));
    
    -- Assign with a function return value.
    ( S, T )  <= returnBV2 after 10 ns;
    ShouldBeTime := NOW + 10 ns;
    wait on S,T;
    if (ShouldBeTime /= Now or S /= BVC(0) or T /= BVC(1)) then
      k := 1;
    end if;
    assert (ShouldBeTime = NOW);
    assert ((S = BVC( 0 )) and (T = BVC( 1 )));
    
    ( C1,C2 ) <= returnCH2 after 10 ns;
    ShouldBeTime := NOW + 10 ns;
    wait on C1,C2;
    if (ShouldBeTime /= Now or C1 /= CHC(1) or C2 /= CHC(2)) then
      k := 1;
    end if;
    assert (ShouldBeTime = NOW);
    assert ((C1 = CHC( 1 )) and (C2 = CHC( 2 )));
    
    -- Assign with a qualified expression.
    ( S, T )  <= BV2'( '0', '1' ) after 10 ns;
    ShouldBeTime := NOW + 10 ns;
    wait on S,T;
    if (ShouldBeTime /= Now or S /= '0' or T /= '1') then
      k := 1;   
    end if;
    assert (ShouldBeTime = NOW);
    assert ((S = '0') and (T = '1'));
    
    ( C1,C2 ) <= CH2'( 'c', 'c' ) after 10 ns;
    ShouldBeTime := NOW + 10 ns;
    wait on C1,C2;
    if (ShouldBeTime /= Now or C1 /= 'c' or C2 /= 'c') then
      k := 1;
    end if;
    assert (ShouldBeTime = NOW);
    assert ((C1 = 'c') and (C2 = 'c'));
    
    assert NOT( k = 0 ) 
      report "***PASSED TEST: c08s04b00x00p07n01i01309"
      severity NOTE;
    assert ( k = 0 ) 
      report "***FAILED TEST: c08s04b00x00p07n01i01309 - If the target of the signal assignment statement is in the form of an aggregate, then the type of the aggregate must be determinable from the context."
      severity ERROR;
    wait;
  END PROCESS TESTING;

END c08s04b00x00p07n01i01309arch;