Updated the magic techfile for GF180MCU to support the efuse
device and bipolar transistors. The layouts of all of these
devices are taken from the klayout source library and installed
in the gf180mcu_fd_pr library, and also converted to magic
views.
diff --git a/VERSION b/VERSION
index 7bf92ee..8bbd18b 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.420
+1.0.421
diff --git a/common/foundry_install.py b/common/foundry_install.py
index bcb17e6..f8738e6 100755
--- a/common/foundry_install.py
+++ b/common/foundry_install.py
@@ -167,6 +167,10 @@
# specified for installation: Do parasitic extraction
# (NOTE: Only does parasitic capacitance extraction).
#
+# noextract: Used with "-gds". Do not extract the layout into a
+# netlist (implies that the layout uses the "device
+# primitive" property).
+#
# options: Followed by "=" and the name of a script. Behavior
# is dependent on the mode; if applied to "-gds",
# then the script is inserted before the GDS read
@@ -1257,6 +1261,7 @@
no_gds_convert = False
no_lef_convert = False
do_parasitics = False
+ no_extract = False
cdl_compile_only = False
lef_compile = False
lef_compile_only = False
@@ -1302,6 +1307,10 @@
if option[0] == 'gds':
do_parasitics = True
+ if 'noextract' in option:
+ if option[0] == 'gds':
+ no_extract = True
+
# Option 'privileged' is a standalone keyword.
if 'priv' in option or 'privileged' in option or 'private' in option:
if option[0] == 'cdl':
@@ -2150,7 +2159,7 @@
print('Running (in ' + destlibdir + '): ' + ' '.join(procopts))
subprocess_run('cdl2spi.py', procopts, cwd = destlibdir)
- elif have_gds and not no_gds_convert:
+ elif have_gds and not no_gds_convert and not no_extract:
# If neither SPICE nor CDL formats is available in the source, then
# read GDS; if the result has no ports, then read the corresponding
# LEF library to get port information. Then write out a SPICE netlist
diff --git a/common/port_order.py b/common/port_order.py
new file mode 100755
index 0000000..2a6c8b3
--- /dev/null
+++ b/common/port_order.py
@@ -0,0 +1,136 @@
+#!/usr/bin/env python3
+#
+# port_order.py: For the given install path, library name, and cellname,
+# find the Magic layout of the cell, and set the indexes of the ports to
+# match the order of the specified ports. The names of the ports must
+# match and must be a complete set; otherwise different ports may end up
+# with the same index.
+# The port indexes are changed in 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.
+#
+# e.g.:
+#
+# port_order.py /path/to/sky130A \
+# sky130_fd_sc_hd sky130_fd_sc_hd__inv_1 A VGND VNB VPB VPWR Y
+
+import os
+import re
+import sys
+
+def order_ports(filename, portnames):
+ with open(filename, 'r') as ifile:
+ magtext = ifile.read().splitlines()
+
+ labrex = re.compile('<< labels >>')
+
+ in_labs = False
+ portidx = 0
+
+ with open(filename, 'w') as ofile:
+ for line in magtext:
+ lmatch = labrex.match(line)
+ if lmatch:
+ in_labs = True
+ print(line, file=ofile)
+ elif in_labs:
+ linetok = line.split()
+ if linetok[0] == 'port':
+ if portidx > 0:
+ print(linetok[0] + ' ' + str(portidx) + ' ' + linetok[2], file=ofile)
+ else:
+ print(line, file=ofile)
+ portidx = 0
+ elif linetok[0] == 'flabel':
+ portlab = linetok[-1]
+ try:
+ portidx = portnames.index(portlab) + 1
+ except:
+ print('Error: Port order list does not contain "' + portlab + '"')
+ portidx = 0
+ print(line, file=ofile)
+ else:
+ print(line, file=ofile)
+ else:
+ print(line, file=ofile)
+
+def usage():
+ print("port_order.py <path_to_pdk> <libname> <cellname> <port_name> ... [option]")
+ print(" options:")
+ print(" -mag do only for the view in the mag/ directory")
+ print(" -maglef do only for the view in the maglef/ directory")
+ return 0
+
+if __name__ == '__main__':
+
+ options = []
+ arguments = []
+ for item in sys.argv[1:]:
+ if item.find('-', 0) == 0:
+ options.append(item)
+ else:
+ arguments.append(item)
+
+ if len(arguments) < 4:
+ print('Not enough options given to port_order.py.')
+ usage()
+ sys.exit(0)
+
+ source = arguments[0]
+ libname = arguments[1]
+ cellname = arguments[2]
+ portnames = arguments[3:]
+
+ # Diagnostic
+ print('port_order.py:')
+ print(' source = ' + source)
+ print(' library = ' + libname)
+ print(' cell = ' + cellname)
+ print(' port names = ' + ' '.join(portnames))
+
+ fail = 0
+
+ efformat = True if '-ef_format' in options else False
+
+ domag = True
+ domaglef = True
+ if '-mag' in options and '-maglef' not in options:
+ domaglef = False
+ if '-maglef' in options and '-mag' not in options:
+ domag = False
+
+ if domag:
+ if efformat:
+ filename = source + '/libs.ref/mag/' + libname + '/' + cellname + '.mag'
+ else:
+ filename = source + '/libs.ref/' + libname + '/mag/' + cellname + '.mag'
+
+ if os.path.isfile(filename):
+ order_ports(filename, portnames)
+ else:
+ fail += 1
+ else:
+ fail += 1
+
+ if domaglef:
+ if efformat:
+ filename = source + '/libs.ref/maglef/' + libname + '/' + cellname + '.mag'
+ else:
+ filename = source + '/libs.ref/' + libname + '/maglef/' + cellname + '.mag'
+
+ if os.path.isfile(filename):
+ order_ports(filename, portnames)
+ else:
+ fail += 1
+ else:
+ fail += 1
+
+ if fail == 2:
+ print('Error: No layout file in either mag/ or maglef/', file=sys.stderr)
+ if efformat:
+ print('(' + source + '/libs.ref/mag[lef]/' + libname +
+ '/' + cellname + '.mag)', file=sys.stderr)
+ else:
+ print('(' + source + '/libs.ref/' + libname + '/mag[lef]/'
+ + cellname + '.mag)', file=sys.stderr)
+
diff --git a/gf180mcu/Makefile.in b/gf180mcu/Makefile.in
index 2842a03..86a650d 100644
--- a/gf180mcu/Makefile.in
+++ b/gf180mcu/Makefile.in
@@ -428,6 +428,10 @@
INSTALL = ${SCRIPTSDIR}/common/staging_install.py ${EF_FORMAT}
endif
+# 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}
+
# List the EDA tools to install local setup files for
TOOLS =
@@ -659,7 +663,7 @@
rm -f ${MAGIC_STAGING_$*}/${GF180MCU$*}-BindKeys
rm -f ${MAGIC_STAGING_$*}/magicrc
if test "${EF_STYLE}" == "1" ; then \
- (cd ${MAGICTOP_STAGING_$*} ; ln -s ${REV_DIR} current) ; \
+ (cd ${MAGICTOP_STAGING_$*} ; ln -f -s ${REV_DIR} current) ; \
fi
${CPP} ${GF180MCU$*_DEFS} magic/${TECH}.tech \
@@ -682,7 +686,7 @@
rm -f ${NETGEN_STAGING_$*}/setup.tcl
${CPP} ${GF180MCU$*_DEFS} netgen/${TECH}_setup.tcl \
${NETGEN_STAGING_$*}/${GF180MCU$*}_setup.tcl
- (cd ${NETGEN_STAGING_$*} ; ln -s ${GF180MCU$*}_setup.tcl setup.tcl)
+ (cd ${NETGEN_STAGING_$*} ; ln -f -s ${GF180MCU$*}_setup.tcl setup.tcl)
qflow-%: qflow/${TECH}.sh qflow/${TECH}.par
mkdir -p ${QFLOWTOP_STAGING_$*}
@@ -845,6 +849,55 @@
-ngspice models/ngspice/*.ngspice \
-xyce models/xyce/*.xyce \
2>&1 | tee -a ${GF180MCU$*}_make.log
+ # Install primitive device fixed layout cells from GDS
+ ${STAGE} -source ${GF180MCU_PR_PATH} \
+ -target ${STAGING_PATH}/${GF180MCU$*} \
+ -gds cells/klayout/pymacros/cells/*/*.gds noextract \
+ -library primitive gf180mcu_fd_pr \
+ 2>&1 | tee -a ${GF180MCU$*}_make.log
+ # The klayout GUI prefers that drc/ and lvs/ exist under tech/,
+ # so make symbolic links.
+ (cd ${STAGING_PATH}/${GF180MCU$*}/libs.tech/klayout/tech ; \
+ ln -f -s ../lvs ; ln -f -s ../drc)
+ # Add "device primitive" property to the bipolar devices and
+ # order the ports correctly to match the subcircuit model. This
+ # ensures that the bipolar layouts extract correctly.
+ ${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ npn_00p54x02p00 "device primitive"
+ ${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ npn_00p54x02p00 I1_default_C I1_default_B I1_default_E I1_default_S
+ ${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ npn_00p54x04p00 "device primitive"
+ ${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ npn_00p54x04p00 I1_default_C I1_default_B I1_default_E I1_default_S
+ ${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ npn_00p54x08p00 "device primitive"
+ ${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ npn_00p54x08p00 I1_default_C I1_default_B I1_default_E I1_default_S
+ ${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ npn_00p54x16p00 "device primitive"
+ ${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ npn_00p54x16p00 I1_default_C I1_default_B I1_default_E I1_default_S
+ ${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ npn_05p00x05p00 "device primitive"
+ ${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ npn_05p00x05p00 I1_default_C I1_default_B I1_default_E I1_default_S
+ ${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ npn_10p00x10p00 "device primitive"
+ ${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ npn_10p00x10p00 I1_default_C I1_default_B I1_default_E I1_default_S
+ ${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ pnp_05p00x00p42 "device primitive"
+ ${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ pnp_05p00x00p42 I1_default_C I1_default_B I1_default_E
+ ${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ pnp_05p00x05p00 "device primitive"
+ ${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ pnp_05p00x05p00 I1_default_C I1_default_B I1_default_E
+ ${ADDPROP} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ pnp_10p00x10p00 "device primitive"
+ ${PORTORDER} ${STAGING_PATH}/${GF180MCU$*} gf180mcu_fd_pr \
+ pnp_10p00x10p00 I1_default_C I1_default_B I1_default_E
digital-9t5v0-%:
# Install 5V 9-track digital standard cells from vendor files
diff --git a/gf180mcu/magic/gf180mcu.tcl b/gf180mcu/magic/gf180mcu.tcl
index dd15fa9..9702501 100644
--- a/gf180mcu/magic/gf180mcu.tcl
+++ b/gf180mcu/magic/gf180mcu.tcl
@@ -103,7 +103,7 @@
magic::add_toolkit_command $layoutframe "pn_3p3 - p-diode" "magic::gencell gf180mcu::pn_3p3" pdk1
magic::add_toolkit_separator $layoutframe pdk1
- magic::add_toolkit_command $layoutframe "vnpn_5x5 (3.3V) - 5.0um^2 " "magic::gencell gf180mcu::vnpn_2x2" pdk1
+ magic::add_toolkit_command $layoutframe "XXX_5x5 (3.3V) - 5.0um^2 " "magic::gencell gf180mcu::vnpn_2x2" pdk1
magic::add_toolkit_command $layoutframe "vnpn_5x0p42 (3.3V) - 5.0um x 0.42um " "magic::gencell gf180mcu::vnpn_5x0p42" pdk1
magic::add_toolkit_command $layoutframe "vnpn_10x10 (3.3V) - 10.0um^2 " "magic::gencell gf180mcu::vnpn_5x5" pdk1
magic::add_toolkit_command $layoutframe "vnpn_10x0p42 (3.3V) - 10.0um x 0.42um " "magic::gencell gf180mcu::vnpn_10x0p42" pdk1
diff --git a/gf180mcu/magic/gf180mcu.tech b/gf180mcu/magic/gf180mcu.tech
index c902ded..1f7433c 100644
--- a/gf180mcu/magic/gf180mcu.tech
+++ b/gf180mcu/magic/gf180mcu.tech
@@ -66,6 +66,8 @@
-well obswell
# Well resistors
well rnw,rnwell
+ well pbase,npn
+ well nbase,pnp
# Transistors
active nmos,ntransistor,nfet
@@ -111,6 +113,7 @@
active ppolyres,ppres,rpp
active npolysilicide,nsresistor,nspres,rnps
active ppolysilicide,psresistor,pspres,rpps
+ active efuse
#ifdef HRPOLY1K
active nhighres,nhires,hires
active mvnhighres,mvnhires,mvhires
@@ -284,9 +287,9 @@
aliases
- allnwell nwell,rnwell
+ allnwell nwell,rnwell,nbase
- allpsub space/w,pwell
+ allpsub space/w,pwell,pbase
# Similar to allpsub* but does not include space-on-well-plane
allpwell pwell
@@ -432,6 +435,9 @@
ncap ntransistor ntransistor_stripes
pcap ptransistor ptransistor_stripes
+ nbase nwell ntransistor_stripes
+ pbase pwell ptransistor_stripes
+
mvndiff ndiffusion hvndiff_mask
mvpdiff pdiffusion hvpdiff_mask
mvnsd ndiff_in_nwell hvndiff_mask
@@ -452,6 +458,7 @@
pc polysilicon metal1 contact_X'es
npolyres polysilicon silicide_block nselect2
ppolyres polysilicon silicide_block pselect2
+ efuse polysilicon electrode
pdiode pdiffusion pselect2
ndiode ndiffusion nselect2
@@ -632,8 +639,8 @@
#-----------------------------------------------------
connect
- nwell,*nsd,*mvnsd nwell,*nsd,*mvnsd
- pwell,*psd,*mvpsd,isosub pwell,*psd,*mvpsd,isosub
+ nwell,*nsd,*mvnsd,nbase,dnwell nwell,*nsd,*mvnsd,nbase,dnwell
+ pwell,*psd,*mvpsd,pbase,isosub pwell,*psd,*mvpsd,pbase,isosub
*psd,*mvpsd *psd,*mvpsd
*m1 *m1
*m2 *m2
@@ -701,12 +708,12 @@
#-----------------------------------------------------
# PWELL (LVPWELL)
#-----------------------------------------------------
- layer PWELL pwell
- labels pwell noport
+ layer PWELL allpwell
+ labels allpwell noport
calma 204 0
layer PWELLTXT
- labels pwell port
+ labels allpwell port
calma 204 10
#-----------------------------------------------------
@@ -721,6 +728,20 @@
calma 22 4
#-----------------------------------------------------
+# Bipolar ID markers
+#-----------------------------------------------------
+
+ layer BJTDRC nbase
+ grow 580
+ bloat-all pbase dnwell
+ grow 20
+
+ layer BJTLVS nbase
+ grow 580
+ bloat-all pbase dnwell
+ grow 20
+
+#-----------------------------------------------------
# PPLUS, NPLUS
#-----------------------------------------------------
@@ -883,6 +904,13 @@
labels fillpoly
calma 30 4
+ layer PLFUSE efuse
+ calma 125 5
+
+ layer EFUSE efuse
+ bloat-all efuse *poly
+ calma 80 5
+
#-----------------------------------------------------
# CONT
#-----------------------------------------------------
@@ -1588,18 +1616,31 @@
options ignore-unknown-layer-labels options no-reconnect-labels
- ignore BJTDEF
ignore SRAMDEF
ignore FET5VDEF
ignore CAPDEF
+ ignore EFUSE
+ ignore SOURCE
ignore VTEXT
ignore FILLOBS
layer pwell PWELL,PWELLTXT
+ and-not BJTDEF,BJTDRC
+ labels PWELL
+ labels PWELLTXT port
+
+ layer pbase PWELL,PWELLTXT
+ and BJTDEF,BJTDRC
labels PWELL
labels PWELLTXT port
layer nwell NWELL,NWELLTXT
+ and-not BJTDEF,BJTDRC
+ labels NWELL
+ labels NWELLTXT port
+
+ layer nbase NWELL,NWELLTXT
+ and BJTDEF,BJTDRC
labels NWELL
labels NWELLTXT port
@@ -1609,9 +1650,15 @@
layer isosub SUBCUT
labels SUBCUT
+ # Implicit nwell defined by DNWELL outside of PWELL
+ templayer nwelldef DNWELL
+ shrink 500
+ and-not PWELL
+ or NWELL
+
templayer ndiffarea DIFF
and-not POLY
- and-not NWELL
+ and-not nwelldef
and-not PPLUS
and-not SBLK
and-not DUALGATE
@@ -1630,7 +1677,7 @@
templayer mvndiffarea DIFF
and-not POLY
- and-not NWELL
+ and-not nwelldef
and-not PPLUS
and-not SBLK
and DUALGATE
@@ -1647,7 +1694,7 @@
layer ndiode DIFF
and NPLUS
and DIODE
- and-not NWELL
+ and-not nwelldef
and-not POLY
and-not PPLUS
and-not DUALGATE
@@ -1657,7 +1704,7 @@
layer nndiode DIFF
and NPLUS
and DIODE
- and-not NWELL
+ and-not nwelldef
and-not POLY
and-not PPLUS
and-not DUALGATE
@@ -1666,7 +1713,7 @@
templayer ndiodearea DIODE
and NPLUS
- and-not NWELL
+ and-not nwelldef
and-not DUALGATE
copyup DIODE,NPLUS
@@ -1679,7 +1726,7 @@
templayer pdiffarea DIFF
and-not POLY
- and NWELL
+ and nwelldef
and-not NPLUS
and-not SBLK
and-not DIODE
@@ -1710,7 +1757,7 @@
templayer mvndiodearea DIODE
and NPLUS
- and-not NWELL
+ and-not nwelldef
and DUALGATE
copyup DIODE,NPLUS
@@ -1723,7 +1770,7 @@
templayer mvpdiffarea DIFF
and-not POLY
- and NWELL
+ and nwelldef
and-not NPLUS
and-not SBLK
and-not DIODE
@@ -1815,14 +1862,14 @@
and-not DUALGATE
and-not NPLUS
and-not POLY
- and NWELL
+ and nwelldef
and pfetexpand
labels DIFF
layer pdiffres DIFF
and-not POLY
and PPLUS
- and NWELL
+ and nwelldef
and SBLK
labels DIFF
@@ -1830,7 +1877,7 @@
and POLY
and-not PPLUS
and-not DUALGATE
- and-not NWELL
+ and-not nwelldef
and NPLUS
and-not NAT
and-not MOSCAP
@@ -1840,7 +1887,7 @@
and POLY
and-not PPLUS
and-not DUALGATE
- and-not NWELL
+ and-not nwelldef
and NPLUS
and-not NAT
and MOSCAP
@@ -1850,14 +1897,14 @@
and POLY
and-not PPLUS
and-not DUALGATE
- and-not NWELL
+ and-not nwelldef
and NPLUS
and NAT
labels DIFF
templayer nsdarea DIFF
and NPLUS
- and NWELL
+ and nwelldef
and-not POLY
and-not PPLUS
and-not DUALGATE
@@ -1875,7 +1922,7 @@
templayer psdarea DIFF
and PPLUS
and-not DUALGATE
- and-not NWELL
+ and-not nwelldef
and-not POLY
and-not NPLUS
and-not pfetexpand
@@ -1890,7 +1937,7 @@
layer mvpdiff DIFF
and-not NPLUS
and-not POLY
- and NWELL
+ and nwelldef
and DUALGATE
and mvpfetexpand
labels DIFF
@@ -1907,7 +1954,7 @@
and-not PPLUS
and NPLUS
and-not NAT
- and-not NWELL
+ and-not nwelldef
and DUALGATE
and-not MOSCAP
labels DIFF
@@ -1917,7 +1964,7 @@
and-not PPLUS
and NPLUS
and-not NAT
- and-not NWELL
+ and-not nwelldef
and DUALGATE
and MOSCAP
labels DIFF
@@ -1927,7 +1974,7 @@
and-not PPLUS
and NPLUS
and NAT
- and-not NWELL
+ and-not nwelldef
and DUALGATE
labels DIFF
@@ -1935,7 +1982,7 @@
and NPLUS
and-not POLY
and-not PPLUS
- and NWELL
+ and nwelldef
and DUALGATE
copyup mvnsubcheck
@@ -1951,7 +1998,7 @@
templayer mvpsdarea DIFF
and PPLUS
- and-not NWELL
+ and-not nwelldef
and-not POLY
and-not NPLUS
and DUALGATE
@@ -1983,7 +2030,7 @@
and-not PPLUS
and-not NPLUS
and-not POLY
- and NWELL
+ and nwelldef
and-not DUALGATE
and nsdexpand
@@ -1991,7 +2038,7 @@
and-not PPLUS
and-not NPLUS
and-not POLY
- and-not NWELL
+ and-not nwelldef
and DUALGATE
and-not mvpfetexpand
and mvpsdexpand
@@ -2000,13 +2047,14 @@
and-not PPLUS
and-not NPLUS
and-not POLY
- and NWELL
+ and nwelldef
and DUALGATE
and mvnsdexpand
templayer polyarea POLY
and-not DIFF
and-not SBLK
+ and-not PLFUSE
#ifdef HRPOLY1K
and-not HRES
#endif (HRPOLY1K)
@@ -2054,6 +2102,11 @@
and-not RESDEF
labels POLY
+ layer efuse POLY
+ and-not DIFF
+ and PLFUSE
+ labels POLY
+
layer rnp POLY
and SBLK
and NPLUS
@@ -2088,7 +2141,7 @@
layer ndc CONT
and DIFF
and NPLUS
- and-not NWELL
+ and-not nwelldef
and MET1
and-not DUALGATE
and-not DIODE
@@ -2098,7 +2151,7 @@
layer nsc CONT
and DIFF
and NPLUS
- and NWELL
+ and nwelldef
and MET1
and-not DUALGATE
and-not DIODE
@@ -2108,7 +2161,7 @@
layer pdc CONT
and DIFF
and PPLUS
- and NWELL
+ and nwelldef
and MET1
and-not DUALGATE
and-not DIODE
@@ -2128,7 +2181,7 @@
layer psc CONT
and DIFF
and PPLUS
- and-not NWELL
+ and-not nwelldef
and MET1
and-not DUALGATE
and-not DIODE
@@ -2178,7 +2231,7 @@
layer mvndc CONT
and DIFF
and NPLUS
- and-not NWELL
+ and-not nwelldef
and MET1
and DUALGATE
and-not DIODE
@@ -2190,7 +2243,7 @@
and NPLUS
and MET1
and DUALGATE
- and NWELL
+ and nwelldef
and-not DIODE
grow 145
shrink 140
@@ -2200,7 +2253,7 @@
and PPLUS
and MET1
and DUALGATE
- and NWELL
+ and nwelldef
and-not DIODE
grow 145
shrink 140
@@ -2218,7 +2271,7 @@
layer mvpsc CONT
and DIFF
and PPLUS
- and-not NWELL
+ and-not nwelldef
and MET1
and DUALGATE
and-not DIODE
@@ -2608,28 +2661,28 @@
layer nvar POLY
and DIFF
and NPLUS
- and NWELL
+ and nwelldef
and-not DUALGATE
labels POLY
layer mvnvar POLY
and DIFF
and NPLUS
- and NWELL
+ and nwelldef
and DUALGATE
labels POLY
layer pvar POLY
and DIFF
and PPLUS
- and-not NWELL
+ and-not nwelldef
and-not DUALGATE
labels POLY
layer mvpvar POLY
and DIFF
and PPLUS
- and-not NWELL
+ and-not nwelldef
and DUALGATE
labels POLY
@@ -2694,6 +2747,9 @@
#ifdef HRPOLY1K
calma HRES 62 0
#endif (HRPOLY1K)
+ calma EFUSE 80 5
+ calma PLFUSE 125 5
+ calma SOURCE 100 8
calma NAT 5 0
#ifdef MIM
calma CAPM 75 0
@@ -2702,6 +2758,7 @@
calma DIODE 115 5
calma CAPDEF 117 5
calma BJTDEF 118 5
+ calma BJTDRC 127 5
calma MOSCAP 166 5
calma BOUND 0 0
calma PRBOUND 63 0
@@ -4675,6 +4732,8 @@
# cap_pmos_06v0_b mosfet (p-varactor, high voltage)
#
# cap_mim_2f0_mXmY_noshield capacitor (MiM)*,**
+#
+# efuse fuse
#
# *Note that there are multiple mutually exclusive process options for the
@@ -4711,6 +4770,8 @@
device subcircuit cap_pmos_06v0 mvpcap mvpdiff,mvpdc l=c_length w=c_width
device subcircuit cap_nmos_06v0 mvncap mvndiff,mvndc l=c_length w=c_width
+ device rsubcircuit efuse efuse *poly
+
device rsubcircuit rm1 rm1 *m1 l=r_length w=r_width
device rsubcircuit rm2 rm2 *m2 l=r_length w=r_width
#ifdef METALS4 || METALS5 || METALS6
diff --git a/gf180mcu/magic/gf180mcu_make_torture.tcl b/gf180mcu/magic/gf180mcu_make_torture.tcl
index 7a28a6e..dc1d3aa 100644
--- a/gf180mcu/magic/gf180mcu_make_torture.tcl
+++ b/gf180mcu/magic/gf180mcu_make_torture.tcl
@@ -43,7 +43,7 @@
if {[rand] > 0.5} {set gt 1} else {set gt 0}
if {[rand] > 0.5} {set gb 1} else {set gb 0}
- magic::gencell efgf013::${devname} ${devname}_$i w $w l $l m $m nf $nf diffcov $dcov polycov $pcov rlcov $rlcov poverlap $pov doverlap $dov topc $tc botc $bc full_metal $fm glc $gl grc $gr gbc $gb gtc $gt
+ magic::gencell gf180mcu::${devname} ${devname}_$i w $w l $l m $m nf $nf diffcov $dcov polycov $pcov rlcov $rlcov poverlap $pov doverlap $dov topc $tc botc $bc full_metal $fm glc $gl grc $gr gbc $gb gtc $gt
select cell ${devname}_$i
set bh [box height]
set bh [+ $bh 124]
@@ -85,7 +85,7 @@
if {[rand] > 0.5} {set gt 1} else {set gt 0}
if {[rand] > 0.5} {set gb 1} else {set gb 0}
- magic::gencell efgf013::${devname} ${devname}_$i w $w l $l m $m nx $nx endcov $ecov roverlap $rov snake $sn full_metal $fm glc $gl grc $gr gbc $gb gtc $gt
+ magic::gencell gf180mcu::${devname} ${devname}_$i w $w l $l m $m nx $nx endcov $ecov roverlap $rov snake $sn full_metal $fm glc $gl grc $gr gbc $gb gtc $gt
select cell ${devname}_$i
set bh [box height]
set bh [+ $bh 124]
@@ -127,7 +127,7 @@
if {[rand] > 0.5} {set gt 1} else {set gt 0}
if {[rand] > 0.5} {set gb 1} else {set gb 0}
- magic::gencell efgf013::${devname} ${devname}_$i w $w l $l nx $nx ny $ny doverlap $dov full_metal $fm elc $el erc $er etc $et ebc $eb glc $gl grc $gr gbc $gb gtc $gt
+ magic::gencell gf180mcu::${devname} ${devname}_$i w $w l $l nx $nx ny $ny doverlap $dov full_metal $fm elc $el erc $er etc $et ebc $eb glc $gl grc $gr gbc $gb gtc $gt
select cell ${devname}_$i
set bh [box height]
set bh [+ $bh 124]
@@ -161,7 +161,7 @@
if {[rand] > 0.5} {set bc 1} else {set bc 0}
if {[rand] > 0.5} {set tc 1} else {set tc 0}
- magic::gencell efgf013::${devname} ${devname}_$i w $w l $l nx $nx ny $ny bconnect $bc tconnect $tc
+ magic::gencell gf180mcu::${devname} ${devname}_$i w $w l $l nx $nx ny $ny bconnect $bc tconnect $tc
select cell ${devname}_$i
set bh [box height]
set bh [+ $bh 160]
@@ -195,7 +195,7 @@
# set r [int [* [rand] 10]]
set deltay [/ $r 10.0]
- magic::gencell efgf013::${devname} ${devname}_$i nx $nx ny $ny deltax $deltax deltay $deltay
+ magic::gencell gf180mcu::${devname} ${devname}_$i nx $nx ny $ny deltax $deltax deltay $deltay
select cell ${devname}_$i
set bh [box height]
set bh [* $bh [+ $ny 1]]
@@ -225,16 +225,16 @@
#
-mos_array 6 nmos_1p2 0 0
-mos_array 6 pmos_1p2 0 75000
-mos_array 6 nmos_3p3 0 150000
-mos_array 6 pmos_3p3 0 225000
-mos_array 6 pmos_1p2_lvt 0 300000
-mos_array 6 pmos_1p2_hvt 0 375000
-mos_array 6 nmos_1p2_lvt 0 450000
-mos_array 6 nmos_1p2_hvt 0 525000
-mos_array 6 nmos_1p2_nat 0 600000
-mos_array 6 nmos_3p3_nat 0 675000
+mos_array 6 nmos_3p3 0 0
+mos_array 6 pmos_3p3 0 75000
+mos_array 6 nmos_6p0 0 150000
+mos_array 6 pmos_6p0 0 225000
+mos_array 6 pmos_3p3_lvt 0 300000
+mos_array 6 pmos_3p3_hvt 0 375000
+mos_array 6 nmos_3p3_lvt 0 450000
+mos_array 6 nmos_3p3_hvt 0 525000
+mos_array 6 nmos_3p3_nat 0 600000
+mos_array 6 nmos_6p0_nat 0 675000
res_array 6 nplus_u 100000 0
res_array 6 pplus_u 100000 180000
diff --git a/gf180mcu/netgen/gf180mcu_setup.tcl b/gf180mcu/netgen/gf180mcu_setup.tcl
index 137e376..6248733 100644
--- a/gf180mcu/netgen/gf180mcu_setup.tcl
+++ b/gf180mcu/netgen/gf180mcu_setup.tcl
@@ -466,4 +466,17 @@
}
}
+# Allow parallel reduction of fillcap (decap fill) cells
+
+foreach cell $cells1 {
+ if {[regexp {.*gf180mcu_fd_sc_.*__fillcap_[[:digit:]]+} $cell match]} {
+ property "-circuit1 $cell" parallel enable
+ }
+}
+
+foreach cell $cells2 {
+ if {[regexp {gf180mcu_fd_sc_.*__fillcap_[[:digit:]]+} $cell match]} {
+ property "-circuit2 $cell" parallel enable
+ }
+}
#---------------------------------------------------------------