Corrected a problem with scripts overwriting temp files during
parallel builds, resolved by using python3's tempfile package.
Also:  Redid the parasitic capacitance definitions to resolve
issues around computing parasitic capacitance to deep nwell
structures (mostly), in combination with some changes in magic to
automatically handle the short version of the "defaultareacap" and
"defaultperimeter" statements in the tech file, to incorporate
information about the handling of isolated substrate regions.
diff --git a/VERSION b/VERSION
index 3dbd46e..c7119f1 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.288
+1.0.289
diff --git a/sky130/custom/scripts/add_bipolar_ids.py b/sky130/custom/scripts/add_bipolar_ids.py
index 872af9b..611cc71 100755
--- a/sky130/custom/scripts/add_bipolar_ids.py
+++ b/sky130/custom/scripts/add_bipolar_ids.py
@@ -10,6 +10,7 @@
 import os
 import re
 import sys
+import tempfile
 
 options = []
 arguments = []
@@ -50,7 +51,6 @@
 
 for idx, device in enumerate(devlist):
     infile_name = magpath + '/' + device + '.mag'
-    outfile_name = magpath + '/' + device + '_temp.mag'
 
     if not os.path.exists(infile_name):
         print('Error:  Cannot find file ' + infile_name)
@@ -61,7 +61,8 @@
     type = typelist[idx]
     is_baserect = False
     infile = open(infile_name, 'r')
-    outfile = open(outfile_name, 'w')
+    handle, outfile_name = tempfile.mkstemp()
+    outfile = os.fdopen(handle, 'w')
     line_number = 0
     replaced_something = False
 
diff --git a/sky130/custom/scripts/fix_spice_includes.py b/sky130/custom/scripts/fix_spice_includes.py
index f70079b..8469057 100755
--- a/sky130/custom/scripts/fix_spice_includes.py
+++ b/sky130/custom/scripts/fix_spice_includes.py
@@ -11,6 +11,7 @@
 import os
 import re
 import sys
+import tempfile
 
 newdevs = []
 newdevs.append('sky130_fd_pr__pnp_05v5_W3p40L3p40')
@@ -38,10 +39,10 @@
     filepath = os.path.split(infile_name)[0]
     filename = os.path.split(infile_name)[1]
     fileroot = os.path.split(filename)[0]
-    outfile_name = os.path.join(filepath, fileroot + '_temp')
 
     infile = open(infile_name, 'r')
-    outfile = open(outfile_name, 'w')
+    handle, outfile_name = tempfile.mkstemp()
+    outfile = os.fdopen(handle, 'w')
 
     line_number = 0
     replaced_something = False
diff --git a/sky130/custom/scripts/mismatch_params.py b/sky130/custom/scripts/mismatch_params.py
index af84ddc..c8a8fef 100755
--- a/sky130/custom/scripts/mismatch_params.py
+++ b/sky130/custom/scripts/mismatch_params.py
@@ -9,6 +9,7 @@
 import os
 import re
 import sys
+import tempfile
 
 mm_switch_param = 'MC_MM_SWITCH'
 
@@ -95,10 +96,10 @@
     filepath = os.path.split(infile_name)[0]
     filename = os.path.split(infile_name)[1]
     fileroot = os.path.splitext(filename)[0]
-    outfile_name = os.path.join(filepath, fileroot + '_temp')
 
     infile = open(infile_name, 'r')
-    outfile = open(outfile_name, 'w')
+    handle, outfile_name = tempfile.mkstemp()
+    outfile = os.fdopen(handle, 'w')
 
     state = 'before_mismatch'
     line_number = 0
diff --git a/sky130/custom/scripts/montecarlo_hack.py b/sky130/custom/scripts/montecarlo_hack.py
index f2486ce..81a47aa 100755
--- a/sky130/custom/scripts/montecarlo_hack.py
+++ b/sky130/custom/scripts/montecarlo_hack.py
@@ -11,6 +11,7 @@
 import os
 import re
 import sys
+import tempfile
 
 searchpath = ['sky130A/libs.tech/ngspice/parameters/critical.spice',
 	'sky130A/libs.tech/ngspice/parameters/montecarlo.spice']
