[dif] Prepare templates for rv_timer modifications.

To adapt the templates to auto-generate the RV timer IRQ DIFs, the
template functions must be adapted to be more generic (in terms of
passing in the register offset macro/variable with the address).
Additionally, the "params_list" from the RV timer's HJSON will need to
be parsed, to exract the number of HARTs/timers, so that capability is
added to the make_new_dif.py tool.

This partially addresses #8142.

Signed-off-by: Timothy Trippel <ttrippel@google.com>
diff --git a/util/make_new_dif.py b/util/make_new_dif.py
index ca3137e..73020d9 100755
--- a/util/make_new_dif.py
+++ b/util/make_new_dif.py
@@ -48,12 +48,6 @@
     'rv_plic',
     'alert_handler',
 ]
-# Subset of IPs for which some portion of the DIFs have been auto-generated.
-# NOTE: This exists while autogenerated DIF code is checked into the repository
-# to warn those who update the templates to re-generate the code. Also, as more
-# auto-generated DIF code is checked in (see
-# https://github.com/lowRISC/opentitan/issues/8142), this list will expand.
-ALL_AUTOGEN_IPS = ["uart"]
 
 
 class Irq:
@@ -76,6 +70,23 @@
         self.width = irq["width"] if "width" in irq else 1
 
 
+class Parameter:
+    """Holds IP Parameter information for populating DIF code templates.
+
+    Attributes:
+        name (str): Parameter name.
+        description (str): Parameter description.
+        default (int): Default parameter value.
+
+    """
+    def __init__(self, parameter: OrderedDict) -> None:
+        self.name = parameter["name"]
+        self.description = parameter["desc"]
+        self.default = None
+        if "default" in parameter:
+            self.default = parameter["default"]
+
+
 class Ip:
     """Holds all IP metadata mined from an IP's name and HJSON file.
 
@@ -85,7 +96,6 @@
         name_camel (str): IP short name in camel case.
         name_long_lower (str): IP full name in lower case.
         name_long_upper (str): IP full name with first letter capitalized.
-        hjson_data (OrderedDict): IP metadata from hw/ip/<ip>/data/<ip>.hjson.
         irqs (List[Irq]): List of Irq objects constructed from hjson_data.
 
     """
@@ -106,28 +116,41 @@
         # .capitalize() does not do the right thing, since it would convert
         # UART to Uart.
         self.name_long_upper = (self.name_long_lower[0].upper() +
-            self.name_long_lower[1:])
+                                self.name_long_lower[1:])
         # Load HJSON data.
         if self.name_snake in IPS_USING_IPGEN:
-            ip_dir = REPO_TOP / "hw/top_earlgrey/ip_autogen/{0}".format(self.name_snake)
+            ip_dir = REPO_TOP / "hw/top_earlgrey/ip_autogen/{0}".format(
+                self.name_snake)
         else:
             ip_dir = REPO_TOP / "hw/ip/{0}".format(self.name_snake)
         _hjson_file = ip_dir / "data" / "{0}.hjson".format(self.name_snake)
         with _hjson_file.open("r") as f:
             _hjson_str = f.read()
-        self.hjson_data = hjson.loads(_hjson_str)
+        self._hjson_data = hjson.loads(_hjson_str)
         # Load IRQ data from HJSON.
         self.irqs = self._load_irqs()
+        # Load Parameters from HJSON
+        self.parameters = self._load_parameters()
 
     def _load_irqs(self):
-        assert (self.hjson_data and
+        assert (self._hjson_data and
                 "ERROR: must load IP HJSON before loarding IRQs")
         irqs = []
-        if "interrupt_list" in self.hjson_data:
-            for irq in self.hjson_data["interrupt_list"]:
+        if "interrupt_list" in self._hjson_data:
+            for irq in self._hjson_data["interrupt_list"]:
                 irqs.append(Irq(irq))
         return irqs
 
+    def _load_parameters(self):
+        assert (self._hjson_data and
+                "ERROR: must load IP HJSON before loarding Parameters")
+        parameters = {}
+        if "param_list" in self._hjson_data:
+            for parameter in self._hjson_data["param_list"]:
+                p = Parameter(parameter)
+                parameters[p.name] = p
+        return parameters
+
 
 def main():
     dif_dir = REPO_TOP / "sw/device/lib/dif"
@@ -212,7 +235,7 @@
                                     strict_undefined=True)
 
                 # Generate output file.
