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

ENTITY c03s02b02x00p01n01i00492ent IS
END c03s02b02x00p01n01i00492ent;

ARCHITECTURE c03s02b02x00p01n01i00492arch OF c03s02b02x00p01n01i00492ent IS
  type etype is (one,two,three,four,five,six,seven);
  type TR is record
               i    : integer;
               b    : bit;
               bo    : boolean;
               bv    : bit_vector (0 to 3);
               r    : real;
               t    : time;
               e    : etype;
               c    : character;
             end record;
  type T1 is record
               t    : time;
               b    : bit;
               i    : integer;
               bo    : boolean;
               r    : real;
               bv    : bit_vector (0 to 3);
               e    : etype;
               c    : character;
             end record;
  function FUNC1(signal recd1: TR) return T1 is
    variable recd2:T1;
  begin
    recd2.bv    := recd1.bv;
    recd2.b    := recd1.b;
    recd2.bo    := recd1.bo;
    recd2.i    := recd1.i;
    recd2.r    := recd1.r;
    recd2.t    := recd1.t;
    recd2.e    := recd1.e;
    recd2.c    := recd1.c;
    return recd2;
  end FUNC1;
  function FUNC2(signal recd1: TR) return integer is
  begin
    return recd1.i;
  end;
  function FUNC3(signal recd1: TR) return bit is
  begin
    return recd1.b;
  end;
  function FUNC4(signal recd1: TR) return boolean is
  begin
    return recd1.bo;
  end;
  function FUNC5(signal recd1: TR) return bit_vector is
  begin
    return recd1.bv;
  end;
  function FUNC6(signal recd1: TR) return real is
  begin
    return recd1.r;
  end;
  function FUNC7(signal recd1: TR) return time is
  begin
    return recd1.t;
  end;
  function FUNC8(signal recd1: TR) return etype is
  begin
    return recd1.e;
  end;
  function FUNC9(signal recd1: TR) return character is
  begin
    return recd1.c;
  end;
  
  signal var1: TR;
  signal var2: T1;
  
BEGIN
  TESTING: PROCESS
    variable OkayCount : integer := 0;
  BEGIN
    wait for 1 ns;
    var2 <= (bv=>"0000",b=>'0',bo=>false,i=>0,r=>0.0,t=>1 ms,e=>one,c=>'a');
    var1 <= (bv=>"0001",b=>'1',bo=>true,i=>777,r=>333.767,t=>44 ms,e=>seven,c=>'%');
    wait for 1 ns;
    var2 <= FUNC1(var1);
    wait for 1 ns;
    assert var2.bv = "0001" report "var2.bv /= 0001" severity note;
    assert var2.b = '1'    report "var2.b /= 1"     severity note;
    assert var2.bo = true    report "var2.bo /= true" severity note;
    assert var2.i = 777    report "var2.i /= 777"     severity note;
    assert var2.r = 333.767 report "var2.r /= 333.767"    severity note;
    assert var2.t = 44 ms    report "var2.t /= 44 ms" severity note;
    assert var2.e = seven    report "var2.e /= seven" severity note;
    assert var2.c = '%'    report "var2.c /= c"     severity note;
    if var2 = (bv=>"0001",b=>'1',bo=>true,i=>777,r=>333.767,t=>44 ms,e=>seven,c=>'%') then
      OkayCount := OkayCount + 1;
    else
      assert false report "bad return on FUNC1" severity note;
    end if;
    var2 <= (bv=>"0000",b=>'0',bo=>false,i=>0,r=>0.0,t=>1 ms,e=>one,c=>'a');
    wait for 1 ns;
    if var2 = (bv=>"0000",b=>'0',bo=>false,i=>0,r=>0.0,t=>1 ms,e=>one,c=>'a') then
      OkayCount := OkayCount + 1;
    end if;
    var2.i    <= FUNC2(var1);
    var2.b    <= FUNC3(var1);
    var2.bo <= FUNC4(var1);
    var2.bv <= FUNC5(var1);
    var2.r    <= FUNC6(var1);
    var2.t    <= FUNC7(var1);
    var2.e    <= FUNC8(var1);
    var2.c    <= FUNC9(var1);
    wait for 1 ns;
    assert var2.bv = "0001" report "var2.bv /= 0001" severity note;
    assert var2.b = '1'    report "var2.b /= 1"     severity note;
    assert var2.bo = true    report "var2.bo /= true" severity note;
    assert var2.i = 777    report "var2.i /= 777"     severity note;
    assert var2.r = 333.767 report "var2.r /= 333.767" severity note;
    assert var2.t = 44 ms    report "var2.t /= 44 ms" severity note;
    assert var2.e = seven    report "var2.e /= seven" severity note;
    assert var2.c = '%'    report "var2.c /= c"     severity note;
    if var2 = (bv=>"0001",b=>'1',bo=>true,i=>777,r=>333.767,t=>44 ms,e=>seven,c=>'%') then
      OkayCount := OkayCount + 1;
    else
      assert false report "bad return on FUNC2-8" severity note;
    end if;
    wait for 1 ns;
    assert NOT( OkayCount = 3 )
      report "***PASSED TEST: c03s02b02x00p01n01i00492"
      severity NOTE;
    assert ( OkayCount = 3 )
      report "***FAILED TEST: c03s02b02x00p01n01i00492 - Problem assigning record subelements in function."
      severity ERROR;
    wait;
  END PROCESS TESTING;

END c03s02b02x00p01n01i00492arch;