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

package c08s12b00x00p05n01i01637pkg is

  -- type declarations
  type ENUM is ( E1, E2, E3 );
  type DISTANCE is range 0 to 1E9
    units
      -- Base units.
      A;                    -- angstrom

      -- Metric lengths.
      nm       = 10 A;      -- nanometer
      um       = 1000 nm;   -- micrometer (or micron)
      mm       = 1000 um;   -- millimeter
      cm       = 10 mm;     -- centimeter

      -- English lengths.
      mil      = 254000 A;  -- mil
      inch     = 1000 mil;  -- inch
    end units;
  type ANARRAY is ARRAY( 0 to 1 ) of REAL;
  type ARECORD is
    RECORD
      Field1      : INTEGER;
      Field2      : BOOLEAN;
    end record;

  -- constant declarations
  CONSTANT CONSTI     : INTEGER  := 47;
  CONSTANT CONSTR     : REAL     := 47.0;
  CONSTANT CONSTE     : ENUM     := E1;
  CONSTANT CONSTD     : DISTANCE := 1 A;
  CONSTANT CONSTT     : TIME     := 1 hr;
  CONSTANT CONSTB     : BIT      := '1';
  CONSTANT CONSTS     : SEVERITY_LEVEL := WARNING;
  CONSTANT CONSTBO    : BOOLEAN  := FALSE;
  CONSTANT CONSTA     : ANARRAY  := ( 3.1415926, 4.0 );
  CONSTANT CONSTRE    : ARECORD  := ( Field1 => 2, Field2 => TRUE );
  
  -- function declarations.
  function funcI return INTEGER;
  function funcR return REAL;
  function funcE return ENUM;
  function funcD return DISTANCE;
  function funcT return TIME;
  function funcB return BIT;
  function funcS return SEVERITY_LEVEL;
  function funcBO return BOOLEAN;
  function funcA return ANARRAY;
  function funcRE return ARECORD;
  
end c08s12b00x00p05n01i01637pkg;

package body c08s12b00x00p05n01i01637pkg is
  
  function funcI return INTEGER is
  begin
    return( CONSTI );
  end;
  
  function funcR return REAL is
  begin
    return( CONSTR );
  end;
  
  function funcE return ENUM is
  begin
    return( CONSTE );
  end;
  
  function funcD return DISTANCE is
  begin
    return( CONSTD );
  end;
  
  function funcT return TIME is
  begin
    return( CONSTT );
  end;
  
  function funcB return BIT is
  begin
    return( CONSTB );
  end;
  
  function funcS return SEVERITY_LEVEL is
  begin
    return( CONSTS );
  end;
  
  function funcBO return BOOLEAN is
  begin
    return( CONSTBO );
  end;
  
  function funcA return ANARRAY is
  begin
    return( CONSTA );
  end;
  
  function funcRE return ARECORD is
  begin
    return( CONSTRE );
  end;
  
end c08s12b00x00p05n01i01637pkg;

use work.c08s12b00x00p05n01i01637pkg.all;
ENTITY c08s12b00x00p05n01i01637ent IS
END c08s12b00x00p05n01i01637ent;

ARCHITECTURE c08s12b00x00p05n01i01637arch OF c08s12b00x00p05n01i01637ent IS

BEGIN
  TESTING: PROCESS
    -- variable declarations.
    VARIABLE VARI     : INTEGER;
    VARIABLE VARR     : REAL;
    VARIABLE VARE     : ENUM;
    VARIABLE VARD     : DISTANCE;
    VARIABLE VART     : TIME;
    VARIABLE VARB     : BIT;
    VARIABLE VARS     : SEVERITY_LEVEL;
    VARIABLE VARBO    : BOOLEAN;
    VARIABLE VARA     : ANARRAY;
    VARIABLE VARRE    : ARECORD;
  BEGIN
    -- Call each function, verify that it returns the proper value.
    assert (funcI = CONSTI);
    assert (funcR = CONSTR);
    assert (funcE = CONSTE);
    assert (funcD = CONSTD);
    assert (funcT = CONSTT);
    assert (funcB = CONSTB);
    assert (funcS = CONSTS);
    assert (funcBO = CONSTBO);
    assert (funcA = CONSTA);
    assert (funcRE = CONSTRE);
    
    -- Assign function values to variables, make sure they're OK.
    VARI  := funcI;
    VARR  := funcR;
    VARE  := funcE;
    VARD  := funcD;
    VART  := funcT;
    VARB  := funcB;
    VARS  := funcS;
    VARBO := funcBO;
    VARA  := funcA;
    VARRE := funcRE;
    assert (VARI = CONSTI);
    assert (VARR = CONSTR);
    assert (VARE = CONSTE);
    assert (VARD = CONSTD);
    assert (VART = CONSTT);
    assert (VARB = CONSTB);
    assert (VARS = CONSTS);
    assert (VARBO = CONSTBO);
    assert (VARA = CONSTA);
    assert (VARRE = CONSTRE);

    assert NOT((funcI = CONSTI)   and
               (funcR = CONSTR)   and
               (funcE = CONSTE)   and
               (funcD = CONSTD)   and
               (funcT = CONSTT)   and
               (funcB = CONSTB)   and
               (funcS = CONSTS)   and
               (funcBO = CONSTBO)   and
               (funcA = CONSTA)   and
               (funcRE = CONSTRE)   and
               (VARI = CONSTI)   and
               (VARR = CONSTR)   and
               (VARE = CONSTE)   and
               (VARD = CONSTD)   and
               (VART = CONSTT)   and
               (VARB = CONSTB)   and
               (VARS = CONSTS)   and
               (VARBO = CONSTBO)   and
               (VARA = CONSTA)   and
               (VARRE = CONSTRE))   
      report "***PASSED TEST: c08s12b00x00p05n01i01637"
      severity NOTE;
    assert   ((funcI = CONSTI)   and
              (funcR = CONSTR)   and
              (funcE = CONSTE)   and
              (funcD = CONSTD)   and
              (funcT = CONSTT)   and
              (funcB = CONSTB)   and
              (funcS = CONSTS)   and
              (funcBO = CONSTBO)   and
              (funcA = CONSTA)   and
              (funcRE = CONSTRE)   and
              (VARI = CONSTI)   and
              (VARR = CONSTR)   and
              (VARE = CONSTE)   and
              (VARD = CONSTD)   and
              (VART = CONSTT)   and
              (VARB = CONSTB)   and
              (VARS = CONSTS)   and
              (VARBO = CONSTBO)   and
              (VARA = CONSTA)   and
              (VARRE = CONSTRE))   
      report "***FAILED TEST: c08s12b00x00p05n01i01637 - The value of the expression defines the result returned by the function."
      severity ERROR;
    wait;
  END PROCESS TESTING;

END c08s12b00x00p05n01i01637arch;