-                out_file.write_text(template.render(ip=ip, irqs=ip.irqs))
+                out_file.write_text(template.render(ip=ip))
 
                 # Format autogenerated file with clang-format.
                 assert (shutil.which("clang-format") and
diff --git a/util/make_new_dif/dif_autogen.c.tpl b/util/make_new_dif/dif_autogen.c.tpl
index 3400613..6b9bf36 100644
--- a/util/make_new_dif/dif_autogen.c.tpl
+++ b/util/make_new_dif/dif_autogen.c.tpl
@@ -11,18 +11,17 @@
     Note, this template requires the following Python objects to be passed:
 
     1. ip: See util/make_new_dif.py for the definition of the `ip` obj.
-    2. list[irq]: See util/make_new_dif.py for the definition of the `irq` obj.
 </%doc>
 
-<%def name="mmio_region_read32(intr_reg_upper)">mmio_region_read32(
-  ${ip.name_snake}->base_addr, 
-  ${ip.name_upper}_INTR_${intr_reg_upper}_REG_OFFSET);
+<%def name="mmio_region_read32(intr_reg_offet)">mmio_region_read32(
+    ${ip.name_snake}->base_addr,
+    ${intr_reg_offet});
 </%def>
 
-<%def name="mmio_region_write32(intr_reg_upper, value)">mmio_region_write32(
-  ${ip.name_snake}->base_addr, 
-  ${ip.name_upper}_INTR_${intr_reg_upper}_REG_OFFSET,
-  ${value});
+<%def name="mmio_region_write32(intr_reg_offet, value)">mmio_region_write32(
+    ${ip.name_snake}->base_addr,
+    ${intr_reg_offet},
+    ${value});
 </%def>
 
 // This file is auto-generated.
@@ -31,7 +30,7 @@
 
 #include "${ip.name_snake}_regs.h"  // Generated.
 
-% if len(irqs) > 0:
+% if len(ip.irqs) > 0:
 
   /**
    * Get the corresponding interrupt register bit offset. INTR_STATE,
@@ -43,7 +42,7 @@
     bitfield_bit32_index_t *index_out) {
 
     switch (irq) {
-  % for irq in irqs:
+  % for irq in ip.irqs:
     ## This handles the GPIO IP case where there is a multi-bit interrupt.
     % if irq.width > 1:
       % for irq_idx in range(irq.width):
@@ -74,7 +73,7 @@
       return kDifBadArg;
     }
 
-    *snapshot = ${mmio_region_read32("STATE")}
+    *snapshot = ${mmio_region_read32(ip.name_upper + "_INTR_STATE_REG_OFFSET")}
 
     return kDifOk;
   }
@@ -94,7 +93,8 @@
       return kDifBadArg;
     }
 
-    uint32_t intr_state_reg = ${mmio_region_read32("STATE")}
+    uint32_t intr_state_reg = ${mmio_region_read32(ip.name_upper + "_INTR_STATE_REG_OFFSET")}
+
     *is_pending = bitfield_bit32_read(intr_state_reg, index);
 
     return kDifOk;
@@ -116,7 +116,7 @@
 
     // Writing to the register clears the corresponding bits (Write-one clear).
     uint32_t intr_state_reg = bitfield_bit32_write(0, index, true);
-    ${mmio_region_write32("STATE", "intr_state_reg")}
+    ${mmio_region_write32(ip.name_upper + "_INTR_STATE_REG_OFFSET", "intr_state_reg")}
 
     return kDifOk;
   }
@@ -136,7 +136,7 @@
     }
 
     uint32_t intr_test_reg = bitfield_bit32_write(0, index, true);
-    ${mmio_region_write32("TEST", "intr_test_reg")}
+    ${mmio_region_write32(ip.name_upper + "_INTR_TEST_REG_OFFSET", "intr_test_reg")}
 
     return kDifOk;
   }
@@ -157,7 +157,8 @@
       return kDifBadArg;
     }
 
-    uint32_t intr_enable_reg = ${mmio_region_read32("ENABLE")}
+    uint32_t intr_enable_reg = ${mmio_region_read32(ip.name_upper + "_INTR_ENABLE_REG_OFFSET")}
+
     bool is_enabled = bitfield_bit32_read(intr_enable_reg, index);
     *state = is_enabled ? 
       kDifToggleEnabled : kDifToggleDisabled;
@@ -180,10 +181,11 @@
       return kDifBadArg;
     }
 
-    uint32_t intr_enable_reg = ${mmio_region_read32("ENABLE")}
+    uint32_t intr_enable_reg = ${mmio_region_read32(ip.name_upper + "_INTR_ENABLE_REG_OFFSET")}
+
     bool enable_bit = (state == kDifToggleEnabled) ? true : false;
     intr_enable_reg = bitfield_bit32_write(intr_enable_reg, index, enable_bit);
-    ${mmio_region_write32("ENABLE", "intr_enable_reg")}
+    ${mmio_region_write32(ip.name_upper + "_INTR_ENABLE_REG_OFFSET", "intr_enable_reg")}
 
     return kDifOk;
   }
@@ -199,11 +201,11 @@
 
     // Pass the current interrupt state to the caller, if requested.
     if (snapshot != NULL) {
-      *snapshot = ${mmio_region_read32("ENABLE")}
+      *snapshot = ${mmio_region_read32(ip.name_upper + "_INTR_ENABLE_REG_OFFSET")}
     }
 
     // Disable all interrupts.
-    ${mmio_region_write32("ENABLE", "0u")}
+    ${mmio_region_write32(ip.name_upper + "_INTR_ENABLE_REG_OFFSET", "0u")}
 
     return kDifOk;
   }
@@ -217,7 +219,7 @@
       return kDifBadArg;
     }
 
-    ${mmio_region_write32("ENABLE", "*snapshot")}
+    ${mmio_region_write32(ip.name_upper + "_INTR_ENABLE_REG_OFFSET", "*snapshot")}
 
     return kDifOk;
   }
diff --git a/util/make_new_dif/dif_autogen.h.tpl b/util/make_new_dif/dif_autogen.h.tpl
index ef11726..b1f33de 100644
--- a/util/make_new_dif/dif_autogen.h.tpl
+++ b/util/make_new_dif/dif_autogen.h.tpl
@@ -15,7 +15,6 @@
     Note, this template requires the following Python objects to be passed:
 
     1. ip: See util/make_new_dif.py for the definition of the `ip` obj.
-    2. list[irq]: See util/make_new_dif.py for the definition of the `irq` obj.
 </%doc>
 
 #ifndef OPENTITAN_SW_DEVICE_LIB_DIF_AUTOGEN_DIF_${ip.name_upper}_AUTOGEN_H_
@@ -51,13 +50,13 @@
   mmio_region_t base_addr;
 } dif_${ip.name_snake}_t;
 
-% if len(irqs) > 0:
+% if len(ip.irqs) > 0:
 
   /**
    * A ${ip.name_snake} interrupt request type.
    */
   typedef enum dif_${ip.name_snake}_irq {
-  % for irq in irqs:
+  % for irq in ip.irqs:
     /**
      * ${irq.description}
      */
diff --git a/util/make_new_dif/dif_autogen_unittest.cc.tpl b/util/make_new_dif/dif_autogen_unittest.cc.tpl
index 0e54117..c32ffb7 100644
--- a/util/make_new_dif/dif_autogen_unittest.cc.tpl
+++ b/util/make_new_dif/dif_autogen_unittest.cc.tpl
@@ -36,7 +36,7 @@
     dif_${ip.name_snake}_t ${ip.name_snake}_ = {.base_addr = dev().region()};
   };
 
-% if len(irqs) > 0:
+% if len(ip.irqs) > 0:
   using ::testing::Eq;
 
   class IrqGetStateTest : public ${ip.name_camel}Test {};
@@ -90,30 +90,30 @@
 
     EXPECT_EQ(dif_${ip.name_snake}_irq_is_pending(
         nullptr, 
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0,
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0,
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel},
       % endif
         &is_pending),
       kDifBadArg);
 
     EXPECT_EQ(dif_${ip.name_snake}_irq_is_pending(
         &${ip.name_snake}_, 
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0,
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0,
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel},
       % endif
         nullptr),
       kDifBadArg);
 
     EXPECT_EQ(dif_${ip.name_snake}_irq_is_pending(
         nullptr,
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0,
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0,
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel},
       % endif
         nullptr),
       kDifBadArg);