@@ -54,10 +55,10 @@
     filepath = os.path.split(infile_name)[0]
     filename = os.path.split(infile_name)[1]
     fileroot = os.path.splitext(filename)[0]
-    outfile_name = os.path.join(filepath, fileroot + '_temp')
 
     infile = open(infile_name, 'r')
-    outfile = open(outfile_name, 'w')
+    handle, outfile_name = tempfile.mkstemp()
+    outfile = osfdopen(handle, 'w')
 
     line_number = 0
     replaced_something = False
diff --git a/sky130/custom/scripts/process_params.py b/sky130/custom/scripts/process_params.py
index d255c41..657a635 100755
--- a/sky130/custom/scripts/process_params.py
+++ b/sky130/custom/scripts/process_params.py
@@ -9,6 +9,7 @@
 import os
 import re
 import sys
+import tempfile
 
 pr_switch_param = 'MC_PR_SWITCH'
 
@@ -86,10 +87,10 @@
     filepath = os.path.split(infile_name)[0]
     filename = os.path.split(infile_name)[1]
     fileroot = os.path.splitext(filename)[0]
-    outfile_name = os.path.join(filepath, fileroot + '_temp')
 
     infile = open(infile_name, 'r')
-    outfile = open(outfile_name, 'w')
+    handle, outfile_name = tempfile.mkstemp()
+    outfile = os.fdopen(handle, 'w')
 
     state = 'before_process'
     line_number = 0
diff --git a/sky130/custom/scripts/sp_to_spice.py b/sky130/custom/scripts/sp_to_spice.py
index 3c9ed3c..b97e7d5 100755
--- a/sky130/custom/scripts/sp_to_spice.py
+++ b/sky130/custom/scripts/sp_to_spice.py
@@ -54,14 +54,14 @@
             tokens = newline.split()
             if tokens[1] == filebits[0]:  # top subckt
                 bus_start = 2
-                last_base = base_rex.match(tokens[2])[1]
+                last_base = base_rex.match(tokens[2]).group(1)
                 i = 3
                 while i < len(tokens):
                     base_match = base_rex.match(tokens[i])  # always matches one base net
-                    if last_base != base_match[1]:
+                    if last_base != base_match.group(1):
                         tokens[bus_start:i] = tokens[i-1:bus_start-1:-1]  # reverse the bus indices
                         bus_start = i
-                        last_base = base_match[1]
+                        last_base = base_match.group(1)
                     i += 1
                 tokens[bus_start:i] = tokens[i-1:bus_start-1:-1]
                 newline = " ".join(tokens)
diff --git a/sky130/custom/scripts/xyce_hack.py b/sky130/custom/scripts/xyce_hack.py
index ecedb7d..6fcc914 100755
--- a/sky130/custom/scripts/xyce_hack.py
+++ b/sky130/custom/scripts/xyce_hack.py
@@ -12,6 +12,7 @@
 import os
 import re
 import sys
+import tempfile
 
 if len(sys.argv) <= 1:
     print('Usage: xyce_hack.py <path_to_file>')
@@ -23,10 +24,10 @@
     filepath = os.path.split(infile_name)[0]
     filename = os.path.split(infile_name)[1]
     fileroot = os.path.splitext(filename)[0]
-    outfile_name = os.path.join(filepath, fileroot + '_temp')
 
     infile = open(infile_name, 'r')
-    outfile = open(outfile_name, 'w')
+    handle, outfile_name = tempfile.mkstemp()
+    outfile = os.fdopen(handle, 'w')
 
     line_number = 0
     replaced_something = False
diff --git a/sky130/custom/scripts/xyce_hack2.py b/sky130/custom/scripts/xyce_hack2.py
index 9308dad..9442ad5 100755
--- a/sky130/custom/scripts/xyce_hack2.py
+++ b/sky130/custom/scripts/xyce_hack2.py
@@ -10,6 +10,7 @@
 import os
 import re
 import sys
