[reggen] Slightly refactor code for hwext register fields

The existing templated version was pretty hard to follow. Move the
"business logic" into a separate Python block rather than interleaving
it with the templating.

Signed-off-by: Rupert Swarbrick <rswarbrick@lowrisc.org>
diff --git a/util/reggen/reg_top.sv.tpl b/util/reggen/reg_top.sv.tpl
index fc8f671..add7122 100644
--- a/util/reggen/reg_top.sv.tpl
+++ b/util/reggen/reg_top.sv.tpl
@@ -443,124 +443,95 @@
   % endif
 </%def>\
 <%def name="finst_gen(field, finst_name, fsig_name, hwext, regwen, shadowed)">\
+<%
+    re_expr = f'{finst_name}_re' if field.swaccess.allows_read() else "1'b0"
+
+    if field.swaccess.allows_write():
+      if regwen:
+        we_expr = f'{finst_name}_we & {regwen.lower()}_qs'
+      else:
+        we_expr = f'{finst_name}_we'
+      wd_expr = f'{finst_name}_wd'
+    else:
+      we_expr = "1'b0"
+      wd_expr = "'0"
+
+    if field.hwaccess.allows_write():
+      de_expr = f'hw2reg.{fsig_name}.de'
+      d_expr = f'hw2reg.{fsig_name}.d'
+    else:
+      de_expr = "1'b0"
+      d_expr = "'0"
+
+    qre_expr = f'reg2hw.{fsig_name}.re' if field.hwre or shadowed else ""
+
+    if field.hwaccess.allows_read():
+      qe_expr = f'reg2hw.{fsig_name}.qe' if field.hwqe else ''
+      q_expr = f'reg2hw.{fsig_name}.q'
+    else:
+      qe_expr = ''
+      q_expr = ''
+
+    qs_expr = f'{finst_name}_qs' if field.swaccess.allows_read() else ''
+%>\
   % if hwext:       ## if hwext, instantiate prim_subreg_ext
   prim_subreg_ext #(
     .DW    (${field.bits.width()})
   ) u_${finst_name} (
-    % if field.swaccess.allows_read():
-    .re     (${finst_name}_re),
-    % else:
-    .re     (1'b0),
-    % endif
-    % if field.swaccess.allows_write():
-      % if regwen:
-    .we     (${finst_name}_we & ${regwen.lower()}_qs),
-      % else:
-    .we     (${finst_name}_we),
-      % endif
-    .wd     (${finst_name}_wd),
-    % else:
-    .we     (1'b0),
-    .wd     ('0),
-    % endif
-    % if field.hwaccess.allows_write():
-    .d      (hw2reg.${fsig_name}.d),
-    % else:
-    .d      ('0),
-    % endif
-    % if field.hwre or shadowed:
-    .qre    (reg2hw.${fsig_name}.re),
-    % else:
-    .qre    (),
-    % endif
-    % if not field.hwaccess.allows_read():
-    .qe     (),
-    .q      (),
-    % else:
-      % if field.hwqe:
-    .qe     (reg2hw.${fsig_name}.qe),
-      % else:
-    .qe     (),
-      % endif
-    .q      (reg2hw.${fsig_name}.q),
-    % endif
-    % if field.swaccess.allows_read():
-    .qs     (${finst_name}_qs)
-    % else:
-    .qs     ()
-    % endif
+    .re     (${re_expr}),
+    .we     (${we_expr}),
+    .wd     (${wd_expr}),
+    .d      (${d_expr}),
+    .qre    (${qre_expr}),
+    .qe     (${qe_expr}),
+    .q      (${q_expr}),
+    .qs     (${qs_expr})
   );
-  % else:       ## if not hwext, instantiate prim_subreg, prim_subreg_shadow or constant assign
-    % if ((not field.hwaccess.allows_read() and\
-           not field.hwaccess.allows_write() and\
-           field.swaccess.swrd() == SwRdAccess.RD and\
-           not field.swaccess.allows_write())):
+  % else:
+<%
+      # This isn't a field in a hwext register. Instantiate prim_subreg,
+      # prim_subreg_shadow or constant assign.
+
+      resval_expr = f"{field.bits.width()}'h{field.resval or 0:x}"
+      is_const_reg = not (field.hwaccess.allows_read() or
+                          field.hwaccess.allows_write() or
+                          field.swaccess.allows_write() or
+                          field.swaccess.swrd() != SwRdAccess.RD)
+
+      subreg_block = 'prim_subreg' + ('_shadowed' if shadowed else '')
+%>\
+    % if is_const_reg:
   // constant-only read
-  assign ${finst_name}_qs = ${field.bits.width()}'h${"%x" % (field.resval or 0)};
-    % else:     ## not hwext not constant
-      % if not shadowed:
-  prim_subreg #(
-      % else:
-  prim_subreg_shadow #(
-      % endif
+  assign ${finst_name}_qs = ${resval_expr};
+    % else:
+  ${subreg_block} #(
     .DW      (${field.bits.width()}),
     .SWACCESS("${field.swaccess.value[1].name.upper()}"),
-    .RESVAL  (${field.bits.width()}'h${"%x" % (field.resval or 0)})
+    .RESVAL  (${resval_expr})
   ) u_${finst_name} (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
       % if shadowed:
-    .re     (${finst_name}_re),
+    .re     (${re_expr}),
       % endif
-      % if field.swaccess.allows_write(): ## non-RO types
-        % if regwen:
-    .we     (${finst_name}_we & ${regwen.lower()}_qs),
-        % else:
-    .we     (${finst_name}_we),
-        % endif
-    .wd     (${finst_name}_wd),
-      % else:                             ## RO types
-    .we     (1'b0),
-    .wd     ('0),
-      % endif
+    .we     (${we_expr}),
+    .wd     (${wd_expr}),
 
     // from internal hardware
-      % if field.hwaccess.allows_write():
-    .de     (hw2reg.${fsig_name}.de),
-    .d      (hw2reg.${fsig_name}.d),
-      % else:
-    .de     (1'b0),
-    .d      ('0),
-      % endif
+    .de     (${de_expr}),
+    .d      (${d_expr}),
 
     // to internal hardware
-      % if not field.hwaccess.allows_read():
-    .qe     (),
-    .q      (),
-      % else:
-        % if field.hwqe:
-    .qe     (reg2hw.${fsig_name}.qe),
-        % else:
-    .qe     (),
-        % endif
-    .q      (reg2hw.${fsig_name}.q),
-      % endif
+    .qe     (${qe_expr}),
+    .q      (${q_expr}),
 
     // to register interface (read)
       % if not shadowed:
-        % if field.swaccess.allows_read():
-    .qs     (${finst_name}_qs)
-        % else:
-    .qs     ()
-        % endif
+    .qs     (${qs_expr})
       % else:
-        % if field.swaccess.allows_read():
-    .qs     (${finst_name}_qs),
-        % else:
-    .qs     (),
-        % endif
+    .qs     (${qs_expr}),
 
     // Shadow register error conditions
     .err_update  (reg2hw.${fsig_name}.err_update),