library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; package encoder_components is function get_encoder_size(din_size: in natural) return natural; function get_dout_size(din_size: in natural) return natural; function get_num_encoders(num_paths_in: in integer) return integer; component encoder_generic is generic( din_size : natural ); port ( din : in STD_LOGIC_VECTOR(din_size-1 downto 0); dout : out STD_LOGIC_VECTOR(get_dout_size(din_size)-1 downto 0); valid : out STD_LOGIC -- '1' if any input is high, '0' if all zero ); end component encoder_generic; component encoder4to2 is port ( din : in STD_LOGIC_VECTOR(3 downto 0); dout : out STD_LOGIC_VECTOR(1 downto 0); valid : out STD_LOGIC -- '1' if any input is high, '0' if all zero ); end component encoder4to2; component encoder8to3 is port ( din : in STD_LOGIC_VECTOR(7 downto 0); dout : out STD_LOGIC_VECTOR(2 downto 0); valid : out STD_LOGIC -- '1' if any input is high, '0' if all zero ); end component encoder8to3; component encoder16to4 is port ( din : in STD_LOGIC_VECTOR(15 downto 0); dout : out STD_LOGIC_VECTOR(3 downto 0); valid : out STD_LOGIC -- '1' if any input is high, '0' if all zero ); end component encoder16to4; component encoder32to5 is port ( din : in STD_LOGIC_VECTOR(31 downto 0); dout : out STD_LOGIC_VECTOR(4 downto 0); valid : out STD_LOGIC -- '1' if any input is high, '0' if all zero ); end component encoder32to5; end package; package body encoder_components is function get_encoder_size(din_size: in natural) return natural is begin if din_size >= 16 then return 32; elsif din_size >= 8 then return 16; else return 8; end if; end function; function get_dout_size(din_size: in natural) return natural is begin if din_size = 32 then return 5; elsif din_size = 16 then return 4; elsif din_size = 8 then return 3; else return 0; end if; end function; function get_num_encoders(num_paths_in: integer) return integer is begin return (num_paths_in+32-1)/32; end function; end package body;