+import tempfile
 
 plist = ["ldif", "hdif", "rd", "rs", "rsc", "rdc", "nqsmod"]
 regexps = []
@@ -26,10 +27,10 @@
     filepath = os.path.split(infile_name)[0]
     filename = os.path.split(infile_name)[1]
     fileroot = os.path.splitext(filename)[0]
-    outfile_name = os.path.join(filepath, fileroot + '_temp')
 
     infile = open(infile_name, 'r')
-    outfile = open(outfile_name, 'w')
+    handle, outfile_name = tempfile.mkstemp()
+    outfile = os.fdopen(handle, 'w')
 
     line_number = 0
     replaced_something = False
diff --git a/sky130/magic/sky130.tech b/sky130/magic/sky130.tech
index 86140a8..304b4e4 100644
--- a/sky130/magic/sky130.tech
+++ b/sky130/magic/sky130.tech
@@ -467,7 +467,7 @@
 
   psub		pwell
 
-  obstypes	obswell,obsactive,obsli,obsmcon,obsm1,obsm2,obsm3,obsm4,obsm5,obsmrdl,obscomment
+  obstypes	obswell,mvobsactive,obsactive,obsli,obsmcon,obsm1,obsm2,obsm3,obsm4,obsm5,obsmrdl,obscomment
   idtypes	res0p35,res0p69,res1p41,res2p85,res5p73,pnp0p68,pnp3p40,npn1p00,npn2p00,npn11p0
   blocktypes	fillblock,fillblock4
   
@@ -5405,8 +5405,7 @@
 
 #n-well
 # NOTE:  This value not found in PEX files
-defaultareacap     nwell well 120
-defaultoverlap     nwell well isosub dwell  120
+defaultareacap     nwell well dnwell dwell 120
 
 #n-active 
 # Rely on device models to capture *ndiff area cap
@@ -5426,19 +5425,17 @@
 # defaultareacap     allpolynonfet active  106
 # defaultperimeter   allpolynonfet active   57
 
- defaultsidewall    *poly active  22.6
- defaultoverlap	    *poly active dnwell,isosub	     dwell 55.27
- defaultareacap     *poly active nwell,obswell,pwell well  106.13
- defaultperimeter   *poly active nwell,obswell,pwell well  55.27
- defaultsideoverlap *poly active nwell,obswell,pwell well  55.27
+ defaultsidewall    *poly active 22.6
+ defaultareacap     *poly active 106.13
+ defaultperimeter   *poly active 55.27
+ defaultsideoverlap *poly active nwell,pwell well  55.27
 
 #locali
- defaultsidewall    allli locali       32.51
- defaultoverlap	    allli locali dnwell,isosub	     dwell 36.99
- defaultareacap     allli locali nwell,obswell,pwell well  36.99
- defaultperimeter   allli locali nwell,obswell,pwell well  40.70
- defaultoverlap     allli locali nwell,obswell,pwell well  36.99
- defaultsideoverlap allli locali nwell,obswell,pwell well  40.70
+ defaultsidewall    allli locali 32.51
+ defaultareacap     allli locali 36.99
+ defaultperimeter   allli locali 40.70
+ defaultoverlap     allli locali nwell,pwell well  36.99
+ defaultsideoverlap allli locali nwell,pwell well  40.70
 
 #locali->diff
  defaultoverlap     allli locali allactivenonfet active 36.99
@@ -5450,12 +5447,11 @@
  defaultsideoverlap *poly active allli locali 25.14
 
 #metal1
- defaultsidewall    allm1 metal1      44.74
- defaultoverlap	    allm1 metal1 dnwell,isosub	     dwell 25.78
- defaultareacap     allm1 metal1 nwell,obswell,pwell well  25.78
- defaultperimeter   allm1 metal1 nwell,obswell,pwell well  40.57
- defaultoverlap     allm1 metal1 nwell,obswell,pwell well  25.78
- defaultsideoverlap allm1 metal1 nwell,obswell,pwell well  40.57
+ defaultsidewall    allm1 metal1 44.74
+ defaultareacap     allm1 metal1 25.78
+ defaultperimeter   allm1 metal1 40.57
+ defaultoverlap     allm1 metal1 nwell,pwell well  25.78
+ defaultsideoverlap allm1 metal1 nwell,pwell well  40.57
 
 #metal1->diff
  defaultoverlap     allm1 metal1 allactivenonfet active 25.78