@@ -135,37 +135,37 @@
     // Get the first IRQ state.
     irq_state = false;
     EXPECT_READ32(${ip.name_upper}_INTR_STATE_REG_OFFSET,
-      % if irqs[0].width > 1:
+      % if ip.irqs[0].width > 1:
         {{0, true}});
       % else:
-        {{${ip.name_upper}_INTR_STATE_${irqs[0].name_upper}_BIT, true}});
+        {{${ip.name_upper}_INTR_STATE_${ip.irqs[0].name_upper}_BIT, true}});
       % endif
     EXPECT_EQ(dif_${ip.name_snake}_irq_is_pending(
         &${ip.name_snake}_,
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0,
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0,
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel},
       % endif
         &irq_state),
       kDifOk);
     EXPECT_TRUE(irq_state);
 
-  % if len(irqs) > 1 or irqs[0].width > 1:
+  % if len(ip.irqs) > 1 or ip.irqs[0].width > 1:
     // Get the last IRQ state.
     irq_state = true;
     EXPECT_READ32(${ip.name_upper}_INTR_STATE_REG_OFFSET,
-      % if irqs[0].width > 1:
-        {{${irqs[0].width - 1}, false}});
+      % if ip.irqs[0].width > 1:
+        {{${ip.irqs[0].width - 1}, false}});
       % else:
