- initial version
git-svn-id: http://moon:8086/svn/vhdl/trunk@1073 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,966 @@
|
||||
--------------------------------------------------------------------------
|
||||
--
|
||||
-- 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_misc
|
||||
--
|
||||
-- Purpose: This package defines supplemental types, subtypes,
|
||||
-- constants, and functions for the Std_logic_1164 Package.
|
||||
--
|
||||
-- Author: GWH
|
||||
--
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
library IEEE;
|
||||
use IEEE.STD_LOGIC_1164.all;
|
||||
library SYNOPSYS;
|
||||
use SYNOPSYS.attributes.all;
|
||||
|
||||
|
||||
package std_logic_misc is
|
||||
|
||||
-- output-strength types
|
||||
|
||||
type STRENGTH is (strn_X01, strn_X0H, strn_XL1, strn_X0Z, strn_XZ1,
|
||||
strn_WLH, strn_WLZ, strn_WZH, strn_W0H, strn_WL1);
|
||||
|
||||
|
||||
--synopsys synthesis_off
|
||||
|
||||
type MINOMAX is array (1 to 3) of TIME;
|
||||
|
||||
|
||||
---------------------------------------------------------------------
|
||||
--
|
||||
-- functions for mapping the STD_(U)LOGIC according to STRENGTH
|
||||
--
|
||||
---------------------------------------------------------------------
|
||||
|
||||
function strength_map(input: STD_ULOGIC; strn: STRENGTH) return STD_LOGIC;
|
||||
|
||||
function strength_map_z(input:STD_ULOGIC; strn:STRENGTH) return STD_LOGIC;
|
||||
|
||||
---------------------------------------------------------------------
|
||||
--
|
||||
-- conversion functions for STD_ULOGIC_VECTOR and STD_LOGIC_VECTOR
|
||||
--
|
||||
---------------------------------------------------------------------
|
||||
|
||||
--synopsys synthesis_on
|
||||
function Drive (V: STD_ULOGIC_VECTOR) return STD_LOGIC_VECTOR;
|
||||
|
||||
function Drive (V: STD_LOGIC_VECTOR) return STD_ULOGIC_VECTOR;
|
||||
--synopsys synthesis_off
|
||||
|
||||
attribute CLOSELY_RELATED_TCF of Drive: function is TRUE;
|
||||
|
||||
---------------------------------------------------------------------
|
||||
--
|
||||
-- conversion functions for sensing various types
|
||||
-- (the second argument allows the user to specify the value to
|
||||
-- be returned when the network is undriven)
|
||||
--
|
||||
---------------------------------------------------------------------
|
||||
|
||||
function Sense (V: STD_ULOGIC; vZ, vU, vDC: STD_ULOGIC) return STD_LOGIC;
|
||||
|
||||
function Sense (V: STD_ULOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
||||
return STD_LOGIC_VECTOR;
|
||||
function Sense (V: STD_ULOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
||||
return STD_ULOGIC_VECTOR;
|
||||
|
||||
function Sense (V: STD_LOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
||||
return STD_LOGIC_VECTOR;
|
||||
function Sense (V: STD_LOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
||||
return STD_ULOGIC_VECTOR;
|
||||
|
||||
--synopsys synthesis_on
|
||||
|
||||
|
||||
---------------------------------------------------------------------
|
||||
--
|
||||
-- Function: STD_LOGIC_VECTORtoBIT_VECTOR STD_ULOGIC_VECTORtoBIT_VECTOR
|
||||
--
|
||||
-- Purpose: Conversion fun. from STD_(U)LOGIC_VECTOR to BIT_VECTOR
|
||||
--
|
||||
-- Mapping: 0, L --> 0
|
||||
-- 1, H --> 1
|
||||
-- X, W --> vX if Xflag is TRUE
|
||||
-- X, W --> 0 if Xflag is FALSE
|
||||
-- Z --> vZ if Zflag is TRUE
|
||||
-- Z --> 0 if Zflag is FALSE
|
||||
-- U --> vU if Uflag is TRUE
|
||||
-- U --> 0 if Uflag is FALSE
|
||||
-- - --> vDC if DCflag is TRUE
|
||||
-- - --> 0 if DCflag is FALSE
|
||||
--
|
||||
---------------------------------------------------------------------
|
||||
|
||||
function STD_LOGIC_VECTORtoBIT_VECTOR (V: STD_LOGIC_VECTOR
|
||||
--synopsys synthesis_off
|
||||
; vX, vZ, vU, vDC: BIT := '0';
|
||||
Xflag, Zflag, Uflag, DCflag: BOOLEAN := FALSE
|
||||
--synopsys synthesis_on
|
||||
) return BIT_VECTOR;
|
||||
|
||||
function STD_ULOGIC_VECTORtoBIT_VECTOR (V: STD_ULOGIC_VECTOR
|
||||
--synopsys synthesis_off
|
||||
; vX, vZ, vU, vDC: BIT := '0';
|
||||
Xflag, Zflag, Uflag, DCflag: BOOLEAN := FALSE
|
||||
--synopsys synthesis_on
|
||||
) return BIT_VECTOR;
|
||||
|
||||
|
||||
---------------------------------------------------------------------
|
||||
--
|
||||
-- Function: STD_ULOGICtoBIT
|
||||
--
|
||||
-- Purpose: Conversion function from STD_(U)LOGIC to BIT
|
||||
--
|
||||
-- Mapping: 0, L --> 0
|
||||
-- 1, H --> 1
|
||||
-- X, W --> vX if Xflag is TRUE
|
||||
-- X, W --> 0 if Xflag is FALSE
|
||||
-- Z --> vZ if Zflag is TRUE
|
||||
-- Z --> 0 if Zflag is FALSE
|
||||
-- U --> vU if Uflag is TRUE
|
||||
-- U --> 0 if Uflag is FALSE
|
||||
-- - --> vDC if DCflag is TRUE
|
||||
-- - --> 0 if DCflag is FALSE
|
||||
--
|
||||
---------------------------------------------------------------------
|
||||
|
||||
function STD_ULOGICtoBIT (V: STD_ULOGIC
|
||||
--synopsys synthesis_off
|
||||
; vX, vZ, vU, vDC: BIT := '0';
|
||||
Xflag, Zflag, Uflag, DCflag: BOOLEAN := FALSE
|
||||
--synopsys synthesis_on
|
||||
) return BIT;
|
||||
|
||||
--------------------------------------------------------------------
|
||||
function AND_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01;
|
||||
function NAND_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01;
|
||||
function OR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01;
|
||||
function NOR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01;
|
||||
function XOR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01;
|
||||
function XNOR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01;
|
||||
|
||||
function AND_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01;
|
||||
function NAND_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01;
|
||||
function OR_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01;
|
||||
function NOR_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01;
|
||||
function XOR_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01;
|
||||
function XNOR_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01;
|
||||
|
||||
--synopsys synthesis_off
|
||||
|
||||
function fun_BUF3S(Input, Enable: UX01; Strn: STRENGTH) return STD_LOGIC;
|
||||
function fun_BUF3SL(Input, Enable: UX01; Strn: STRENGTH) return STD_LOGIC;
|
||||
function fun_MUX2x1(Input0, Input1, Sel: UX01) return UX01;
|
||||
|
||||
function fun_MAJ23(Input0, Input1, Input2: UX01) return UX01;
|
||||
function fun_WiredX(Input0, Input1: std_ulogic) return STD_LOGIC;
|
||||
|
||||
--synopsys synthesis_on
|
||||
|
||||
end;
|
||||
|
||||
|
||||
package body std_logic_misc is
|
||||
|
||||
--synopsys synthesis_off
|
||||
|
||||
type STRN_STD_ULOGIC_TABLE is array (STD_ULOGIC,STRENGTH) of STD_ULOGIC;
|
||||
|
||||
--------------------------------------------------------------------
|
||||
--
|
||||
-- Truth tables for output strength --> STD_ULOGIC lookup
|
||||
--
|
||||
--------------------------------------------------------------------
|
||||
|
||||
-- truth table for output strength --> STD_ULOGIC lookup
|
||||
constant tbl_STRN_STD_ULOGIC: STRN_STD_ULOGIC_TABLE :=
|
||||
-- ------------------------------------------------------------------
|
||||
-- | X01 X0H XL1 X0Z XZ1 WLH WLZ WZH W0H WL1 | strn/ output|
|
||||
-- ------------------------------------------------------------------
|
||||
(('U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U'), -- | U |
|
||||
('X', 'X', 'X', 'X', 'X', 'W', 'W', 'W', 'W', 'W'), -- | X |
|
||||
('0', '0', 'L', '0', 'Z', 'L', 'L', 'Z', '0', 'L'), -- | 0 |
|
||||
('1', 'H', '1', 'Z', '1', 'H', 'Z', 'H', 'H', '1'), -- | 1 |
|
||||
('X', 'X', 'X', 'X', 'X', 'W', 'W', 'W', 'W', 'W'), -- | Z |
|
||||
('X', 'X', 'X', 'X', 'X', 'W', 'W', 'W', 'W', 'W'), -- | W |
|
||||
('0', '0', 'L', '0', 'Z', 'L', 'L', 'Z', '0', 'L'), -- | L |
|
||||
('1', 'H', '1', 'Z', '1', 'H', 'Z', 'H', 'H', '1'), -- | H |
|
||||
('X', 'X', 'X', 'X', 'X', 'W', 'W', 'W', 'W', 'W')); -- | - |
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------
|
||||
--
|
||||
-- Truth tables for strength --> STD_ULOGIC mapping ('Z' pass through)
|
||||
--
|
||||
--------------------------------------------------------------------
|
||||
|
||||
-- truth table for output strength --> STD_ULOGIC lookup
|
||||
constant tbl_STRN_STD_ULOGIC_Z: STRN_STD_ULOGIC_TABLE :=
|
||||
-- ------------------------------------------------------------------
|
||||
-- | X01 X0H XL1 X0Z XZ1 WLH WLZ WZH W0H WL1 | strn/ output|
|
||||
-- ------------------------------------------------------------------
|
||||
(('U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U'), -- | U |
|
||||
('X', 'X', 'X', 'X', 'X', 'W', 'W', 'W', 'W', 'W'), -- | X |
|
||||
('0', '0', 'L', '0', 'Z', 'L', 'L', 'Z', '0', 'L'), -- | 0 |
|
||||
('1', 'H', '1', 'Z', '1', 'H', 'Z', 'H', 'H', '1'), -- | 1 |
|
||||
('Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z', 'Z'), -- | Z |
|
||||
('X', 'X', 'X', 'X', 'X', 'W', 'W', 'W', 'W', 'W'), -- | W |
|
||||
('0', '0', 'L', '0', 'Z', 'L', 'L', 'Z', '0', 'L'), -- | L |
|
||||
('1', 'H', '1', 'Z', '1', 'H', 'Z', 'H', 'H', '1'), -- | H |
|
||||
('X', 'X', 'X', 'X', 'X', 'W', 'W', 'W', 'W', 'W')); -- | - |
|
||||
|
||||
|
||||
|
||||
---------------------------------------------------------------------
|
||||
--
|
||||
-- functions for mapping the STD_(U)LOGIC according to STRENGTH
|
||||
--
|
||||
---------------------------------------------------------------------
|
||||
|
||||
function strength_map(input: STD_ULOGIC; strn: STRENGTH) return STD_LOGIC is
|
||||
-- pragma subpgm_id 387
|
||||
begin
|
||||
return tbl_STRN_STD_ULOGIC(input, strn);
|
||||
end strength_map;
|
||||
|
||||
|
||||
function strength_map_z(input:STD_ULOGIC; strn:STRENGTH) return STD_LOGIC is
|
||||
-- pragma subpgm_id 388
|
||||
begin
|
||||
return tbl_STRN_STD_ULOGIC_Z(input, strn);
|
||||
end strength_map_z;
|
||||
|
||||
|
||||
---------------------------------------------------------------------
|
||||
--
|
||||
-- conversion functions for STD_LOGIC_VECTOR and STD_ULOGIC_VECTOR
|
||||
--
|
||||
---------------------------------------------------------------------
|
||||
|
||||
--synopsys synthesis_on
|
||||
function Drive (V: STD_LOGIC_VECTOR) return STD_ULOGIC_VECTOR is
|
||||
-- pragma built_in SYN_FEED_THRU
|
||||
-- pragma subpgm_id 389
|
||||
--synopsys synthesis_off
|
||||
alias Value: STD_LOGIC_VECTOR (V'length-1 downto 0) is V;
|
||||
--synopsys synthesis_on
|
||||
begin
|
||||
--synopsys synthesis_off
|
||||
return STD_ULOGIC_VECTOR(Value);
|
||||
--synopsys synthesis_on
|
||||
end Drive;
|
||||
|
||||
|
||||
function Drive (V: STD_ULOGIC_VECTOR) return STD_LOGIC_VECTOR is
|
||||
-- pragma built_in SYN_FEED_THRU
|
||||
-- pragma subpgm_id 390
|
||||
--synopsys synthesis_off
|
||||
alias Value: STD_ULOGIC_VECTOR (V'length-1 downto 0) is V;
|
||||
--synopsys synthesis_on
|
||||
begin
|
||||
--synopsys synthesis_off
|
||||
return STD_LOGIC_VECTOR(Value);
|
||||
--synopsys synthesis_on
|
||||
end Drive;
|
||||
--synopsys synthesis_off
|
||||
|
||||
|
||||
---------------------------------------------------------------------
|
||||
--
|
||||
-- conversion functions for sensing various types
|
||||
--
|
||||
-- (the second argument allows the user to specify the value to
|
||||
-- be returned when the network is undriven)
|
||||
--
|
||||
---------------------------------------------------------------------
|
||||
|
||||
function Sense (V: STD_ULOGIC; vZ, vU, vDC: STD_ULOGIC)
|
||||
return STD_LOGIC is
|
||||
-- pragma subpgm_id 391
|
||||
begin
|
||||
if V = 'Z' then
|
||||
return vZ;
|
||||
elsif V = 'U' then
|
||||
return vU;
|
||||
elsif V = '-' then
|
||||
return vDC;
|
||||
else
|
||||
return V;
|
||||
end if;
|
||||
end Sense;
|
||||
|
||||
|
||||
function Sense (V: STD_ULOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
||||
return STD_LOGIC_VECTOR is
|
||||
-- pragma subpgm_id 392
|
||||
alias Value: STD_ULOGIC_VECTOR (V'length-1 downto 0) is V;
|
||||
variable Result: STD_LOGIC_VECTOR (V'length-1 downto 0);
|
||||
begin
|
||||
for i in Value'range loop
|
||||
if ( Value(i) = 'Z' ) then
|
||||
Result(i) := vZ;
|
||||
elsif Value(i) = 'U' then
|
||||
Result(i) := vU;
|
||||
elsif Value(i) = '-' then
|
||||
Result(i) := vDC;
|
||||
else
|
||||
Result(i) := Value(i);
|
||||
end if;
|
||||
end loop;
|
||||
return Result;
|
||||
end Sense;
|
||||
|
||||
|
||||
function Sense (V: STD_ULOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
||||
return STD_ULOGIC_VECTOR is
|
||||
-- pragma subpgm_id 393
|
||||
alias Value: STD_ULOGIC_VECTOR (V'length-1 downto 0) is V;
|
||||
variable Result: STD_ULOGIC_VECTOR (V'length-1 downto 0);
|
||||
begin
|
||||
for i in Value'range loop
|
||||
if ( Value(i) = 'Z' ) then
|
||||
Result(i) := vZ;
|
||||
elsif Value(i) = 'U' then
|
||||
Result(i) := vU;
|
||||
elsif Value(i) = '-' then
|
||||
Result(i) := vDC;
|
||||
else
|
||||
Result(i) := Value(i);
|
||||
end if;
|
||||
end loop;
|
||||
return Result;
|
||||
end Sense;
|
||||
|
||||
|
||||
function Sense (V: STD_LOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
||||
return STD_LOGIC_VECTOR is
|
||||
-- pragma subpgm_id 394
|
||||
alias Value: STD_LOGIC_VECTOR (V'length-1 downto 0) is V;
|
||||
variable Result: STD_LOGIC_VECTOR (V'length-1 downto 0);
|
||||
begin
|
||||
for i in Value'range loop
|
||||
if ( Value(i) = 'Z' ) then
|
||||
Result(i) := vZ;
|
||||
elsif Value(i) = 'U' then
|
||||
Result(i) := vU;
|
||||
elsif Value(i) = '-' then
|
||||
Result(i) := vDC;
|
||||
else
|
||||
Result(i) := Value(i);
|
||||
end if;
|
||||
end loop;
|
||||
return Result;
|
||||
end Sense;
|
||||
|
||||
|
||||
function Sense (V: STD_LOGIC_VECTOR; vZ, vU, vDC: STD_ULOGIC)
|
||||
return STD_ULOGIC_VECTOR is
|
||||
-- pragma subpgm_id 395
|
||||
alias Value: STD_LOGIC_VECTOR (V'length-1 downto 0) is V;
|
||||
variable Result: STD_ULOGIC_VECTOR (V'length-1 downto 0);
|
||||
begin
|
||||
for i in Value'range loop
|
||||
if ( Value(i) = 'Z' ) then
|
||||
Result(i) := vZ;
|
||||
elsif Value(i) = 'U' then
|
||||
Result(i) := vU;
|
||||
elsif Value(i) = '-' then
|
||||
Result(i) := vDC;
|
||||
else
|
||||
Result(i) := Value(i);
|
||||
end if;
|
||||
end loop;
|
||||
return Result;
|
||||
end Sense;
|
||||
|
||||
---------------------------------------------------------------------
|
||||
--
|
||||
-- Function: STD_LOGIC_VECTORtoBIT_VECTOR
|
||||
--
|
||||
-- Purpose: Conversion fun. from STD_LOGIC_VECTOR to BIT_VECTOR
|
||||
--
|
||||
-- Mapping: 0, L --> 0
|
||||
-- 1, H --> 1
|
||||
-- X, W --> vX if Xflag is TRUE
|
||||
-- X, W --> 0 if Xflag is FALSE
|
||||
-- Z --> vZ if Zflag is TRUE
|
||||
-- Z --> 0 if Zflag is FALSE
|
||||
-- U --> vU if Uflag is TRUE
|
||||
-- U --> 0 if Uflag is FALSE
|
||||
-- - --> vDC if DCflag is TRUE
|
||||
-- - --> 0 if DCflag is FALSE
|
||||
--
|
||||
---------------------------------------------------------------------
|
||||
|
||||
--synopsys synthesis_on
|
||||
function STD_LOGIC_VECTORtoBIT_VECTOR (V: STD_LOGIC_VECTOR
|
||||
--synopsys synthesis_off
|
||||
; vX, vZ, vU, vDC: BIT := '0';
|
||||
Xflag, Zflag, Uflag, DCflag: BOOLEAN := FALSE
|
||||
--synopsys synthesis_on
|
||||
) return BIT_VECTOR is
|
||||
-- pragma built_in SYN_FEED_THRU
|
||||
-- pragma subpgm_id 396
|
||||
--synopsys synthesis_off
|
||||
alias Value: STD_LOGIC_VECTOR (V'length-1 downto 0) is V;
|
||||
variable Result: BIT_VECTOR (V'length-1 downto 0);
|
||||
--synopsys synthesis_on
|
||||
begin
|
||||
--synopsys synthesis_off
|
||||
for i in Value'range loop
|
||||
case Value(i) is
|
||||
when '0' | 'L' =>
|
||||
Result(i) := '0';
|
||||
when '1' | 'H' =>
|
||||
Result(i) := '1';
|
||||
when 'X' =>
|
||||
if ( Xflag ) then
|
||||
Result(i) := vX;
|
||||
else
|
||||
Result(i) := '0';
|
||||
assert FALSE
|
||||
report "STD_LOGIC_VECTORtoBIT_VECTOR: X --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
when 'W' =>
|
||||
if ( Xflag ) then
|
||||
Result(i) := vX;
|
||||
else
|
||||
Result(i) := '0';
|
||||
assert FALSE
|
||||
report "STD_LOGIC_VECTORtoBIT_VECTOR: W --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
when 'Z' =>
|
||||
if ( Zflag ) then
|
||||
Result(i) := vZ;
|
||||
else
|
||||
Result(i) := '0';
|
||||
assert FALSE
|
||||
report "STD_LOGIC_VECTORtoBIT_VECTOR: Z --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
when 'U' =>
|
||||
if ( Uflag ) then
|
||||
Result(i) := vU;
|
||||
else
|
||||
Result(i) := '0';
|
||||
assert FALSE
|
||||
report "STD_LOGIC_VECTORtoBIT_VECTOR: U --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
when '-' =>
|
||||
if ( DCflag ) then
|
||||
Result(i) := vDC;
|
||||
else
|
||||
Result(i) := '0';
|
||||
assert FALSE
|
||||
report "STD_LOGIC_VECTORtoBIT_VECTOR: - --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
end case;
|
||||
end loop;
|
||||
return Result;
|
||||
--synopsys synthesis_on
|
||||
end STD_LOGIC_VECTORtoBIT_VECTOR;
|
||||
|
||||
|
||||
|
||||
|
||||
---------------------------------------------------------------------
|
||||
--
|
||||
-- Function: STD_ULOGIC_VECTORtoBIT_VECTOR
|
||||
--
|
||||
-- Purpose: Conversion fun. from STD_ULOGIC_VECTOR to BIT_VECTOR
|
||||
--
|
||||
-- Mapping: 0, L --> 0
|
||||
-- 1, H --> 1
|
||||
-- X, W --> vX if Xflag is TRUE
|
||||
-- X, W --> 0 if Xflag is FALSE
|
||||
-- Z --> vZ if Zflag is TRUE
|
||||
-- Z --> 0 if Zflag is FALSE
|
||||
-- U --> vU if Uflag is TRUE
|
||||
-- U --> 0 if Uflag is FALSE
|
||||
-- - --> vDC if DCflag is TRUE
|
||||
-- - --> 0 if DCflag is FALSE
|
||||
--
|
||||
---------------------------------------------------------------------
|
||||
|
||||
function STD_ULOGIC_VECTORtoBIT_VECTOR (V: STD_ULOGIC_VECTOR
|
||||
--synopsys synthesis_off
|
||||
; vX, vZ, vU, vDC: BIT := '0';
|
||||
Xflag, Zflag, Uflag, DCflag: BOOLEAN := FALSE
|
||||
--synopsys synthesis_on
|
||||
) return BIT_VECTOR is
|
||||
-- pragma built_in SYN_FEED_THRU
|
||||
-- pragma subpgm_id 397
|
||||
--synopsys synthesis_off
|
||||
alias Value: STD_ULOGIC_VECTOR (V'length-1 downto 0) is V;
|
||||
variable Result: BIT_VECTOR (V'length-1 downto 0);
|
||||
--synopsys synthesis_on
|
||||
begin
|
||||
--synopsys synthesis_off
|
||||
for i in Value'range loop
|
||||
case Value(i) is
|
||||
when '0' | 'L' =>
|
||||
Result(i) := '0';
|
||||
when '1' | 'H' =>
|
||||
Result(i) := '1';
|
||||
when 'X' =>
|
||||
if ( Xflag ) then
|
||||
Result(i) := vX;
|
||||
else
|
||||
Result(i) := '0';
|
||||
assert FALSE
|
||||
report "STD_ULOGIC_VECTORtoBIT_VECTOR: X --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
when 'W' =>
|
||||
if ( Xflag ) then
|
||||
Result(i) := vX;
|
||||
else
|
||||
Result(i) := '0';
|
||||
assert FALSE
|
||||
report "STD_ULOGIC_VECTORtoBIT_VECTOR: W --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
when 'Z' =>
|
||||
if ( Zflag ) then
|
||||
Result(i) := vZ;
|
||||
else
|
||||
Result(i) := '0';
|
||||
assert FALSE
|
||||
report "STD_ULOGIC_VECTORtoBIT_VECTOR: Z --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
when 'U' =>
|
||||
if ( Uflag ) then
|
||||
Result(i) := vU;
|
||||
else
|
||||
Result(i) := '0';
|
||||
assert FALSE
|
||||
report "STD_ULOGIC_VECTORtoBIT_VECTOR: U --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
when '-' =>
|
||||
if ( DCflag ) then
|
||||
Result(i) := vDC;
|
||||
else
|
||||
Result(i) := '0';
|
||||
assert FALSE
|
||||
report "STD_ULOGIC_VECTORtoBIT_VECTOR: - --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
end case;
|
||||
end loop;
|
||||
return Result;
|
||||
--synopsys synthesis_on
|
||||
end STD_ULOGIC_VECTORtoBIT_VECTOR;
|
||||
|
||||
|
||||
|
||||
|
||||
---------------------------------------------------------------------
|
||||
--
|
||||
-- Function: STD_ULOGICtoBIT
|
||||
--
|
||||
-- Purpose: Conversion function from STD_ULOGIC to BIT
|
||||
--
|
||||
-- Mapping: 0, L --> 0
|
||||
-- 1, H --> 1
|
||||
-- X, W --> vX if Xflag is TRUE
|
||||
-- X, W --> 0 if Xflag is FALSE
|
||||
-- Z --> vZ if Zflag is TRUE
|
||||
-- Z --> 0 if Zflag is FALSE
|
||||
-- U --> vU if Uflag is TRUE
|
||||
-- U --> 0 if Uflag is FALSE
|
||||
-- - --> vDC if DCflag is TRUE
|
||||
-- - --> 0 if DCflag is FALSE
|
||||
--
|
||||
---------------------------------------------------------------------
|
||||
|
||||
function STD_ULOGICtoBIT (V: STD_ULOGIC
|
||||
--synopsys synthesis_off
|
||||
; vX, vZ, vU, vDC: BIT := '0';
|
||||
Xflag, Zflag, Uflag, DCflag: BOOLEAN := FALSE
|
||||
--synopsys synthesis_on
|
||||
) return BIT is
|
||||
-- pragma built_in SYN_FEED_THRU
|
||||
-- pragma subpgm_id 398
|
||||
variable Result: BIT;
|
||||
begin
|
||||
--synopsys synthesis_off
|
||||
case V is
|
||||
when '0' | 'L' =>
|
||||
Result := '0';
|
||||
when '1' | 'H' =>
|
||||
Result := '1';
|
||||
when 'X' =>
|
||||
if ( Xflag ) then
|
||||
Result := vX;
|
||||
else
|
||||
Result := '0';
|
||||
assert FALSE
|
||||
report "STD_ULOGICtoBIT: X --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
when 'W' =>
|
||||
if ( Xflag ) then
|
||||
Result := vX;
|
||||
else
|
||||
Result := '0';
|
||||
assert FALSE
|
||||
report "STD_ULOGICtoBIT: W --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
when 'Z' =>
|
||||
if ( Zflag ) then
|
||||
Result := vZ;
|
||||
else
|
||||
Result := '0';
|
||||
assert FALSE
|
||||
report "STD_ULOGICtoBIT: Z --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
when 'U' =>
|
||||
if ( Uflag ) then
|
||||
Result := vU;
|
||||
else
|
||||
Result := '0';
|
||||
assert FALSE
|
||||
report "STD_ULOGICtoBIT: U --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
when '-' =>
|
||||
if ( DCflag ) then
|
||||
Result := vDC;
|
||||
else
|
||||
Result := '0';
|
||||
assert FALSE
|
||||
report "STD_ULOGICtoBIT: - --> 0"
|
||||
severity WARNING;
|
||||
end if;
|
||||
end case;
|
||||
return Result;
|
||||
--synopsys synthesis_on
|
||||
end STD_ULOGICtoBIT;
|
||||
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
function AND_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01 is
|
||||
-- pragma subpgm_id 399
|
||||
variable result: STD_LOGIC;
|
||||
begin
|
||||
result := '1';
|
||||
for i in ARG'range loop
|
||||
result := result and ARG(i);
|
||||
end loop;
|
||||
return result;
|
||||
end;
|
||||
|
||||
function NAND_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01 is
|
||||
-- pragma subpgm_id 400
|
||||
begin
|
||||
return not AND_REDUCE(ARG);
|
||||
end;
|
||||
|
||||
function OR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01 is
|
||||
-- pragma subpgm_id 401
|
||||
variable result: STD_LOGIC;
|
||||
begin
|
||||
result := '0';
|
||||
for i in ARG'range loop
|
||||
result := result or ARG(i);
|
||||
end loop;
|
||||
return result;
|
||||
end;
|
||||
|
||||
function NOR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01 is
|
||||
-- pragma subpgm_id 402
|
||||
begin
|
||||
return not OR_REDUCE(ARG);
|
||||
end;
|
||||
|
||||
function XOR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01 is
|
||||
-- pragma subpgm_id 403
|
||||
variable result: STD_LOGIC;
|
||||
begin
|
||||
result := '0';
|
||||
for i in ARG'range loop
|
||||
result := result xor ARG(i);
|
||||
end loop;
|
||||
return result;
|
||||
end;
|
||||
|
||||
function XNOR_REDUCE(ARG: STD_LOGIC_VECTOR) return UX01 is
|
||||
-- pragma subpgm_id 404
|
||||
begin
|
||||
return not XOR_REDUCE(ARG);
|
||||
end;
|
||||
|
||||
function AND_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01 is
|
||||
-- pragma subpgm_id 405
|
||||
variable result: STD_LOGIC;
|
||||
begin
|
||||
result := '1';
|
||||
for i in ARG'range loop
|
||||
result := result and ARG(i);
|
||||
end loop;
|
||||
return result;
|
||||
end;
|
||||
|
||||
function NAND_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01 is
|
||||
-- pragma subpgm_id 406
|
||||
begin
|
||||
return not AND_REDUCE(ARG);
|
||||
end;
|
||||
|
||||
function OR_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01 is
|
||||
-- pragma subpgm_id 407
|
||||
variable result: STD_LOGIC;
|
||||
begin
|
||||
result := '0';
|
||||
for i in ARG'range loop
|
||||
result := result or ARG(i);
|
||||
end loop;
|
||||
return result;
|
||||
end;
|
||||
|
||||
function NOR_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01 is
|
||||
-- pragma subpgm_id 408
|
||||
begin
|
||||
return not OR_REDUCE(ARG);
|
||||
end;
|
||||
|
||||
function XOR_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01 is
|
||||
-- pragma subpgm_id 409
|
||||
variable result: STD_LOGIC;
|
||||
begin
|
||||
result := '0';
|
||||
for i in ARG'range loop
|
||||
result := result xor ARG(i);
|
||||
end loop;
|
||||
return result;
|
||||
end;
|
||||
|
||||
function XNOR_REDUCE(ARG: STD_ULOGIC_VECTOR) return UX01 is
|
||||
-- pragma subpgm_id 410
|
||||
begin
|
||||
return not XOR_REDUCE(ARG);
|
||||
end;
|
||||
|
||||
--synopsys synthesis_off
|
||||
|
||||
function fun_BUF3S(Input, Enable: UX01; Strn: STRENGTH) return STD_LOGIC is
|
||||
-- pragma subpgm_id 411
|
||||
type TRISTATE_TABLE is array(STRENGTH, UX01, UX01) of STD_LOGIC;
|
||||
|
||||
-- truth table for tristate "buf" function (Enable active Low)
|
||||
constant tbl_BUF3S: TRISTATE_TABLE :=
|
||||
-- ----------------------------------------------------
|
||||
-- | Input U X 0 1 | Enable Strength |
|
||||
-- ---------------------------------|-----------------|
|
||||
((('U', 'U', 'U', 'U'), --| U X01 |
|
||||
('U', 'X', 'X', 'X'), --| X X01 |
|
||||
('Z', 'Z', 'Z', 'Z'), --| 0 X01 |
|
||||
('U', 'X', '0', '1')), --| 1 X01 |
|
||||
(('U', 'U', 'U', 'U'), --| U X0H |
|
||||
('U', 'X', 'X', 'X'), --| X X0H |
|
||||
('Z', 'Z', 'Z', 'Z'), --| 0 X0H |
|
||||
('U', 'X', '0', 'H')), --| 1 X0H |
|
||||
(('U', 'U', 'U', 'U'), --| U XL1 |
|
||||
('U', 'X', 'X', 'X'), --| X XL1 |
|
||||
('Z', 'Z', 'Z', 'Z'), --| 0 XL1 |
|
||||
('U', 'X', 'L', '1')), --| 1 XL1 |
|
||||
(('U', 'U', 'U', 'Z'), --| U X0Z |
|
||||
('U', 'X', 'X', 'Z'), --| X X0Z |
|
||||
('Z', 'Z', 'Z', 'Z'), --| 0 X0Z |
|
||||
('U', 'X', '0', 'Z')), --| 1 X0Z |
|
||||
(('U', 'U', 'U', 'U'), --| U XZ1 |
|
||||
('U', 'X', 'X', 'X'), --| X XZ1 |
|
||||
('Z', 'Z', 'Z', 'Z'), --| 0 XZ1 |
|
||||
('U', 'X', 'Z', '1')), --| 1 XZ1 |
|
||||
(('U', 'U', 'U', 'U'), --| U WLH |
|
||||
('U', 'W', 'W', 'W'), --| X WLH |
|
||||
('Z', 'Z', 'Z', 'Z'), --| 0 WLH |
|
||||
('U', 'W', 'L', 'H')), --| 1 WLH |
|
||||
(('U', 'U', 'U', 'U'), --| U WLZ |
|
||||
('U', 'W', 'W', 'Z'), --| X WLZ |
|
||||
('Z', 'Z', 'Z', 'Z'), --| 0 WLZ |
|
||||
('U', 'W', 'L', 'Z')), --| 1 WLZ |
|
||||
(('U', 'U', 'U', 'U'), --| U WZH |
|
||||
('U', 'W', 'W', 'W'), --| X WZH |
|
||||
('Z', 'Z', 'Z', 'Z'), --| 0 WZH |
|
||||
('U', 'W', 'Z', 'H')), --| 1 WZH |
|
||||
(('U', 'U', 'U', 'U'), --| U W0H |
|
||||
('U', 'W', 'W', 'W'), --| X W0H |
|
||||
('Z', 'Z', 'Z', 'Z'), --| 0 W0H |
|
||||
('U', 'W', '0', 'H')), --| 1 W0H |
|
||||
(('U', 'U', 'U', 'U'), --| U WL1 |
|
||||
('U', 'W', 'W', 'W'), --| X WL1 |
|
||||
('Z', 'Z', 'Z', 'Z'), --| 0 WL1 |
|
||||
('U', 'W', 'L', '1')));--| 1 WL1 |
|
||||
begin
|
||||
return tbl_BUF3S(Strn, Enable, Input);
|
||||
end fun_BUF3S;
|
||||
|
||||
|
||||
function fun_BUF3SL(Input, Enable: UX01; Strn: STRENGTH) return STD_LOGIC is
|
||||
-- pragma subpgm_id 412
|
||||
type TRISTATE_TABLE is array(STRENGTH, UX01, UX01) of STD_LOGIC;
|
||||
|
||||
-- truth table for tristate "buf" function (Enable active Low)
|
||||
constant tbl_BUF3SL: TRISTATE_TABLE :=
|
||||
-- ----------------------------------------------------
|
||||
-- | Input U X 0 1 | Enable Strength |
|
||||
-- ---------------------------------|-----------------|
|
||||
((('U', 'U', 'U', 'U'), --| U X01 |
|
||||
('U', 'X', 'X', 'X'), --| X X01 |
|
||||
('U', 'X', '0', '1'), --| 0 X01 |
|
||||
('Z', 'Z', 'Z', 'Z')), --| 1 X01 |
|
||||
(('U', 'U', 'U', 'U'), --| U X0H |
|
||||
('U', 'X', 'X', 'X'), --| X X0H |
|
||||
('U', 'X', '0', 'H'), --| 0 X0H |
|
||||
('Z', 'Z', 'Z', 'Z')), --| 1 X0H |
|
||||
(('U', 'U', 'U', 'U'), --| U XL1 |
|
||||
('U', 'X', 'X', 'X'), --| X XL1 |
|
||||
('U', 'X', 'L', '1'), --| 0 XL1 |
|
||||
('Z', 'Z', 'Z', 'Z')), --| 1 XL1 |
|
||||
(('U', 'U', 'U', 'Z'), --| U X0Z |
|
||||
('U', 'X', 'X', 'Z'), --| X X0Z |
|
||||
('U', 'X', '0', 'Z'), --| 0 X0Z |
|
||||
('Z', 'Z', 'Z', 'Z')), --| 1 X0Z |
|
||||
(('U', 'U', 'U', 'U'), --| U XZ1 |
|
||||
('U', 'X', 'X', 'X'), --| X XZ1 |
|
||||
('U', 'X', 'Z', '1'), --| 0 XZ1 |
|
||||
('Z', 'Z', 'Z', 'Z')), --| 1 XZ1 |
|
||||
(('U', 'U', 'U', 'U'), --| U WLH |
|
||||
('U', 'W', 'W', 'W'), --| X WLH |
|
||||
('U', 'W', 'L', 'H'), --| 0 WLH |
|
||||
('Z', 'Z', 'Z', 'Z')), --| 1 WLH |
|
||||
(('U', 'U', 'U', 'U'), --| U WLZ |
|
||||
('U', 'W', 'W', 'Z'), --| X WLZ |
|
||||
('U', 'W', 'L', 'Z'), --| 0 WLZ |
|
||||
('Z', 'Z', 'Z', 'Z')), --| 1 WLZ |
|
||||
(('U', 'U', 'U', 'U'), --| U WZH |
|
||||
('U', 'W', 'W', 'W'), --| X WZH |
|
||||
('U', 'W', 'Z', 'H'), --| 0 WZH |
|
||||
('Z', 'Z', 'Z', 'Z')), --| 1 WZH |
|
||||
(('U', 'U', 'U', 'U'), --| U W0H |
|
||||
('U', 'W', 'W', 'W'), --| X W0H |
|
||||
('U', 'W', '0', 'H'), --| 0 W0H |
|
||||
('Z', 'Z', 'Z', 'Z')), --| 1 W0H |
|
||||
(('U', 'U', 'U', 'U'), --| U WL1 |
|
||||
('U', 'W', 'W', 'W'), --| X WL1 |
|
||||
('U', 'W', 'L', '1'), --| 0 WL1 |
|
||||
('Z', 'Z', 'Z', 'Z')));--| 1 WL1 |
|
||||
begin
|
||||
return tbl_BUF3SL(Strn, Enable, Input);
|
||||
end fun_BUF3SL;
|
||||
|
||||
|
||||
function fun_MUX2x1(Input0, Input1, Sel: UX01) return UX01 is
|
||||
-- pragma subpgm_id 413
|
||||
type MUX_TABLE is array (UX01, UX01, UX01) of UX01;
|
||||
|
||||
-- truth table for "MUX2x1" function
|
||||
constant tbl_MUX2x1: MUX_TABLE :=
|
||||
--------------------------------------------
|
||||
--| In0 'U' 'X' '0' '1' | Sel In1 |
|
||||
--------------------------------------------
|
||||
((('U', 'U', 'U', 'U'), --| 'U' 'U' |
|
||||
('U', 'U', 'U', 'U'), --| 'X' 'U' |
|
||||
('U', 'X', '0', '1'), --| '0' 'U' |
|
||||
('U', 'U', 'U', 'U')), --| '1' 'U' |
|
||||
(('U', 'X', 'U', 'U'), --| 'U' 'X' |
|
||||
('U', 'X', 'X', 'X'), --| 'X' 'X' |
|
||||
('U', 'X', '0', '1'), --| '0' 'X' |
|
||||
('X', 'X', 'X', 'X')), --| '1' 'X' |
|
||||
(('U', 'U', '0', 'U'), --| 'U' '0' |
|
||||
('U', 'X', '0', 'X'), --| 'X' '0' |
|
||||
('U', 'X', '0', '1'), --| '0' '0' |
|
||||
('0', '0', '0', '0')), --| '1' '0' |
|
||||
(('U', 'U', 'U', '1'), --| 'U' '1' |
|
||||
('U', 'X', 'X', '1'), --| 'X' '1' |
|
||||
('U', 'X', '0', '1'), --| '0' '1' |
|
||||
('1', '1', '1', '1')));--| '1' '1' |
|
||||
begin
|
||||
return tbl_MUX2x1(Input1, Sel, Input0);
|
||||
end fun_MUX2x1;
|
||||
|
||||
|
||||
function fun_MAJ23(Input0, Input1, Input2: UX01) return UX01 is
|
||||
-- pragma subpgm_id 414
|
||||
type MAJ23_TABLE is array (UX01, UX01, UX01) of UX01;
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
-- The "tbl_MAJ23" truth table return 1 if the majority of three
|
||||
-- inputs is 1, a 0 if the majority is 0, a X if unknown, and a U if
|
||||
-- uninitialized.
|
||||
----------------------------------------------------------------------------
|
||||
constant tbl_MAJ23: MAJ23_TABLE :=
|
||||
--------------------------------------------
|
||||
--| In0 'U' 'X' '0' '1' | In1 In2 |
|
||||
--------------------------------------------
|
||||
((('U', 'U', 'U', 'U'), --| 'U' 'U' |
|
||||
('U', 'U', 'U', 'U'), --| 'X' 'U' |
|
||||
('U', 'U', '0', 'U'), --| '0' 'U' |
|
||||
('U', 'U', 'U', '1')), --| '1' 'U' |
|
||||
(('U', 'U', 'U', 'U'), --| 'U' 'X' |
|
||||
('U', 'X', 'X', 'X'), --| 'X' 'X' |
|
||||
('U', 'X', '0', 'X'), --| '0' 'X' |
|
||||
('U', 'X', 'X', '1')), --| '1' 'X' |
|
||||
(('U', 'U', '0', 'U'), --| 'U' '0' |
|
||||
('U', 'X', '0', 'X'), --| 'X' '0' |
|
||||
('0', '0', '0', '0'), --| '0' '0' |
|
||||
('U', 'X', '0', '1')), --| '1' '0' |
|
||||
(('U', 'U', 'U', '1'), --| 'U' '1' |
|
||||
('U', 'X', 'X', '1'), --| 'X' '1' |
|
||||
('U', 'X', '0', '1'), --| '0' '1' |
|
||||
('1', '1', '1', '1')));--| '1' '1' |
|
||||
|
||||
begin
|
||||
return tbl_MAJ23(Input0, Input1, Input2);
|
||||
end fun_MAJ23;
|
||||
|
||||
|
||||
function fun_WiredX(Input0, Input1: STD_ULOGIC) return STD_LOGIC is
|
||||
-- pragma subpgm_id 415
|
||||
TYPE stdlogic_table IS ARRAY(STD_ULOGIC, STD_ULOGIC) OF STD_LOGIC;
|
||||
|
||||
-- truth table for "WiredX" function
|
||||
-------------------------------------------------------------------
|
||||
-- resolution function
|
||||
-------------------------------------------------------------------
|
||||
CONSTANT resolution_table : stdlogic_table := (
|
||||
-- ---------------------------------------------------------
|
||||
-- | U X 0 1 Z W L H - | |
|
||||
-- ---------------------------------------------------------
|
||||
( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- | U |
|
||||
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- | X |
|
||||
( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- | 0 |
|
||||
( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- | 1 |
|
||||
( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- | Z |
|
||||
( 'U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X' ), -- | W |
|
||||
( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X' ), -- | L |
|
||||
( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X' ), -- | H |
|
||||
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ));-- | - |
|
||||
begin
|
||||
return resolution_table(Input0, Input1);
|
||||
end fun_WiredX;
|
||||
|
||||
--synopsys synthesis_on
|
||||
|
||||
end;
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -0,0 +1,654 @@
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
-- 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_TEXTIO
|
||||
--
|
||||
-- Purpose: This package overloads the standard TEXTIO procedures
|
||||
-- READ and WRITE.
|
||||
--
|
||||
-- Author: CRC, TS
|
||||
--
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
use STD.textio.all;
|
||||
library IEEE;
|
||||
use IEEE.std_logic_1164.all;
|
||||
|
||||
package STD_LOGIC_TEXTIO is
|
||||
--synopsys synthesis_off
|
||||
-- Read and Write procedures for STD_ULOGIC and STD_ULOGIC_VECTOR
|
||||
procedure READ(L:inout LINE; VALUE:out STD_ULOGIC);
|
||||
procedure READ(L:inout LINE; VALUE:out STD_ULOGIC; GOOD: out BOOLEAN);
|
||||
procedure READ(L:inout LINE; VALUE:out STD_ULOGIC_VECTOR);
|
||||
procedure READ(L:inout LINE; VALUE:out STD_ULOGIC_VECTOR; GOOD: out BOOLEAN);
|
||||
procedure WRITE(L:inout LINE; VALUE:in STD_ULOGIC;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0);
|
||||
procedure WRITE(L:inout LINE; VALUE:in STD_ULOGIC_VECTOR;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0);
|
||||
|
||||
-- Read and Write procedures for STD_LOGIC_VECTOR
|
||||
procedure READ(L:inout LINE; VALUE:out STD_LOGIC_VECTOR);
|
||||
procedure READ(L:inout LINE; VALUE:out STD_LOGIC_VECTOR; GOOD: out BOOLEAN);
|
||||
procedure WRITE(L:inout LINE; VALUE:in STD_LOGIC_VECTOR;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0);
|
||||
|
||||
--
|
||||
-- Read and Write procedures for Hex and Octal values.
|
||||
-- The values appear in the file as a series of characters
|
||||
-- between 0-F (Hex), or 0-7 (Octal) respectively.
|
||||
--
|
||||
|
||||
-- Hex
|
||||
procedure HREAD(L:inout LINE; VALUE:out STD_ULOGIC_VECTOR);
|
||||
procedure HREAD(L:inout LINE; VALUE:out STD_ULOGIC_VECTOR; GOOD: out BOOLEAN);
|
||||
procedure HWRITE(L:inout LINE; VALUE:in STD_ULOGIC_VECTOR;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0);
|
||||
procedure HREAD(L:inout LINE; VALUE:out STD_LOGIC_VECTOR);
|
||||
procedure HREAD(L:inout LINE; VALUE:out STD_LOGIC_VECTOR; GOOD: out BOOLEAN);
|
||||
procedure HWRITE(L:inout LINE; VALUE:in STD_LOGIC_VECTOR;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0);
|
||||
|
||||
-- Octal
|
||||
procedure OREAD(L:inout LINE; VALUE:out STD_ULOGIC_VECTOR);
|
||||
procedure OREAD(L:inout LINE; VALUE:out STD_ULOGIC_VECTOR; GOOD: out BOOLEAN);
|
||||
procedure OWRITE(L:inout LINE; VALUE:in STD_ULOGIC_VECTOR;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0);
|
||||
procedure OREAD(L:inout LINE; VALUE:out STD_LOGIC_VECTOR);
|
||||
procedure OREAD(L:inout LINE; VALUE:out STD_LOGIC_VECTOR; GOOD: out BOOLEAN);
|
||||
procedure OWRITE(L:inout LINE; VALUE:in STD_LOGIC_VECTOR;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0);
|
||||
|
||||
|
||||
--synopsys synthesis_on
|
||||
end STD_LOGIC_TEXTIO;
|
||||
|
||||
package body STD_LOGIC_TEXTIO is
|
||||
--synopsys synthesis_off
|
||||
|
||||
-- Type and constant definitions used to map STD_ULOGIC values
|
||||
-- into/from character values.
|
||||
|
||||
type MVL9plus is ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-', ERROR);
|
||||
type char_indexed_by_MVL9 is array (STD_ULOGIC) of character;
|
||||
type MVL9_indexed_by_char is array (character) of STD_ULOGIC;
|
||||
type MVL9plus_indexed_by_char is array (character) of MVL9plus;
|
||||
|
||||
constant MVL9_to_char: char_indexed_by_MVL9 := "UX01ZWLH-";
|
||||
constant char_to_MVL9: MVL9_indexed_by_char :=
|
||||
('U' => 'U', 'X' => 'X', '0' => '0', '1' => '1', 'Z' => 'Z',
|
||||
'W' => 'W', 'L' => 'L', 'H' => 'H', '-' => '-', others => 'U');
|
||||
constant char_to_MVL9plus: MVL9plus_indexed_by_char :=
|
||||
('U' => 'U', 'X' => 'X', '0' => '0', '1' => '1', 'Z' => 'Z',
|
||||
'W' => 'W', 'L' => 'L', 'H' => 'H', '-' => '-', others => ERROR);
|
||||
|
||||
|
||||
-- Overloaded procedures.
|
||||
|
||||
procedure READ(L:inout LINE; VALUE:out STD_ULOGIC; GOOD:out BOOLEAN) is
|
||||
variable c: character;
|
||||
variable readOk: BOOLEAN;
|
||||
begin
|
||||
loop -- skip white space
|
||||
read(l,c,readOk); -- but also exit on a bad read
|
||||
exit when ((readOk = FALSE) or ((c /= ' ') and (c /= CR) and (c /= HT)));
|
||||
end loop;
|
||||
|
||||
if (readOk = FALSE) then
|
||||
good := FALSE;
|
||||
else
|
||||
if (char_to_MVL9plus(c) = ERROR) then
|
||||
value := 'U';
|
||||
good := FALSE;
|
||||
else
|
||||
value := char_to_MVL9(c);
|
||||
good := TRUE;
|
||||
end if;
|
||||
end if;
|
||||
end READ;
|
||||
|
||||
procedure READ(L:inout LINE; VALUE:out STD_ULOGIC_VECTOR; GOOD:out BOOLEAN) is
|
||||
variable m: STD_ULOGIC;
|
||||
variable c: character;
|
||||
variable s: string(1 to value'length-1);
|
||||
variable mv: STD_ULOGIC_VECTOR(0 to value'length-1);
|
||||
constant allU: STD_ULOGIC_VECTOR(0 to value'length-1)
|
||||
:= (others => 'U');
|
||||
variable readOk: BOOLEAN;
|
||||
|
||||
begin
|
||||
loop -- skip white space
|
||||
read(l,c,readOk);
|
||||
exit when ((readOk = FALSE) or ((c /= ' ') and (c /= CR) and (c /= HT)));
|
||||
end loop;
|
||||
|
||||
-- Bail out if there was a bad read
|
||||
if (readOk = FALSE) then
|
||||
good := FALSE;
|
||||
return;
|
||||
end if;
|
||||
|
||||
if (char_to_MVL9plus(c) = ERROR) then
|
||||
value := allU;
|
||||
good := FALSE;
|
||||
return;
|
||||
end if;
|
||||
|
||||
read(l, s, readOk);
|
||||
-- Bail out if there was a bad read
|
||||
if (readOk = FALSE) then
|
||||
good := FALSE;
|
||||
return;
|
||||
end if;
|
||||
|
||||
for i in 1 to value'length-1 loop
|
||||
if (char_to_MVL9plus(s(i)) = ERROR) then
|
||||
value := allU;
|
||||
good := FALSE;
|
||||
return;
|
||||
end if;
|
||||
end loop;
|
||||
|
||||
mv(0) := char_to_MVL9(c);
|
||||
for i in 1 to value'length-1 loop
|
||||
mv(i) := char_to_MVL9(s(i));
|
||||
end loop;
|
||||
value := mv;
|
||||
good := TRUE;
|
||||
end READ;
|
||||
|
||||
procedure READ(L:inout LINE; VALUE:out STD_ULOGIC) is
|
||||
variable c: character;
|
||||
begin
|
||||
loop -- skip white space
|
||||
read(l,c);
|
||||
exit when ((c /= ' ') and (c /= CR) and (c /= HT));
|
||||
end loop;
|
||||
|
||||
if (char_to_MVL9plus(c) = ERROR) then
|
||||
value := 'U';
|
||||
assert FALSE report "READ(STD_ULOGIC) Error: Character '" &
|
||||
c & "' read, expected STD_ULOGIC literal.";
|
||||
else
|
||||
value := char_to_MVL9(c);
|
||||
end if;
|
||||
end READ;
|
||||
|
||||
procedure READ(L:inout LINE; VALUE:out STD_ULOGIC_VECTOR) is
|
||||
variable m: STD_ULOGIC;
|
||||
variable c: character;
|
||||
variable s: string(1 to value'length-1);
|
||||
variable mv: STD_ULOGIC_VECTOR(0 to value'length-1);
|
||||
constant allU: STD_ULOGIC_VECTOR(0 to value'length-1)
|
||||
:= (others => 'U');
|
||||
begin
|
||||
loop -- skip white space
|
||||
read(l,c);
|
||||
exit when ((c /= ' ') and (c /= CR) and (c /= HT));
|
||||
end loop;
|
||||
|
||||
if (char_to_MVL9plus(c) = ERROR) then
|
||||
value := allU;
|
||||
assert FALSE report
|
||||
"READ(STD_ULOGIC_VECTOR) Error: Character '" &
|
||||
c & "' read, expected STD_ULOGIC literal.";
|
||||
return;
|
||||
end if;
|
||||
|
||||
read(l, s);
|
||||
for i in 1 to value'length-1 loop
|
||||
if (char_to_MVL9plus(s(i)) = ERROR) then
|
||||
value := allU;
|
||||
assert FALSE report
|
||||
"READ(STD_ULOGIC_VECTOR) Error: Character '" &
|
||||
s(i) & "' read, expected STD_ULOGIC literal.";
|
||||
return;
|
||||
end if;
|
||||
end loop;
|
||||
|
||||
mv(0) := char_to_MVL9(c);
|
||||
for i in 1 to value'length-1 loop
|
||||
mv(i) := char_to_MVL9(s(i));
|
||||
end loop;
|
||||
value := mv;
|
||||
end READ;
|
||||
|
||||
procedure WRITE(L:inout LINE; VALUE:in STD_ULOGIC;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0) is
|
||||
begin
|
||||
write(l, MVL9_to_char(value), justified, field);
|
||||
end WRITE;
|
||||
|
||||
|
||||
procedure WRITE(L:inout LINE; VALUE:in STD_ULOGIC_VECTOR;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0) is
|
||||
variable s: string(1 to value'length);
|
||||
variable m: STD_ULOGIC_VECTOR(1 to value'length) := value;
|
||||
begin
|
||||
for i in 1 to value'length loop
|
||||
s(i) := MVL9_to_char(m(i));
|
||||
end loop;
|
||||
write(l, s, justified, field);
|
||||
end WRITE;
|
||||
|
||||
-- Read and Write procedures for STD_LOGIC_VECTOR
|
||||
procedure READ(L:inout LINE; VALUE:out STD_LOGIC_VECTOR) is
|
||||
variable tmp: STD_ULOGIC_VECTOR(VALUE'length-1 downto 0);
|
||||
begin
|
||||
READ(L, tmp);
|
||||
VALUE := STD_LOGIC_VECTOR(tmp);
|
||||
end READ;
|
||||
|
||||
procedure READ(L:inout LINE; VALUE:out STD_LOGIC_VECTOR; GOOD: out BOOLEAN) is
|
||||
variable tmp: STD_ULOGIC_VECTOR(VALUE'length-1 downto 0);
|
||||
begin
|
||||
READ(L, tmp, GOOD);
|
||||
VALUE := STD_LOGIC_VECTOR(tmp);
|
||||
end READ;
|
||||
|
||||
procedure WRITE(L:inout LINE; VALUE:in STD_LOGIC_VECTOR;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0) is
|
||||
begin
|
||||
WRITE(L, STD_ULOGIC_VECTOR(VALUE), JUSTIFIED, FIELD);
|
||||
end WRITE;
|
||||
|
||||
|
||||
--
|
||||
-- Hex Read and Write procedures.
|
||||
--
|
||||
|
||||
--
|
||||
-- Hex, and Octal Read and Write procedures for BIT_VECTOR
|
||||
-- (these procedures are not exported, they are only used
|
||||
-- by the STD_ULOGIC hex/octal reads and writes below.
|
||||
--
|
||||
--
|
||||
|
||||
procedure Char2QuadBits(C: Character;
|
||||
RESULT: out std_ulogic_vector(3 downto 0);
|
||||
GOOD: out Boolean;
|
||||
ISSUE_ERROR: in Boolean) is
|
||||
begin
|
||||
case c is
|
||||
when '0' => result := x"0"; good := TRUE;
|
||||
when '1' => result := x"1"; good := TRUE;
|
||||
when '2' => result := x"2"; good := TRUE;
|
||||
when '3' => result := x"3"; good := TRUE;
|
||||
when '4' => result := x"4"; good := TRUE;
|
||||
when '5' => result := x"5"; good := TRUE;
|
||||
when '6' => result := x"6"; good := TRUE;
|
||||
when '7' => result := x"7"; good := TRUE;
|
||||
when '8' => result := x"8"; good := TRUE;
|
||||
when '9' => result := x"9"; good := TRUE;
|
||||
when 'A' => result := x"A"; good := TRUE;
|
||||
when 'B' => result := x"B"; good := TRUE;
|
||||
when 'C' => result := x"C"; good := TRUE;
|
||||
when 'D' => result := x"D"; good := TRUE;
|
||||
when 'E' => result := x"E"; good := TRUE;
|
||||
when 'F' => result := x"F"; good := TRUE;
|
||||
when 'Z' => result(0) := 'Z'; result(1) := 'Z'; result(2) := 'Z'; result(3) := 'Z'; good := TRUE;
|
||||
when 'X' => result(0) := 'X'; result(1) := 'X'; result(2) := 'X'; result(3) := 'X'; good := TRUE;
|
||||
|
||||
when 'a' => result := x"A"; good := TRUE;
|
||||
when 'b' => result := x"B"; good := TRUE;
|
||||
when 'c' => result := x"C"; good := TRUE;
|
||||
when 'd' => result := x"D"; good := TRUE;
|
||||
when 'e' => result := x"E"; good := TRUE;
|
||||
when 'f' => result := x"F"; good := TRUE;
|
||||
when others =>
|
||||
if ISSUE_ERROR then
|
||||
assert FALSE report
|
||||
"HREAD Error: Read a '" & c &
|
||||
"', expected a Hex character (0-F).";
|
||||
end if;
|
||||
good := FALSE;
|
||||
end case;
|
||||
end;
|
||||
|
||||
procedure HREAD(L:inout LINE; VALUE:out STD_ULOGIC_VECTOR) is
|
||||
variable ok: boolean;
|
||||
variable c: character;
|
||||
constant ne: integer := value'length/4;
|
||||
variable bv: std_ulogic_vector(0 to value'length-1);
|
||||
variable s: string(1 to ne-1);
|
||||
begin
|
||||
if value'length mod 4 /= 0 then
|
||||
assert FALSE report
|
||||
"HREAD Error: Trying to read vector " &
|
||||
"with an odd (non multiple of 4) length";
|
||||
return;
|
||||
end if;
|
||||
|
||||
loop -- skip white space
|
||||
read(l,c);
|
||||
exit when ((c /= ' ') and (c /= CR) and (c /= HT));
|
||||
end loop;
|
||||
|
||||
Char2QuadBits(c, bv(0 to 3), ok, TRUE);
|
||||
if not ok then
|
||||
return;
|
||||
end if;
|
||||
|
||||
read(L, s, ok);
|
||||
if not ok then
|
||||
assert FALSE
|
||||
report "HREAD Error: Failed to read the STRING";
|
||||
return;
|
||||
end if;
|
||||
|
||||
for i in 1 to ne-1 loop
|
||||
Char2QuadBits(s(i), bv(4*i to 4*i+3), ok, TRUE);
|
||||
if not ok then
|
||||
return;
|
||||
end if;
|
||||
end loop;
|
||||
value := bv;
|
||||
end HREAD;
|
||||
|
||||
procedure HREAD(L:inout LINE; VALUE:out STD_ULOGIC_VECTOR;GOOD: out BOOLEAN) is
|
||||
variable ok: boolean;
|
||||
variable c: character;
|
||||
constant ne: integer := value'length/4;
|
||||
variable bv: std_ulogic_vector(0 to value'length-1);
|
||||
variable s: string(1 to ne-1);
|
||||
begin
|
||||
if value'length mod 4 /= 0 then
|
||||
good := FALSE;
|
||||
return;
|
||||
end if;
|
||||
|
||||
loop -- skip white space
|
||||
read(l,c);
|
||||
exit when ((c /= ' ') and (c /= CR) and (c /= HT));
|
||||
end loop;
|
||||
|
||||
Char2QuadBits(c, bv(0 to 3), ok, FALSE);
|
||||
if not ok then
|
||||
good := FALSE;
|
||||
return;
|
||||
end if;
|
||||
|
||||
read(L, s, ok);
|
||||
if not ok then
|
||||
good := FALSE;
|
||||
return;
|
||||
end if;
|
||||
|
||||
for i in 1 to ne-1 loop
|
||||
Char2QuadBits(s(i), bv(4*i to 4*i+3), ok, FALSE);
|
||||
if not ok then
|
||||
good := FALSE;
|
||||
return;
|
||||
end if;
|
||||
end loop;
|
||||
good := TRUE;
|
||||
value := bv;
|
||||
end HREAD;
|
||||
|
||||
procedure HWRITE(L:inout LINE; VALUE:in std_ulogic_vector;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0) is
|
||||
variable quad: std_ulogic_vector(0 to 3);
|
||||
constant ne: integer := value'length/4;
|
||||
variable bv: std_ulogic_vector(0 to value'length-1) := value;
|
||||
variable s: string(1 to ne);
|
||||
begin
|
||||
if value'length mod 4 /= 0 then
|
||||
assert FALSE report
|
||||
"HWRITE Error: Trying to read vector " &
|
||||
"with an odd (non multiple of 4) length";
|
||||
return;
|
||||
end if;
|
||||
|
||||
for i in 0 to ne-1 loop
|
||||
quad := To_X01Z(bv(4*i to 4*i+3));
|
||||
case quad is
|
||||
when x"0" => s(i+1) := '0';
|
||||
when x"1" => s(i+1) := '1';
|
||||
when x"2" => s(i+1) := '2';
|
||||
when x"3" => s(i+1) := '3';
|
||||
when x"4" => s(i+1) := '4';
|
||||
when x"5" => s(i+1) := '5';
|
||||
when x"6" => s(i+1) := '6';
|
||||
when x"7" => s(i+1) := '7';
|
||||
when x"8" => s(i+1) := '8';
|
||||
when x"9" => s(i+1) := '9';
|
||||
when x"A" => s(i+1) := 'A';
|
||||
when x"B" => s(i+1) := 'B';
|
||||
when x"C" => s(i+1) := 'C';
|
||||
when x"D" => s(i+1) := 'D';
|
||||
when x"E" => s(i+1) := 'E';
|
||||
when x"F" => s(i+1) := 'F';
|
||||
when others =>
|
||||
if (quad = "ZZZZ") then
|
||||
s(i+1) := 'Z';
|
||||
else
|
||||
s(i+1) := 'X';
|
||||
end if;
|
||||
end case;
|
||||
end loop;
|
||||
write(L, s, JUSTIFIED, FIELD);
|
||||
end HWRITE;
|
||||
|
||||
procedure Char2TriBits(C: Character;
|
||||
RESULT: out bit_vector(2 downto 0);
|
||||
GOOD: out Boolean;
|
||||
ISSUE_ERROR: in Boolean) is
|
||||
begin
|
||||
case c is
|
||||
when '0' => result := o"0"; good := TRUE;
|
||||
when '1' => result := o"1"; good := TRUE;
|
||||
when '2' => result := o"2"; good := TRUE;
|
||||
when '3' => result := o"3"; good := TRUE;
|
||||
when '4' => result := o"4"; good := TRUE;
|
||||
when '5' => result := o"5"; good := TRUE;
|
||||
when '6' => result := o"6"; good := TRUE;
|
||||
when '7' => result := o"7"; good := TRUE;
|
||||
when others =>
|
||||
if ISSUE_ERROR then
|
||||
assert FALSE report
|
||||
"OREAD Error: Read a '" & c &
|
||||
"', expected an Octal character (0-7).";
|
||||
end if;
|
||||
good := FALSE;
|
||||
end case;
|
||||
end;
|
||||
|
||||
procedure OREAD(L:inout LINE; VALUE:out BIT_VECTOR) is
|
||||
variable c: character;
|
||||
variable ok: boolean;
|
||||
constant ne: integer := value'length/3;
|
||||
variable bv: bit_vector(0 to value'length-1);
|
||||
variable s: string(1 to ne-1);
|
||||
begin
|
||||
if value'length mod 3 /= 0 then
|
||||
assert FALSE report
|
||||
"OREAD Error: Trying to read vector " &
|
||||
"with an odd (non multiple of 3) length";
|
||||
return;
|
||||
end if;
|
||||
|
||||
loop -- skip white space
|
||||
read(l,c);
|
||||
exit when ((c /= ' ') and (c /= CR) and (c /= HT));
|
||||
end loop;
|
||||
|
||||
Char2TriBits(c, bv(0 to 2), ok, TRUE);
|
||||
if not ok then
|
||||
return;
|
||||
end if;
|
||||
|
||||
read(L, s, ok);
|
||||
if not ok then
|
||||
assert FALSE
|
||||
report "OREAD Error: Failed to read the STRING";
|
||||
return;
|
||||
end if;
|
||||
|
||||
for i in 1 to ne-1 loop
|
||||
Char2TriBits(s(i), bv(3*i to 3*i+2), ok, TRUE);
|
||||
if not ok then
|
||||
return;
|
||||
end if;
|
||||
end loop;
|
||||
value := bv;
|
||||
end OREAD;
|
||||
|
||||
procedure OREAD(L:inout LINE; VALUE:out BIT_VECTOR;GOOD: out BOOLEAN) is
|
||||
variable ok: boolean;
|
||||
variable c: character;
|
||||
constant ne: integer := value'length/3;
|
||||
variable bv: bit_vector(0 to value'length-1);
|
||||
variable s: string(1 to ne-1);
|
||||
begin
|
||||
if value'length mod 3 /= 0 then
|
||||
good := FALSE;
|
||||
return;
|
||||
end if;
|
||||
|
||||
loop -- skip white space
|
||||
read(l,c);
|
||||
exit when ((c /= ' ') and (c /= CR) and (c /= HT));
|
||||
end loop;
|
||||
|
||||
Char2TriBits(c, bv(0 to 2), ok, FALSE);
|
||||
if not ok then
|
||||
good := FALSE;
|
||||
return;
|
||||
end if;
|
||||
|
||||
read(L, s, ok);
|
||||
if not ok then
|
||||
good := FALSE;
|
||||
return;
|
||||
end if;
|
||||
|
||||
for i in 1 to ne-1 loop
|
||||
Char2TriBits(s(i), bv(3*i to 3*i+2), ok, FALSE);
|
||||
if not ok then
|
||||
good := FALSE;
|
||||
return;
|
||||
end if;
|
||||
end loop;
|
||||
good := TRUE;
|
||||
value := bv;
|
||||
end OREAD;
|
||||
|
||||
|
||||
procedure OWRITE(L:inout LINE; VALUE:in std_ulogic_vector;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0) is
|
||||
variable tri: std_ulogic_vector(0 to 2);
|
||||
constant ne: integer := value'length/3;
|
||||
variable bv: std_ulogic_vector(0 to value'length-1) := value;
|
||||
variable s: string(1 to ne);
|
||||
begin
|
||||
if value'length mod 3 /= 0 then
|
||||
assert FALSE report
|
||||
"OWRITE Error: Trying to read vector " &
|
||||
"with an odd (non multiple of 3) length";
|
||||
return;
|
||||
end if;
|
||||
|
||||
for i in 0 to ne-1 loop
|
||||
tri := To_X01Z(bv(3*i to 3*i+2));
|
||||
case tri is
|
||||
when o"0" => s(i+1) := '0';
|
||||
when o"1" => s(i+1) := '1';
|
||||
when o"2" => s(i+1) := '2';
|
||||
when o"3" => s(i+1) := '3';
|
||||
when o"4" => s(i+1) := '4';
|
||||
when o"5" => s(i+1) := '5';
|
||||
when o"6" => s(i+1) := '6';
|
||||
when o"7" => s(i+1) := '7';
|
||||
when others =>
|
||||
if (tri = "ZZZ") then
|
||||
s(i+1) := 'Z';
|
||||
else
|
||||
s(i+1) := 'X';
|
||||
end if;
|
||||
end case;
|
||||
end loop;
|
||||
write(L, s, JUSTIFIED, FIELD);
|
||||
end OWRITE;
|
||||
|
||||
-- Hex Read and Write procedures for STD_LOGIC_VECTOR
|
||||
procedure HREAD(L:inout LINE; VALUE:out BIT_VECTOR;GOOD:out BOOLEAN) is
|
||||
variable tmp: std_ulogic_vector(VALUE'length-1 downto 0);
|
||||
begin
|
||||
HREAD(L, tmp, GOOD);
|
||||
VALUE := To_BitVector(tmp);
|
||||
end HREAD;
|
||||
|
||||
procedure HREAD(L:inout LINE; VALUE:out BIT_VECTOR) is
|
||||
variable tmp: std_ulogic_vector(VALUE'length-1 downto 0);
|
||||
begin
|
||||
HREAD(L, tmp);
|
||||
VALUE := To_BitVector(tmp);
|
||||
end HREAD;
|
||||
|
||||
-- Hex Read and Write procedures for STD_LOGIC_VECTOR
|
||||
|
||||
procedure HREAD(L:inout LINE; VALUE:out STD_LOGIC_VECTOR) is
|
||||
variable tmp: STD_ULOGIC_VECTOR(VALUE'length-1 downto 0);
|
||||
begin
|
||||
HREAD(L, tmp);
|
||||
VALUE := STD_LOGIC_VECTOR(tmp);
|
||||
end HREAD;
|
||||
|
||||
procedure HREAD(L:inout LINE; VALUE:out STD_LOGIC_VECTOR; GOOD: out BOOLEAN) is
|
||||
variable tmp: STD_ULOGIC_VECTOR(VALUE'length-1 downto 0);
|
||||
begin
|
||||
HREAD(L, tmp, GOOD);
|
||||
VALUE := STD_LOGIC_VECTOR(tmp);
|
||||
end HREAD;
|
||||
|
||||
procedure HWRITE(L:inout LINE; VALUE:in STD_LOGIC_VECTOR;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0) is
|
||||
begin
|
||||
HWRITE(L, STD_ULOGIC_VECTOR(VALUE), JUSTIFIED, FIELD);
|
||||
end HWRITE;
|
||||
|
||||
|
||||
-- Octal Read and Write procedures for STD_ULOGIC_VECTOR
|
||||
procedure OREAD(L:inout LINE; VALUE:out STD_ULOGIC_VECTOR;GOOD:out BOOLEAN) is
|
||||
variable tmp: bit_vector(VALUE'length-1 downto 0);
|
||||
begin
|
||||
OREAD(L, tmp, GOOD);
|
||||
VALUE := To_X01(tmp);
|
||||
end OREAD;
|
||||
|
||||
procedure OREAD(L:inout LINE; VALUE:out STD_ULOGIC_VECTOR) is
|
||||
variable tmp: bit_vector(VALUE'length-1 downto 0);
|
||||
begin
|
||||
OREAD(L, tmp);
|
||||
VALUE := To_X01(tmp);
|
||||
end OREAD;
|
||||
|
||||
-- Octal Read and Write procedures for STD_LOGIC_VECTOR
|
||||
|
||||
procedure OREAD(L:inout LINE; VALUE:out STD_LOGIC_VECTOR) is
|
||||
variable tmp: STD_ULOGIC_VECTOR(VALUE'length-1 downto 0);
|
||||
begin
|
||||
OREAD(L, tmp);
|
||||
VALUE := STD_LOGIC_VECTOR(tmp);
|
||||
end OREAD;
|
||||
|
||||
procedure OREAD(L:inout LINE; VALUE:out STD_LOGIC_VECTOR; GOOD: out BOOLEAN) is
|
||||
variable tmp: STD_ULOGIC_VECTOR(VALUE'length-1 downto 0);
|
||||
begin
|
||||
OREAD(L, tmp, GOOD);
|
||||
VALUE := STD_LOGIC_VECTOR(tmp);
|
||||
end OREAD;
|
||||
|
||||
procedure OWRITE(L:inout LINE; VALUE:in STD_LOGIC_VECTOR;
|
||||
JUSTIFIED:in SIDE := RIGHT; FIELD:in WIDTH := 0) is
|
||||
begin
|
||||
OWRITE(L, STD_ULOGIC_VECTOR(VALUE), JUSTIFIED, FIELD);
|
||||
end OWRITE;
|
||||
|
||||
|
||||
--synopsys synthesis_on
|
||||
end STD_LOGIC_TEXTIO;
|
||||
@@ -0,0 +1,329 @@
|
||||
--------------------------------------------------------------------------
|
||||
-- --
|
||||
-- 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 --
|
||||
-- --
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
library IEEE;
|
||||
use IEEE.std_logic_1164.all;
|
||||
use IEEE.std_logic_arith.all;
|
||||
|
||||
package STD_LOGIC_UNSIGNED 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; 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_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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user