@@ -5478,11 +5474,10 @@
 # For ReRAM, all parasitics account for the additional 0.295um between
 # metal1 and metal2
 
- defaultoverlap	    allm2 metal2 dnwell,isosub	     dwell 14.77
- defaultareacap     allm2 metal2 nwell,obswell,pwell well 14.77
- defaultperimeter   allm2 metal2 nwell,obswell,pwell well 32.92
- defaultoverlap     allm2 metal2 nwell,obswell,pwell well 14.77
- defaultsideoverlap allm2 metal2 nwell,obswell,pwell well 32.92
+ defaultareacap     allm2 metal2 14.77
+ defaultperimeter   allm2 metal2 32.92
+ defaultoverlap     allm2 metal2 nwell,pwell well 14.77
+ defaultsideoverlap allm2 metal2 nwell,pwell well 32.92
 
 #metal2->diff
  defaultoverlap     allm2 metal2 allactivenonfet active 14.77
@@ -5504,11 +5499,10 @@
  defaultsideoverlap allm1 metal1 allm2 metal2 23.03
 
 #else (!RERAM)
- defaultoverlap	    allm2 metal2 dnwell,isosub	     dwell 16.94
- defaultareacap     allm2 metal2 nwell,obswell,pwell well 16.94
- defaultperimeter   allm2 metal2 nwell,obswell,pwell well 37.76
- defaultoverlap     allm2 metal2 nwell,obswell,pwell well 16.94
- defaultsideoverlap allm2 metal2 nwell,obswell,pwell well 37.76
+ defaultareacap     allm2 metal2 16.94
+ defaultperimeter   allm2 metal2 37.76
+ defaultoverlap     allm2 metal2 nwell,pwell well 16.94
+ defaultsideoverlap allm2 metal2 nwell,pwell well 37.76
 
 #metal2->diff
  defaultoverlap     allm2 metal2 allactivenonfet active 16.94
@@ -5535,11 +5529,10 @@
  defaultsidewall    allm3 metal3     63.15
 
 #ifdef RERAM
- defaultoverlap	    allm3 metal3 dnwell,isosub	     dwell 11.19
- defaultareacap     allm3 metal3 nwell,obswell,pwell well 11.19
- defaultperimeter   allm3 metal3 nwell,obswell,pwell well 37.07
- defaultoverlap     allm3 metal3 nwell,obswell,pwell well 11.19
- defaultsideoverlap allm3 metal3 nwell,obswell,pwell well 37.07
+ defaultareacap     allm3 metal3 11.19
+ defaultperimeter   allm3 metal3 37.07
+ defaultoverlap     allm3 metal3 nwell,pwell well 11.19
+ defaultsideoverlap allm3 metal3 nwell,pwell well 37.07
 
 #metal3->diff
  defaultoverlap     allm3 metal3 allactive active 11.19
@@ -5561,11 +5554,10 @@
  defaultsideoverlap allm1 metal1 allm3 metal3 20.83
 
 #else (!RERAM)
- defaultoverlap	    allm3 metal3 dnwell,isosub	     dwell 12.37
- defaultareacap     allm3 metal3 nwell,obswell,pwell well 12.37
- defaultperimeter   allm3 metal3 nwell,obswell,pwell well 40.99
- defaultoverlap     allm3 metal3 nwell,obswell,pwell well 12.37
- defaultsideoverlap allm3 metal3 nwell,obswell,pwell well 40.99
+ defaultareacap     allm3 metal3 12.37
+ defaultperimeter   allm3 metal3 40.99
+ defaultoverlap     allm3 metal3 nwell,pwell well 12.37
+ defaultsideoverlap allm3 metal3 nwell,pwell well 40.99
 
 #metal3->diff
  defaultoverlap     allm3 metal3 allactive active 12.37