-        {{${ip.name_upper}_INTR_STATE_${irqs[-1].name_upper}_BIT, false}});
+        {{${ip.name_upper}_INTR_STATE_${ip.irqs[-1].name_upper}_BIT, false}});
       % endif
     EXPECT_EQ(dif_${ip.name_snake}_irq_is_pending(
         &${ip.name_snake}_,
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}${irqs[0].width - 1},
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}${ip.irqs[0].width - 1},
       % else:
-        kDif${ip.name_camel}Irq${irqs[-1].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[-1].name_camel},
       % endif
         &irq_state),
       kDifOk);
@@ -178,10 +178,10 @@
   TEST_F(IrqAcknowledgeTest, NullArgs) {
     EXPECT_EQ(dif_${ip.name_snake}_irq_acknowledge(
         nullptr, 
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0),
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0),
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}),
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}),
       % endif
       kDifBadArg);
   }
@@ -196,34 +196,34 @@
   TEST_F(IrqAcknowledgeTest, Success) {
     // Clear the first IRQ state.
     EXPECT_WRITE32(${ip.name_upper}_INTR_STATE_REG_OFFSET,
-      % if irqs[0].width > 1:
+      % if ip.irqs[0].width > 1:
          {{0, true}});
       % else:
-        {{${ip.name_upper}_INTR_STATE_${irqs[0].name_upper}_BIT, true}});
+        {{${ip.name_upper}_INTR_STATE_${ip.irqs[0].name_upper}_BIT, true}});
       % endif
     EXPECT_EQ(dif_${ip.name_snake}_irq_acknowledge(
         &${ip.name_snake}_,
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0),
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0),
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}),
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}),
       % endif
       kDifOk);
 
-  % if len(irqs) > 1 or irqs[0].width > 1:
+  % if len(ip.irqs) > 1 or ip.irqs[0].width > 1:
     // Clear the last IRQ state.
     EXPECT_WRITE32(${ip.name_upper}_INTR_STATE_REG_OFFSET,
-      % if irqs[0].width > 1:
-        {{${irqs[0].width - 1}, true}});
+      % if ip.irqs[0].width > 1:
+        {{${ip.irqs[0].width - 1}, true}});
       % else:
