diff --git a/libraries/base/common/src/vhdl/common_pkg.vhd b/libraries/base/common/src/vhdl/common_pkg.vhd index 7a3b48ecc0b9fcc572bc87c2368b321304853df4..791cfb39682d6e1fd94b0469e18c4d6582ae0e1d 100644 --- a/libraries/base/common/src/vhdl/common_pkg.vhd +++ b/libraries/base/common/src/vhdl/common_pkg.vhd @@ -137,10 +137,18 @@ PACKAGE common_pkg IS TYPE t_slv_32_matrix IS ARRAY (INTEGER RANGE <>, INTEGER RANGE <>) OF STD_LOGIC_VECTOR(31 DOWNTO 0); TYPE t_slv_64_matrix IS ARRAY (INTEGER RANGE <>, INTEGER RANGE <>) OF STD_LOGIC_VECTOR(63 DOWNTO 0); - TYPE t_natural_2arr_2 IS ARRAY (INTEGER RANGE <>) OF t_natural_arr(1 DOWNTO 0); - - TYPE t_complex_integer_arr2 IS ARRAY (NATURAL RANGE <>) OF t_integer_arr(1 DOWNTO 0); - TYPE t_complex_real_arr2 IS ARRAY (NATURAL RANGE <>) OF t_real_arr(1 DOWNTO 0); + -- Multi-dimensional array types with fixed LS-dimension + -- . 2arr_2 + -- . first '2' indicates two dimensions, so array I of array J, where I is + -- free in (NATURAL RANGE <>) + -- . second '_2' indicate that the last dimension J has fixed size 2 is + -- (1 DOWNTO 0) + TYPE t_natural_2arr_2 IS ARRAY (NATURAL RANGE <>) OF t_natural_arr(1 DOWNTO 0); + TYPE t_integer_2arr_2 IS ARRAY (NATURAL RANGE <>) OF t_integer_arr(1 DOWNTO 0); + TYPE t_real_2arr_2 IS ARRAY (NATURAL RANGE <>) OF t_real_arr(1 DOWNTO 0); + + SUBTYPE t_complex_integer_arr_2 IS t_integer_2arr_2; + SUBTYPE t_complex_real_arr_2 IS t_real_2arr_2; -- STRUCTURE DECLARATIONS --------------------------------------------------- @@ -724,38 +732,40 @@ PACKAGE BODY common_pkg IS FUNCTION pack_complex(re, im : INTEGER; w : NATURAL) RETURN INTEGER IS CONSTANT c_complex_w : NATURAL := 2 * w; - CONSTANT c_complex_slv : STD_LOGIC_VECTOR(c_complex_w-1 DOWNTO 0) := TO_SVEC(im, w) & TO_SVEC(re, w); + VARIABLE v_complex_slv : STD_LOGIC_VECTOR(c_complex_w-1 DOWNTO 0) := TO_SVEC(im, w) & TO_SVEC(re, w); BEGIN ASSERT c_complex_w <= c_word_w REPORT "common_pkg: Complex value to large to pack into 32 bit integer" SEVERITY FAILURE; IF c_complex_w < c_word_w THEN -- fits in 31 bit unsigned NATURAL - RETURN TO_UINT(c_complex_slv); + RETURN TO_UINT(v_complex_slv); ELSE -- need to use 32 bit signed INTEGER - RETURN TO_SINT(c_complex_slv); + RETURN TO_SINT(v_complex_slv); END IF; END; FUNCTION unpack_complex_re(data : STD_LOGIC_VECTOR; w : NATURAL) RETURN INTEGER IS BEGIN + ASSERT w <= c_word_w REPORT "common_pkg: Complex value to large to unpack into 32 bit integer parts" SEVERITY FAILURE; RETURN TO_SINT(data(w-1 DOWNTO 0)); -- Re in LS part END; FUNCTION unpack_complex_re(data : INTEGER; w : NATURAL) RETURN INTEGER IS CONSTANT c_complex_w : NATURAL := 2 * w; - CONSTANT c_complex_slv : STD_LOGIC_VECTOR(c_complex_w-1 DOWNTO 0) := TO_SVEC(data, c_complex_w); + VARIABLE v_complex_slv : STD_LOGIC_VECTOR(c_complex_w-1 DOWNTO 0) := TO_SVEC(data, c_complex_w); BEGIN - RETURN TO_SINT(c_complex_slv(w-1 DOWNTO 0)); -- Re in LS part + RETURN TO_SINT(v_complex_slv(w-1 DOWNTO 0)); -- Re in LS part END; FUNCTION unpack_complex_im(data : STD_LOGIC_VECTOR; w : NATURAL) RETURN INTEGER IS BEGIN + ASSERT w <= c_word_w REPORT "common_pkg: Complex value to large to unpack into 32 bit integer parts" SEVERITY FAILURE; RETURN TO_SINT(data(2*w-1 DOWNTO w)); -- Im in MS part END; FUNCTION unpack_complex_im(data : INTEGER; w : NATURAL) RETURN INTEGER IS CONSTANT c_complex_w : NATURAL := 2 * w; - CONSTANT c_complex_slv : STD_LOGIC_VECTOR(c_complex_w-1 DOWNTO 0) := TO_SVEC(data, c_complex_w); + VARIABLE v_complex_slv : STD_LOGIC_VECTOR(c_complex_w-1 DOWNTO 0) := TO_SVEC(data, c_complex_w); BEGIN - RETURN TO_SINT(c_complex_slv(c_complex_w-1 DOWNTO w)); -- Im in MS part + RETURN TO_SINT(v_complex_slv(c_complex_w-1 DOWNTO w)); -- Im in MS part END; FUNCTION atan2(Y, X: REAL) RETURN REAL IS