@@ -5595,14 +5587,12 @@
 
 #ifdef METAL5
 #metal4
- defaultsidewall    allm4 metal4       67.33
+ defaultsidewall    allm4 metal4 67.33
 #ifdef RERAM
-# defaultareacap     alltopm metal4 well  7.84
- defaultoverlap	    allm4 metal4 dnwell,isosub	     dwell 7.84
- areacap     	    allm4/m4 7.84
- defaultperimeter   allm4 metal4 nwell,obswell,pwell well 34.17
- defaultoverlap     allm4 metal4 nwell,obswell,pwell well 7.84
- defaultsideoverlap allm4 metal4 nwell,obswell,pwell well 34.17
+ defaultareacap     allm4 metal4 7.84
+ defaultperimeter   allm4 metal4 34.17
+ defaultoverlap     allm4 metal4 nwell,pwell well 7.84
+ defaultsideoverlap allm4 metal4 nwell,pwell well 34.17
 
 #metal4->diff
  defaultoverlap     allm4 metal4 allactivenonfet active 7.84
@@ -5624,12 +5614,10 @@
  defaultsideoverlap allm1 metal1 allm4 metal4 14.54
 
 #else (!RERAM)
-# defaultareacap     alltopm metal4 well  8.42
- defaultoverlap	    allm4 metal4 dnwell,isosub	     dwell 8.42
- areacap     	    allm4/m4 8.42
- defaultperimeter   allm4 metal4 nwell,obswell,pwell well 36.68
- defaultoverlap     allm4 metal4 nwell,obswell,pwell well 8.42
- defaultsideoverlap allm4 metal4 nwell,obswell,pwell well 36.68
+ defaultareacap     allm4 metal4 8.42
+ defaultperimeter   allm4 metal4 36.68
+ defaultoverlap     allm4 metal4 nwell,pwell well 8.42
+ defaultsideoverlap allm4 metal4 nwell,pwell well 36.68
 
 #metal4->diff
  defaultoverlap     allm4 metal4 allactivenonfet active 8.42
@@ -5663,14 +5651,12 @@
  defaultsideoverlap allm3 metal3 allm4 metal4 42.64
 
 #metal5
- defaultsidewall    allm5 metal5       127.06
+ defaultsidewall    allm5 metal5 127.06
 #ifdef RERAM
-# defaultareacap     allm5 metal5 well  5.99
- defaultoverlap	    allm5 metal5 dnwell,isosub	     dwell 5.99
- areacap     	    allm5/m5 5.99
- defaultoverlap     allm5 metal5 nwell,obswell,pwell well  5.99
- defaultperimeter   allm5 metal5 nwell,obswell,pwell well  36.83
- defaultsideoverlap allm5 metal5 nwell,obswell,pwell well  36.83
+ defaultareacap     allm5 metal5 5.99
+ defaultoverlap     allm5 metal5 5.99
+ defaultperimeter   allm5 metal5 nwell,pwell well  36.83
+ defaultsideoverlap allm5 metal5 nwell,pwell well  36.83
 
 #metal5->diff
  defaultoverlap     allm5 metal5 allactivenonfet active 5.99
@@ -5692,12 +5678,10 @@
  defaultsideoverlap allm1 metal1 allm5 metal5 11.12
 
 #else (!RERAM)
-# defaultareacap     allm5 metal5 well  6.32
- defaultoverlap	    allm5 metal5 dnwell,isosub	     dwell 6.32
- areacap     	    allm5/m5 6.32
- defaultoverlap     allm5 metal5 nwell,obswell,pwell well  6.32
- defaultperimeter   allm5 metal5 nwell,obswell,pwell well  38.85
- defaultsideoverlap allm5 metal5 nwell,obswell,pwell well  38.85
+ defaultareacap     allm5 metal5 6.32
+ defaultperimeter   allm5 metal5 38.85
+ defaultoverlap     allm5 metal5 nwell,pwell well  6.32
+ defaultsideoverlap allm5 metal5 nwell,pwell well  38.85
 
 #metal5->diff
  defaultoverlap     allm5 metal5 allactivenonfet active 6.32