Modified GF180MCU-GDS tech file to add some missing layers that
weren't being handled, and to add one alternate layer number for
"boundary" to the main GF180MCU tech file. Added a patching
script to sky130 to fix the incorrect "related_bias_pin" entries
in the liberty files, which were inserted by the original audit
scripts that produced the open source version of the PDK.
diff --git a/VERSION b/VERSION
index 21bb8ce..f0f99b9 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.334
+1.0.335
diff --git a/gf180mcu/magic/gf180mcu.tech b/gf180mcu/magic/gf180mcu.tech
index ba9b5a9..9849fcd 100644
--- a/gf180mcu/magic/gf180mcu.tech
+++ b/gf180mcu/magic/gf180mcu.tech
@@ -2518,7 +2518,7 @@
layer glass GLASS
labels GLASS
- templayer cellbound BOUND
+ templayer cellbound BOUND,PRBOUND
boundary
layer lvstext TTEXT
@@ -2608,6 +2608,7 @@
calma BJTDEF 118 5
calma MOSCAP 166 5
calma BOUND 0 0
+ calma PRBOUND 63 *
calma FILLOBS 111 5
calma FILLOBS2 152 5
calma TTEXT 230 *
diff --git a/gf180mcu/magic/gf180mcugds.tech b/gf180mcu/magic/gf180mcugds.tech
index df96381..4dedfa0 100644
--- a/gf180mcu/magic/gf180mcugds.tech
+++ b/gf180mcu/magic/gf180mcugds.tech
@@ -45,6 +45,10 @@
l34
l35
l36
+ l37
+ l38
+ l39
+ l40
end
types
@@ -84,6 +88,10 @@
l34 DIODE,l34
l35 RESDEF,l35
l36 CAPDEF,l36
+ l37 V5DEF,l37
+ l38 SRAMDEF,l38
+ l39 BOUND,l39
+ l40 PWELL,l40
end
contact
@@ -127,6 +135,10 @@
l34 pdop_stripes
l35 pselect2
l36 implant3
+ l37 implant1
+ l38 implant2
+ l39 subcircuit
+ l40 pwell
end
compose
@@ -144,6 +156,10 @@
labels NWELL
calma 21 0
+ layer PWELL PWELL
+ labels PWELL
+ calma 204 0
+
layer COMP COMP
labels COMP
calma 22 0
@@ -152,6 +168,14 @@
labels DUALGATE
calma 55 0
+ layer V5DEF V5DEF
+ labels V5DEF
+ calma 112 1
+
+ layer SRAMDEF SRAMDEF
+ labels SRAMDEF
+ calma 108 5
+
layer POLY2 POLY2
labels POLY2
calma 30 0
@@ -172,6 +196,10 @@
labels PPLUS
calma 31 0
+ layer BOUND BOUND
+ labels BOUND
+ calma 63 63
+
layer CONTACT CONTACT
labels CONTACT
calma 33 0
@@ -298,6 +326,10 @@
labels NWELL
calma NWELL 21 0
+ layer PWELL PWELL
+ labels PWELL
+ calma PWELL 204 0
+
layer COMP COMP
labels COMP
calma COMP 22 0
@@ -306,6 +338,14 @@
labels DUALGATE
calma DUALGATE 55 0
+ layer V5DEF V5DEF
+ labels V5DEF
+ calma V5DEF 112 1
+
+ layer SRAMDEF SRAMDEF
+ labels SRAMDEF
+ calma SRAMDEF 108 5
+
layer POLY2 POLY2
labels POLY2
calma POLY2 30 0
@@ -318,6 +358,10 @@
labels ESD
calma ESD 24 0
+ layer BOUND BOUND
+ labels BOUND
+ calma BOUND 63 *
+
layer SAB SAB
labels SAB
calma SAB 49 0
@@ -494,4 +538,8 @@
planeorder l34 33
planeorder l35 34
planeorder l36 35
+ planeorder l37 36
+ planeorder l38 37
+ planeorder l39 38
+ planeorder l40 39
end
diff --git a/sky130/Makefile.in b/sky130/Makefile.in
index da6e800..5ed5d4b 100644
--- a/sky130/Makefile.in
+++ b/sky130/Makefile.in
@@ -1343,6 +1343,7 @@
-doc %l/latest/cells/*/*.pdf \
-lib %l/latest/timing/*.lib filter=custom/scripts/add_wireloads.py \
filter=custom/scripts/fix_default_fanout_load.py \
+ filter=custom/scripts/fix_related_bias_pins.py \
-gds %l/latest/cells/*/*.gds compile-only \
no-copy=custom/sky130_fd_sc_hd/gds/sky130_fd*.gds \
include=custom/sky130_fd_sc_hd/gds/sky130_ef*.gds \
@@ -1398,6 +1399,7 @@
-doc %l/latest/cells/*/*.pdf \
-lib %l/latest/timing/*.lib filter=custom/scripts/add_wireloads.py \
filter=custom/scripts/fix_default_fanout_load.py \
+ filter=custom/scripts/fix_related_bias_pins.py \
-gds %l/latest/cells/*/*.gds compile-only \
options=custom/scripts/gds_import_setup.tcl \
sort=../common/sort_pdkfiles.py \
@@ -1438,6 +1440,7 @@
-doc %l/latest/cells/*/*.pdf \
-lib %l/latest/timing/*.lib filter=custom/scripts/add_wireloads.py \
filter=custom/scripts/fix_default_fanout_load.py \
+ filter=custom/scripts/fix_related_bias_pins.py \
-gds %l/latest/cells/*/*.gds compile-only \
include=custom/sky130_fd_sc_hvl/gds/sky130_ef*.gds \
options=custom/scripts/gds_import_setup.tcl \
@@ -1485,6 +1488,7 @@
-doc %l/latest/cells/*/*.pdf \
-lib %l/latest/timing/*.lib filter=custom/scripts/add_wireloads.py \
filter=custom/scripts/fix_default_fanout_load.py \
+ filter=custom/scripts/fix_related_bias_pins.py \
-gds %l/latest/cells/*/*.gds compile-only \
options=custom/scripts/gds_import_setup.tcl \
sort=../common/sort_pdkfiles.py \
@@ -1524,6 +1528,7 @@
-doc %l/latest/cells/*/*.pdf \
-lib %l/latest/timing/*.lib filter=custom/scripts/add_wireloads.py \
filter=custom/scripts/fix_default_fanout_load.py \
+ filter=custom/scripts/fix_related_bias_pins.py \
-gds %l/latest/cells/*/*.gds compile-only \
no-copy=custom/sky130_fd_sc_hs/gds/sky130_fd*.gds \
options=custom/scripts/gds_import_setup.tcl \
@@ -1560,6 +1565,7 @@
-doc %l/latest/cells/*/*.pdf \
-lib %l/latest/timing/*.lib filter=custom/scripts/add_wireloads.py \
filter=custom/scripts/fix_default_fanout_load.py \
+ filter=custom/scripts/fix_related_bias_pins.py \
-gds %l/latest/cells/*/*.gds compile-only \
options=custom/scripts/gds_import_setup.tcl \
sort=../common/sort_pdkfiles.py \
@@ -1595,6 +1601,7 @@
-doc %l/latest/cells/*/*.pdf \
-lib %l/latest/timing/*.lib filter=custom/scripts/add_wireloads.py \
filter=custom/scripts/fix_default_fanout_load.py \
+ filter=custom/scripts/fix_related_bias_pins.py \
-gds %l/latest/cells/*/*.gds compile-only \
options=custom/scripts/gds_import_setup.tcl \
sort=../common/sort_pdkfiles.py \
diff --git a/sky130/custom/scripts/fix_related_bias_pins.py b/sky130/custom/scripts/fix_related_bias_pins.py
new file mode 100755
index 0000000..9948008
--- /dev/null
+++ b/sky130/custom/scripts/fix_related_bias_pins.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python3
+#
+# fix_related_bias_pins.py ---
+#
+# All of the sky130 standard cell liberty files share an error
+# introduced by the audit script, which added "related_bias_pin"
+# entries for each cell. All of them are wrong in that they
+# have VPB as the related bias for VGND and VNB as the related
+# bias for VPWR. These need to be swapped.
+#
+# This script is a filter to be run by setting the name of this script as
+# the value to "filter=" for the lib install in the sky130 Makefile.
+
+import re
+import os
+import sys
+
+def filter(inname, outname):
+
+ # Read input
+ try:
+ with open(inname, 'r') as inFile:
+ stext = inFile.read()
+ slines = stext.splitlines()
+ except:
+ print('fix_related_bias_pins.py: failed to open ' + inname + ' for reading.', file=sys.stderr)
+ return 1
+
+ # Process input with regexp
+
+ fixedlines = []
+ modified = False
+ current_pin = ''
+
+ related_re = re.compile('\s*related_bias_pin\s*:\s*"(.+)"\s*;')
+ pg_re = re.compile('\s*pg_pin\s*\(\s*"(.+)"\s*\)\s*{')
+
+ for line in slines:
+ pmatch = pg_re.match(line)
+ if pmatch:
+ current_pin = pmatch.group(1)
+
+ rmatch = related_re.match(line)
+ if rmatch:
+ pin_str = rmatch.group(1)
+ if pin_str == 'VPB' and current_pin == 'VGND':
+ modified = True
+ line = line.replace(pin_str, 'VNB')
+ elif pin_str == 'VNB' and current_pin == 'VPWR':
+ modified = True
+ line = line.replace(pin_str, 'VPB')
+ else:
+ print('Warning: Unknown related bias pin ' + pin_str)
+ current_pin = ''
+
+ 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_related_bias_pins.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/sky130.json b/sky130/sky130.json
index 5b08ba9..5767096 100644
--- a/sky130/sky130.json
+++ b/sky130/sky130.json
@@ -92,8 +92,8 @@
"magic": "MAGIC_COMMIT"
},
"reference": {
- "open_pdks": "cc0029b45c68137aa21323912f50d2fc17eeea13",
- "magic": "5d51e10fb969b31e6e95b5fb78d21efeccc73c14",
+ "open_pdks": "82d61e2c9c265c0f0e994233cd2d024c90adb45f",
+ "magic": "7905e15ae3b66ed26349fb701b475ef93b566de5",
"skywater_pdk": "f70d8ca46961ff92719d8870a18a076370b85f6c",
"sky130_osu_sc_t12": "ac90ef0c622a9377a16b5218d9da3ac4169eeaaf",
"sky130_osu_sc_t15": "95d1c19abb47e1b2945847acb4e817b1b8417c43",