aboutsummaryrefslogtreecommitdiffstats
path: root/testsuite/gna/issue795/file_reader_pkg.vhdl
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/gna/issue795/file_reader_pkg.vhdl')
-rw-r--r--testsuite/gna/issue795/file_reader_pkg.vhdl205
1 files changed, 205 insertions, 0 deletions
diff --git a/testsuite/gna/issue795/file_reader_pkg.vhdl b/testsuite/gna/issue795/file_reader_pkg.vhdl
new file mode 100644
index 000000000..99e167ac9
--- /dev/null
+++ b/testsuite/gna/issue795/file_reader_pkg.vhdl
@@ -0,0 +1,205 @@
+library ieee;
+--! Standard packages
+use ieee.Std_logic_1164.all;
+use ieee.Numeric_std.all;
+--! Implicit use of std libary
+--library std;
+use std.textio.all;
+--
+-- unit name: csv_file_reader package
+--
+--! @brief Package contains functions to read CSV file
+--!
+--! @author Ricardo Jasinski
+--!
+--! @version 2.0
+--!
+--! @details
+--! CSV Reader package taken from Web
+--! Latest commit 4e2d20f on 10 Sep 2013
+--! Public license - no guarrentee
+--! https://github.com/ricardo-jasinski/vhdl-csv-file-reader
+--!
+--! Modifications by CL add to include function to read HEX numberes
+-- Define operations to read formatted data from a comma-separated-values file
+-- (CSV file). To use this package:
+-- 1. Create a csv_file_reader: variable csv: csv_file_reader_type;
+-- 2. Open a csv file: csv.initialize("c:\file.csv");
+-- 3. Read one line at a time: csv.readline;
+-- 4. Start reading values: my_integer := csv.read_integer;
+-- 5. To read more values in the same line, call any of the read_* functions
+-- 6. To move to the next line, call csv.readline() again
+package csv_file_reader_pkg is
+ -- Maximum string length for read operations
+ constant LINE_LENGTH_MAX : integer := 256;
+ -- file reader type
+ type csv_file_reader_type is protected
+ -- Open the CSV text file to be used for subsequent read operations
+ procedure initialize(file_pathname : string);
+ -- Release (close) the associated CSV file
+ procedure dispose;
+ -- Read one line from the csv file, and keep it in the cache
+ procedure readline;
+ -- Read a string from the csv file and convert it to an integer
+ impure function read_integer return integer;
+ -- Read a string from the csv file as an hex number and convert it to an integer
+ -- convert to a unsigned integer depending if MSB is set
+ impure function read_hex return integer;
+ -- Read a string from the csv file and convert it to real
+ impure function read_real return real;
+ -- Read a string from the csv file and convert it to boolean
+ impure function read_boolean return boolean;
+ -- Read a string with a numeric value from the csv file and convert it to a boolean
+ impure function read_integer_as_boolean return boolean;
+ -- Read a string from the csv file, until a separator character ',' is found
+ impure function read_string return string;
+ -- True when the end of the CSV file was reached
+ impure function end_of_file return boolean;
+ end protected;
+end;
+
+package body csv_file_reader_pkg is
+
+ type csv_file_reader_type is protected body
+ file my_csv_file : text;
+ -- cache one line at a time for read operations
+ variable current_line : line;
+ -- true when end of file was reached and there are no more lines to read
+ variable end_of_file_reached : boolean;
+
+ -- True when the end of the CSV file was reached
+ impure function end_of_file return boolean is
+ begin
+ return end_of_file_reached;
+ end;
+
+ -- Open the CSV text file to be used for subsequent read operations
+ procedure initialize(file_pathname : string) is
+ begin
+ file_open(my_csv_file, file_pathname, READ_MODE);
+ end_of_file_reached := false;
+ end;
+
+ -- Release (close) the associated CSV file
+ procedure dispose is
+ begin
+ file_close(my_csv_file);
+ end;
+
+ -- Read one line from the csv file, and keep it in the cache
+ procedure readline is
+ begin
+ readline(my_csv_file, current_line);
+ end_of_file_reached := endfile(my_csv_file);
+ end;
+
+ -- Skip a separator (comma character) in the current line
+ procedure skip_separator is
+ variable dummy_string : string(1 to LINE_LENGTH_MAX);
+ begin
+ dummy_string := read_string;
+ end;
+
+ -- Read a string from the csv file and convert it to integer
+ impure function read_integer return integer is
+ variable read_value : integer;
+ begin
+ -- read(current_line, read_value);
+ skip_separator;
+ return read_value;
+ end;
+
+ -- Read a string from the csv file and assume it is Hex value
+ impure function read_hex return integer is
+ variable return_integer : integer := 0;
+ variable char_val : integer := 0;
+ variable read_char : character;
+ variable read_ok : boolean := true;
+ begin
+ -- read(current_line, read_char, read_ok);
+ while read_ok loop
+ if read_char = ',' then
+ return return_integer;
+ else
+ return_integer := return_integer * 16;
+ if read_char >= 'a' and read_char <= 'f' then
+ char_val := (character'pos(read_char) - character'pos('a')) + 10;
+ elsif read_char >= 'A' and read_char <= 'F' then
+ char_val := (character'pos(read_char) - character'pos('A')) + 10;
+ else
+ char_val := (character'pos(read_char) - character'pos('0'));
+ end if;
+ return_integer := return_integer + char_val;
+ end if;
+ -- read(current_line, read_char, read_ok);
+ end loop;
+ return read_integer;
+ end;
+
+ -- Read a string from the csv file and convert it to real
+ impure function read_real return real is
+ variable read_value : real;
+ begin
+ read(current_line, read_value);
+ skip_separator;
+ return read_value;
+ end;
+
+ -- Read a string from the csv file and convert it to boolean
+ impure function read_boolean return boolean is
+ begin
+ return boolean'value(read_string);
+ end;
+
+ impure function read_integer_as_boolean return boolean is
+ begin
+ return (read_integer /= 0);
+ end;
+
+ -- Read a string from the csv file, until a separator character ',' is found
+ -- Delimeter "" used if first and last char
+ impure function read_string return string is
+ variable return_string : string(1 to LINE_LENGTH_MAX);
+ variable read_char : character;
+ variable read_ok : boolean := true;
+ variable read_delim : boolean := false;
+ variable index : integer := 0;
+ begin
+ read(current_line, read_char, read_ok);
+ while read_ok loop
+ case index is
+ when 0 =>
+ if read_char = ',' then
+ return return_string;
+ elsif read_char = '"' then
+ index := 1;
+ read_delim := true;
+ else
+ return_string(1) := read_char;
+ index := 2;
+ end if;
+ when -1 =>
+ if read_char = ',' then
+ return return_string;
+ else
+ read_delim := false;
+ end if;
+ when others =>
+ if read_delim and read_char = '"' then
+ index := -1;
+ read_delim := false;
+ elsif not read_delim and read_char = ',' then
+ return return_string;
+ else
+ return_string(index) := read_char;
+ index := index + 1;
+ end if;
+ end case;
+ read(current_line, read_char, read_ok);
+ end loop;
+ return "Exit";
+ end;
+ end protected body;
+
+end;
+