Corrections to the PDK, especially in support of the Caravel design
for the MPW-7 tapeout.  (1) Correct the pin order of instances in the
macro_sparecell in the HD library.  (2) Correct the netlists of the
EF overlay I/O cells.  (3) Adds missing diode devices to the vendor
I/O netlist for the gnd2gnd_120x2_lv_isosub cell, and adds length and
width values to generic (net-splitting) resistors.
diff --git a/VERSION b/VERSION
index 2587cf1..819d259 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.345
+1.0.346
diff --git a/sky130/Makefile.in b/sky130/Makefile.in
index cfa5571..35dc218 100644
--- a/sky130/Makefile.in
+++ b/sky130/Makefile.in
@@ -1352,8 +1352,10 @@
 			rename=sky130_fd_sc_hd__nom.tlef \
 		-spice %l/latest/cells/*/*.spice compile-only \
 			sort=../common/sort_pdkfiles.py \
+			filter=custom/scripts/fix_sparecell_spice.py \
 			filter=custom/scripts/fix_device_models.py \
 		-cdl %l/latest/cells/*/*.cdl ignore=topography compile-only \
+			filter=custom/scripts/fix_sparecell_cdl.py \
 			sort=../common/sort_pdkfiles.py \
 		-lef %l/latest/cells/*/*.lef \
 			exclude=*.magic.lef,sky130_ef_sc_hd.lef lefopts=-toplayer \
diff --git a/sky130/custom/scripts/fix_sparecell_cdl.py b/sky130/custom/scripts/fix_sparecell_cdl.py
new file mode 100755
index 0000000..3252b23
--- /dev/null
+++ b/sky130/custom/scripts/fix_sparecell_cdl.py
@@ -0,0 +1,105 @@
+#!/usr/bin/env python3
+#
+# fix_sparecell_cdl ---
+#
+# This script fixes problems in the SkyWater HD library "macro_sparecell".
+# The pin order of the instances in the macro are incorrect and need to be
+# reordered to match the pin order of the individual standard cells in the
+# macro.
+#
+# This script is a filter to be run by setting the name of this script as
+# the value to "filter=" for the model install in the sky130 Makefile.
+
+import re
+import os
+import sys
+
+def filter(inname, outname):
+
+    # Read input
+    try:
+        with open(inname, 'r') as inFile:
+            spitext = inFile.read()
+            # (Don't) unwrap continuation lines
+            # spilines = spitext.replace('\n+', ' ').splitlines()
+            spilines = spitext.splitlines()
+    except:
+        print('fix_sparecell_cdl.py: failed to open ' + inname + ' for reading.', file=sys.stderr)
+        return 1
+
+    macrolines = [
+	'XI1 VGND VNB VPB VPWR net59 LO / sky130_fd_sc_hd__conb_1',
+	'XI2 LO LO VGND VNB VPB VPWR nd2right / sky130_fd_sc_hd__nand2_2',
+	'XI3 LO LO VGND VNB VPB VPWR nd2left / sky130_fd_sc_hd__nand2_2',
+	'XI4 nd2right nd2right VGND VNB VPB VPWR nor2right / sky130_fd_sc_hd__nor2_2',
+	'XI5 nd2left nd2left VGND VNB VPB VPWR nor2left / sky130_fd_sc_hd__nor2_2',
+	'XI6 nor2right VGND VNB VPB VPWR invright / sky130_fd_sc_hd__inv_2',
+	'XI7 nor2left VGND VNB VPB VPWR invleft / sky130_fd_sc_hd__inv_2']
+
+    fixedlines = []
+    modified = False
+    inmacro = False
+
+    # NOTE:  The text "I LO:" appears only in the PININFO line of macro_sparecell
+
+    for line in spilines:
+        if inmacro == True:
+            if '.ENDS' in line:
+                inmacro = False
+                fixedlines.append(line)
+        elif 'I LO:' in line:
+            inmacro = True
+            fixedlines.append(line)
+            for mline in macrolines:
+                fixedlines.append(mline)
+            modified = True
+        else:
+            fixedlines.append(line)
+
+    # Write output
+    if outname == None:
+        for i in fixedlines:
+            print(i)
+    else:
+        # If the output is a symbolic link but no modifications have been made,
+        # then leave it alone.  If it was modified, then remove the symbolic
+        # link before writing.
+        if os.path.islink(outname):
+            if not modified:
+                return 0
+            else:
+                os.unlink(outname)
+        try:
+            with open(outname, 'w') as outFile:
+                for i in fixedlines:
+                    print(i, file=outFile)
+        except:
+            print('fix_sparecell_cdl.py: failed to open ' + outname + ' for writing.', file=sys.stderr)
+            return 1
+
+
+if __name__ == '__main__':
+
+    # This script expects to get one or two arguments.  One argument is
+    # mandatory and is the input file.  The other argument is optional and
+    # is the output file.  The output file and input file may be the same
+    # name, in which case the original input is overwritten.
+
+    options = []
+    arguments = []
+    for item in sys.argv[1:]:
+        if item.find('-', 0) == 0:
+            options.append(item[1:])
+        else:
+            arguments.append(item)
+
+    if len(arguments) > 0:
+        infilename = arguments[0]
+
+    if len(arguments) > 1:
+        outfilename = arguments[1]
+    else:
+        outfilename = None
+
+    result = filter(infilename, outfilename)
+    sys.exit(result)
diff --git a/sky130/custom/scripts/fix_sparecell_spice.py b/sky130/custom/scripts/fix_sparecell_spice.py
new file mode 100755
index 0000000..b323e14
--- /dev/null
+++ b/sky130/custom/scripts/fix_sparecell_spice.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python3
+#
+# fix_sparecell_spice ---
+#
+# This script fixes problems in the SkyWater HD library "macro_sparecell".
+# The pin order of the instances in the macro are incorrect and need to be
+# reordered to match the pin order of the individual standard cells in the
+# macro.
+#
+# This script is a filter to be run by setting the name of this script as
+# the value to "filter=" for the model install in the sky130 Makefile.
+
+import re
+import os
+import sys
+
+def filter(inname, outname):
+
+    # Read input
+    try:
+        with open(inname, 'r') as inFile:
+            spitext = inFile.read()
+            # (Don't) unwrap continuation lines
+            # spilines = spitext.replace('\n+', ' ').splitlines()
+            spilines = spitext.splitlines()
+    except:
+        print('fix_sparecell_spice.py: failed to open ' + inname + ' for reading.', file=sys.stderr)
+        return 1
+
+    
+    macrolines = [
+	'Xsky130_fd_sc_hd__nand2_2_0 LO LO VGND VNB VPB VPWR sky130_fd_sc_hd__nor2_2_0/B',
+	'+ sky130_fd_sc_hd__nand2_2',
+	'Xsky130_fd_sc_hd__nand2_2_1 LO LO VGND VNB VPB VPWR sky130_fd_sc_hd__nor2_2_1/B',
+	'+ sky130_fd_sc_hd__nand2_2',
+	'Xsky130_fd_sc_hd__inv_2_0 sky130_fd_sc_hd__inv_2_0/A VGND VNB VPB VPWR',
+	'+ sky130_fd_sc_hd__inv_2_0/Y sky130_fd_sc_hd__inv_2',
+	'Xsky130_fd_sc_hd__inv_2_1 sky130_fd_sc_hd__inv_2_1/A VGND VNB VPB VPWR',
+	'+ sky130_fd_sc_hd__inv_2_1/Y sky130_fd_sc_hd__inv_2',
+	'Xsky130_fd_sc_hd__nor2_2_0 sky130_fd_sc_hd__nor2_2_0/B sky130_fd_sc_hd__nor2_2_0/B',
+	'+ VGND VNB VPB VPWR sky130_fd_sc_hd__inv_2_0/A sky130_fd_sc_hd__nor2_2',
+	'Xsky130_fd_sc_hd__nor2_2_1 sky130_fd_sc_hd__nor2_2_1/B sky130_fd_sc_hd__nor2_2_1/B',
+	'+ VGND VNB VPB VPWR sky130_fd_sc_hd__inv_2_1/A sky130_fd_sc_hd__nor2_2',
+	'Xsky130_fd_sc_hd__conb_1_0 VGND VNB VPB VPWR sky130_fd_sc_hd__conb_1_0/HI LO',
+	'+ sky130_fd_sc_hd__conb_1']
+
+    fixedlines = []
+    modified = False
+    inmacro = False
+
+    for line in spilines:
+        if 'sparecell' in line:
+            inmacro = True
+            fixedlines.append(line)
+            for mline in macrolines:
+                fixedlines.append(mline)
+            modified = True
+        elif inmacro == True:
+            if '.ends' in line:
+                inmacro = False
+                fixedlines.append(line)
+        else:
+            fixedlines.append(line)
+
+    # Write output
+    if outname == None:
+        for i in fixedlines:
+            print(i)
+    else:
+        # If the output is a symbolic link but no modifications have been made,
+        # then leave it alone.  If it was modified, then remove the symbolic
+        # link before writing.
+        if os.path.islink(outname):
+            if not modified:
+                return 0
+            else:
+                os.unlink(outname)
+        try:
+            with open(outname, 'w') as outFile:
+                for i in fixedlines:
+                    print(i, file=outFile)
+        except:
+            print('fix_sparecell_spice.py: failed to open ' + outname + ' for writing.', file=sys.stderr)
+            return 1
+
+
+if __name__ == '__main__':
+
+    # This script expects to get one or two arguments.  One argument is
+    # mandatory and is the input file.  The other argument is optional and
+    # is the output file.  The output file and input file may be the same
+    # name, in which case the original input is overwritten.
+
+    options = []
+    arguments = []
+    for item in sys.argv[1:]:
+        if item.find('-', 0) == 0:
+            options.append(item[1:])
+        else:
+            arguments.append(item)
+
+    if len(arguments) > 0:
+        infilename = arguments[0]
+
+    if len(arguments) > 1:
+        outfilename = arguments[1]
+    else:
+        outfilename = None
+
+    result = filter(infilename, outfilename)
+    sys.exit(result)
diff --git a/sky130/custom/sky130_fd_io/cdl/sky130_ef_io.cdl b/sky130/custom/sky130_fd_io/cdl/sky130_ef_io.cdl
index af6f5d5..aa141bd 100644
--- a/sky130/custom/sky130_fd_io/cdl/sky130_ef_io.cdl
+++ b/sky130/custom/sky130_fd_io/cdl/sky130_ef_io.cdl
@@ -120,6 +120,10 @@
 + SRC_BDY_HVC VCCD VCCHIB VDDA VDDIO VDDIO_Q
 + VSSA VSSD VSSIO VSSIO_Q VSWITCH
 + sky130_fd_io__top_power_hvc_wpadv2
+Rtest0 VDDIO_Q VDDIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
+Rtest1 VDDIO_Q VDDIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
+Rtest2 VDDIO_Q VDDIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
+Rtest3 VDDIO_Q VDDIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
 
 .ENDS
 
@@ -202,6 +206,10 @@
 + VDDIO SRC_BDY_HVC VCCD VCCHIB VDDA VDDIO VDDIO_Q
 + VSSA VSSD VSSIO VSSIO_Q VSWITCH
 + sky130_fd_io__top_ground_hvc_wpad
+Rtest0 VSSIO_Q VSSIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
+Rtest1 VSSIO_Q VSSIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
+Rtest2 VSSIO_Q VSSIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
+Rtest3 VSSIO_Q VSSIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
 
 .ENDS
 
@@ -422,6 +430,10 @@
 + VSSIO VCCD VCCHIB VDDA VDDIO VDDIO_Q
 + VSSA VSSD VSSIO VSSIO_Q VSWITCH
 + sky130_fd_io__top_power_hvc_wpadv2
+Rtest0 VDDIO_Q VDDIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
+Rtest1 VDDIO_Q VDDIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
+Rtest2 VDDIO_Q VDDIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
+Rtest3 VDDIO_Q VDDIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
 
 .ENDS
 
@@ -442,6 +454,10 @@
 + VDDIO VSSIO VCCD VCCHIB VDDA VDDIO VDDIO_Q
 + VSSA VSSD VSSIO VSSIO_Q VSWITCH
 + sky130_fd_io__top_ground_hvc_wpad
+Rtest0 VSSIO_Q VSSIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
+Rtest1 VSSIO_Q VSSIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
+Rtest2 VSSIO_Q VSSIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
+Rtest3 VSSIO_Q VSSIO sky130_fd_pr__res_generic_m3 w=23.9 l=0.2
 
 .ENDS
 
@@ -541,9 +557,9 @@
 
 * Instantiate the underlying power pad (connects P_PAD to VCCD)
 Xsky130_fd_io__top_power_lvc_base
-+ AMUXBUS_A AMUXBUS_B VSSD1 VCCD1 VCCD1 VDDIO
++ AMUXBUS_A AMUXBUS_B VSSIO VCCD1 VCCD1 VDDIO
 + VCCD1 VCCD_PAD
-+ VSSIO VSSD1 VCCD VCCHIB VDDA VDDIO VDDIO_Q
++ VSSD1 VSSD1 VCCD VCCHIB VDDA VDDIO VDDIO_Q
 + VSSA VSSD VSSIO VSSIO_Q VSWITCH
 + sky130_fd_io__top_power_lvc_wpad
 
@@ -565,7 +581,7 @@
 Xsky130_fd_io__top_ground_lvc_base
 + AMUXBUS_A AMUXBUS_B VSSIO VCCD1 VCCD1
 + VSSD1 VSSD_PAD
-+ VDDIO VSSIO VSSD VCCD VCCHIB VDDA VDDIO VDDIO_Q
++ VDDIO VSSD1 VSSD1 VCCD VCCHIB VDDA VDDIO VDDIO_Q
 + VSSA VSSD VSSIO VSSIO_Q VSWITCH
 + sky130_fd_io__top_ground_lvc_wpad
 
@@ -584,9 +600,9 @@
 
 * Instantiate the underlying power pad (connects P_PAD to VCCD)
 Xsky130_fd_io__top_power_lvc_base
-+ AMUXBUS_A AMUXBUS_B VSSIO VCCD VCCD VDDIO
++ AMUXBUS_A AMUXBUS_B VSSA VCCD VCCD VDDIO
 + VCCD VCCD_PAD
-+ VSSD VSSD VCCD VCCHIB VDDA VDDIO VDDIO_Q
++ VSSIO VSSD VCCD VCCHIB VDDA VDDIO VDDIO_Q
 + VSSA VSSD VSSIO VSSIO_Q VSWITCH
 + sky130_fd_io__top_power_lvc_wpad
 
@@ -605,9 +621,9 @@
 
 * Instantiate the underlying ground pad (connects G_PAD to VSSD)
 Xsky130_fd_io__top_ground_lvc_base
-+ AMUXBUS_A AMUXBUS_B VSSIO VCCD VCCD
++ AMUXBUS_A AMUXBUS_B VSSA VCCD VCCD
 + VSSD VSSD_PAD
-+ VDDIO VSSD VSSD VCCD VCCHIB VDDA VDDIO VDDIO_Q
++ VDDIO VSSIO VSSD VCCD VCCHIB VDDA VDDIO VDDIO_Q
 + VSSA VSSD VSSIO VSSIO_Q VSWITCH
 + sky130_fd_io__top_ground_lvc_wpad
 
diff --git a/sky130/custom/sky130_fd_io/spice/sky130_fd_io.spice b/sky130/custom/sky130_fd_io/spice/sky130_fd_io.spice
index 218e648..ce57405 100644
--- a/sky130/custom/sky130_fd_io/spice/sky130_fd_io.spice
+++ b/sky130/custom/sky130_fd_io/spice/sky130_fd_io.spice
@@ -19,6 +19,10 @@
 .SUBCKT sky130_fd_io__condiode NEG POS
 .ENDS
 
+.SUBCKT sky130_fd_io__gnd2gnd_120x2_lv_isosub BDY2_B2B SRC_BDY_LVC1 VSSD
+D0 SRC_BDY_LVC1 BDY2_B2B sky130_fd_pr__diode_pd2nw_05v5 area=90 pj=33
+D1 BDY2_B2B SRC_BDY_LVC1 sky130_fd_pr__diode_pd2nw_05v5 area=90 pj=33
+.ENDS
 
 .SUBCKT sky130_fd_io__amuxsplitv2_delay ENABLE_VDDA_H HLD_VDDA_H_N HOLD RESET
 + VCC_IO VGND
@@ -3061,8 +3065,8 @@
 XI70 net531 en VCC_IO VCC_IO sky130_fd_pr__pfet_g5v0d10v5 m=4 w=5.0 l=0.5 mult=1
 + sa=0.265 sb=0.265 sd=0.28 topography=normal area=0.063 perim=1.14
 RI221 net420 vr sky130_fd_pr__res_generic_po W=0.75 L=513.445 m=1
-RI186 SLEW_CTL_H_N[0] mode4b sky130_fd_pr__res_generic_m1
-RI157 net247 mode2b sky130_fd_pr__res_generic_m1
+RI186 SLEW_CTL_H_N[0] mode4b sky130_fd_pr__res_generic_m1 L=1 W=1
+RI157 net247 mode2b sky130_fd_pr__res_generic_m1 L=1 W=1
 .ENDS sky130_fd_io__gpio_ovtv2_pdpredrvr_strong_leak_fix
 
 * Copyright 2020 The SkyWater PDK Authors
@@ -4847,9 +4851,9 @@
 * Rshort<1> hld_i_h_n_net<1> HLD_I_H_N short
 * Rshort<0> hld_i_h_n_net<0> HLD_I_H_N short
 * Rshort_hld_i_h enable_vdda_h_n HLD_I_H short
-Rshort<1> hld_i_h_n_net<1> HLD_I_H_N sky130_fd_pr__res_generic_m1
-Rshort<0> hld_i_h_n_net<0> HLD_I_H_N sky130_fd_pr__res_generic_m1
-Rshort_hld_i_h enable_vdda_h_n HLD_I_H sky130_fd_pr__res_generic_m1
+Rshort<1> hld_i_h_n_net<1> HLD_I_H_N sky130_fd_pr__res_generic_m1 L=1 W=1
+Rshort<0> hld_i_h_n_net<0> HLD_I_H_N sky130_fd_pr__res_generic_m1 L=1 W=1
+Rshort_hld_i_h enable_vdda_h_n HLD_I_H sky130_fd_pr__res_generic_m1 L=1 W=1
 .ENDS sky130_fd_io__gpiov2_ctl_hld
 
 * Copyright 2020 The SkyWater PDK Authors
@@ -6362,8 +6366,8 @@
 + sa=0.0 sb=0.0 sd=0.0 topography=normal area=0.048 perim=0.94
 * RI9 net18 NBODY short
 * RI8 net16 NWELLRING short
-RI9 net18 NBODY sky130_fd_pr__res_generic_m1 W=0.02 L=0.005
-RI8 net16 NWELLRING sky130_fd_pr__res_generic_m1 W=0.02 L=0.005
+*RI9 net18 NBODY sky130_fd_pr__res_generic_m1 W=0.02 L=0.005
+*RI8 net16 NWELLRING sky130_fd_pr__res_generic_m1 W=0.02 L=0.005
 .ENDS sky130_fd_io__signal_5_sym_hv_local_5term
 
 * Copyright 2020 The SkyWater PDK Authors
@@ -7151,7 +7155,7 @@
 Xpre_p1_q0 g_nclamp g_pdpre DRN_HVC DRN_HVC sky130_fd_pr__pfet_g5v0d10v5 m=50
 + w=7.0 l=0.5 mult=1 sa=0.265 sb=0.265 sd=0.28 topography=normal area=0.063
 + perim=1.14
-RI13 G_PAD G_CORE sky130_fd_pr__res_generic_m5 W=1 L=1
+RI13 G_PAD G_CORE sky130_fd_pr__res_generic_m5 w=2.5385e+08u l=100000u
 .ENDS sky130_fd_io__top_ground_hvc_wpad
 
 * Copyright 2020 The SkyWater PDK Authors
@@ -7240,7 +7244,7 @@
 Xcxtor2_q0 DRN_HVC g_nclamp SRC_BDY_HVC SRC_BDY_HVC sky130_fd_pr__nfet_g5v0d10v5
 + m=22 w=10.0 l=0.5 mult=1 sa=0.265 sb=0.265 sd=0.28 topography=normal area=0.063
 + perim=1.14
-RI13 P_PAD P_CORE sky130_fd_pr__res_generic_m5 W=1 L=1
+RI13 P_PAD P_CORE sky130_fd_pr__res_generic_m5 w=2.5385e+08u l=100000u
 .ENDS sky130_fd_io__top_power_hvc_wpadv2
 
 * Copyright 2020 The SkyWater PDK Authors
@@ -7727,7 +7731,7 @@
 Xesd_q0 BDY2_B2B SRC_BDY_LVC1 VSSD sky130_fd_io__gnd2gnd_120x2_lv_isosub
 xI54 SRC_BDY_LVC2 VDDIO sky130_fd_io__condiode
 xI50 SRC_BDY_LVC1 VDDIO sky130_fd_io__condiode
-RI21 G_PAD G_CORE sky130_fd_pr__res_generic_m5 W=1 L=1
+RI21 G_PAD G_CORE sky130_fd_pr__res_generic_m5 w=2.5385e+08u l=100000u
 Xpre_p1_q0 g_nclamp_lvc1 g_pdpre_lvc1 DRN_LVC1 DRN_LVC1 sky130_fd_pr__pfet_01v8
 + m=20 w=7.0 l=0.18 mult=1 sa=0.265 sb=0.265 sd=0.28 topography=normal area=0.063
 + perim=1.14
@@ -7797,7 +7801,7 @@
 Xesd_q0 BDY2_B2B SRC_BDY_LVC1 VSSD sky130_fd_io__gnd2gnd_120x2_lv_isosub
 xI54 SRC_BDY_LVC2 VDDIO sky130_fd_io__condiode
 xI50 SRC_BDY_LVC1 VDDIO sky130_fd_io__condiode
-RI21 P_PAD P_CORE sky130_fd_pr__res_generic_m5 W=1 L=1
+RI21 P_PAD P_CORE sky130_fd_pr__res_generic_m5 w=2.5385e+08u l=100000u
 Xpre_p1_q0 g_nclamp_lvc1 g_pdpre_lvc1 DRN_LVC1 DRN_LVC1 sky130_fd_pr__pfet_01v8
 + m=20 w=7.0 l=0.18 mult=1 sa=0.265 sb=0.265 sd=0.28 topography=normal area=0.063
 + perim=1.14