--------------------------------------------------------------------------
-- --
-- Copyright (c) 1990, 1991, 1992 by Synopsys, Inc. --
-- All rights reserved. --
-- --
-- This source file may be used and distributed without restriction --
-- provided that this copyright statement is not removed from the file --
-- and that any derivative work contains this copyright notice. --
-- --
-- Package name: STD_LOGIC_UNSIGNED --
-- --
-- --
-- Date: 09/11/92 KN --
-- 10/08/92 AMT --
-- --
-- Purpose: --
-- A set of unsigned arithemtic, conversion, --
-- and comparision functions for STD_LOGIC_VECTOR. --
-- --
-- Note: comparision of same length discrete arrays is defined --
-- by the LRM. This package will "overload" those --
-- definitions --
-- --
--------------------------------------------------------------------------
---------------------------------------------------
-- Attributes added to invoke MTI builtin functions
---------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
package STD_LOGIC_UNSIGNED is
attribute builtin_subprogram: string;
function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
"+"[STD_LOGIC_VECTOR, STD_LOGIC_VECTOR return STD_LOGIC_VECTOR]:
function is "stdarith_plus_uuu";
function "+"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
"+"[STD_LOGIC_VECTOR, INTEGER return STD_LOGIC_VECTOR]:
function is "stdarith_plus_uiu";
function "+"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
"+"[INTEGER, STD_LOGIC_VECTOR return STD_LOGIC_VECTOR]:
function is "stdarith_plus_iuu";
function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
"+"[STD_LOGIC_VECTOR, STD_LOGIC return STD_LOGIC_VECTOR]:
function is "stdarith_plus_uxu";
function "+"(L: STD_LOGIC; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
"+"[STD_LOGIC, STD_LOGIC_VECTOR return STD_LOGIC_VECTOR]:
function is "stdarith_plus_xuu";
function "-"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
"-"[STD_LOGIC_VECTOR, STD_LOGIC_VECTOR return STD_LOGIC_VECTOR]:
function is "stdarith_minus_uuu";
function "-"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
"-"[STD_LOGIC_VECTOR, INTEGER return STD_LOGIC_VECTOR]:
function is "stdarith_minus_uiu";
function "-"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
"-"[INTEGER, STD_LOGIC_VECTOR return STD_LOGIC_VECTOR]:
function is "stdarith_minus_iuu";
function "-"(L: STD_LOGIC_VECTOR; R: STD_LOGIC) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
"-"[STD_LOGIC_VECTOR, STD_LOGIC return STD_LOGIC_VECTOR]:
function is "stdarith_minus_uxu";
function "-"(L: STD_LOGIC; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
"-"[STD_LOGIC, STD_LOGIC_VECTOR return STD_LOGIC_VECTOR]:
function is "stdarith_minus_xuu";
function "+"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
"+"[STD_LOGIC_VECTOR return STD_LOGIC_VECTOR]:
function is "stdarith_unary_plus_uu";
function "*"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
"*"[STD_LOGIC_VECTOR, STD_LOGIC_VECTOR return STD_LOGIC_VECTOR]:
function is "stdarith_mult_uuu";
function "<"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN;
attribute builtin_subprogram of
"<"[STD_LOGIC_VECTOR, STD_LOGIC_VECTOR return BOOLEAN]:
function is "stdarith_lt_uu";
function "<"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
attribute builtin_subprogram of
"<"[STD_LOGIC_VECTOR, INTEGER return BOOLEAN]:
function is "stdarith_lt_ui";
function "<"(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
attribute builtin_subprogram of
"<"[INTEGER, STD_LOGIC_VECTOR return BOOLEAN]:
function is "stdarith_lt_iu";
function "<="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN;
attribute builtin_subprogram of
"<="[STD_LOGIC_VECTOR, STD_LOGIC_VECTOR return BOOLEAN]:
function is "stdarith_lte_uu";
function "<="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
attribute builtin_subprogram of
"<="[STD_LOGIC_VECTOR, INTEGER return BOOLEAN]:
function is "stdarith_lte_ui";
function "<="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
attribute builtin_subprogram of
"<="[INTEGER, STD_LOGIC_VECTOR return BOOLEAN]:
function is "stdarith_lte_iu";
function ">"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN;
attribute builtin_subprogram of
">"[STD_LOGIC_VECTOR, STD_LOGIC_VECTOR return BOOLEAN]:
function is "stdarith_gt_uu";
function ">"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
attribute builtin_subprogram of
">"[STD_LOGIC_VECTOR, INTEGER return BOOLEAN]:
function is "stdarith_gt_ui";
function ">"(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
attribute builtin_subprogram of
">"[INTEGER, STD_LOGIC_VECTOR return BOOLEAN]:
function is "stdarith_gt_iu";
function ">="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN;
attribute builtin_subprogram of
">="[STD_LOGIC_VECTOR, STD_LOGIC_VECTOR return BOOLEAN]:
function is "stdarith_gte_uu";
function ">="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
attribute builtin_subprogram of
">="[STD_LOGIC_VECTOR, INTEGER return BOOLEAN]:
function is "stdarith_gte_ui";
function ">="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
attribute builtin_subprogram of
">="[INTEGER, STD_LOGIC_VECTOR return BOOLEAN]:
function is "stdarith_gte_iu";
function "="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN;
attribute builtin_subprogram of
"="[STD_LOGIC_VECTOR, STD_LOGIC_VECTOR return BOOLEAN]:
function is "stdarith_eq_uu";
function "="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
attribute builtin_subprogram of
"="[STD_LOGIC_VECTOR, INTEGER return BOOLEAN]:
function is "stdarith_eq_ui";
function "="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
attribute builtin_subprogram of
"="[INTEGER, STD_LOGIC_VECTOR return BOOLEAN]:
function is "stdarith_eq_iu";
function "/="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN;
attribute builtin_subprogram of
"/="[STD_LOGIC_VECTOR, STD_LOGIC_VECTOR return BOOLEAN]:
function is "stdarith_neq_uu";
function "/="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
attribute builtin_subprogram of
"/="[STD_LOGIC_VECTOR, INTEGER return BOOLEAN]:
function is "stdarith_neq_ui";
function "/="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
attribute builtin_subprogram of
"/="[INTEGER, STD_LOGIC_VECTOR return BOOLEAN]:
function is "stdarith_neq_iu";
function SHL(ARG:STD_LOGIC_VECTOR;COUNT: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
SHL[STD_LOGIC_VECTOR, STD_LOGIC_VECTOR return STD_LOGIC_VECTOR]: function is "stdarith_shl_uuu";
function SHR(ARG:STD_LOGIC_VECTOR;COUNT: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
attribute builtin_subprogram of
SHR[STD_LOGIC_VECTOR, STD_LOGIC_VECTOR return STD_LOGIC_VECTOR]: function is "stdarith_shr_uuu";
function CONV_INTEGER(ARG: STD_LOGIC_VECTOR) return INTEGER;
attribute builtin_subprogram of
CONV_INTEGER[STD_LOGIC_VECTOR return INTEGER]:
function is "stdarith_conv_integer_ui2";
------------------------------------------------------------------------------------------
-- If desired, you may select an optional implementation for CONV_INTEGER(STD_LOGIC_VECTOR)
-- by changing the value of the attribute:
-- stdarith_conv_integer_ui implements the original CONV_INTEGER(STD_LOGIC_VECTOR) VHDL which
-- generates an error if the argument is larger than 31 bits.
-- stdarith_conv_integer_ui2 allows 32 bits. It generates a warning if the
-- argument is 32 bits and the MSB is not zero.
-- The default is stdarith_conv_integer_ui2.
--
-- attribute builtin_subprogram of
-- CONV_INTEGER[STD_LOGIC_VECTOR return INTEGER]: function is "stdarith_conv_integer_ui";
------------------------------------------------------------------------------------------
-- remove this since it is already in std_logic_arith
-- function CONV_STD_LOGIC_VECTOR(ARG: INTEGER; SIZE: INTEGER) return STD_LOGIC_VECTOR;
end STD_LOGIC_UNSIGNED;
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
package body STD_LOGIC_UNSIGNED is
function maximum(L, R: INTEGER) return INTEGER is
begin
if L > R then
return L;
else
return R;
end if;
end;
function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
-- pragma label_applies_to plus
constant length: INTEGER := maximum(L'length, R'length);
variable result : STD_LOGIC_VECTOR (length-1 downto 0);
begin
result := UNSIGNED(L) + UNSIGNED(R);-- pragma label plus
return std_logic_vector(result);
end;
function "+"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR is
-- pragma label_applies_to plus
variable result : STD_LOGIC_VECTOR (L'range);
begin
result := UNSIGNED(L) + R;-- pragma label plus
return std_logic_vector(result);
end;
function "+"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
-- pragma label_applies_to plus
variable result : STD_LOGIC_VECTOR (R'range);
begin
result := L + UNSIGNED(R);-- pragma label plus
return std_logic_vector(result);
end;
function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC) return STD_LOGIC_VECTOR is
-- pragma label_applies_to plus
variable result : STD_LOGIC_VECTOR (L'range);
begin
result := UNSIGNED(L) + R;-- pragma label plus
return std_logic_vector(result);
end;
function "+"(L: STD_LOGIC; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
-- pragma label_applies_to plus
variable result : STD_LOGIC_VECTOR (R'range);
begin
result := L + UNSIGNED(R);-- pragma label plus
return std_logic_vector(result);
end;
function "-"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
-- pragma label_applies_to minus
constant length: INTEGER := maximum(L'length, R'length);
variable result : STD_LOGIC_VECTOR (length-1 downto 0);
begin
result := UNSIGNED(L) - UNSIGNED(R); -- pragma label minus
return std_logic_vector(result);
end;
function "-"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR is
-- pragma label_applies_to minus
variable result : STD_LOGIC_VECTOR (L'range);
begin
result := UNSIGNED(L) - R; -- pragma label minus
return std_logic_vector(result);
end;
function "-"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
-- pragma label_applies_to minus
variable result : STD_LOGIC_VECTOR (R'range);
begin
result := L - UNSIGNED(R); -- pragma label minus
return std_logic_vector(result);
end;
function "-"(L: STD_LOGIC_VECTOR; R: STD_LOGIC) return STD_LOGIC_VECTOR is
variable result : STD_LOGIC_VECTOR (L'range);
begin
result := UNSIGNED(L) - R;
return std_logic_vector(result);
end;
function "-"(L: STD_LOGIC; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
-- pragma label_applies_to minus
variable result : STD_LOGIC_VECTOR (R'range);
begin
result := L - UNSIGNED(R); -- pragma label minus
return std_logic_vector(result);
end;
function "+"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
variable result : STD_LOGIC_VECTOR (L'range);
begin
result := + UNSIGNED(L);
return std_logic_vector(result);
end;
function "*"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
-- pragma label_applies_to mult
constant length: INTEGER := maximum(L'length, R'length);
variable result : STD_LOGIC_VECTOR ((L'length+R'length-1) downto 0);
begin
result := UNSIGNED(L) * UNSIGNED(R); -- pragma label mult
return std_logic_vector(result);
end;
function "<"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
-- pragma label_applies_to lt
constant length: INTEGER := maximum(L'length, R'length);
begin
return UNSIGNED(L) < UNSIGNED(R); -- pragma label lt
end;
function "<"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is
-- pragma label_applies_to lt
begin
return UNSIGNED(L) < R; -- pragma label lt
end;
function "<"(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is
-- pragma label_applies_to lt
begin
return L < UNSIGNED(R); -- pragma label lt
end;
function "<="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
-- pragma label_applies_to leq
begin
return UNSIGNED(L) <= UNSIGNED(R); -- pragma label leq
end;
function "<="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is
-- pragma label_applies_to leq
begin
return UNSIGNED(L) <= R; -- pragma label leq
end;
function "<="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is
-- pragma label_applies_to leq
begin
return L <= UNSIGNED(R); -- pragma label leq
end;
function ">"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
-- pragma label_applies_to gt
begin
return UNSIGNED(L) > UNSIGNED(R); -- pragma label gt
end;
function ">"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is
-- pragma label_applies_to gt
begin
return UNSIGNED(L) > R; -- pragma label gt
end;
function ">"(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is
-- pragma label_applies_to gt
begin
return L > UNSIGNED(R); -- pragma label gt
end;
function ">="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
-- pragma label_applies_to geq
begin
return UNSIGNED(L) >= UNSIGNED(R); -- pragma label geq
end;
function ">="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is
-- pragma label_applies_to geq
begin
return UNSIGNED(L) >= R; -- pragma label geq
end;
function ">="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is
-- pragma label_applies_to geq
begin
return L >= UNSIGNED(R); -- pragma label geq
end;
function "="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
begin
return UNSIGNED(L) = UNSIGNED(R);
end;
function "="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is
begin
return UNSIGNED(L) = R;
end;
function "="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is
begin
return L = UNSIGNED(R);
end;
function "/="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
begin
return UNSIGNED(L) /= UNSIGNED(R);
end;
function "/="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is
begin
return UNSIGNED(L) /= R;
end;
function "/="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is
begin
return L /= UNSIGNED(R);
end;
function CONV_INTEGER(ARG: STD_LOGIC_VECTOR) return INTEGER is
variable result : UNSIGNED(ARG'range);
begin
result := UNSIGNED(ARG);
return CONV_INTEGER(result);
end;
function SHL(ARG:STD_LOGIC_VECTOR;COUNT: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
begin
return STD_LOGIC_VECTOR(SHL(UNSIGNED(ARG),UNSIGNED(COUNT)));
end;
function SHR(ARG:STD_LOGIC_VECTOR;COUNT: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
begin
return STD_LOGIC_VECTOR(SHR(UNSIGNED(ARG),UNSIGNED(COUNT)));
end;
-- remove this since it is already in std_logic_arith
--function CONV_STD_LOGIC_VECTOR(ARG: INTEGER; SIZE: INTEGER) return STD_LOGIC_VECTOR is
--variable result1 : UNSIGNED (SIZE-1 downto 0);
--variable result2 : STD_LOGIC_VECTOR (SIZE-1 downto 0);
--begin
--result1 := CONV_UNSIGNED(ARG,SIZE);
--return std_logic_vector(result1);
--end;
end STD_LOGIC_UNSIGNED;