Corrected errors related to the standard cells and the DRC rules for several of the FET devices with HVT/LVT implants. Also corrected the missing extraction device for type "rmp", and removed unused options from the "device resistor" lines.
diff --git a/sky130/magic/sky130.tech b/sky130/magic/sky130.tech index 966123e..69a4abe 100644 --- a/sky130/magic/sky130.tech +++ b/sky130/magic/sky130.tech
@@ -158,6 +158,7 @@ -active npass,npassfet,srampassfet active pmos,ptransistor,pfet -active scpmos,scptransistor,scpfet + -active scpmoshvt,scpfethvt -active ppu,ppufet,srampfet active nnmos,nntransistor active mvnmos,mvntransistor,mvnfet @@ -364,10 +365,11 @@ allnwell nwell,obswell,pnp allnfets nfet,npass,npd,scnfet,mvnfet,mvnnfet,nfetlvt,nsonos - allpfets pfet,ppu,scpfet,mvpfet,pfethvt,pfetlvt,pfetmvt + allpfets pfet,ppu,scpfet,scpfethvt,mvpfet,pfethvt,pfetlvt,pfetmvt allfets allnfets,allpfets,varactor,mvvaractor,varhvt allfetsstd nfet,mvnfet,mvnnfet,nfetlvt,pfet,mvpfet,pfethvt,pfetlvt,pfetmvt - allfetsspecial npass,npd,scnfet,nsonos,ppu,scpfet + allfetsspecial npass,npd,scnfet,nsonos,ppu,scpfet,scpfethvt + allfetsnolvt nfet,npass,npd,scnfet,mvnfet,mvnnfet,nsonos,pfet,ppu,scpfet,scpfethvt,mvpfet,pfethvt,pfetmvt,varactor,mvvaractor,varhvt allnactivenonfet *ndiff,*nsd,*ndiode,*nndiode,*mvndiff,*mvnsd,*mvndiode,*ndiodelvt allnactive allnactivenonfet,allnfets @@ -385,7 +387,7 @@ allactiveres ndiffres,pdiffres,mvndiffres,mvpdiffres allndifflv *ndif,*nsd,*ndiode,ndiffres,nfet,npass,npd,scnfet,nfetlvt,nsonos - allpdifflv *pdif,*psd,*pdiode,pdiffres,pfet,ppu,scpfet,pfetlvt,pfetmvt,pfethvt + allpdifflv *pdif,*psd,*pdiode,pdiffres,pfet,ppu,scpfet,scpfethvt,pfetlvt,pfetmvt,pfethvt alldifflv allndifflv,allpdifflv allndifflvnonfet *ndif,*nsd,*ndiode,*nndiode,ndiffres,*ndiodelvt allpdifflvnonfet *pdif,*psd,*pdiode,pdiffres,*pdiodelvt,*pdiodehvt @@ -460,6 +462,7 @@ npd ntransistor ntransistor_stripes pfet ptransistor ptransistor_stripes scpfet ptransistor ptransistor_stripes + scpfethvt ptransistor ptransistor_stripes implant2 ppu ptransistor ptransistor_stripes var polysilicon ndiff_in_nwell ndc ndiffusion metal1 contact_X'es @@ -834,7 +837,7 @@ # HVTP #---------------------------------------------------------------- - layer HVTP pfethvt,varhvt,*pdiodehvt + layer HVTP scpfethvt,pfethvt,varhvt,*pdiodehvt grow 180 bridge 380 380 grow 185 @@ -869,7 +872,7 @@ #---------------------------------------------------------------- layer STDCELL scnfet - bloat-all scpfet,scnfet CELLBOUND + bloat-all scpfet,scpfethvt,scnfet CELLBOUND calma 81 4 #---------------------------------------------------------------- @@ -2226,6 +2229,12 @@ and STDCELL labels DIFF + layer scpfethvt pfetarea + and-not LVTN + and HVTP + and STDCELL + labels DIFF + layer ppu pfetarea and-not LVTN and-not HVTP @@ -2242,6 +2251,7 @@ layer pfethvt pfetarea and HVTP + and-not STDCELL labels DIFF # Always force nwell under pfet (nwell encloses pdiff by 0.18) @@ -2547,6 +2557,14 @@ layer scpfet POLY and DIFF and diffresarea + and-not HVTP + and-not NPLUS + and STDCELL + + layer scpfethvt POLY + and DIFF + and diffresarea + and HVTP and-not NPLUS and STDCELL @@ -3715,6 +3733,12 @@ and STDCELL labels DIFF + layer scpfethvt pfetarea + and-not LVTN + and HVTP + and STDCELL + labels DIFF + layer ppu pfetarea and-not LVTN and-not HVTP @@ -3731,6 +3755,7 @@ layer pfethvt pfetarea and HVTP + and-not STDCELL labels DIFF # Always force nwell under pfet (nwell encloses pdiff by 0.18) @@ -4035,10 +4060,88 @@ layer scpfet POLY and DIFF + and-not HVTP and diffresarea and-not NPLUS and STDCELL + layer scpfethvt POLY + and DIFF + and HVTP + and diffresarea + and-not NPLUS + and STDCELL + + templayer xpolyterm RPM,URPM + and POLY + and-not POLYRES + # add back the 0.06um contact surround in the direction of the resistor + grow 60 + and POLY + + layer xpc xpolyterm + + templayer polyarea POLY + and-not POLYRES + and-not POLYSHORT + and-not DIFF + and-not RPM + and-not URPM + copyup polycheck + + layer poly polyarea,POLYTXT,POLYPIN + labels POLY + labels POLYTXT port + labels POLYPIN port + + # Copy (non-resistor) poly areas up for contact checks + templayer xpolycheck polycheck + copyup polycheck + + layer mrp1 POLY + and POLYRES + and-not RPM + and-not URPM + labels POLY + + layer rmp POLY + and POLYSHORT + labels POLY + + layer xhrpoly POLY + and POLYRES + and RPM + and-not URPM + and PPLUS + and NPC + and-not xpolyterm + labels POLY + + layer uhrpoly POLY + and POLYRES + and URPM + and-not RPM + and NPC + and-not xpolyterm + labels POLY + + templayer ndcbase CONT + and DIFF + and NPLUS + and-not NWELL + and LI + and-not THKOX + + layer ndc ndcbase + grow 85 + shrink 85 + shrink 85 + grow 85 + or ndcbase + labels CONT + + templayer nscbase CONT + templayer xpolyterm RPM,URPM and POLY and-not POLYRES @@ -5018,7 +5121,7 @@ # DIFF #----------------------------- - width *ndiff,nfet,scnfet,npd,npass,*nsd,*ndiode,ndiffres,*pdiff,pfet,scpfet,ppu,*psd,*pdiode,pdiffres \ + 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 290 \ "MV Diffusion width < %d (diff/tap.14)" @@ -5113,9 +5216,9 @@ "poly spacing to Diffusion < %d (poly.4)" spacing npres *nsd 480 touching_illegal \ "poly resistor spacing to N-tap < %d (poly.9)" - overhang *ndiff,rndiff nfet,scnfet,npd,npass 250 "N-Diffusion overhang of nmos < %d (poly.7)" + overhang *ndiff,rndiff nfet,scnfet,npd,npass 250 "N-Diffusion overhang of nFET < %d (poly.7)" overhang *mvndiff,mvrndiff mvnfet,mvnnfet 250 \ - "N-Diffusion overhang of nmos < %d (poly.7)" + "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 *poly allfets 130 "poly overhang of transistor < %d (poly.8)" @@ -5137,28 +5240,29 @@ # HVTP #-------------------------------------------------------------------- - spacing pmoshvt,pdiodehvt,varactorhvt pfet,ppu,scpfet,mvpfet,pfetlvt,pfetmvt \ + spacing pfethvt,pdiodehvt,varactorhvt pfet,ppu,scpfet,mvpfet,pfetlvt,pfetmvt \ 360 touching_illegal \ "Min. spacing between pFET and HVTP < %d (hvtp.4)" - spacing pmoshvt,pdiodehvt,varactorhvt varactor 360 touching_illegal \ + spacing pfethvt,pdiodehvt,varactorhvt varactor 360 touching_illegal \ "Min. spacing between varactor and HVTP < %d (hvtp.4 + varac.3)" #-------------------------------------------------------------------- # LVTN #-------------------------------------------------------------------- - spacing pmoslvt,nmoslvt,pdiodelvt,ndiodelvt allfets 360 touching_illegal \ - "Min. spacing between FET and LVTP < %d (lvtn.3a)" + spacing pfetlvt,nfetlvt,pdiodelvt,ndiodelvt \ + allfetsnolvt 360 touching_illegal \ + "Min. spacing between FET and LVTN < %d (lvtn.3a)" - spacing pmoslvt,nmoslvt,pdiodelvt,ndiodelvt pmoshvt,pdiodehvt,varactorhvt \ + spacing pfetlvt,nfetlvt,pdiodelvt,ndiodelvt scpfethvt,pfethvt,pdiodehvt,varactorhvt \ 740 touching_illegal \ - "Min. spacing between LVTN and LVTP < %d (lvtn.9)" + "Min. spacing between LVTN and HVTP < %d (lvtn.9)" # Spacing across S/D direction requires edge rule - edge4way allfets allactivenonfet 415 \ - ~(pmoslvt,nmoslvt,pdiodelvt,ndiodelvt)/a allfets 415 \ - "Min. spacing between FET and LVTP in S/D direction < %d (lvtn.3b)" + edge4way allfetsnolvt allactivenonfet 415 \ + ~(pfetlvt,nfetlvt,pdiodelvt,ndiodelvt)/a allfetsnolvt 415 \ + "Min. spacing between FET and LVTN in S/D direction < %d (lvtn.3b)" #-------------------------------------------------------------------- # NPC (Nitride poly Cut) @@ -5204,7 +5308,7 @@ spacing ndc,pdc nfet,nfetlvt,pfet,pfethvt,pfetlvt,pfetmvt 55 touching_illegal \ "Diffusion contact to gate < %d (licon.11)" - spacing ndc,pdc scnfet,npd,npass,scpfet,ppu 50 touching_illegal \ + spacing ndc,pdc scnfet,npd,npass,scpfet,scpfethvt,ppu 50 touching_illegal \ "Diffusion contact to standard cell gate < %d (licon.11)" spacing mvndc,mvpdc mvnfet,mvnnfet,mvpfet 55 touching_illegal \ "Diffusion contact to gate < %d (licon.11)" @@ -5217,7 +5321,7 @@ surround ndc/a *ndiff,nfet,scnfet,npd,npass,nfetlvt 40 absence_illegal \ "N-diffusion overlap of N-diffusion contact < %d (licon.5a)" - surround pdc/a *pdiff,pfet,scpfet,ppu,pfethvt,pfetmvt,pfetlvt 40 absence_illegal \ + surround pdc/a *pdiff,pfet,scpfet,scpfethvt,ppu,pfethvt,pfetmvt,pfetlvt 40 absence_illegal \ "P-diffusion overlap of P-diffusion contact < %d (licon.5a)" surround ndic/a *ndi 40 absence_illegal \ "N-diode overlap of N-diode contact < %d (licon.5a)" @@ -5231,7 +5335,7 @@ surround ndc/a *ndiff,nfet,scnfet,npd,npass,nfetlvt 60 directional \ "N-diffusion overlap of N-diffusion contact < %d in one direction (licon.5c)" - surround pdc/a *pdiff,pfet,scpfet,ppu,pfethvt,pfetmvt,pfetlvt 60 directional \ + surround pdc/a *pdiff,pfet,scpfet,scpfethvt,ppu,pfethvt,pfetmvt,pfetlvt 60 directional \ "P-diffusion overlap of P-diffusion contact < %d in one direction (licon.5c)" surround ndic/a *ndi 60 directional \ "N-diode overlap of N-diode contact < %d in one direction (licon.5c)" @@ -5491,7 +5595,7 @@ edge4way *psd *ndiff 300 ~(nfet,npass,npd,scnfet,nfetlvt,nsonos)/a *psd 300 \ "Butting P-tap spacing to NMOS gate < %d (poly.6)" - edge4way *nsd *pdiff 300 ~(pfet,ppu,scpfet,pfetlvt,pfetmvt)/a *nsd 300 \ + 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 \ "Butting MV P-tap spacing to MV NMOS gate < %d (poly.6)" @@ -5499,7 +5603,7 @@ "Butting MV N-tap spacing to MV PMOS gate < %d (poly.6)" # No LV FETs in HV diff - spacing pfet,scpfet,ppu,pfetlvt,pfetmvt,pfethvt,*pdiff *mvpdiff 360 touching_illegal \ + spacing pfet,scpfet,scpfethvt,ppu,pfetlvt,pfetmvt,pfethvt,*pdiff *mvpdiff 360 touching_illegal \ "LV P-diffusion to MV P-diffusion < %d (diff/tap.23 + diff/tap.22)" spacing nfet,scnfet,npd,npass,nfetlvt,varactor,varhvt,*ndiff *mvndiff 360 touching_illegal \ @@ -6094,7 +6198,7 @@ *pdiff,pdiffres *pdiff,pdiffres nwell error l=l w=w device msubcircuit sky130_fd_pr__pfet_01v8_mvt pfetmvt \ *pdiff,pdiffres *pdiff,pdiffres nwell error l=l w=w - device msubcircuit sky130_fd_pr__pfet_01v8_hvt pfethvt \ + device msubcircuit sky130_fd_pr__pfet_01v8_hvt pfethvt,scpfethvt \ *pdiff,pdiffres *pdiff,pdiffres nwell error l=l w=w device msubcircuit sky130_fd_pr__nfet_01v8 nfet,scnfet \ @@ -6144,19 +6248,13 @@ device msubcircuit sky130_fd_pr__nfet_05v0_nvt mvnnfet \ *mvndiff,mvndiffres *mvndiff,mvndiffres pwell,space/w error l=l w=w - device resistor sky130_fd_pr__res_generic_l1 rli1 \ - *li,coreli space/w,pwell,nwell error l=l w=w - device resistor sky130_fd_pr__res_generic_m1 rmetal1 \ - *metal1 space/w,pwell,nwell error l=l w=w - device resistor sky130_fd_pr__res_generic_m2 rmetal2 \ - *metal2 space/w,pwell,nwell error l=l w=w - device resistor sky130_fd_pr__res_generic_m3 rmetal3 \ - *metal3 space/w,pwell,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 + device resistor sky130_fd_pr__res_generic_m2 rmetal2 *metal2 + device resistor sky130_fd_pr__res_generic_m3 rmetal3 *metal3 #ifdef METAL5 - device resistor sky130_fd_pr__res_generic_m4 rm4 \ - *m4 space/w,pwell,nwell error l=l w=w - device resistor sky130_fd_pr__res_generic_m5 rm5 \ - *m5 space/w,pwell,nwell error l=l w=w + device resistor sky130_fd_pr__res_generic_m4 rm4 *m4 + device resistor sky130_fd_pr__res_generic_m5 rm5 *m5 #endif (METAL5) device rsubcircuit sky130_fd_pr__res_high_po_0p35 xhrpoly \ @@ -6191,12 +6289,10 @@ device rsubcircuit sky130_fd_pr__res_iso_pw rpw \ pwell dnwell error l=l w=w - device resistor sky130_fd_pr__res_generic_po mrp1 \ - *poly pwell,space/w error - device resistor sky130_fd_pr__res_generic_nd__hv mvndiffres \ - *mvndiff pwell,space/w error - device resistor sky130_fd_pr__res_generic_pd__hv mvpdiffres \ - *mvpdiff nwell error + device resistor sky130_fd_pr__res_generic_po rmp *poly + device resistor sky130_fd_pr__res_generic_po mrp1 *poly + device resistor sky130_fd_pr__res_generic_nd__hv mvndiffres *mvndiff + device resistor sky130_fd_pr__res_generic_pd__hv mvpdiffres *mvpdiff device subcircuit sky130_fd_pr__diode_pd2nw_05v5 *pdiode \ nwell a=area @@ -6228,7 +6324,7 @@ device mosfet sky130_fd_pr__special_pfet_pass ppu pdiff,pdiffres,pdc nwell device mosfet sky130_fd_pr__pfet_01v8_lvt pfetlvt pdiff,pdiffres,pdc nwell device mosfet sky130_fd_pr__pfet_01v8_mvt pfetmvt pdiff,pdiffres,pdc nwell - device mosfet sky130_fd_pr__pfet_01v8_hvt pfethvt pdiff,pdiffres,pdc nwell + device mosfet sky130_fd_pr__pfet_01v8_hvt scpfethvt,pfethvt pdiff,pdiffres,pdc nwell device mosfet sky130_fd_pr__nfet_01v8 scnfet,nfet ndiff,ndiffres,ndc pwell,space/w device mosfet sky130_fd_pr__special_nfet_pass npass ndiff,ndiffres,ndc pwell,space/w device mosfet sky130_fd_pr__special_nfet_latch npd ndiff,ndiffres,ndc pwell,space/w