-        {{${ip.name_upper}_INTR_STATE_${irqs[-1].name_upper}_BIT, true}});
+        {{${ip.name_upper}_INTR_STATE_${ip.irqs[-1].name_upper}_BIT, true}});
       % endif
     EXPECT_EQ(dif_${ip.name_snake}_irq_acknowledge(
         &${ip.name_snake}_,
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}${irqs[0].width - 1}),
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}${ip.irqs[0].width - 1}),
       % else:
-        kDif${ip.name_camel}Irq${irqs[-1].name_camel}),
+        kDif${ip.name_camel}Irq${ip.irqs[-1].name_camel}),
       % endif
       kDifOk);
   % endif
@@ -234,10 +234,10 @@
   TEST_F(IrqForceTest, NullArgs) {
     EXPECT_EQ(dif_${ip.name_snake}_irq_force(
         nullptr, 
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0),
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0),
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}),
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}),
       % endif
       kDifBadArg);
   }
@@ -252,34 +252,34 @@
   TEST_F(IrqForceTest, Success) {
     // Force first IRQ.
     EXPECT_WRITE32(${ip.name_upper}_INTR_TEST_REG_OFFSET,
-      % if irqs[0].width > 1:
+      % if ip.irqs[0].width > 1:
          {{0, true}});
       % else:
-         {{${ip.name_upper}_INTR_TEST_${irqs[0].name_upper}_BIT, true}});
+         {{${ip.name_upper}_INTR_TEST_${ip.irqs[0].name_upper}_BIT, true}});
       % endif
     EXPECT_EQ(dif_${ip.name_snake}_irq_force(
         &${ip.name_snake}_,
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0),
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0),
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}),
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}),
       % endif
       kDifOk);
 
-  % if len(irqs) > 1 or irqs[0].width > 1:
+  % if len(ip.irqs) > 1 or ip.irqs[0].width > 1:
     // Force last IRQ.
     EXPECT_WRITE32(${ip.name_upper}_INTR_TEST_REG_OFFSET,
-      % if irqs[0].width > 1:
-        {{${irqs[0].width - 1}, true}});
+      % if ip.irqs[0].width > 1:
+        {{${ip.irqs[0].width - 1}, true}});
       % else:
-        {{${ip.name_upper}_INTR_TEST_${irqs[-1].name_upper}_BIT, true}});
+        {{${ip.name_upper}_INTR_TEST_${ip.irqs[-1].name_upper}_BIT, true}});
       % endif
     EXPECT_EQ(dif_${ip.name_snake}_irq_force(
         &${ip.name_snake}_,
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[-1].name_camel}${irqs[0].width - 1}),
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[-1].name_camel}${ip.irqs[0].width - 1}),
       % else:
-        kDif${ip.name_camel}Irq${irqs[-1].name_camel}),
+        kDif${ip.name_camel}Irq${ip.irqs[-1].name_camel}),
       % endif
       kDifOk);
   % endif
@@ -293,30 +293,30 @@
 
     EXPECT_EQ(dif_${ip.name_snake}_irq_get_enabled(
         nullptr, 
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0,
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0,
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel},
       % endif
         &irq_state),
       kDifBadArg);
 
     EXPECT_EQ(dif_${ip.name_snake}_irq_get_enabled(
         &${ip.name_snake}_, 
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0,
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0,
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel},
       % endif
         nullptr),
       kDifBadArg);
 
     EXPECT_EQ(dif_${ip.name_snake}_irq_get_enabled(
         nullptr, 
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0,
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0,
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel},
       % endif
         nullptr),
       kDifBadArg);
@@ -338,37 +338,37 @@
     // First IRQ is enabled.
     irq_state = kDifToggleDisabled;
     EXPECT_READ32(${ip.name_upper}_INTR_ENABLE_REG_OFFSET,
-      % if irqs[0].width > 1:
+      % if ip.irqs[0].width > 1:
         {{0, true}});
       % else:
