[sw] Add mubi header enums

Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/sw/device/lib/base/meson.build b/sw/device/lib/base/meson.build
index 7bd3128..5eeba33 100644
--- a/sw/device/lib/base/meson.build
+++ b/sw/device/lib/base/meson.build
@@ -37,6 +37,8 @@
 sw_lib_hardened = declare_dependency(
   link_with: static_library(
     'hardened_ot',
-    sources: ['hardened.c'],
+    sources: [
+      'hardened.c'
+    ],
   )
 )
diff --git a/sw/device/lib/base/multibits.h b/sw/device/lib/base/multibits.h
new file mode 100644
index 0000000..1620411
--- /dev/null
+++ b/sw/device/lib/base/multibits.h
@@ -0,0 +1,43 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+#ifndef OPENTITAN_SW_DEVICE_LIB_BASE_MULTIBITS_H_
+#define OPENTITAN_SW_DEVICE_LIB_BASE_MULTIBITS_H_
+
+/**
+ * Multi-bit boolean values
+ *
+ * Certain configuration fields in the design are multi-bits.
+ * This gives the configuration fields redundancy and ensures
+ * it is difficult to fault the values to a "good" state.
+ */
+typedef enum multi_bit_bool {
+
+  /**
+   * 4-bits boolean values
+   */
+  kMultiBitBool4True = 0xA,
+  kMultiBitBool4False = 0x5,
+
+  /**
+   * 8-bits boolean values
+   */
+  kMultiBitBool8True = 0x5A,
+  kMultiBitBool8False = 0xA5,
+
+  /**
+   * 12-bits boolean values
+   */
+  kMultiBitBool12True = 0xA5A,
+  kMultiBitBool12False = 0x5A5,
+
+  /**
+   * 16-bits boolean values
+   */
+  kMultiBitBool16True = 0x5A5A,
+  kMultiBitBool16False = 0xA5A5,
+
+} multi_bit_bool_t;
+
+#endif  // OPENTITAN_SW_DEVICE_LIB_BASE_MULTIBITS_H_
diff --git a/sw/device/lib/dif/dif_entropy_src.c b/sw/device/lib/dif/dif_entropy_src.c
index 90afed8..2ad5c9d 100644
--- a/sw/device/lib/dif/dif_entropy_src.c
+++ b/sw/device/lib/dif/dif_entropy_src.c
@@ -8,6 +8,7 @@
 
 #include "sw/device/lib/base/memory.h"
 #include "sw/device/lib/base/mmio.h"
+#include "sw/device/lib/base/multibits.h"
 #include "sw/device/lib/dif/dif_base.h"
 
 #include "entropy_src_regs.h"  // Generated.
@@ -20,20 +21,23 @@
                                 const dif_entropy_src_config_t *config) {
   // TODO: Make this configurable at the API level.
   uint32_t reg = bitfield_field32_write(
-      0, ENTROPY_SRC_CONF_BOOT_BYPASS_DISABLE_FIELD, 0x5);
+      0, ENTROPY_SRC_CONF_BOOT_BYPASS_DISABLE_FIELD, kMultiBitBool4False);
 
-  uint32_t health_clr_sel = config->reset_health_test_registers ? 0xa : 0x5;
+  uint32_t health_clr_sel = config->reset_health_test_registers
+                                ? kMultiBitBool4True
+                                : kMultiBitBool4False;
   reg = bitfield_field32_write(reg, ENTROPY_SRC_CONF_HEALTH_TEST_CLR_FIELD,
                                health_clr_sel);
 
-  reg = bitfield_field32_write(reg,
-                               ENTROPY_SRC_CONF_ENTROPY_DATA_REG_ENABLE_FIELD,
-                               config->route_to_firmware ? 0xa : 0x5);
+  reg = bitfield_field32_write(
+      reg, ENTROPY_SRC_CONF_ENTROPY_DATA_REG_ENABLE_FIELD,
+      config->route_to_firmware ? kMultiBitBool4True : kMultiBitBool4False);
 
   // Configure single RNG bit mode
   uint32_t rng_bit_en =
