diff options
Diffstat (limited to 'ieee_proposed/rtl/standard_textio_additions_c.vhd')
-rw-r--r-- | ieee_proposed/rtl/standard_textio_additions_c.vhd | 478 |
1 files changed, 0 insertions, 478 deletions
diff --git a/ieee_proposed/rtl/standard_textio_additions_c.vhd b/ieee_proposed/rtl/standard_textio_additions_c.vhd deleted file mode 100644 index 35ed5d0..0000000 --- a/ieee_proposed/rtl/standard_textio_additions_c.vhd +++ /dev/null @@ -1,478 +0,0 @@ ------------------------------------------------------------------------------- --- "standard_textio_additions" package contains the additions to the built in --- "standard.textio" package. --- This package should be compiled into "ieee_proposed" and used as follows: --- use ieee_proposed.standard_textio_additions.all; --- Last Modified: $Date: 2007-03-13 14:25:58-04 $ --- RCS ID: $Id: standard_textio_additions_c.vhdl,v 1.5 2007-03-13 14:25:58-04 l435385 Exp $ --- --- Created for VHDL-200X par, David Bishop (dbishop@vhdl.org) ------------------------------------------------------------------------------- -use std.textio.all; -package standard_textio_additions is - --- procedure DEALLOCATE (P : inout LINE); - - procedure FLUSH (file F : TEXT); - - function MINIMUM (L, R : SIDE) return SIDE; - function MAXIMUM (L, R : SIDE) return SIDE; - - function TO_STRING (VALUE : SIDE) return STRING; - - function JUSTIFY (VALUE : STRING; JUSTIFIED : SIDE := right; FIELD : WIDTH := 0) return STRING; - - procedure SREAD (L : inout LINE; VALUE : out STRING; STRLEN : out NATURAL); - alias STRING_READ is SREAD [LINE, STRING, NATURAL]; - alias BREAD is READ [LINE, BIT_VECTOR, BOOLEAN]; - alias BREAD is READ [LINE, BIT_VECTOR]; - alias BINARY_READ is READ [LINE, BIT_VECTOR, BOOLEAN]; - alias BINARY_READ is READ [LINE, BIT_VECTOR]; - procedure OREAD (L : inout LINE; VALUE : out BIT_VECTOR; GOOD : out BOOLEAN); - procedure OREAD (L : inout LINE; VALUE : out BIT_VECTOR); - alias OCTAL_READ is OREAD [LINE, BIT_VECTOR, BOOLEAN]; - alias OCTAL_READ is OREAD [LINE, BIT_VECTOR]; - procedure HREAD (L : inout LINE; VALUE : out BIT_VECTOR; GOOD : out BOOLEAN); - procedure HREAD (L : inout LINE; VALUE : out BIT_VECTOR); - alias HEX_READ is HREAD [LINE, BIT_VECTOR, BOOLEAN]; - alias HEX_READ is HREAD [LINE, BIT_VECTOR]; - procedure TEE (file F : TEXT; L : inout LINE); - procedure WRITE (L : inout LINE; VALUE : in REAL; - FORMAT : in STRING); - alias SWRITE is WRITE [LINE, STRING, SIDE, WIDTH]; - alias STRING_WRITE is WRITE [LINE, STRING, SIDE, WIDTH]; - alias BWRITE is WRITE [LINE, BIT_VECTOR, SIDE, WIDTH]; - alias BINARY_WRITE is WRITE [LINE, BIT_VECTOR, SIDE, WIDTH]; - procedure OWRITE (L : inout LINE; VALUE : in BIT_VECTOR; - JUSTIFIED : in SIDE := right; FIELD : in WIDTH := 0); - alias OCTAL_WRITE is OWRITE [LINE, BIT_VECTOR, SIDE, WIDTH]; - procedure HWRITE (L : inout LINE; VALUE : in BIT_VECTOR; - JUSTIFIED : in SIDE := right; FIELD : in WIDTH := 0); - alias HEX_WRITE is HWRITE [LINE, BIT_VECTOR, SIDE, WIDTH]; - -end package standard_textio_additions; - -library ieee_proposed; -use ieee_proposed.standard_additions.all; - -package body standard_textio_additions is --- pragma synthesis_off - constant NUS : STRING(2 to 1) := (others => ' '); -- NULL array - constant NBSP : CHARACTER := CHARACTER'val(160); -- space character - - -- Writes L to a file without modifying the contents of the line - procedure TEE (file F : TEXT; L : inout LINE) is - begin - write (OUTPUT, L.all & LF); - writeline(F, L); - end procedure TEE; - - procedure FLUSH (file F: TEXT) is -- Implicit - begin - file_close (F); - end procedure FLUSH; - - -- Read and Write procedure for strings - procedure SREAD (L : inout LINE; - VALUE : out STRING; - STRLEN : out natural) is - variable ok : BOOLEAN; - variable c : CHARACTER; - -- Result is padded with space characters - variable result : STRING (1 to VALUE'length) := (others => ' '); - begin - VALUE := result; - loop -- skip white space - read(L, c, ok); - exit when (ok = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT)); - end loop; - -- Bail out if there was a bad read - if not ok then - STRLEN := 0; - return; - end if; - result (1) := c; - STRLEN := 1; - for i in 2 to VALUE'length loop - read(L, c, ok); - if (ok = false) or ((c = ' ') or (c = NBSP) or (c = HT)) then - exit; - else - result (i) := c; - end if; - STRLEN := i; - end loop; - VALUE := result; - end procedure SREAD; - - -- Hex Read and Write procedures for bit_vector. - -- Procedure only visible internally. - procedure Char2QuadBits (C : CHARACTER; - RESULT : out BIT_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' | 'a' => result := x"A"; good := true; - when 'B' | 'b' => result := x"B"; good := true; - when 'C' | 'c' => result := x"C"; good := true; - when 'D' | 'd' => result := x"D"; good := true; - when 'E' | 'e' => result := x"E"; good := true; - when 'F' | 'f' => result := x"F"; good := true; - when others => - assert not ISSUE_ERROR report - "TEXTIO.HREAD Error: Read a '" & c & - "', expected a Hex character (0-F)." severity error; - GOOD := false; - end case; - end procedure Char2QuadBits; - - procedure HREAD (L : inout LINE; - VALUE : out BIT_VECTOR; - GOOD : out BOOLEAN) is - variable ok : BOOLEAN; - variable c : CHARACTER; - constant ne : INTEGER := (VALUE'length+3)/4; - constant pad : INTEGER := ne*4 - VALUE'length; - variable sv : BIT_VECTOR (0 to ne*4 - 1) := (others => '0'); - variable s : STRING(1 to ne-1); - begin - VALUE := (VALUE'range => '0'); - loop -- skip white space - read(l, c, ok); - exit when (ok = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT)); - end loop; - -- Bail out if there was a bad read - if not ok then - GOOD := false; - return; - end if; - Char2QuadBits(c, sv(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), sv(4*i to 4*i+3), ok, false); - if not ok then - GOOD := false; - return; - end if; - end loop; - if or_reduce (sv (0 to pad-1)) = '1' then - GOOD := false; -- vector was truncated. - else - GOOD := true; - VALUE := sv (pad to sv'high); - end if; - end procedure HREAD; - - procedure HREAD (L : inout LINE; - VALUE : out BIT_VECTOR) is - variable ok : BOOLEAN; - variable c : CHARACTER; - constant ne : INTEGER := (VALUE'length+3)/4; - constant pad : INTEGER := ne*4 - VALUE'length; - variable sv : BIT_VECTOR(0 to ne*4 - 1) := (others => '0'); - variable s : STRING(1 to ne-1); - begin - VALUE := (VALUE'range => '0'); - loop -- skip white space - read(l, c, ok); - exit when (ok = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT)); - end loop; - -- Bail out if there was a bad read - if not ok then - report "TEXTIO.HREAD Error: Failed skipping white space" - severity error; - return; - end if; - Char2QuadBits(c, sv(0 to 3), ok, true); - if not ok then - return; - end if; - read(L, s, ok); - if not ok then - report "TEXTIO.HREAD Error: Failed to read the STRING" - severity error; - return; - end if; - for i in 1 to ne-1 loop - Char2QuadBits(s(i), sv(4*i to 4*i+3), ok, true); - if not ok then - return; - end if; - end loop; - if or_reduce (sv (0 to pad-1)) = '1' then - report "TEXTIO.HREAD Error: Vector truncated" - severity error; - else - VALUE := sv (pad to sv'high); - end if; - end procedure HREAD; - - procedure HWRITE (L : inout LINE; - VALUE : in BIT_VECTOR; - JUSTIFIED : in SIDE := right; - FIELD : in WIDTH := 0) is - begin - write (L => L, - VALUE => to_hstring(VALUE), - JUSTIFIED => JUSTIFIED, - FIELD => FIELD); - end procedure HWRITE; - - -- Procedure only visible internally. - 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 => - assert not ISSUE_ERROR - report - "TEXTIO.OREAD Error: Read a '" & c & - "', expected an Octal character (0-7)." - severity error; - GOOD := false; - end case; - end procedure Char2TriBits; - - -- Read and Write procedures for Octal values - procedure OREAD (L : inout LINE; - VALUE : out BIT_VECTOR; - GOOD : out BOOLEAN) is - variable ok : BOOLEAN; - variable c : CHARACTER; - constant ne : INTEGER := (VALUE'length+2)/3; - constant pad : INTEGER := ne*3 - VALUE'length; - variable sv : BIT_VECTOR(0 to ne*3 - 1) := (others => '0'); - variable s : STRING(1 to ne-1); - begin - VALUE := (VALUE'range => '0'); - loop -- skip white space - read(l, c, ok); - exit when (ok = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT)); - end loop; - -- Bail out if there was a bad read - if not ok then - GOOD := false; - return; - end if; - Char2TriBits(c, sv(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), sv(3*i to 3*i+2), ok, false); - if not ok then - GOOD := false; - return; - end if; - end loop; - if or_reduce (sv (0 to pad-1)) = '1' then - GOOD := false; -- vector was truncated. - else - GOOD := true; - VALUE := sv (pad to sv'high); - end if; - end procedure OREAD; - - procedure OREAD (L : inout LINE; - VALUE : out BIT_VECTOR) is - variable c : CHARACTER; - variable ok : BOOLEAN; - constant ne : INTEGER := (VALUE'length+2)/3; - constant pad : INTEGER := ne*3 - VALUE'length; - variable sv : BIT_VECTOR(0 to ne*3 - 1) := (others => '0'); - variable s : STRING(1 to ne-1); - begin - VALUE := (VALUE'range => '0'); - loop -- skip white space - read(l, c, ok); - exit when (ok = false) or ((c /= ' ') and (c /= NBSP) and (c /= HT)); - end loop; - -- Bail out if there was a bad read - if not ok then - report "TEXTIO.OREAD Error: Failed skipping white space" - severity error; - return; - end if; - Char2TriBits(c, sv(0 to 2), ok, true); - if not ok then - return; - end if; - read(L, s, ok); - if not ok then - report "TEXTIO.OREAD Error: Failed to read the STRING" - severity error; - return; - end if; - for i in 1 to ne-1 loop - Char2TriBits(s(i), sv(3*i to 3*i+2), ok, true); - if not ok then - return; - end if; - end loop; - if or_reduce (sv (0 to pad-1)) = '1' then - report "TEXTIO.OREAD Error: Vector truncated" - severity error; - else - VALUE := sv (pad to sv'high); - end if; - end procedure OREAD; - - procedure OWRITE (L : inout LINE; - VALUE : in BIT_VECTOR; - JUSTIFIED : in SIDE := right; - FIELD : in WIDTH := 0) is - begin - write (L => L, - VALUE => to_ostring(VALUE), - JUSTIFIED => JUSTIFIED, - FIELD => FIELD); - end procedure OWRITE; - - -- read and write for vector versions - -- These versions produce "value1, value2, value3 ...." - procedure read (L : inout LINE; - VALUE : out boolean_vector; - GOOD : out BOOLEAN) is - variable dummy : CHARACTER; - variable igood : BOOLEAN := true; - begin - for i in VALUE'range loop - read (L => L, - VALUE => VALUE(i), - GOOD => igood); - if (igood) and (i /= value'right) then - read (L => L, - VALUE => dummy, -- Toss the comma or seperator - good => igood); - end if; - if (not igood) then - good := false; - return; - end if; - end loop; - good := true; - end procedure read; - - procedure read (L : inout LINE; - VALUE : out boolean_vector) is - variable dummy : CHARACTER; - variable igood : BOOLEAN; - begin - for i in VALUE'range loop - read (L => L, - VALUE => VALUE(i), - good => igood); - if (igood) and (i /= value'right) then - read (L => L, - VALUE => dummy, -- Toss the comma or seperator - good => igood); - end if; - if (not igood) then - report "STANDARD.STD_TEXTIO(BOOLEAN_VECTOR) " - & "Read error ecounted during vector read" severity error; - return; - end if; - end loop; - end procedure read; - - procedure write (L : inout LINE; - VALUE : in boolean_vector; - JUSTIFIED : in SIDE := right; - FIELD : in WIDTH := 0) is - begin - for i in VALUE'range loop - write (L => L, - VALUE => VALUE(i), - JUSTIFIED => JUSTIFIED, - FIELD => FIELD); - if (i /= value'right) then - swrite (L, ", "); - end if; - end loop; - end procedure write; - - procedure WRITE (L: inout LINE; VALUE: in REAL; - FORMAT: in STRING) is - begin - swrite ( L => L, - VALUE => to_string (VALUE, FORMAT)); - end procedure WRITE; - - function justify ( - value : STRING; - justified : SIDE := right; - field : width := 0) - return STRING is - constant VAL_LEN : INTEGER := value'length; - variable result : STRING (1 to field) := (others => ' '); - begin -- function justify - -- return value if field is too small - if VAL_LEN >= field then - return value; - end if; - if justified = left then - result(1 to VAL_LEN) := value; - elsif justified = right then - result(field - VAL_LEN + 1 to field) := value; - end if; - return result; - end function justify; - - function to_string ( - VALUE : SIDE) return STRING is - begin - return SIDE'image(VALUE); - end function to_string; - - -- pragma synthesis_on - -- Will be implicit - function minimum (L, R : SIDE) return SIDE is - begin - if L > R then return R; - else return L; - end if; - end function minimum; - - function maximum (L, R : SIDE) return SIDE is - begin - if L > R then return L; - else return R; - end if; - end function maximum; - -end package body standard_textio_additions; |