-------------------------------------------------------------------------- -- -- -- 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_SIGNED -- -- -- -- -- -- Date: 09/11/91 KN -- -- 10/08/92 AMT change std_ulogic to signed std_logic -- -- 10/28/92 AMT added signed functions, -, ABS -- -- -- -- Purpose: -- -- A set of signed arithemtic, conversion, -- -- and comparision functions for STD_LOGIC_VECTOR. -- -- -- -- Note: Comparision of same length std_logic_vector is defined -- -- in the LRM. The interpretation is for unsigned vectors -- -- This package will "overload" that definition. -- -- -- -------------------------------------------------------------------------- library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; package STD_LOGIC_SIGNED is function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR; function "+"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR; function "+"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR; function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC) return STD_LOGIC_VECTOR; function "+"(L: STD_LOGIC; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR; function "-"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR; function "-"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR; function "-"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR; function "-"(L: STD_LOGIC_VECTOR; R: STD_LOGIC) return STD_LOGIC_VECTOR; function "-"(L: STD_LOGIC; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR; function "+"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR; function "-"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR; function "ABS"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR; function "*"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR; function "<"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN; function "<"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN; function "<"(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN; function "<="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN; function "<="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN; function "<="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN; function ">"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN; function ">"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN; function ">"(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN; function ">="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN; function ">="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN; function ">="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN; function "="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN; function "="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN; function "="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN; function "/="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN; function "/="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN; function "/="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN; function SHL(ARG:STD_LOGIC_VECTOR;COUNT: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR; function SHR(ARG:STD_LOGIC_VECTOR;COUNT: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR; function CONV_INTEGER(ARG: STD_LOGIC_VECTOR) return INTEGER; -- 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_SIGNED; library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; package body STD_LOGIC_SIGNED 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 := SIGNED(L) + SIGNED(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 := SIGNED(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 + SIGNED(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 := SIGNED(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 + SIGNED(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 := SIGNED(L) - SIGNED(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 := SIGNED(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 - SIGNED(R); -- pragma label minus return std_logic_vector(result); end; function "-"(L: STD_LOGIC_VECTOR; R: STD_LOGIC) return STD_LOGIC_VECTOR is -- pragma label_applies_to minus variable result : STD_LOGIC_VECTOR (L'range); begin result := SIGNED(L) - R; -- pragma label minus 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 - SIGNED(R); -- pragma label minus return std_logic_vector(result); end; function "+"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is -- pragma label_applies_to plus variable result : STD_LOGIC_VECTOR (L'range); begin result := + SIGNED(L); -- pragma label plus return std_logic_vector(result); end; function "-"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is -- pragma label_applies_to minus variable result : STD_LOGIC_VECTOR (L'range); begin result := - SIGNED(L); -- pragma label minus return std_logic_vector(result); end; function "ABS"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is variable result : STD_LOGIC_VECTOR (L'range); begin result := ABS( SIGNED(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 := SIGNED(L) * SIGNED(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 SIGNED(L) < SIGNED(R); -- pragma label lt end; function "<"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is -- pragma label_applies_to lt begin return SIGNED(L) < R; -- pragma label lt end; function "<"(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is -- pragma label_applies_to lt begin return L < SIGNED(R); -- pragma label lt end; function "<="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is -- pragma label_applies_to leq begin return SIGNED(L) <= SIGNED(R); -- pragma label leq end; function "<="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is -- pragma label_applies_to leq begin return SIGNED(L) <= R; -- pragma label leq end; function "<="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is -- pragma label_applies_to leq begin return L <= SIGNED(R); -- pragma label leq end; function ">"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is -- pragma label_applies_to gt begin return SIGNED(L) > SIGNED(R); -- pragma label gt end; function ">"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is -- pragma label_applies_to gt begin return SIGNED(L) > R; -- pragma label gt end; function ">"(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is -- pragma label_applies_to gt begin return L > SIGNED(R); -- pragma label gt end; function ">="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is -- pragma label_applies_to geq begin return SIGNED(L) >= SIGNED(R); -- pragma label geq end; function ">="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is -- pragma label_applies_to geq begin return SIGNED(L) >= R; -- pragma label geq end; function ">="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is -- pragma label_applies_to geq begin return L >= SIGNED(R); -- pragma label geq end; function "="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is begin return SIGNED(L) = SIGNED(R); end; function "="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is begin return SIGNED(L) = R; end; function "="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is begin return L = SIGNED(R); end; function "/="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is begin return SIGNED(L) /= SIGNED(R); end; function "/="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is begin return SIGNED(L) /= R; end; function "/="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is begin return L /= SIGNED(R); end; function SHL(ARG:STD_LOGIC_VECTOR;COUNT: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is begin return STD_LOGIC_VECTOR(SHL(SIGNED(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(SIGNED(ARG),UNSIGNED(COUNT))); end; -- This function converts std_logic_vector to a signed integer value -- using a conversion function in std_logic_arith function CONV_INTEGER(ARG: STD_LOGIC_VECTOR) return INTEGER is variable result : SIGNED(ARG'range); begin result := SIGNED(ARG); return CONV_INTEGER(result); end; end STD_LOGIC_SIGNED;