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