-      (config->single_bit_mode == kDifEntropySrcSingleBitModeDisabled) ? 0x5
-                                                                       : 0xa;
+      (config->single_bit_mode == kDifEntropySrcSingleBitModeDisabled)
+          ? kMultiBitBool4False
+          : kMultiBitBool4True;
   reg = bitfield_field32_write(reg, ENTROPY_SRC_CONF_RNG_BIT_ENABLE_FIELD,
                                rng_bit_en);
 
@@ -41,12 +45,15 @@
   reg = bitfield_field32_write(reg, ENTROPY_SRC_CONF_RNG_BIT_SEL_FIELD,
                                rng_bit_sel);
 
-  uint32_t sw_rd_en = config->route_to_firmware ? 0xa : 0x5;
+  uint32_t sw_rd_en =
+      config->route_to_firmware ? kMultiBitBool4True : kMultiBitBool4False;
   reg = bitfield_field32_write(
       reg, ENTROPY_SRC_CONF_ENTROPY_DATA_REG_ENABLE_FIELD, sw_rd_en);
 
   // Enable configuration
-  uint32_t enable_val = config->mode != kDifEntropySrcModeDisabled ? 0xa : 0x5;
+  uint32_t enable_val = config->mode != kDifEntropySrcModeDisabled
+                            ? kMultiBitBool4True
+                            : kMultiBitBool4False;
   reg = bitfield_field32_write(reg, ENTROPY_SRC_CONF_ENABLE_FIELD, enable_val);
   mmio_region_write32(entropy_src->base_addr, ENTROPY_SRC_CONF_REG_OFFSET, reg);
 }
@@ -104,13 +111,15 @@
 
   // Conditioning bypass is hardcoded to disabled. Conditioning bypass is not
   // intended as a regular mode of operation.
-  uint32_t es_route_val = config.route_to_firmware ? 0xa : 0x5;
+  uint32_t es_route_val =
+      config.route_to_firmware ? kMultiBitBool4True : kMultiBitBool4False;
   uint32_t reg = bitfield_field32_write(
       0, ENTROPY_SRC_ENTROPY_CONTROL_ES_ROUTE_FIELD, es_route_val);
   reg = bitfield_field32_write(reg, ENTROPY_SRC_ENTROPY_CONTROL_ES_TYPE_FIELD,
-                               0x5);
+                               kMultiBitBool4False);
   mmio_region_write32(entropy_src->base_addr,
                       ENTROPY_SRC_ENTROPY_CONTROL_REG_OFFSET, reg);
+
   config_register_set(entropy_src, &config);
   return kDifOk;
 }
diff --git a/sw/device/lib/dif/dif_entropy_src_unittest.cc b/sw/device/lib/dif/dif_entropy_src_unittest.cc
index cd173f2..132eab0 100644
--- a/sw/device/lib/dif/dif_entropy_src_unittest.cc
+++ b/sw/device/lib/dif/dif_entropy_src_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "gtest/gtest.h"
 #include "sw/device/lib/base/mmio.h"
+#include "sw/device/lib/base/multibits.h"
 #include "sw/device/lib/base/testing/mock_mmio.h"
 #include "sw/device/lib/dif/dif_base.h"
 
@@ -92,34 +93,44 @@
       ENTROPY_SRC_FW_OV_CONTROL_REG_OFFSET,
       {
           {ENTROPY_SRC_FW_OV_CONTROL_FW_OV_MODE_OFFSET,
-           (uint32_t)(config_.fw_override.enable ? 0xa : 0x5)},
+           (uint32_t)(config_.fw_override.enable ? kMultiBitBool4True
+                                                 : kMultiBitBool4False)},
           {ENTROPY_SRC_FW_OV_CONTROL_FW_OV_ENTROPY_INSERT_OFFSET,
-           (uint32_t)(config_.fw_override.entropy_insert_enable ? 0xa : 0x5)},
+           (uint32_t)(config_.fw_override.entropy_insert_enable
+                          ? kMultiBitBool4True
+                          : kMultiBitBool4False)},
       });
 
