Added ESD devices for the 5V nFET and pFET, which are essentially
just marker layers used for LVS; however, as these are the devices
with angled gates, they can be used
diff --git a/sky130/magic/sky130.tech b/sky130/magic/sky130.tech
index 8bfaff8..97cf5a4 100644
--- a/sky130/magic/sky130.tech
+++ b/sky130/magic/sky130.tech
@@ -79,6 +79,8 @@
# sky130_fd_pr__cap_var_hvt varactorhvt high Vt varactor
# sky130_fd_pr__cap_var mvvaractor thickox varactor
# sky130_fd_pr__res_iso_pw rpw pwell resistor (in deep nwell)
+# sky130_fd_pr__esd_nfet_g5v0d10v5 mvnfetesd ESD thickox nFET
+# sky130_fd_pr__esd_pfet_g5v0d10v5 mvpfetesd ESD thickox pFET
#
# (*) Note that ppres may extract into some generic type called
# "sky130_fd_pr__res_xhigh_po", but only specific sizes of xhrpoly are
@@ -93,9 +95,7 @@
# only by script-generated subcells in the PDK.
#-------------------------------------------------------------
# sky130_fd_pr__esd_nfet_01v8 ESD nFET
-# sky130_fd_pr__esd_nfet_g5v0d10v5 ESD thickox nFET
# sky130_fd_pr__esd_nfet_05v0_nvt ESD native nFET
-# sky130_fd_pr__esd_pfet_g5v0d10v5 ESD thickox pFET
# sky130_fd_pr__special_nfet_pass_flash flash nFET device
# sky130_fd_pr__esd_rf_diode_pw2nd_11v0 ESD n+ diode
# sky130_fd_pr__esd_rf_diode_pd2nw_11v0 ESD p+ diode
@@ -162,6 +162,8 @@
active mvnmos,mvntransistor,mvnfet
active mvpmos,mvptransistor,mvpfet
active mvnnmos,mvnntransistor,mvnnfet,nnfet
+ -active mvnmosesd,mvntransistoresd,mvnfetesd
+ -active mvpmosesd,mvptransistoresd,mvpfetesd
active varactor,varact,var
active mvvaractor,mvvaract,mvvar
@@ -171,8 +173,8 @@
active nmoslvt,nfetlvt
active varactorhvt,varacthvt,varhvt
-active nsonos,sonos
- active sramnvar,corenvar,corenvaractor
- active srampvar,corepvar,corepvaractor
+ -active sramnvar,corenvar,corenvaractor
+ -active srampvar,corepvar,corepvaractor
# Diffusions
active ndiff,ndiffusion,ndif
@@ -364,13 +366,13 @@
allwellplane nwell
allnwell nwell,obswell,pnp
- allnfets nfet,npass,npd,scnfet,mvnfet,mvnnfet,nfetlvt,nsonos
- allpfets pfet,ppu,scpfet,scpfethvt,mvpfet,pfethvt,pfetlvt,pfetmvt
+ allnfets nfet,npass,npd,scnfet,mvnfet,mvnfetesd,mvnnfet,nfetlvt,nsonos
+ allpfets pfet,ppu,scpfet,scpfethvt,mvpfet,mvpfetesd,pfethvt,pfetlvt,pfetmvt
allfets allnfets,allpfets,varactor,mvvaractor,varhvt,corenvar,corepvar
- allfetsstd nfet,mvnfet,mvnnfet,nfetlvt,pfet,mvpfet,pfethvt,pfetlvt,pfetmvt
+ allfetsstd nfet,mvnfet,mvnfetesd,mvnnfet,nfetlvt,pfet,mvpfet,mvpfetesd,pfethvt,pfetlvt,pfetmvt
allfetsspecial scnfet,scpfet,scpfethvt
allfetscore npass,npd,nsonos,ppu,corenvar,corepvar
- allfetsnolvt nfet,npass,npd,scnfet,mvnfet,mvnnfet,nsonos,pfet,ppu,scpfet,scpfethvt,mvpfet,pfethvt,pfetmvt,varactor,mvvaractor,varhvt,corenvar
+ allfetsnolvt nfet,npass,npd,scnfet,mvnfet,mvnfetesd,mvnnfet,nsonos,pfet,ppu,scpfet,scpfethvt,mvpfet,mvpfetesd,pfethvt,pfetmvt,varactor,mvvaractor,varhvt,corenvar
allnactivenonfet *ndiff,*nsd,*ndiode,*nndiode,*mvndiff,*mvnsd,*mvndiode,*ndiodelvt
allnactive allnactivenonfet,allnfets
@@ -394,11 +396,11 @@
allpdifflvnonfet *pdif,*psd,*pdiode,pdiffres,*pdiodelvt,*pdiodehvt
alldifflvnonfet allndifflvnonfet,allpdifflvnonfet
- allndiffmv *mvndif,*mvnsd,*mvndiode,*nndiode,mvndiffres,mvnfet,mvnnfet
- allpdiffmv *mvpdif,*mvpsd,*mvpdiode,mvpdiffres,mvpfet
+ allndiffmv *mvndif,*mvnsd,*mvndiode,*nndiode,mvndiffres,mvnfet,mvnfetesd,mvnnfet
+ allpdiffmv *mvpdif,*mvpsd,*mvpdiode,mvpdiffres,mvpfet,mvpfetesd
alldiffmv allndiffmv,allpdiffmv
- allndiffmvnontap *mvndif,*mvndiode,*nndiode,mvndiffres,mvnfet,mvnnfet
- allpdiffmvnontap *mvpdif,*mvpdiode,mvpdiffres,mvpfet
+ allndiffmvnontap *mvndif,*mvndiode,*nndiode,mvndiffres,mvnfet,mvnfetesd,mvnnfet
+ allpdiffmvnontap *mvpdif,*mvpdiode,mvpdiffres,mvpfet,mvpfetesd
alldiffmvnontap allndiffmvnontap,allpdiffmvnontap
allndiffmvnonfet *mvndif,*mvnsd,*mvndiode,*nndiode,mvndiffres
allpdiffmvnonfet *mvpdif,*mvpsd,*mvpdiode,mvpdiffres
@@ -488,8 +490,10 @@
mvnsd ndiff_in_nwell hvndiff_mask
mvpsd pdiff_in_pwell hvpdiff_mask
mvnfet ntransistor ntransistor_stripes hvndiff_mask
+ mvnfetesd ntransistor ntransistor_stripes hvndiff_mask
mvnnfet ntransistor ndiff_in_nwell hvndiff_mask
mvpfet ptransistor ptransistor_stripes
+ mvpfetesd ptransistor ptransistor_stripes
mvvar polysilicon ndiff_in_nwell hvndiff_mask
mvndc ndiffusion metal1 contact_X'es hvndiff_mask
mvpdc pdiffusion metal1 contact_X'es hvpdiff_mask
@@ -943,7 +947,7 @@
grow 185
layer HVNTM
- bloat-all mvnfet,mvnnfet,*mvndiode,mvrdn,*nndiode *mvndiff
+ bloat-all mvnfet,mvnfetesd,mvnnfet,*mvndiode,mvrdn,*nndiode *mvndiff
bloat-all mvvaractor *mvnsd
and-not hvntm_block
grow 185
@@ -1581,7 +1585,7 @@
grow 185
templayer hvntm_generate
- bloat-all mvnfet,mvnnfet,*mvndiode,mvrdn,*nndiode *mvndiff
+ bloat-all mvnfet,mvnfetesd,mvnnfet,*mvndiode,mvrdn,*nndiode *mvndiff
bloat-all mvvaractor *mvnsd
and-not hvntm_block
grow 185
@@ -2368,6 +2372,11 @@
and POLY
layer mvpfet mvpfetarea
+ and-not ESDID
+ labels DIFF
+
+ layer mvpfetesd mvpfetarea
+ and ESDID
labels DIFF
layer pdiff DIFF,DIFFTXT,DIFFPIN
@@ -2539,11 +2548,21 @@
and THKOX
and-not mvnfetarea
+ layer mvnfetesd DIFF
+ and POLY
+ and-not PPLUS
+ and NPLUS
+ and THKOX
+ and ESDID
+ and-not mvnnfetarea
+ labels DIFF
+
layer mvnfet DIFF
and POLY
and-not PPLUS
and NPLUS
and THKOX
+ and-not ESDID
and-not mvnnfetarea
labels DIFF
@@ -3408,6 +3427,12 @@
and-not CORELI
copyup CONT
+ # barediff---treat as mvndiff---only found in GPIO cell
+ layer mvndiff DIFF
+ and-not NPLUS
+ and-not PPLUS
+ and-not NWELL
+
layer glass GLASS,PADTXT,PADPIN
labels GLASS
labels PADTXT text
@@ -3502,6 +3527,8 @@
calma SEALID 81 1
# Low tap density ID mark
calma LOWTAPDENSITY 81 14
+ # ESD area ID
+ calma ESDID 81 19
# LICON
calma CONT 66 44
@@ -3904,6 +3931,11 @@
and POLY
layer mvpfet mvpfetarea
+ and-not ESDID
+ labels DIFF
+
+ layer mvpfetesd mvpfetarea
+ and ESDID
labels DIFF
layer pdiff DIFF,DIFFTXT,DIFFPIN
@@ -4072,11 +4104,21 @@
and THKOX
and-not mvnfetarea
+ layer mvnfetesd DIFF
+ and POLY
+ and-not PPLUS
+ and NPLUS
+ and THKOX
+ and ESD
+ and-not mvnnfetarea
+ labels DIFF
+
layer mvnfet DIFF
and POLY
and-not PPLUS
and NPLUS
and THKOX
+ and-not ESDID
and-not mvnnfetarea
labels DIFF
@@ -5030,6 +5072,8 @@
calma SEALID 81 1
# Low tap density ID mark
calma LOWTAPDENSITY 81 14
+ # ESD area ID
+ calma ESDID 81 19
# LICON
calma CONT 66 44
@@ -5230,7 +5274,7 @@
width *ndiff,nfet,scnfet,npd,npass,*nsd,*ndiode,ndiffres,*pdiff,pfet,scpfet,scpfethvt,ppu,*psd,*pdiode,pdiffres \
150 "Diffusion width < %d (diff/tap.1)"
- width *mvndiff,mvnfet,mvnnfet,*mvndiode,*nndiode,mvndiffres,*mvpdiff,mvpfet,*mvpdiode,mvpdiffres 290 \
+ width *mvndiff,mvnfet,mvnfetesd,mvnnfet,*mvndiode,*nndiode,mvndiffres,*mvpdiff,mvpfet,mvpfetesd,*mvpdiode,mvpdiffres 290 \
"MV Diffusion width < %d (diff/tap.14)"
width *mvnsd,*mvpsd 150 "MV Tap width < %d (diff/tap.1)"
@@ -5245,9 +5289,9 @@
"MV Diffusion spacing < %d (diff/tap.15a)"
spacing alldiffmv *mvnsd,*mvpsd 270 touching_ok \
"MV Diffusion to MV tap spacing < %d (diff/tap.3)"
- spacing *mvndiff,mvnfet,mvnnfet,*mvndiode,*nndiode,mvndiffres,mvvar *mvpsd 370 \
+ spacing *mvndiff,mvnfet,mvnfetesd,mvnnfet,*mvndiode,*nndiode,mvndiffres,mvvar *mvpsd 370 \
touching_ok "MV P-Diffusion to MV N-tap spacing < %d (diff/tap.15b)"
- spacing *mvnsd,*mvpdiff,mvpfet,mvvar,*mvpdiode *mvpsd,*psd 760 touching_illegal \
+ spacing *mvnsd,*mvpdiff,mvpfet,mvpfetesd,mvvar,*mvpdiode *mvpsd,*psd 760 touching_illegal \
"MV Diffusion in N-well to P-tap spacing < %d (diff/tap.20 + diff/tap.17,19)"
spacing *ndiff,*ndiode,nfet allnwell 340 touching_illegal \
"N-Diffusion spacing to N-well < %d (diff/tap.9)"
@@ -5263,7 +5307,7 @@
"N-well overlap of MV N-tap < %d (diff/tap.19)"
surround *pdiff,*pdiode,pfet,scpfet,ppu allnwell 180 absence_illegal \
"N-well overlap of P-Diffusion < %d (diff/tap.8)"
- surround *mvpdiff,*mvpdiode,mvpfet allnwell 330 absence_illegal \
+ surround *mvpdiff,*mvpdiode,mvpfet,mvpfetesd allnwell 330 absence_illegal \
"N-well overlap of P-Diffusion < %d (diff/tap.17)"
surround mvvar allnwell 560 absence_illegal \
"N-well overlap of MV varactor < %d (lvtn.10 + lvtn.4b)"
@@ -5338,7 +5382,7 @@
overhang *mvndiff,mvrndiff mvnfet,mvnnfet 250 \
"N-Diffusion overhang of nFET < %d (poly.7)"
overhang *pdiff,rpdiff pfet,scpfet,ppu 250 "P-Diffusion overhang of pmos < %d (poly.7)"
- overhang *mvpdiff,mvrpdiff mvpfet 250 "P-Diffusion overhang of pmos < %d (poly.7)"
+ overhang *mvpdiff,mvrpdiff mvpfet,mvpfetesd 250 "P-Diffusion overhang of pmos < %d (poly.7)"
overhang *poly allfetsstd,allfetsspecial 130 "poly overhang of transistor < %d (poly.8)"
overhang *poly allfetscore 110 "poly overhang of SRAM core transistor < %d (poly.8)"
rect_only allfets "No bends in transistors (poly.11)"
@@ -5361,7 +5405,7 @@
# HVTP
#--------------------------------------------------------------------
- spacing pfethvt,pdiodehvt,varactorhvt pfet,ppu,scpfet,mvpfet,pfetlvt,pfetmvt \
+ spacing pfethvt,pdiodehvt,varactorhvt pfet,ppu,scpfet,mvpfet,mvpfetesd,pfetlvt,pfetmvt \
360 touching_illegal \
"Min. spacing between pFET and HVTP < %d (hvtp.4)"
@@ -5433,7 +5477,7 @@
"Diffusion contact to standard cell gate < %d (licon.11)"
spacing ndc,pdc npd,npass,ppu 40 touching_illegal \
"Diffusion contact to SRAM gate < %d (licon.11)"
- spacing mvndc,mvpdc mvnfet,mvnnfet,mvpfet 55 touching_illegal \
+ spacing mvndc,mvpdc mvnfet,mvnfetesd,mvnnfet,mvpfet,mvpfetesd 55 touching_illegal \
"Diffusion contact to gate < %d (licon.11)"
spacing nsc varactor,varhvt 250 touching_illegal \
"Diffusion contact to varactor gate < %d (licon.10)"
@@ -5470,9 +5514,9 @@
surround psc/a *psd 120 directional \
"P-tap overlap of P-tap contact < %d in one direction (licon.7)"
- surround mvndc/a *mvndiff,mvnfet,mvrnd 40 absence_illegal \
+ surround mvndc/a *mvndiff,mvnfet,mvnfetesd,mvrnd 40 absence_illegal \
"N-diffusion overlap of N-diffusion contact < %d (licon.5a)"
- surround mvpdc/a *mvpdiff,mvpfet,mvrpd 40 absence_illegal \
+ surround mvpdc/a *mvpdiff,mvpfet,mvpfetesd,mvrpd 40 absence_illegal \
"P-diffusion overlap of P-diffusion contact < %d (licon.5a)"
surround mvndic/a *mvndi 40 absence_illegal \
"N-diode overlap of N-diode contact < %d (licon.5a)"
@@ -5484,9 +5528,9 @@
spacing mvnsc/a allpdiffmvnontap 60 touching_illegal \
"Min. space between N-tap contact and butting P diffusion < %d (licon.5b)"
- surround mvndc/a *mvndiff,mvnfet,mvrnd 60 directional \
+ surround mvndc/a *mvndiff,mvnfet,mvnfetesd,mvrnd 60 directional \
"N-diffusion overlap of N-diffusion contact < %d in one direction (licon.5c)"
- surround mvpdc/a *mvpdiff,mvpfet,mvrpd 60 directional \
+ surround mvpdc/a *mvpdiff,mvpfet,mvpfetesd,mvrpd 60 directional \
"P-diffusion overlap of P-diffusion contact < %d in one direction (licon.5c)"
surround mvndic/a *mvndi 60 directional \
"N-diode overlap of N-diode contact < %d in one direction (licon.5c)"
@@ -5748,9 +5792,9 @@
"Butting P-tap spacing to NMOS gate < %d (poly.6)"
edge4way *nsd *pdiff 300 ~(pfet,ppu,scpfet,scpfethvt,pfetlvt,pfetmvt)/a *nsd 300 \
"Butting N-tap spacing to PMOS gate < %d (poly.6)"
- edge4way *mvpsd *mvndiff 300 ~(mvnfet,mvnnfet)/a *mvpsd 300 \
+ edge4way *mvpsd *mvndiff 300 ~(mvnfet,mvnfetesd,mvnnfet)/a *mvpsd 300 \
"Butting MV P-tap spacing to MV NMOS gate < %d (poly.6)"
- edge4way *mvnsd *mvpdiff 300 ~mvpfet/a *mvnsd 300 \
+ edge4way *mvnsd *mvpdiff 300 ~(mvpfet,mvpfetesd)/a *mvnsd 300 \
"Butting MV N-tap spacing to MV PMOS gate < %d (poly.6)"
# No LV FETs in HV diff
@@ -5761,22 +5805,22 @@
"LV N-diffusion to MV N-diffusion < %d (diff/tap.23 + diff/tap.22)"
# No HV FETs in LV diff
- spacing mvpfet,*mvpdiff *pdiff 360 touching_illegal \
+ spacing mvpfet,mvpfetesd,*mvpdiff *pdiff 360 touching_illegal \
"MV P-diffusion to LV P-diffusion < %d (diff/tap.23 + diff/tap.22)"
- spacing mvnfet,mvvaractor,*mvndiff *ndiff 360 touching_illegal \
+ spacing mvnfet,mvnfetesd,mvvaractor,*mvndiff *ndiff 360 touching_illegal \
"MV N-diffusion to LV N-diffusion < %d (diff/tap.23 + diff/tap.22)"
# Minimum length of MV FETs. Note that this is larger than the minimum
# width (0.29um), so an edge rule is required
- edge4way mvndiff mvnfet 500 mvnfet 0 0 \
+ edge4way mvndiff mvnfet,mvnfetesd 500 mvnfet,mvnfetesd 0 0 \
"MV NMOS minimum length < %d (poly.13)"
edge4way mvnsd mvvaractor 500 mvvaractor 0 0 \
"MV Varactor minimum length < %d (poly.13)"
- edge4way mvpdiff mvpfet 500 mvpfet 0 0 \
+ edge4way mvpdiff mvpfet,mvpfetesd 500 mvpfet,mvpfetesd 0 0 \
"MV PMOS minimum length < %d (poly.13)"
#--------------------------------------------------
@@ -6415,6 +6459,10 @@
*mvndiff,mvndiffres *mvndiff,mvndiffres pwell,space/w error l=l w=w
device msubcircuit sky130_fd_pr__nfet_05v0_nvt mvnnfet \
*mvndiff,mvndiffres *mvndiff,mvndiffres pwell,space/w error l=l w=w
+ device msubcircuit sky130_fd_pr__esd_nfet_g5v0d10v5 mvnfetesd \
+ *mvndiff,mvndiffres *mvndiff,mvndiffres pwell,space/w error l=l w=w
+ device msubcircuit sky130_fd_pr__esd_pfet_g5v0d10v5 mvpfetesd \
+ *mvpdiff,mvpdiffres *mvpdiff,mvpdiffres nwell error l=l w=w
device resistor sky130_fd_pr__res_generic_l1 rli1 *li,coreli
device resistor sky130_fd_pr__res_generic_m1 rmetal1 *metal1
@@ -6515,7 +6563,9 @@
pwell,space/w nwell error
device mosfet sky130_fd_pr__pfet_g5v0d10v5 mvpfet mvpdiff,mvpdiffres,mvpdc nwell
+ device mosfet sky130_fd_pr__esd_pfet_g5v0d10v5 mvpfetesd mvpdiff,mvpdiffres,mvpdc nwell
device mosfet sky130_fd_pr__nfet_g5v0d10v5 mvnfet mvndiff,mvndiffres,mvndc pwell,space/w
+ device mosfet sky130_fd_pr__esd_nfet_g5v0d10v5 mvnfetesd mvndiff,mvndiffres,mvndc pwell,space/w
device mosfet sky130_fd_pr__nfet_05v0_nvt mvnnfet *mvndiff,mvndiffres pwell,space/w
# These devices always extract as subcircuits