aboutsummaryrefslogtreecommitdiffstats
path: root/libraries/synopsys/std_logic_signed.vhdl
diff options
context:
space:
mode:
authorgingold <gingold@b72b5c32-5f01-0410-b925-b5c7b92870f7>2005-09-24 05:10:24 +0000
committergingold <gingold@b72b5c32-5f01-0410-b925-b5c7b92870f7>2005-09-24 05:10:24 +0000
commit977ff5e02c6d2f9bfdabcf8b4e98b81e2d83e849 (patch)
tree7bcf8e7aff40a8b54d4af83e90cccd73568e77bb /libraries/synopsys/std_logic_signed.vhdl
downloadghdl-977ff5e02c6d2f9bfdabcf8b4e98b81e2d83e849.tar.gz
ghdl-977ff5e02c6d2f9bfdabcf8b4e98b81e2d83e849.tar.bz2
ghdl-977ff5e02c6d2f9bfdabcf8b4e98b81e2d83e849.zip
First import from sources
Diffstat (limited to 'libraries/synopsys/std_logic_signed.vhdl')
-rw-r--r--libraries/synopsys/std_logic_signed.vhdl343
1 files changed, 343 insertions, 0 deletions
diff --git a/libraries/synopsys/std_logic_signed.vhdl b/libraries/synopsys/std_logic_signed.vhdl
new file mode 100644
index 000000000..27d211be5
--- /dev/null
+++ b/libraries/synopsys/std_logic_signed.vhdl
@@ -0,0 +1,343 @@
+--------------------------------------------------------------------------
+-- --
+-- 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;
+
+