-  EXPECT_WRITE32(ENTROPY_SRC_ENTROPY_CONTROL_REG_OFFSET,
-                 {
-                     {ENTROPY_SRC_ENTROPY_CONTROL_ES_ROUTE_OFFSET,
-                      (uint32_t)(test_param.route_to_firmware ? 0xa : 0x5)},
-                     {ENTROPY_SRC_ENTROPY_CONTROL_ES_TYPE_OFFSET, 0x5},
-                 });
+  EXPECT_WRITE32(
+      ENTROPY_SRC_ENTROPY_CONTROL_REG_OFFSET,
+      {
+          {ENTROPY_SRC_ENTROPY_CONTROL_ES_ROUTE_OFFSET,
+           (uint32_t)(test_param.route_to_firmware ? kMultiBitBool4True
+                                                   : kMultiBitBool4False)},
+          {ENTROPY_SRC_ENTROPY_CONTROL_ES_TYPE_OFFSET, kMultiBitBool4False},
+      });
 
   // Current dif does not perform a read modified write
   // EXPECT_READ32(ENTROPY_SRC_CONF_REG_OFFSET, 0);
 
-  uint32_t rng_bit_enable = test_param.expected_rng_bit_en ? 0xa : 0x5;
-  uint32_t route_to_fw = test_param.route_to_firmware ? 0xa : 0x5;
-  uint32_t enable =
-      test_param.expected_mode != kDifEntropySrcModeDisabled ? 0xa : 0x5;
+  uint32_t rng_bit_enable =
+      test_param.expected_rng_bit_en ? kMultiBitBool4True : kMultiBitBool4False;
+  uint32_t route_to_fw =
+      test_param.route_to_firmware ? kMultiBitBool4True : kMultiBitBool4False;
+  uint32_t enable = test_param.expected_mode != kDifEntropySrcModeDisabled
+                        ? kMultiBitBool4True
+                        : kMultiBitBool4False;
 
-  uint32_t reset_ht = test_param.reset_health_test_registers ? 0xa : 0x5;
+  uint32_t reset_ht = test_param.reset_health_test_registers
+                          ? kMultiBitBool4True
+                          : kMultiBitBool4False;
   EXPECT_WRITE32(
       ENTROPY_SRC_CONF_REG_OFFSET,
       {
           {ENTROPY_SRC_CONF_RNG_BIT_SEL_OFFSET, test_param.expected_rng_sel},
           {ENTROPY_SRC_CONF_RNG_BIT_ENABLE_OFFSET, rng_bit_enable},
           {ENTROPY_SRC_CONF_HEALTH_TEST_CLR_OFFSET, reset_ht},
-          {ENTROPY_SRC_CONF_BOOT_BYPASS_DISABLE_OFFSET, 0x5},
+          {ENTROPY_SRC_CONF_BOOT_BYPASS_DISABLE_OFFSET, kMultiBitBool4False},
           {ENTROPY_SRC_CONF_ENTROPY_DATA_REG_ENABLE_OFFSET, route_to_fw},
           {ENTROPY_SRC_CONF_ENABLE_OFFSET, enable},
       });
