-- Copyright 1992-1997 Future Parallel -- Source: T:/IC_Design/generic/VHDL/integer_plus.bdy -- VLSI Design Lab -- Designer: Tim Pagden -- Description: Extensions to the std.standard.integer package to allow -- conversion functions and mixed operators -- Revision history: T:/IC_Design/generic/etc/integer_plus_bdy.dnh -- 29.12.97 TP 0.0 created from integer_plus.pkg library IEEE; -- library vfp; package body integer_plus is use IEEE.std_logic_1164.all; -- use vfp.std_logic_class.all; -- extensions to vfp.integer_class and std.standard.integer -- integer defined in std.standard -- integer subtypes -- ____________________ -- conversion functions -- vfp.integer_plus.to_integer (std_ulogic_vector) -> integer function to_integer ( -- 29.11.95 a: std_ulogic_vector ) return integer is variable y: integer := 0; begin y := 0; if (a'length < 32) then for i in a'length-1 downto 0 loop y := y * 2; if (a(i) = '1') or (a(i) = 'H') then y := y + 1; elsif (a(i) = 'U') or (a(i) = 'X') or (a(i) = 'Z') or (a(i) = 'W') or (a(i) = '-') then y := y + 0; -- assert false -- report "Error 0001." & -- "Library = vfp." & -- "Package Body = generic_conversions." & -- "Function = to_integer." & -- "The std_ulogic_vector input to this function MUST contain 0, 1, L, or H." -- severity error; -- upon this assertion, 0 will have effectively been added to y -- else y := y + 0; thus there's no update to y for this "bit" anyway end if; end loop; else assert false report "Error 0002." & "Library = vfp." & "Package Body = generic_conversions." & "Function = to_integer." & "The std_ulogic_vector input to this function MUST be less than 32 bits." severity error; end if; return y; -- y returns 0 if std_ulogic_vector is > 31 bits end to_integer; -- vfp.integer_plus.to_integer (std_logic_vector) -> integer function to_integer ( -- 03.02.95 a: std_logic_vector ) return integer is variable y: integer := 0; begin y := 0; if (a'length < 32) then for i in a'length-1 downto 0 loop y := y * 2; if (a(i) = '1') or (a(i) = 'H') then y := y + 1; elsif (a(i) = 'U') or (a(i) = 'X') or (a(i) = 'Z') or (a(i) = 'W') or (a(i) = '-') then y := y + 0; -- assert false -- report "Error 0001." & -- "Library = vfp." & -- "Package Body = generic_conversions." & -- "Function = to_integer." & -- "The std_logic_vector input to this function MUST contain 0, 1, L, or H." -- severity error; -- upon this assertion, 0 will have effectively been added to y -- else y := y + 0; thus there's no update to y for this "bit" anyway end if; end loop; else assert false report "Error 0002." & "Library = vfp." & "Package Body = generic_conversions." & "Function = to_integer." & "The std_logic_vector input to this function MUST be less than 32 bits." severity error; end if; return y; -- y returns 0 if std_logic_vector is > 31 bits end to_integer; -- vfp.integer_plus.to_integer (twos_complement) -> integer function to_integer ( -- 29.11.95 a: twos_complement ) return integer is variable y: integer := 0; begin if (a(a'length-1) = '1') or (a(a'length-1) = 'H') then y := -1; elsif (a(a'length-1) = 'U') or (a(a'length-1) = 'X') or (a(a'length-1) = 'Z') or (a(a'length-1) = 'W') or (a(a'length-1) = '-') then y := 0; -- was integer'low -- assert false -- report "Warning 0001." & -- "Library = vfp." & -- "Package Body = generic_conversions." & -- "Function = to_integer (input = 2's complement)." & -- "The 2's complement input to this function MUST contain 0, 1, L, or H." -- severity warning; -- upon this assertion, y will still be uninitialized else -- a(i'length-1) is '0' or 'L' y := 0; end if; for i in a'length-2 downto 0 loop y := y * 2; if (a(i) = '1') or (a(i) = 'H') then y := y + 1; elsif (a(i) = 'U') or (a(i) = 'X') or (a(i) = 'Z') or (a(i) = 'W') or (a(i) = '-') then y := y + 0; -- assert false -- report "Warning 0002." & -- "Library = vfp." & -- "Package Body = generic_conversions." & -- "Function = to_integer (input = 2's complement)." & -- "The 2's complement input to this function MUST contain 0, 1, L, or H." -- severity warning; -- upon this assertion, 0 will have effectively been added to y -- else y := y + 0; thus there's no update to y for this "bit" anyway end if; end loop; return y; end to_integer; -- mixed operators -- debug functions end integer_plus;