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

ENTITY c02s03b00x00p03n01i02964ent IS
END c02s03b00x00p03n01i02964ent;

ARCHITECTURE c02s03b00x00p03n01i02964arch OF c02s03b00x00p03n01i02964ent IS
  function f1a(constant c1 : in integer) return integer is
  begin
    return 12;
  end;
  function f1a(constant c1,c2 : in integer) return integer is
  begin
    return 25;
  end;
  function f2b(constant c1 : in integer) return integer is
  begin
    return 22;
  end;
  function f2b(constant c1 : in real) return integer is
  begin
    return 28;
  end;
  function f3c(constant c0:integer; constant c1:real) return integer is
  begin
    return 32;
  end;
  function f3c(constant c1:real; constant c0:integer) return integer is
  begin
    return 38;
  end;
  function f4d(constant c1 : in integer) return integer is
  begin
    return 42;
  end;
  function f4d(constant c1 : in integer) return real is
  begin
    return 48.0;
  end;
  function f5e(constant c1 : in integer) return integer is
  begin
    return 52;
  end;
  procedure f5e(constant c1 : in integer) is
  begin
    return;
  end;
  function f6f(constant c0 : in real;constant c1 : in integer) return integer is
  begin
    return 62;
  end;
  function f6f(constant c2 : in integer;constant c3 : in real) return integer is
  begin
    return 68;
  end;
BEGIN
  TESTING: PROCESS
    variable i1 : integer;
    variable r1 : real;
    variable k  : integer := 0;
  BEGIN
    i1 := 8;
    if (i1 /= 8) then
      k := 1;
    end if;
    assert (i1=8)
      report "Error in initial conditions detected"
      severity failure;
    i1:= f1a(4);
    if (i1 /= 12) then
      k := 1;
    end if;
    assert (i1=12)
      report "Error differentiating overloaded subprog by number of formals"
      severity failure;
    i1:=f1a(16,23);
    if (i1 /= 25) then
      k := 1;
    end if;
    assert (i1=25)
      report "Error differentiating overloaded subprog by number of formals"
      severity failure;
    i1:= f2b(4);
    if (i1 /= 22) then
      k := 1;
    end if;
    assert (i1=22)
      report "Error differentiating overloaded subprog by type of formals"
      severity failure;
    i1:=f2b(4.0);
    if (i1 /= 28) then
      k := 1;
    end if;
    assert (i1=28)
      report "Error differentiating overloaded subprog by type of formals"
      severity failure;
    i1:= f3c(4,4.0);
    if (i1 /= 32) then
      k := 1;
    end if;
    assert (i1=32)
      report "Error differentiating overloaded subprog by order of formals"
      severity failure;
    i1:= f3c(4.0,4);
    if (i1 /= 38) then
      k := 1;
    end if;
    assert (i1=38)
      report "Error differentiating overloaded subprog by order of formals"
      severity failure;
    i1:= f4d(4);
    if (i1 /= 42) then
      k := 1;
    end if;
    assert (i1=42)
      report "Error differentiating overloaded subprog by return type"
      severity failure;

    r1:= f4d(4);
    if (r1 /= 48.0) then
      k := 1;
    end if;
    assert (r1=48.0)
      report "Error differentiating overloaded subprog by return type"
      severity failure;
    i1:= f5e(4);
    if (i1 /= 52) then
      k := 1;
    end if;
    assert (i1=52)
      report "Error differentiating overloaded subprog by having a return"
      severity failure;
    i1:= f6f(c1 => 4, c0 => 4.4);
    if (i1 /= 62) then
      k := 1;
    end if;
    assert (i1=62)
      report "Error differentiating overloaded subprog by name of formals"
      severity failure;
    i1:= f6f(c3 => 4.4, c2 => 4);
    if (i1 /= 68) then
      k := 1;
    end if;
    assert (i1=68)
      report "Error differentiating overloaded subprog by name of formals"
      severity failure;
    wait for 5 ns;
    assert NOT( k=0 )
      report "***PASSED TEST: c02s03b00x00p03n01i02964"
      severity NOTE;
    assert ( k=0 )
      report "***FAILED TEST: c02s03b00x00p03n01i02964 - Overload subprogram call test failed."
      severity ERROR;
    wait;
  END PROCESS TESTING;

END c02s03b00x00p03n01i02964arch;