[reggen] Add localparam from integer count value in multireg

Tool now defines parameter if multireg count is integer. This will help
transition to parameterized data structure

This is related to #30 #47 #270
diff --git a/hw/ip/alert_handler/rtl/alert_handler_reg_pkg.sv b/hw/ip/alert_handler/rtl/alert_handler_reg_pkg.sv
index fedc0f6..3c4fa68 100644
--- a/hw/ip/alert_handler/rtl/alert_handler_reg_pkg.sv
+++ b/hw/ip/alert_handler/rtl/alert_handler_reg_pkg.sv
@@ -6,6 +6,13 @@
 
 package alert_handler_reg_pkg;
 
+  // Param list
+  localparam int ALERT_EN = 4;
+  localparam int ALERT_CLASS = 4;
+  localparam int ALERT_CAUSE = 4;
+  localparam int LOC_ALERT_EN = 4;
+  localparam int LOC_ALERT_CLASS = 4;
+
 // Register to internal design logic
 typedef struct packed {
 
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
index e21a0ca..dfc0262 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
@@ -6,6 +6,10 @@
 
 package flash_ctrl_reg_pkg;
 
+  // Param list
+  localparam int MP_REGION_CFG = 8;
+  localparam int MP_BANK_CFG = 2;
+
 // Register to internal design logic
 typedef struct packed {
 
diff --git a/hw/ip/hmac/rtl/hmac_reg_pkg.sv b/hw/ip/hmac/rtl/hmac_reg_pkg.sv
index b8b3dda..789c60f 100644
--- a/hw/ip/hmac/rtl/hmac_reg_pkg.sv
+++ b/hw/ip/hmac/rtl/hmac_reg_pkg.sv
@@ -6,6 +6,10 @@
 
 package hmac_reg_pkg;
 
+  // Param list
+  localparam int KEY = 8;
+  localparam int DIGEST = 8;
+
 // Register to internal design logic
 typedef struct packed {
 
diff --git a/hw/ip/rv_plic/rtl/rv_plic_reg_pkg.sv b/hw/ip/rv_plic/rtl/rv_plic_reg_pkg.sv
index 82fa17f..d946e4d 100644
--- a/hw/ip/rv_plic/rtl/rv_plic_reg_pkg.sv
+++ b/hw/ip/rv_plic/rtl/rv_plic_reg_pkg.sv
@@ -6,6 +6,11 @@
 
 package rv_plic_reg_pkg;
 
+  // Param list
+  localparam int IP = 32;
+  localparam int LE = 32;
+  localparam int IE0 = 32;
+
 // Register to internal design logic
 typedef struct packed {
 
diff --git a/hw/top_earlgrey/rtl/rv_plic_reg_pkg.sv b/hw/top_earlgrey/rtl/rv_plic_reg_pkg.sv
index 058a865..9073e87 100644
--- a/hw/top_earlgrey/rtl/rv_plic_reg_pkg.sv
+++ b/hw/top_earlgrey/rtl/rv_plic_reg_pkg.sv
@@ -6,6 +6,11 @@
 
 package rv_plic_reg_pkg;
 
+  // Param list
+  localparam int IP = 54;
+  localparam int LE = 54;
+  localparam int IE0 = 54;
+
 // Register to internal design logic
 typedef struct packed {
 
diff --git a/util/reggen/validate.py b/util/reggen/validate.py
index 2793f39..80e58fc 100644
--- a/util/reggen/validate.py
+++ b/util/reggen/validate.py
@@ -27,16 +27,38 @@
     return d
 
 
-def check_count(params, x, err_prefix):
+def check_count(top, mreg, err_prefix):
     '''Checking mreg count if it is in param list
     '''
-    name_list = [z["name"] for z in params]
+    if not "param_list" in top:
+        top["param_list"] = []
+        name_list = []
+    else:
+        name_list = [z["name"] for z in top["param_list"]]
+
     try:
-        index = name_list.index(x)
-        return check_int(params[index]["default"], err_prefix + " default")
+        index = name_list.index(mreg["count"])
+        return check_int(top["param_list"][index]["default"],
+                         err_prefix + " default")
     except ValueError:
         # cannot find entry in the param list
-        return check_int(x, err_prefix)
+        log.warning(err_prefix + " is integer. " +
+                    "It is recommended to use Parameter.")
+        mcount, ierr = check_int(mreg["count"], err_prefix)
+        if ierr != 0:
+            return mcount, ierr
+
+        top["param_list"].append({
+            "name": mreg["name"],
+            "type": "int",
+            "default": mcount,
+            "desc": "auto added parameter"
+        })
+        log.info("Parameter {} is added".format(mreg["name"]))
+        # Replace count integer to parameter
+        mreg["count"] = mreg["name"]
+
+        return mcount, ierr
 
 
 # validating version of int(x, 0)
@@ -842,6 +864,7 @@
 
     if not 'name' in mreg:
         mrname = "MultiRegister at +" + hex(offset)
+        mreg["name"] = "MREG_" + hex(offset)
     else:
         mrname = mreg['name']
     error = check_keys(mreg, multireg_required, multireg_optional,
@@ -863,9 +886,8 @@
     error += gen[0]
 
     # Check `count` field if it is in paramter list
-    mcount, ierr = check_count(
-        top['param_list'] if "param_list" in top else [], mreg['count'],
-        mrname + " multireg count")
+    # If count is integer, add the value to param with name as REGISTER
+    mcount, ierr = check_count(top, mreg, mrname + " multireg count")
     if ierr:
         error += 1