Modifications to the waffle fill pattern generator output style.
diff --git a/VERSION b/VERSION
index 818b8de..224d004 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.81
+1.0.82
diff --git a/common/staging_install.py b/common/staging_install.py
index 2994ac0..db400a2 100755
--- a/common/staging_install.py
+++ b/common/staging_install.py
@@ -21,6 +21,9 @@
# if link_from is "source". This option may
# be called multiple times if there are multiple
# sources.
+# -variable <name> Specify a variable name that is used for the
+# target path. This variable name must be enforced
+# in setup scripts like .magicrc
import re
import os
@@ -231,6 +234,7 @@
targetdir = None
link_from = None
localdir = None
+ variable = None
ef_format = False
do_install = True
@@ -286,6 +290,9 @@
elif option[0] == 'local':
optionlist.remove(option)
localdir = option[1]
+ elif option[0] == 'variable':
+ optionlist.remove(option)
+ variable = option[1]
# Error if no staging or dest specified
if not stagingdir:
@@ -432,7 +439,13 @@
print(' ' + tool + ' (' + str(total) + ' ' + symstr + ')')
# In .mag files in mag/ and maglef/, also need to change the staging
- # directory name to localdir
+ # directory name to localdir. If "-variable" is specified in the options,
+ # the replace the staging path with the variable name, not localdir.
+
+ if variable:
+ localname = '$' + variable
+ else:
+ localname = localdir
needcheck = ['mag', 'maglef']
refdirs = ['/libs.ref/']
@@ -449,7 +462,7 @@
libraries = os.listdir(filedir)
for library in libraries:
libdir = filedir + '/' + library
- total = filter_recursive(libdir, stagingdir, localdir)
+ total = filter_recursive(libdir, stagingdir, localname)
if total > 0:
substr = 'substitutions' if total > 1 else 'substitution'
print(' ' + library + ' (' + str(total) + ' ' + substr + ')')
@@ -461,7 +474,7 @@
print(' ' + library)
for filetype in needcheck:
filedir = targetdir + refdir + library + '/' + filetype
- total = filter_recursive(filedir, stagingdir, localdir)
+ total = filter_recursive(filedir, stagingdir, localname)
if total > 0:
substr = 'substitutions' if total > 1 else 'substitution'
print(' ' + filetype + ' (' + str(total) + ' ' + substr + ')')
diff --git a/sky130/magic/sky130.tech b/sky130/magic/sky130.tech
index e027773..df37c77 100644
--- a/sky130/magic/sky130.tech
+++ b/sky130/magic/sky130.tech
@@ -1647,12 +1647,19 @@
style wafflefill
#----------------------------------------------------------------
# Style used by scripts for automatically generating fill layers
+# NOTE: Be sure to generate output on flattened layout.
#----------------------------------------------------------------
scalefactor 10 nanometers
options calma-permissive-labels
gridlimit 5
#----------------------------------------------------------------
+# Generate and retain a layer representing the bounding box
+#----------------------------------------------------------------
+ templayer topbox
+ bbox top
+
+#----------------------------------------------------------------
# Generate guard-band around nwells to keep FOM from crossing
# Spacing from nwell = Diff/Tap 9 = 0.34um
# Enclosure by nwell = Diff/Tap 8 = 0.18um
@@ -1666,114 +1673,107 @@
#---------------------------------------------------
# Interleaved FOM and POLY fill
#---------------------------------------------------
- templayer slots_fom_pass1
- bbox top
+ templayer slots_fom_pass1 topbox
slots 0 4080 1320 0 4080 1320 1360 0
templayer obstruct_fom_pass1 alldiff,allpoly,rpw
grow 500
or well_guardband
templayer fomfill_pass1 slots_fom_pass1
and-not obstruct_fom_pass1
+ and topbox
shrink 2035
grow 2035
#---------------------------------------------------
- templayer slots_poly_pass1
- bbox top
- slots 0 720 360 0 720 360 240 0
- templayer obstruct_poly_pass1 alldiff,allpoly,rpw
- grow 700
- or fomfill_pass1
- grow 300
- or well_guardband
- templayer polyfill_pass1 slots_poly_pass1
- and-not obstruct_poly_pass1
- shrink 355
- grow 355
-
-#---------------------------------------------------
-
- templayer slots_fom_pass2
- bbox top
+ templayer slots_fom_pass2 topbox
slots 0 2500 1320 0 2500 1320 1360 0
templayer obstruct_fom_pass2 fomfill_pass1
- grow 820
- grow 200
- or polyfill_pass1
- grow 300
+ grow 1320
or obstruct_fom_pass1
templayer fomfill_pass2 slots_fom_pass2
and-not obstruct_fom_pass2
+ and topbox
shrink 1245
grow 1245
#---------------------------------------------------
- templayer slots_poly_coarse
- bbox top
- slots 0 720 360 0 720 360 240 120
- templayer obstruct_poly_coarse polyfill_pass1
- grow 60
- or fomfill_pass1,fomfill_pass2
- grow 300
- or obstruct_poly_pass1
- templayer polyfill_coarse slots_poly_coarse
- and-not obstruct_poly_coarse
- shrink 355
- grow 355
-
-#---------------------------------------------------
-
- templayer slots_fom_coarse
- bbox top
+ templayer slots_fom_coarse topbox
slots 0 1500 1320 0 1500 1320 1360 0
templayer obstruct_fom_coarse fomfill_pass1,fomfill_pass2
- grow 1020
- or polyfill_pass1,polyfill_coarse
- grow 300
+ grow 1320
or obstruct_fom_pass1
templayer fomfill_coarse slots_fom_coarse
and-not obstruct_fom_coarse
+ and topbox
shrink 745
grow 745
#---------------------------------------------------
- templayer slots_poly_medium
- bbox top
- slots 0 540 360 0 540 360 240 100
- templayer obstruct_poly_medium polyfill_pass1,polyfill_coarse
- grow 1010
- or obstruct_poly_pass1
- templayer polyfill_medium slots_poly_medium
- and-not obstruct_poly_medium
- shrink 265
- grow 265
-#---------------------------------------------------
-
- templayer slots_fom_fine
- bbox top
+ templayer slots_fom_fine topbox
slots 0 500 400 0 500 400 160 0
templayer obstruct_fom_fine fomfill_pass1,fomfill_pass2,fomfill_coarse
grow 1320
or obstruct_fom_pass1
templayer fomfill_fine slots_fom_fine
and-not obstruct_fom_fine
+ and topbox
shrink 245
grow 245
#---------------------------------------------------
- templayer slots_poly_fine
- bbox top
+
+ templayer slots_poly_pass1 topbox
+ slots 0 720 360 0 720 360 240 0
+ templayer obstruct_poly_pass1
+ or fomfill_pass1,fomfill_pass2,fomfill_coarse,fomfill_fine
+ grow 300
+ or obstruct_fom_pass1
+ templayer polyfill_pass1 slots_poly_pass1
+ and-not obstruct_poly_pass1
+ and topbox
+ shrink 355
+ grow 355
+
+#---------------------------------------------------
+
+ templayer slots_poly_coarse topbox
+ slots 0 720 360 0 720 360 240 120
+ templayer obstruct_poly_coarse polyfill_pass1
+ or fomfill_pass1,fomfill_pass2,fomfill_coarse,fomfill_fine
+ grow 360
+ or obstruct_fom_pass1
+ templayer polyfill_coarse slots_poly_coarse
+ and-not obstruct_poly_coarse
+ and topbox
+ shrink 355
+ grow 355
+
+#---------------------------------------------------
+ templayer slots_poly_medium topbox
+ slots 0 540 360 0 540 360 240 100
+ templayer obstruct_poly_medium polyfill_pass1,polyfill_coarse
+ or fomfill_pass1,fomfill_pass2,fomfill_coarse,fomfill_fine
+ grow 1010
+ or obstruct_fom_pass1
+ templayer polyfill_medium slots_poly_medium
+ and-not obstruct_poly_medium
+ and topbox
+ shrink 265
+ grow 265
+
+#---------------------------------------------------
+ templayer slots_poly_fine topbox
slots 0 480 360 0 480 360 240 200
templayer obstruct_poly_fine polyfill_pass1,polyfill_coarse,polyfill_medium
- grow 650
- or polyfill_pass1,polyfill_coarse,polyfill_medium
- grow 360
+ or fomfill_pass1,fomfill_pass2,fomfill_coarse,fomfill_fine
+ grow 1010
or obstruct_poly_pass1
templayer polyfill_fine slots_poly_fine
and-not obstruct_poly_fine
+ and topbox
shrink 235
grow 235
@@ -1796,18 +1796,17 @@
#---------------------------------------------------
# MET1 fill
#---------------------------------------------------
- templayer slots_m1_coarse
- bbox top
+ templayer slots_m1_coarse topbox
slots 0 2000 200 0 2000 200 700 0
templayer obstruct_m1_coarse allm1,allpad,obsm1,m1fill,fillblock
grow 3000
templayer met1fill_coarse slots_m1_coarse
and-not obstruct_m1_coarse
+ and topbox
shrink 995
grow 995
- templayer slots_m1_medium
- bbox top
+ templayer slots_m1_medium topbox
slots 0 1000 200 0 1000 200 700 0
templayer obstruct_m1_medium allm1,allpad,obsm1,m1fill,fillblock
grow 2800
@@ -1815,11 +1814,11 @@
grow 200
templayer met1fill_medium slots_m1_medium
and-not obstruct_m1_medium
+ and topbox
shrink 495
grow 495
- templayer slots_m1_fine
- bbox top
+ templayer slots_m1_fine topbox
slots 0 580 200 0 580 200 700 0
templayer obstruct_m1_fine allm1,allpad,obsm1,m1fill,fillblock
grow 300
@@ -1827,11 +1826,11 @@
grow 200
templayer met1fill_fine slots_m1_fine
and-not obstruct_m1_fine
+ and topbox
shrink 285
grow 285
- templayer slots_m1_veryfine
- bbox top
+ templayer slots_m1_veryfine topbox
slots 0 300 200 0 300 200 100 50
templayer obstruct_m1_veryfine allm1,allpad,obsm1,m1fill,fillblock
grow 100
@@ -1839,6 +1838,7 @@
grow 200
templayer met1fill_veryfine slots_m1_veryfine
and-not obstruct_m1_veryfine
+ and topbox
shrink 145
grow 145
@@ -1851,18 +1851,17 @@
#---------------------------------------------------
# MET2 fill
#---------------------------------------------------
- templayer slots_m2_coarse
- bbox top
+ templayer slots_m2_coarse topbox
slots 0 2000 200 0 2000 200 700 350
templayer obstruct_m2 allm2,allpad,obsm2,m2fill,fillblock
grow 3000
templayer met2fill_coarse slots_m2_coarse
and-not obstruct_m2
+ and topbox
shrink 995
grow 995
- templayer slots_m2_medium
- bbox top
+ templayer slots_m2_medium topbox
slots 0 1000 200 0 1000 200 700 350
templayer obstruct_m2_medium allm2,allpad,obsm2,m2fill,fillblock
grow 2800
@@ -1870,11 +1869,11 @@
grow 200
templayer met2fill_medium slots_m2_medium
and-not obstruct_m2_medium
+ and topbox
shrink 495
grow 495
- templayer slots_m2_fine
- bbox top
+ templayer slots_m2_fine topbox
slots 0 580 200 0 580 200 700 350
templayer obstruct_m2_fine allm2,allpad,obsm2,m2fill,fillblock
grow 300
@@ -1882,11 +1881,11 @@
grow 200
templayer met2fill_fine slots_m2_fine
and-not obstruct_m2_fine
+ and topbox
shrink 285
grow 285
- templayer slots_m2_veryfine
- bbox top
+ templayer slots_m2_veryfine topbox
slots 0 300 200 0 300 200 100 100
templayer obstruct_m2_veryfine allm2,allpad,obsm2,m2fill,fillblock
grow 100
@@ -1894,6 +1893,7 @@
grow 200
templayer met2fill_veryfine slots_m2_veryfine
and-not obstruct_m2_veryfine
+ and topbox
shrink 145
grow 145
@@ -1906,18 +1906,17 @@
#---------------------------------------------------
# MET3 fill
#---------------------------------------------------
- templayer slots_m3_coarse
- bbox top
+ templayer slots_m3_coarse topbox
slots 0 2000 300 0 2000 300 700 700
templayer obstruct_m3 allm3,allpad,obsm3,m3fill,fillblock
grow 3000
templayer met3fill_coarse slots_m3_coarse
and-not obstruct_m3
+ and topbox
shrink 995
grow 995
- templayer slots_m3_medium
- bbox top
+ templayer slots_m3_medium topbox
slots 0 1000 300 0 1000 300 700 700
templayer obstruct_m3_medium allm3,allpad,obsm3,m3fill,fillblock
grow 2700
@@ -1925,11 +1924,11 @@
grow 300
templayer met3fill_medium slots_m3_medium
and-not obstruct_m3_medium
+ and topbox
shrink 495
grow 495
- templayer slots_m3_fine
- bbox top
+ templayer slots_m3_fine topbox
slots 0 580 300 0 580 300 700 700
templayer obstruct_m3_fine allm3,allpad,obsm3,m3fill,fillblock
grow 200
@@ -1937,17 +1936,18 @@
grow 300
templayer met3fill_fine slots_m3_fine
and-not obstruct_m3_fine
+ and topbox
shrink 285
grow 285
- templayer slots_m3_veryfine
- bbox top
+ templayer slots_m3_veryfine topbox
slots 0 400 300 0 400 300 150 200
templayer obstruct_m3_veryfine allm3,allpad,obsm3,m3fill,fillblock
or met3fill_coarse,met3fill_medium,met3fill_fine
grow 300
templayer met3fill_veryfine slots_m3_veryfine
and-not obstruct_m3_veryfine
+ and topbox
shrink 195
grow 195
@@ -1961,18 +1961,17 @@
#---------------------------------------------------
# MET4 fill
#---------------------------------------------------
- templayer slots_m4_coarse
- bbox top
+ templayer slots_m4_coarse topbox
slots 0 2000 300 0 2000 300 700 1050
templayer obstruct_m4 allm4,allpad,obsm4,m4fill,fillblock
grow 3000
templayer met4fill_coarse slots_m4_coarse
and-not obstruct_m4
+ and topbox
shrink 995
grow 995
- templayer slots_m4_medium
- bbox top
+ templayer slots_m4_medium topbox
slots 0 1000 300 0 1000 300 700 1050
templayer obstruct_m4_medium allm4,allpad,obsm4,m4fill,fillblock
grow 2700
@@ -1983,8 +1982,7 @@
shrink 495
grow 495
- templayer slots_m4_fine
- bbox top
+ templayer slots_m4_fine topbox
slots 0 580 300 0 580 300 700 1050
templayer obstruct_m4_fine allm4,allpad,obsm4,m4fill,fillblock
grow 200
@@ -1992,17 +1990,18 @@
grow 300
templayer met4fill_fine slots_m4_fine
and-not obstruct_m4_fine
+ and topbox
shrink 285
grow 285
- templayer slots_m4_veryfine
- bbox top
+ templayer slots_m4_veryfine topbox
slots 0 400 300 0 400 300 150 300
templayer obstruct_m4_veryfine allm4,allpad,obsm4,m4fill,fillblock
or met4fill_coarse,met4fill_medium,met4fill_fine
grow 300
templayer met4fill_veryfine slots_m4_veryfine
and-not obstruct_m4_veryfine
+ and topbox
shrink 195
grow 195
@@ -2015,13 +2014,13 @@
#---------------------------------------------------
# MET5 fill
#---------------------------------------------------
- templayer slots_m5
- bbox top
+ templayer slots_m5 topbox
slots 0 3000 1600 0 3000 1600 1000 100
templayer obstruct_m5 allm5,allpad,obsm5,m5fill,fillblock
grow 3000
templayer met5fill_gen slots_m5
and-not obstruct_m5
+ and topbox
shrink 1495
grow 1495
@@ -5052,6 +5051,31 @@
calma FILLOBSM3 107 24
calma FILLOBSM4 112 4
+style waffleimport
+ # This style is for reading back and validating shapes
+ # generated by the "wafflefill" cifoutput style.
+
+ scalefactor 10 nanometers
+ gridlimit 5
+
+ options ignore-unknown-layer-labels no-reconnect-labels
+
+ layer ndiff FOMMASK
+ layer poly POLYMASK
+ layer metal1 MET1MASK
+ layer metal2 MET2MASK
+ layer metal3 MET3MASK
+ layer metal4 MET4MASK
+ layer metal5 MET5MASK
+
+ calma FOMMASK 23 0
+ calma POLYMASK 28 0
+ calma MET1MASK 36 0
+ calma MET2MASK 41 0
+ calma MET3MASK 34 0
+ calma MET4MASK 51 0
+ calma MET5MASK 59 0
+
end
#-----------------------------------------------------