diff --git a/libraries/technology/base/technology_pkg.vhd b/libraries/technology/base/technology_pkg.vhd index c74395c5957083566f1825c7c39bd92b2c796a73..72882b491cf82ebe4020e4253c9fab0065a3593a 100644 --- a/libraries/technology/base/technology_pkg.vhd +++ b/libraries/technology/base/technology_pkg.vhd @@ -21,6 +21,7 @@ LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.MATH_REAL.ALL; PACKAGE technology_pkg IS @@ -33,6 +34,9 @@ PACKAGE technology_pkg IS -- Functions FUNCTION tech_sel_a_b(sel : BOOLEAN; a, b : STRING) RETURN STRING; + + FUNCTION tech_true_log2(n : NATURAL) RETURN NATURAL; -- tech_true_log2(n) = log2(n) + FUNCTION tech_ceil_log2(n : NATURAL) RETURN NATURAL; -- tech_ceil_log2(n) = log2(n), but force tech_ceil_log2(1) = 1 END technology_pkg; @@ -43,4 +47,37 @@ PACKAGE BODY technology_pkg IS IF sel=TRUE THEN RETURN a; ELSE RETURN b; END IF; END; + FUNCTION tech_true_log2(n : NATURAL) RETURN NATURAL IS + -- Purpose: For calculating extra vector width of existing vector + -- Description: Return mathematical ceil(log2(n)) + -- n log2() + -- 0 -> -oo --> FAILURE + -- 1 -> 0 + -- 2 -> 1 + -- 3 -> 2 + -- 4 -> 2 + -- 5 -> 3 + -- 6 -> 3 + -- 7 -> 3 + -- 8 -> 3 + -- 9 -> 4 + -- etc, up to n = NATURAL'HIGH = 2**31-1 + BEGIN + RETURN natural(integer(ceil(log2(real(n))))); + END; + + FUNCTION tech_ceil_log2(n : NATURAL) RETURN NATURAL IS + -- Purpose: For calculating vector width of new vector + -- Description: + -- Same as tech_true_log2() except tech_ceil_log2(1) = 1, which is needed to support + -- the vector width width for 1 address, to avoid NULL array for single + -- word register address. + BEGIN + IF n = 1 THEN + RETURN 1; -- avoid NULL array + ELSE + RETURN tech_true_log2(n); + END IF; + END; + END technology_pkg; \ No newline at end of file