Corrected the "insert_layer.py" routine, which was missing a space and did not account for files which might have no "labels" section, and enhanced the script to accept any coordinate list with a length that is a multiple of four. Used this script in the gf180mcu Makefile to add the isolated substrate layer into the corner I/O cell that needs it to extract correctly.
diff --git a/VERSION b/VERSION index dfa6bf0..5414b84 100644 --- a/VERSION +++ b/VERSION
@@ -1 +1 @@ -1.0.430 +1.0.431
diff --git a/common/insert_layer.py b/common/insert_layer.py index af4623e..a993882 100755 --- a/common/insert_layer.py +++ b/common/insert_layer.py
@@ -6,6 +6,10 @@ # The layer is added to the layout in both the mag/ (full) and maglef/ # (abstract) directories. Option "-maglef" or "-mag" will restrict the # use to only the view indicated by the option. +# +# Extended 7/30/2023 to allow multiple rectangles to be specified by +# allowing any multiple of four coordinates. So eight coordinates will +# generate two "rect" lines, for example. # # e.g.: # @@ -23,6 +27,7 @@ layerrex = re.compile('<< ' + layer + ' >>') sectionrex = re.compile('<< ') labelsrex = re.compile('<< labels >>') + propsrex = re.compile('<< properties >>') endrex = re.compile('<< end >>') in_layer = False @@ -33,19 +38,22 @@ if not done and not in_layer: # Handle case in which layer did not already exist in file lmatch = labelsrex.match(line) + pmatch = propsrex.match(line) ematch = endrex.match(line) - if lmatch or ematch: - print('<< ' + layer + '>>', file=ofile) - print('rect ' + geometry, file=ofile) + if lmatch or pmatch or ematch: + print('<< ' + layer + ' >>', file=ofile) + for coords in zip(*[iter(geometry.split())]*4): + print('rect ' + ' '.join(coords), file=ofile) done = True lmatch = layerrex.match(line) - if lmatch: + if lmatch or pmatch: in_layer = True elif in_layer: smatch = sectionrex.match(line) if smatch: - print('rect ' + geometry, file=ofile) + for coords in zip(*[iter(geometry.split())]*4): + print('rect ' + ' '.join(coords), file=ofile) in_layer = False done = True @@ -63,13 +71,13 @@ options = [] arguments = [] for item in sys.argv[1:]: - if item.find('-', 0) == 0: + if item.find('-', 0) == 0 and len(item) > 1 and item[1].isalpha(): options.append(item) else: arguments.append(item) if len(arguments) < 5: - print("Not enough options given to insert_layer.py.") + print("Not enough arguments given to insert_layer.py.") usage() sys.exit(0)
diff --git a/gf180mcu/Makefile.in b/gf180mcu/Makefile.in index 87afbde..289e5b7 100644 --- a/gf180mcu/Makefile.in +++ b/gf180mcu/Makefile.in
@@ -431,6 +431,7 @@ # The script(s) below are used for custom changes to the vendor PDK files PORTORDER = ../common/port_order.py ${EF_FORMAT} ADDPROP = ../common/insert_property.py ${EF_FORMAT} +ADDLAYER = ../common/insert_layer.py ${EF_FORMAT} REMOVELAB = ../common/remove_label.py ${EF_FORMAT} # List the EDA tools to install local setup files for @@ -1177,6 +1178,10 @@ filter=custom/scripts/fix_io_lef.py \ -verilog cells/*/*.v compile-only \ -library general gf180mcu_fd_io 2>&1 | tee -a ${GF180MCU$*}_make.log + # Quick solution to extraction issue---add the isolated substrate layer + # in the corner clamp cell that contains the devices being isolated. + ${ADDLAYER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_io ESD_CLAMP_COR \ + isosubstrate "-42 43458 56113 57130 40932 43016 57057 55812" -mag sram-%: # Install SRAM macros from vendor files