library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use STD.textio.all;
use ieee.std_logic_textio.all;

entity example_file_io_tb is
end example_file_io_tb;

architecture behave of example_file_io_tb is

	------------------------------------------------------------------------------
	-- Declare the Component under Test
	------------------------------------------------------------------------------
	component module_ripple_carrier_adder is
		generic (
			g_WIDTH: natural);
		port (
			i_add_term1 : in  std_logic_vector(g_WIDTH-1 downto 0);
			i_add_term2 : in  std_logic_vector(g_WIDTH-1 downto 0);
			o_result	: out std_logic_vector(g_WIDTH downto 0);
			);
	end component module_ripple_carrier_adder;

	------------------------------------------------------------------------------
	-- Testbench Internal Signals
	------------------------------------------------------------------------------
	file file_VECTOR : text;
	file file_RESULT: text;

	constant c_WIDTH : natural := 4;

	signal r_ADD_TERM1 : std_logic_vector(c_WIDTH-1 downto 0) := (others => '0');
	signal r_ADD_TERM2 : std_logic_vector(c_WIDTH-1 downto 0) := (others => '0');
	signal w_SUM 	   : std_logic_vector(c_WIDTH downto 0);

begin
	------------------------------------------------------------------------------
	-- Instantiate and Map UUT
	------------------------------------------------------------------------------
	MODULE_RIPPLE_CARRY_ADDER_INST : module_ripple_carry_adder
		generic map (
			g_WIDTH => c_WIDTH)
		port map (
			i_addr_term1 => r_ADD_TERM1,
			i_addr_term2 => r_ADD_TERM2,
			o_result => w_SUM
			);

	------------------------------------------------------------------------------
	-- This procedure reads the file input_vectors.txt which is located in the 
	-- simulation project area. 
	-- It will read the data in and send it to the ripple carry adder component
	-- to perform the operations. The result is written to the
	-- output_results.txt file, located in the same directory.
	------------------------------------------------------------------------------

	begin
		file_open(file_VECTORS, "input_vectors.txt", read_mode);
		file_open(file_RESULTS, "output_results.txt", write_mode);
		
		while not endfile(file_VECTORS) loop
			readline(file_VECTORS, v_ILINE);
			read(v_ILINE, v_ADD_TERM1);
			read(v_ILINE, v_SPACE);
			read(v_ILINE, V_ADD_TERM2);
			
			-- Pass the variable to a signal to allow the ripple-carry to use it
			r_ADD_TERM1 <= v_ADD_TERM1;
			r_ADD_TERM2 <= v_ADD_TERM2;

			wait for 60 ns;
			
			write(v_OLINE, w_SUM, right, c_WIDTH);
			writeline(file_RESULTS, v_OLINE);
		end loop;

		file_close(file_VECTORS);
		file_close(file_RESULTS);

		wait;
	end process;

end behave;