Added a patch file to correct the deep nwell and nwell overlap errors in the original SkyWater layout for the GPIOv2 cell in the sky130_fd_io library.
diff --git a/VERSION b/VERSION index 5c037ec..d1deb38 100644 --- a/VERSION +++ b/VERSION
@@ -1 +1 @@ -1.0.293 +1.0.294
diff --git a/sky130/Makefile.in b/sky130/Makefile.in index 3a49b01..9373208 100644 --- a/sky130/Makefile.in +++ b/sky130/Makefile.in
@@ -524,6 +524,7 @@ # These definitions depend on the setting of EF_STYLE ifeq (${EF_STYLE}, 1) IO_VERILOG = verilog/sky130_fd_io + IO_GDS = gds/sky130_fd_io HD_VERILOG = verilog/sky130_fd_sc_hd HDLL_VERILOG = verilog/sky130_fd_sc_hdll HVL_VERILOG = verilog/sky130_fd_sc_hvl @@ -542,6 +543,7 @@ SPIEXT = spi else IO_VERILOG = sky130_fd_io/verilog + IO_GDS = sky130_fd_io/gds HD_VERILOG = sky130_fd_sc_hd/verilog HDLL_VERILOG = sky130_fd_sc_hdll/verilog HVL_VERILOG = sky130_fd_sc_hvl/verilog @@ -1181,6 +1183,11 @@ compile-only rename=sky130_ef_io \ -lef %l/lef/sky130_fd_io__top_xres4v2.lef \ -library general sky130_fd_io 2>&1 | tee -a ${SKY130$*}_make.log + # Copy the GDS file for the GPIOv2 cell, then run the script that fixes it. + cp ${SKYWATER_LIBS_PATH}/sky130_fd_io/latest/cells/top_gpiov2/sky130_fd_io__top_gpiov2.gds \ + ${STAGING_PATH}/${SKY130$*}/libs.ref/${IO_GDS} + ./custom/scripts/fix_gpiov2_gds.py \ + ${STAGING_PATH}/${SKY130$*}/libs.ref/${IO_GDS}/sky130_fd_io__top_gpiov2.gds # Install SkyWater I/O pad library ${STAGE} -source ${SKYWATER_LIBS_PATH} -target ${STAGING_PATH}/${SKY130$*} \ -cdl %l/latest/cells/*/*.cdl ignore=topography compile-only \ @@ -1196,6 +1203,8 @@ -gds %l/latest/cells/*/*.gds compile-only \ sort=../common/sort_pdkfiles.py \ options=custom/scripts/sky130_fd_io_import.tcl \ + no-copy=sky130_fd_io__top_gpiov2.gds \ + include=sky130_fd_io__top_gpiov2.gds \ -verilog %l/latest/cells/*/*.*.v \ -verilog %l/latest/cells/*/*.v exclude=*.*.v,sky130_ef_io.v \ compile-only filter=custom/scripts/inc_verilog.py \
diff --git a/sky130/custom/scripts/fix_gpiov2_gds.py b/sky130/custom/scripts/fix_gpiov2_gds.py new file mode 100755 index 0000000..3c8c788 --- /dev/null +++ b/sky130/custom/scripts/fix_gpiov2_gds.py
@@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +# +# fix_gpiov2_gds.py --- +# +# Special-purpose script that does the work of what ought to be a simple +# binary diff and patch. Except that no such thing exists as a standard +# offering on most Linux systems, so instead of adding another OS +# package requirement, I'm just writing a binary search-and-replace in +# python. +# +# The purpose of the patch is to correct the coordinates of the deep nwell +# and nwell layers in the cell amux_switch_1v2b, as the SkyWater cell +# contains DRC errors. +# +# Specifically, DNWELL coordinate (34.450, 0.035) is moved to (34.905, 0.035) +# and NWELL coordinate (35.055, -0.365) is moved to (35.390, -0.365) + +import sys + +if len(sys.argv) != 2: + print('Usage: fix_gpiov2_gds.py <filename>') + sys.exit(1) +else: + file_name = sys.argv[1] + +orig_data_1 = b'\x00\x00\x86\x92\x00\x00\x00\x23\x00\x00\x86\x92' +replace_data_1 = b'\x00\x00\x88\x59\x00\x00\x00\x23\x00\x00\x88\x59' + +orig_data_2 = b'\x00\x00\x88\xef\xff\xff\xff\x8d\x00\x00\x47\xef\xff\xff\xff\x8d' +replace_data_2 = b'\x00\x00\x8a\x3e\x00\x00\x00\x91\x00\x00\x47\xef\x00\x00\x00\x91' + +orig_data_3 = b'\x00\x00\x88\xef\xff\xff\xfe\x93\x00\x00\x88\xef\xff\xff\xff\x8d' +replace_data_3 = b'\x00\x00\x8a\x3e\xff\xff\xfe\x93\x00\x00\x8a\x3e\x00\x00\x00\x91' + +# This is not efficient, but only needs to be done once. + +with open(file_name, 'rb') as ifile: + data = ifile.read() + data = data.replace(orig_data_1, replace_data_1) + data = data.replace(orig_data_2, replace_data_2) + data = data.replace(orig_data_3, replace_data_3) + +# Write back into the same file +with open(file_name, 'wb') as ofile: + ofile.write(data) + +print("Done!")
diff --git a/sky130/custom/sky130_fd_io/README b/sky130/custom/sky130_fd_io/README index 52b7385..03c4bdd 100644 --- a/sky130/custom/sky130_fd_io/README +++ b/sky130/custom/sky130_fd_io/README
@@ -16,5 +16,7 @@ either high- or low-voltage clamps, connecting to one of the six power domains vddio, vdda, vccd, vssio, vssa, or vssd. +(4) Fix a DRC error in the SkyWater GPIO pad layout + "sky130_ef_io" is open source copyright 2020 efabless, Inc. Released under Apache 2.0 license