diff --git a/libraries/base/common/src/vhdl/common_pkg.vhd b/libraries/base/common/src/vhdl/common_pkg.vhd index 45429006032f3e26fdb0a44a69d283ff9152b161..dbbea6568eb6d61c57cb9d84333d5d2f13ebcedf 100644 --- a/libraries/base/common/src/vhdl/common_pkg.vhd +++ b/libraries/base/common/src/vhdl/common_pkg.vhd @@ -206,6 +206,9 @@ PACKAGE common_pkg IS FUNCTION orv( slv : STD_LOGIC_VECTOR) RETURN STD_LOGIC; -- alias of vector_or FUNCTION xorv(slv : STD_LOGIC_VECTOR) RETURN STD_LOGIC; -- alias of vector_xor + FUNCTION array_and(arr : t_nat_boolean_arr) RETURN BOOLEAN; + FUNCTION array_or( arr : t_nat_boolean_arr) RETURN BOOLEAN; + FUNCTION matrix_and(mat : t_sl_matrix; wi, wj : NATURAL) RETURN STD_LOGIC; -- '1' when all matrix bits are '1' else '0' FUNCTION matrix_or( mat : t_sl_matrix; wi, wj : NATURAL) RETURN STD_LOGIC; -- '0' when all matrix bits are '0' else '1' @@ -757,6 +760,20 @@ PACKAGE BODY common_pkg IS RETURN vector_tree(slv, "XOR"); END; + FUNCTION array_and(arr : t_nat_boolean_arr) RETURN BOOLEAN IS + VARIABLE v_slv : STD_LOGIC_VECTOR(arr'RANGE); + BEGIN + FOR I IN arr'RANGE LOOP v_slv(I) := sel_a_b(arr(I), '1', '0'); END LOOP; -- wire map boolean arr to slv + RETURN sel_a_b(vector_and(v_slv) = '1', TRUE, FALSE); -- use vector_tree to determine result + END; + + FUNCTION array_or(arr : t_nat_boolean_arr) RETURN BOOLEAN IS + VARIABLE v_slv : STD_LOGIC_VECTOR(arr'RANGE); + BEGIN + FOR I IN arr'RANGE LOOP v_slv(I) := sel_a_b(arr(I), '1', '0'); END LOOP; -- wire map boolean arr to slv + RETURN sel_a_b(vector_or(v_slv) = '1', TRUE, FALSE); -- use vector_tree to determine result + END; + FUNCTION matrix_and(mat : t_sl_matrix; wi, wj : NATURAL) RETURN STD_LOGIC IS VARIABLE v_mat : t_sl_matrix(0 TO wi-1, 0 TO wj-1) := mat; -- map to fixed range VARIABLE v_result : STD_LOGIC := '1';