--****************************************************************************** --** @(#) Design Unit: PACKAGE utilities.standard_utils() --** @(#) Part Class: Utilities --** @(#) File: standard_utils.vhd --** @(#) Version: 1.3 --** @(#) Date: 07/23/98 --** @(#) Description: Subprograms for type conversions between types in --** @(#) Description: std.standard and other support functions associated --** @(#) Description: with package std.standard --** --****************************************************************************** --** File: standard_utils.vhd --** --** Description: PACKAGE BODY standard_utils --** See PACKAGE Declaration --** --****************************************************************************** --** History: @(#)standard_utils.vhd 1.3 07/23/98 --** Version | Who | When | What --** 1.1 | VLS | 01-20-95 | Original (Vince Sanders) --** 1.2 | VLS | 05-08-95 | Added Procedure Skip_White, --** Changed SEVERITY_LEVELS --** 1.3 | VLS | 03-03-97 | Added Maximum, Minimum for Integer, Real --** --****************************************************************************** --** --****************************************************************************** --** --** Organization: --** Microsystems Prototyping Laboratory --** Mississippi State University --** P.O. Box 9627 --** Mississippi State, MS 39762 --** Phone : (601) 325-3670 --** FAX : (601) 325-7692 --** E-Mail : mpl-vhdl@ERC.MsState.Edu --** WWW : http://www.ERC.MsState.Edu/mpl --** --** Disclaimer: --** All information, models, programs, code, etc... --** is provided as-is with no warranty of any kind with regard to this --** material, either expressed or implied, including, but not limited to, --** the implied warranties of merchantability and fitness for a particular --** purpose. --** --** Bug Reports and Information: --** Please report all bugs/fixes/problems/comments to the --** above organization. If you would like to be put on the --** mailing list for updates/bug fixes/etc... and future model --** releases please send email to the above organization. --** --****************************************************************************** LIBRARY std; USE std.textio.ALL; PACKAGE BODY standard_utils IS --############################################################################## -- Conversions FROM std.standard TO std.standard --############################################################################## -------------------------------------------------------------------------------- -- To_Bit -------------------------------------------------------------------------------- ------------------------------------------------------------------------------ FUNCTION To_Bit (v : Boolean) RETURN Bit IS BEGIN RETURN Bit'VAL(Boolean'POS(v)); END To_Bit; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION To_Bit (v : Character; xmap : Bit := '0') RETURN Bit IS BEGIN CASE v IS WHEN '0' => RETURN '0'; WHEN '1' => RETURN '1'; WHEN OTHERS => ASSERT FALSE REPORT LF& "WARNING: FUNCTION To_Bit (v : Character; xmap : Bit := '0') RETURN Bit;"&LF& " Character := "&v&" ==> Bit := "&To_Character(xmap)&LF& LF SEVERITY WARNING; RETURN xmap; END CASE; END To_Bit; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION To_Bit (v : String; xmap : Bit := '0') RETURN Bit IS ALIAS va : String(1 TO v'LENGTH) IS v; BEGIN ASSERT NOT (v'LENGTH > 1) REPORT LF& "WARNING: FUNCTION To_Bit (v : String; xmap : Bit := '0') RETURN Bit;"&LF& " String := "&v&" ==> v'LENGTH > 1, RETURNING To_Bit(v'LEFT)"&LF& LF SEVERITY WARNING; RETURN To_Bit(va(1), xmap); END To_Bit; ------------------------------------------------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- To_Bit_Vector -------------------------------------------------------------------------------- ------------------------------------------------------------------------------ FUNCTION To_Bit_Vector (v : Integer; length : Positive) RETURN Bit_Vector IS VARIABLE tmp : Integer := v; VARIABLE result : Bit_Vector(length - 1 DOWNTO 0); BEGIN IF (v > (2 ** length - 1)) THEN result := (OTHERS => '1'); ASSERT FALSE REPORT LF& "WARNING: FUNCTION To_Bit_Vector (v : Integer; length : Positive) RETURN Bit_Vector;"&LF& " Integer := "&To_String(v)&" ==> Bit_Vector("&To_String(length - 1)&" DOWNTO 0) := "&To_String(result)&LF& LF SEVERITY WARNING; RETURN result; END IF; FOR i IN result'REVERSE_RANGE LOOP result(i) := Bit'VAL(tmp MOD 2); tmp := tmp / 2; END LOOP; RETURN result; END To_Bit_Vector; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION To_Bit_Vector (v : String; xmap : Bit := '0') RETURN Bit_Vector IS ALIAS va : String(1 TO v'LENGTH) IS v; VARIABLE result : Bit_Vector(1 TO v'LENGTH); BEGIN FOR i IN 1 TO result'LENGTH LOOP result(i) := To_Bit(va(i), xmap); END LOOP; RETURN result; END To_Bit_Vector; ------------------------------------------------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- To_Boolean -------------------------------------------------------------------------------- ------------------------------------------------------------------------------ FUNCTION To_Boolean (v : Bit) RETURN Boolean IS BEGIN RETURN Boolean'VAL(Bit'POS(v)); END To_Boolean; ------------------------------------------------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- To_Character -------------------------------------------------------------------------------- ------------------------------------------------------------------------------ FUNCTION To_Character (v : Bit) RETURN Character IS BEGIN RETURN Character'VAL(Character'POS('0') + Bit'POS(v)); --?? CASE v IS --?? WHEN '0' => RETURN '0'; --?? WHEN '1' => RETURN '1'; --?? END CASE; END To_Character; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION To_Character (v : Boolean) RETURN Character IS BEGIN CASE v IS WHEN FALSE => RETURN 'F'; WHEN TRUE => RETURN 'T'; END CASE; END To_Character; ------------------------------------------------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- To_Integer -------------------------------------------------------------------------------- ------------------------------------------------------------------------------ FUNCTION To_Integer (v : Bit) RETURN Integer IS BEGIN RETURN Bit'POS(v); END To_Integer; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION To_Integer (v : Bit_Vector) RETURN Integer IS VARIABLE result : Integer := 0; BEGIN FOR i IN v'RANGE LOOP result := 2 * result + Bit'POS(v(i)); END LOOP; RETURN result; END To_Integer; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ --?? FUNCTION To_Integer (v : Character) RETURN Integer IS --?? BEGIN --?? RETURN Character'POS(v); --?? END To_Integer; ------------------------------------------------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- To_String -------------------------------------------------------------------------------- ------------------------------------------------------------------------------ FUNCTION To_String (v : Bit) RETURN String IS VARIABLE result : String(1 TO 1); BEGIN result(1) := To_Character(v); RETURN result; END To_String; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION To_String (v : Bit_Vector) RETURN String IS ALIAS va : Bit_Vector(1 TO v'LENGTH) IS v; VARIABLE result : String(1 TO v'LENGTH); BEGIN FOR i IN result'RANGE LOOP result(i) := To_Character(va(i)); END LOOP; RETURN result; END To_String; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION To_String (v : Boolean) RETURN String IS BEGIN CASE v IS WHEN FALSE => RETURN "FALSE"; WHEN TRUE => RETURN "TRUE"; END CASE; END To_String; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION To_String (v : Integer) RETURN String IS VARIABLE l : Line; BEGIN WRITE(l, v); RETURN l.ALL; END To_String; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION To_String (v : Real) RETURN String IS VARIABLE l : Line; BEGIN WRITE(l, v); RETURN l.ALL; END To_String; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION To_String (v : Time) RETURN String IS VARIABLE l : Line; BEGIN WRITE(l, v); RETURN l.ALL; END To_String; ------------------------------------------------------------------------------ -------------------------------------------------------------------------------- --############################################################################## -- Misc Functions & Procedures --############################################################################## -------------------------------------------------------------------------------- -- Skip_White -------------------------------------------------------------------------------- ------------------------------------------------------------------------------ PROCEDURE Skip_White (l : INOUT Line) IS VARIABLE cc : Character; BEGIN IF (l /= NULL AND l'LENGTH /= 0) THEN WHILE (l'LENGTH /= 0 AND (l(l'LEFT) = ' ' OR l(l'LEFT) = HT)) LOOP READ(l, cc); END LOOP; END IF; END Skip_White; ------------------------------------------------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Maximum, Minimum Functions -------------------------------------------------------------------------------- ------------------------------------------------------------------------------ FUNCTION Maximum (x, y : Integer) RETURN Integer IS BEGIN IF (x > y) THEN RETURN x; ELSE RETURN y; END IF; END Maximum; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION Minimum (x, y : Integer) RETURN Integer IS BEGIN IF (x < y) THEN RETURN x; ELSE RETURN y; END IF; END Minimum; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION Maximum (x, y : Real) RETURN Real IS BEGIN IF (x > y) THEN RETURN x; ELSE RETURN y; END IF; END Maximum; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION Minimum (x, y : Real) RETURN Real IS BEGIN IF (x < y) THEN RETURN x; ELSE RETURN y; END IF; END Minimum; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION Maximum (x, y : Time) RETURN Time IS BEGIN IF (x > y) THEN RETURN x; ELSE RETURN y; END IF; END Maximum; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION Minimum (x, y : Time) RETURN Time IS BEGIN IF (x < y) THEN RETURN x; ELSE RETURN y; END IF; END Minimum; ------------------------------------------------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- To_Logic -------------------------------------------------------------------------------- ------------------------------------------------------------------------------ FUNCTION To_Logic (v : Character; xmap : Bit := '0') RETURN Bit IS BEGIN RETURN To_Bit(v, xmap); END To_Logic; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION To_Logic (v : String; xmap : Bit := '0') RETURN Bit IS BEGIN RETURN To_Bit(v, xmap); END To_Logic; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION To_Logic (v : String; xmap : Bit := '0') RETURN Bit_Vector IS BEGIN RETURN To_Bit_Vector(v, xmap); END To_Logic; ------------------------------------------------------------------------------ -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -- Reduce Logic Functions -------------------------------------------------------------------------------- ------------------------------------------------------------------------------ FUNCTION Reduce_AND (v : Bit_Vector) RETURN Bit IS VARIABLE result : Bit := '1'; BEGIN FOR i IN v'RANGE LOOP result := result AND v(i); EXIT WHEN result = '0'; END LOOP; RETURN result; END Reduce_AND; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION Reduce_OR (v : Bit_Vector) RETURN Bit IS VARIABLE result : Bit := '0'; BEGIN FOR i IN v'RANGE LOOP result := result OR v(i); EXIT WHEN result = '1'; END LOOP; RETURN result; END Reduce_OR; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION Reduce_XOR (v : Bit_Vector) RETURN Bit IS VARIABLE result : Bit := '0'; BEGIN FOR i IN v'RANGE LOOP result := result XOR v(i); END LOOP; RETURN result; END Reduce_XOR; ------------------------------------------------------------------------------ -------------------------------------------------------------------------------- END standard_utils;