diff --git a/util/design/data/multibits.h.tpl b/util/design/data/multibits.h.tpl
new file mode 100644
index 0000000..49f685a
--- /dev/null
+++ b/util/design/data/multibits.h.tpl
@@ -0,0 +1,33 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+#ifndef OPENTITAN_SW_DEVICE_LIB_BASE_MULTIBITS_H_
+#define OPENTITAN_SW_DEVICE_LIB_BASE_MULTIBITS_H_
+
+/**
+ * Multi-bit boolean values
+ *
+ * Certain configuration fields in the design are multi-bits.
+ * This gives the configuration fields redundancy and ensures
+ * it is difficult to fault the values to a "good" state.
+ */
+typedef enum multi_bit_bool {
+<%
+from mubi import prim_mubi
+%>\
+
+% for n in range(1, n_max_nibbles + 1):
+  <%
+     nbits = n * 4
+  %>\
+  /**
+   * ${nbits}-bits boolean values
+   */
+  kMultiBitBool${nbits}True = 0x${prim_mubi.mubi_value_as_hexstr(True, nbits)},
+  kMultiBitBool${nbits}False = 0x${prim_mubi.mubi_value_as_hexstr(False, nbits)},
+
+% endfor
+} multi_bit_bool_t;
+
+#endif  // OPENTITAN_SW_DEVICE_LIB_BASE_MULTIBITS_H_
diff --git a/util/design/data/prim_mubi_pkg.sv.tpl b/util/design/data/prim_mubi_pkg.sv.tpl
index 9ca00f2..012ea90 100644
--- a/util/design/data/prim_mubi_pkg.sv.tpl
+++ b/util/design/data/prim_mubi_pkg.sv.tpl
@@ -13,7 +13,7 @@
 package prim_mubi_pkg;
 
 <%
-import prim_mubi as prim_mubi
+from mubi import prim_mubi
 %>\
 % for n in range(1, n_max_nibbles + 1):
 <%
diff --git a/util/design/prim_mubi.py b/util/design/mubi/prim_mubi.py
similarity index 91%
rename from util/design/prim_mubi.py
rename to util/design/mubi/prim_mubi.py
index 66488da..4615e58 100755
--- a/util/design/prim_mubi.py
+++ b/util/design/mubi/prim_mubi.py
@@ -11,12 +11,14 @@
 MUBI_SENDER_TPL_PATH = "util/design/data/prim_mubi_sender.sv.tpl"
 MUBI_SYNC_TPL_PATH = "util/design/data/prim_mubi_sync.sv.tpl"
 MUBI_DEC_TPL_PATH = "util/design/data/prim_mubi_dec.sv.tpl"
+MUBI_SW_TPL_PATH = "util/design/data/multibits.h.tpl"
 
 MUBI_PKG_OUT_PATH = "hw/ip/prim/rtl/prim_mubi_pkg.sv"
 MUBI_CORE_OUT_PATH = "hw/ip/prim/prim_mubi.core"
 MUBI_SENDER_OUT_PATH = "hw/ip/prim/rtl/prim_mubi{}_sender.sv"
 MUBI_SYNC_OUT_PATH = "hw/ip/prim/rtl/prim_mubi{}_sync.sv"
 MUBI_DEC_OUT_PATH = "hw/ip/prim/rtl/prim_mubi{}_dec.sv"
+MUBI_SW_OUT_PATH = "sw/device/lib/base/multibits.h"
 
 N_MAX_NIBBLES = 4
 
@@ -46,11 +48,16 @@
     return int(mubi_value_as_hexstr(sel, width), 16)
 
 
-def main():
+def get_c_path():
+    return MUBI_SW_OUT_PATH
+
+
+def gen():
 
     tpls = [
         (MUBI_PKG_TPL_PATH, MUBI_PKG_OUT_PATH),
         (MUBI_CORE_TPL_PATH, MUBI_CORE_OUT_PATH),
+        (MUBI_SW_TPL_PATH, MUBI_SW_OUT_PATH),
     ]
     for tpl, out in tpls:
         with open(tpl) as inf:
@@ -70,7 +77,3 @@
                 n_bits = n * 4
                 with open(out.format(n_bits), 'w') as outf:
                     outf.write(reg_tpl.render(n_bits=n_bits))
-
-
-if __name__ == "__main__":
-    main()
diff --git a/util/reggen/field.py b/util/reggen/field.py
index a69ba67..a85fe7f 100644
--- a/util/reggen/field.py
+++ b/util/reggen/field.py
@@ -10,7 +10,7 @@
 from .lib import (check_keys, check_str, check_name, check_bool,
                   check_list, check_str_list, check_xint)
 from .params import ReggenParams
-from design.prim_mubi import is_width_valid, mubi_value_as_int  # type: ignore
+from design.mubi.prim_mubi import is_width_valid, mubi_value_as_int  # type: ignore
 
 
 REQUIRED_FIELDS = {