-        {{${ip.name_upper}_INTR_ENABLE_${irqs[0].name_upper}_BIT, true}});
+        {{${ip.name_upper}_INTR_ENABLE_${ip.irqs[0].name_upper}_BIT, true}});
       % endif
     EXPECT_EQ(dif_${ip.name_snake}_irq_get_enabled(
         &${ip.name_snake}_,
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0,
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0,
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel},
       % endif
         &irq_state),
       kDifOk);
     EXPECT_EQ(irq_state, kDifToggleEnabled);
 
-  % if len(irqs) > 1 or irqs[0].width > 1:
+  % if len(ip.irqs) > 1 or ip.irqs[0].width > 1:
     // Last IRQ is disabled.
     irq_state = kDifToggleEnabled;
     EXPECT_READ32(${ip.name_upper}_INTR_ENABLE_REG_OFFSET,
-      % if irqs[0].width > 1:
-        {{${irqs[0].width - 1}, false}});
+      % if ip.irqs[0].width > 1:
+        {{${ip.irqs[0].width - 1}, false}});
       % else:
-        {{${ip.name_upper}_INTR_ENABLE_${irqs[-1].name_upper}_BIT, false}});
+        {{${ip.name_upper}_INTR_ENABLE_${ip.irqs[-1].name_upper}_BIT, false}});
       % endif
     EXPECT_EQ(dif_${ip.name_snake}_irq_get_enabled(
         &${ip.name_snake}_,
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}${irqs[0].width - 1},
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}${ip.irqs[0].width - 1},
       % else:
-        kDif${ip.name_camel}Irq${irqs[-1].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[-1].name_camel},
       % endif
         &irq_state),
       kDifOk);
@@ -383,10 +383,10 @@
 
     EXPECT_EQ(dif_${ip.name_snake}_irq_set_enabled(
         nullptr, 
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0,
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0,
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel},
       % endif
         irq_state),
       kDifBadArg);
@@ -408,36 +408,36 @@
     // Enable first IRQ.
     irq_state = kDifToggleEnabled;
     EXPECT_MASK32(${ip.name_upper}_INTR_ENABLE_REG_OFFSET,
-      % if irqs[0].width > 1:
+      % if ip.irqs[0].width > 1:
         {{0, 0x1, true}});
       % else:
-        {{${ip.name_upper}_INTR_ENABLE_${irqs[0].name_upper}_BIT, 0x1, true}});
+        {{${ip.name_upper}_INTR_ENABLE_${ip.irqs[0].name_upper}_BIT, 0x1, true}});
       % endif
     EXPECT_EQ(dif_${ip.name_snake}_irq_set_enabled(
         &${ip.name_snake}_,
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}0,
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}0,
       % else:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel},
       % endif
         irq_state),
       kDifOk);
 
-  % if len(irqs) > 1 or irqs[0].width > 1:
+  % if len(ip.irqs) > 1 or ip.irqs[0].width > 1:
     // Disable last IRQ.
     irq_state = kDifToggleDisabled;
     EXPECT_MASK32(${ip.name_upper}_INTR_ENABLE_REG_OFFSET,
-      % if irqs[0].width > 1:
-        {{${irqs[0].width - 1}, 0x1, false}});
+      % if ip.irqs[0].width > 1:
+        {{${ip.irqs[0].width - 1}, 0x1, false}});
       % else:
-        {{${ip.name_upper}_INTR_ENABLE_${irqs[-1].name_upper}_BIT, 0x1, false}});
+        {{${ip.name_upper}_INTR_ENABLE_${ip.irqs[-1].name_upper}_BIT, 0x1, false}});
       % endif
     EXPECT_EQ(dif_${ip.name_snake}_irq_set_enabled(
         &${ip.name_snake}_,
-      % if irqs[0].width > 1:
-        kDif${ip.name_camel}Irq${irqs[0].name_camel}${irqs[0].width - 1},
+      % if ip.irqs[0].width > 1:
+        kDif${ip.name_camel}Irq${ip.irqs[0].name_camel}${ip.irqs[0].width - 1},
       % else:
-        kDif${ip.name_camel}Irq${irqs[-1].name_camel},
+        kDif${ip.name_camel}Irq${ip.irqs[-1].name_camel},
       % endif
         irq_state),
       kDifOk);