Reworked the 5V vs. 6V transistor handling in magic for GF180MCU
to be a bit more consistent with other tools (namely klayout,
but also with layout submitted to GF and checked by GF). The
5V and 6V FET devices were separated into two types "mvnfet"
("mvpfet") and "hvnfet" ("hvpfet"), respectively, where previously
there was only one type. The FET5VDEF mask (112:1, or V5_XTOR)
is applied to the "mv" types and not to the "hv" types. The
generated cells have been modified to match this, with the
correct gate type being applied for "5V" vs. "6V" types. The
device DRC for minimum channel length is applied separately.
diff --git a/gf180mcu/magic/gf180mcu.tcl b/gf180mcu/magic/gf180mcu.tcl
index 923cd2c..ab6490f 100644
--- a/gf180mcu/magic/gf180mcu.tcl
+++ b/gf180mcu/magic/gf180mcu.tcl
@@ -4292,7 +4292,7 @@
diff_poly_space 0.30 \
diff_gate_space 0.30 \
diff_spacing 0.36 \
- gate_type mvpfet \
+ gate_type hvpfet \
diff_type mvpdiff \
diff_contact_type mvpdc \
plus_diff_type mvnsd \
@@ -4339,7 +4339,7 @@
diff_poly_space 0.30 \
diff_gate_space 0.30 \
diff_spacing 0.36 \
- gate_type mvnfet \
+ gate_type hvnfet \
diff_type mvndiff \
diff_contact_type mvndc \
plus_diff_type mvpsd \
@@ -4413,7 +4413,7 @@
diff_poly_space 0.30 \
diff_gate_space 0.30 \
diff_spacing 0.36 \
- gate_type mvpfet \
+ gate_type hvpfet \
diff_type mvpdiffres \
diff_contact_type mvpdc \
plus_diff_type mvnsd \
@@ -4437,7 +4437,7 @@
diff_poly_space 0.30 \
diff_gate_space 0.30 \
diff_spacing 0.36 \
- gate_type mvnfet \
+ gate_type hvnfet \
diff_type mvndiffres \
diff_contact_type mvndc \
plus_diff_type mvpsd \
diff --git a/gf180mcu/magic/gf180mcu.tech b/gf180mcu/magic/gf180mcu.tech
index 0412561..4553062 100644
--- a/gf180mcu/magic/gf180mcu.tech
+++ b/gf180mcu/magic/gf180mcu.tech
@@ -76,6 +76,8 @@
active nnmos,nntransistor,nnfet
active mvnmos,mvntransistor,mvnfet
active mvpmos,mvptransistor,mvpfet
+ active hvnmos,hvntransistor,hvnfet
+ active hvpmos,hvptransistor,hvpfet
active mvnnmos,mvnntransistor,mvnnfet
# Diffusions
active ndiff,ndiffusion,ndif
@@ -332,12 +334,12 @@
# Allwells contains obstruction-on-well-plane but not space-on-well-plane
allwells allnwell,allpwell,obswell
- allnfets nfet,mvnfet,nnfet,mvnnfet,ncap,mvncap,srammvnfet,sramnfet
- allnfetsnonnat nfet,mvnfet,ncap,mvncap,srammvnfet,sramnfet
- allpfets pfet,mvpfet,pcap,mvpcap,srammvpfet,srampfet
+ allnfets nfet,hvnfet,mvnfet,nnfet,mvnnfet,ncap,mvncap,srammvnfet,sramnfet
+ allnfetsnonnat nfet,hvnfet,mvnfet,ncap,mvncap,srammvnfet,sramnfet
+ allpfets pfet,hvpfet,mvpfet,pcap,mvpcap,srammvpfet,srampfet
allfets allnfets,allpfets,nvaractor,mvnvaractor,pvaractor,mvpvaractor
allfetsnonnat allnfetsnonnat,allpfets,nvaractor,mvnvaractor,pvaractor,mvpvaractor
- allfetsmv mvnfet,mvpfet,mvnnfet,mvnvaractor,mvpvaractor,mvncap,mvpcap,srammvpfet,srammvnfet
+ allfetsmv hvnfet,mvnfet,hvpfet,mvpfet,mvnnfet,mvnvaractor,mvpvaractor,mvncap,mvpcap,srammvpfet,srammvnfet
alllvnactivenonfet *ndiff,*nsd,*ndiode,*nndiode,*sramndiff
allmvnactivenonfet *mvndiff,*mvnsd,*mvndiode,*mvnndiode,*ldndiff,*srammvndiff
@@ -363,8 +365,8 @@
allpdifflvnonfet *pdif,*psd,*pdiode,pdiffres,*srampdiff
alldifflvnonfet allndifflvnonfet,allpdifflvnonfet
- allndiffmv *mvndif,*mvnsd,*mvndiode,mvndiffres,mvnfet,mvnnfet,mvnvaractor,*mvnndiode,mvncap,*ldndiff,*srammvndiff,srammvnfet
- allpdiffmv *mvpdif,*mvpsd,*mvpdiode,mvpdiffres,mvpfet,mvpvaractor,mvpcap,*ldpdiff,*srammvpdiff,srammvpfet
+ allndiffmv *mvndif,*mvnsd,*mvndiode,mvndiffres,hvnfet,mvnfet,mvnnfet,mvnvaractor,*mvnndiode,mvncap,*ldndiff,*srammvndiff,srammvnfet
+ allpdiffmv *mvpdif,*mvpsd,*mvpdiode,mvpdiffres,hvpfet,mvpfet,mvpvaractor,mvpcap,*ldpdiff,*srammvpdiff,srammvpfet
alldiffmv allndiffmv,allpdiffmv
allndiffmvnonfet *mvndif,*mvnsd,*mvndiode,mvndiffres,*mvnndiode,*ldndiff,*srammvndiff
allpdiffmvnonfet *mvpdif,*mvpsd,*mvpdiode,mvpdiffres,*ldpdiff,*srammvpdiff
@@ -475,8 +477,10 @@
mvnsd ndiff_in_nwell hvndiff_mask
mvpsd pdiff_in_pwell hvpdiff_mask
mvnfet ntransistor ntransistor_stripes hvndiff_mask
+ hvnfet ntransistor ntransistor_stripes hvndiff_mask
mvnnfet ntransistor ndiff_in_nwell hvndiff_mask
- mvpfet ptransistor ptransistor_stripes
+ mvpfet ptransistor ptransistor_stripes hvpdiff_mask
+ hvpfet ptransistor ptransistor_stripes hvpdiff_mask
mvnvar polysilicon ndiff_in_nwell hvndiff_mask
mvpvar polysilicon pdiff_in_pwell hvpdiff_mask
ldndiff hvndiff
@@ -649,6 +653,9 @@
compose srampfet poly srampdiff
compose sramnfet poly sramndiff
+
+ decompose hvnfet poly mvndiff
+ decompose hvpfet poly mvndiff
#ifdef MIM
#ifdef METALS3
@@ -788,15 +795,15 @@
# LDFETs cut the diffusion under the gate
templayer ldbreak1 *ldndiff,*ldpdiff
grow 160
- and mvnfet,mvpfet
+ and hvnfet,hvpfet,mvnfet,mvpfet
- templayer ldbreak mvnfet,mvpfet
+ templayer ldbreak hvnfet,hvpfet,mvnfet,mvpfet
grow 200
and ldndiff,ldpdiff
or ldbreak1
# Additional cut-back of LD diffusion for implant
- templayer ldbreak2 mvnfet,mvpfet
+ templayer ldbreak2 hvnfet,hvpfet,mvnfet,mvpfet
grow 240
and ldndiff,ldpdiff
@@ -948,7 +955,7 @@
grow 200
and-not RESDEF
#endif (HRPOLY1K)
- bloat-or *pdif,*pdiode,pdiffres,pfet,pcap,*mvpdif,*mvpdiode,mvpdiffres,mvpfet,mvpcap,*srammvpdiff,srammvpfet,*srampdiff,srampfet * 160 allnactivenonfet 0
+ bloat-or *pdif,*pdiode,pdiffres,pfet,pcap,*mvpdif,*mvpdiode,mvpdiffres,hvpfet,mvpfet,mvpcap,*srammvpdiff,srammvpfet,*srampdiff,srampfet * 160 allnactivenonfet 0
# NOTE: Rule CO.5b applies to butted contacts but Calibre rule is
# implemented for all contacts, so the Calibre rule is being followed.
bloat-or psc,mvpsc * 95
@@ -996,6 +1003,19 @@
calma 5 0
#-----------------------------------------------------
+# FET5VDEF
+#-----------------------------------------------------
+
+ # Ensure FET5VDEF surrounds all mv (5V) FET devices.
+ # This ensures that short length devices do not get
+ # flagged for DRC errors.
+
+ layer FET5VDEF
+ bloat-all mvnfet,mvpfet,srammvnfet,srammvpfet *mvndiff,*mvpdiff
+ grow 100
+ calma 112 1
+
+#-----------------------------------------------------
# POLY
#-----------------------------------------------------
layer POLY allpoly
@@ -1321,8 +1341,8 @@
layer SBLK
bloat-all rnd *nfet
bloat-all rpd *pfet
- bloat-all mvrnd *mvnfet
- bloat-all mvrpd *mvpfet
+ bloat-all mvrnd *mvnfet,*hvnfet
+ bloat-all mvrpd *mvpfet,*hvpfet
and allfets
grow 220
bloat-or allsblkdev * 0 space/a 220
@@ -1604,7 +1624,7 @@
gridlimit 5
# Check that all p-diff and n-ohmic have either nwell or dnwell
- templayer missing_nwell *nsd,*mvnsd,*pdiff,*mvpdiff,*pdiode,pdiffres,mvpdiffres,pfet,mvpfet,srammvpfet,srampfet,mvnvaractor
+ templayer missing_nwell *nsd,*mvnsd,*pdiff,*mvpdiff,*pdiode,pdiffres,mvpdiffres,pfet,hvpfet,mvpfet,srammvpfet,srampfet,mvnvaractor
and-not dnwell,nwell
# Check that all p-ohmic and n-diff have either pwell + dnwell
@@ -1625,7 +1645,7 @@
and dnwell
and-not pwell
- templayer mvndiff_missing_pwell *mvndiff,mvndiffres,mvnfet,*srammvndiff,srammvnfet
+ templayer mvndiff_missing_pwell *mvndiff,mvndiffres,hvnfet,mvnfet,*srammvndiff,srammvnfet
grow 600
and dnwell
and-not pwell
@@ -1663,14 +1683,14 @@
# versions of the cifoutput rules.
templayer check_pplus
- bloat-or *pdif,*pdiode,pdiffres,pfet,pcap,*mvpdif,*mvpdiode,mvpdiffres,mvpfet,mvpcap,srammvpfet,srampfet * 160 allnactivenonfet 0
+ bloat-or *pdif,*pdiode,pdiffres,pfet,pcap,*mvpdif,*mvpdiode,mvpdiffres,hvpfet,mvpfet,mvpcap,srammvpfet,srampfet * 160 allnactivenonfet 0
bloat-or psc,mvpsc * 95
bloat-or *psd,*mvpsd * 20 allnactivenonfet 0
grow 200
shrink 200
templayer check_nplus
- bloat-or *ndif,*ndiode,*nndiode,ndiffres,nfet,*mvndif,*mvndiode,*mvnndiode,mvndiffres,mvnfet,*srammvndiff,srammvnfet,*sramndiff,sramnfet * 160 allpactivenonfet 0
+ bloat-or *ndif,*ndiode,*nndiode,ndiffres,nfet,*mvndif,*mvndiode,*mvnndiode,mvndiffres,hvnfet,hvnfet,mvnfet,*srammvndiff,srammvnfet,*sramndiff,sramnfet * 160 allpactivenonfet 0
bloat-or nsc,mvnsc * 95
bloat-or *nsd,*mvnsd * 20 allpactivenonfet 0
grow 200
@@ -1790,7 +1810,6 @@
options ignore-unknown-layer-labels
- ignore FET5VDEF
ignore CAPDEF
ignore EFUSE
ignore SOURCE
@@ -2054,8 +2073,14 @@
and-not NPLUS
and POLY
+ layer hvpfet mvpfetarea
+ and-not MOSCAP
+ and-not FET5VDEF
+ and-not sramexpand
+
layer mvpfet mvpfetarea
and-not MOSCAP
+ and FET5VDEF
and-not sramexpand
layer srammvpfet mvpfetarea
@@ -3141,7 +3166,7 @@
spacing (*ndiff,*ndiode,nfet,nnfet,ncap)/a allnwell 430 touching_illegal \
"N-Diffusion spacing to N-well < %d (DF.8)"
- spacing (*mvndiff,*mvndiode,mvnfet,mvncap,mvnnfet)/a allnwell 600 touching_illegal \
+ spacing (*mvndiff,*mvndiode,hvnfet,mvnfet,mvncap,mvnnfet)/a allnwell 600 touching_illegal \
"N-Diffusion spacing to N-well < %d (DF.8)"
spacing *srammvndiff,srammvnfet allnwell 450 touching_illegal \
"N-Diffusion spacing to N-well in 5V SRAM < %d (S.DF.8_MV)"
@@ -3159,7 +3184,7 @@
"N-well overlap of N-Ohmic < %d (DF.4a)"
surround *pdiff,*pdiode,pfet,pcap allnwell 430 absence_okay \
"N-well overlap of P-Diffusion < %d (DF.7)"
- surround *mvpdiff,*mvpdiode,mvpfet,mvpcap allnwell 600 absence_okay \
+ surround *mvpdiff,*mvpdiode,hvpfet,mvpfet,mvpcap allnwell 600 absence_okay \
"N-well overlap of P-Diffusion < %d (DF.7)"
surround srammvpfet allnwell 450 absence_okay \
"N-well overlap of P-Diffusion in 5V SRAM < %d (S.DF.7_MV)"
@@ -3171,7 +3196,7 @@
"Deep N-well overlap of N-Ohmic < %d (DF.4b)"
surround *pdiff,*pdiode,pfet,pcap dnwell 930 absence_okay \
"Deep N-well overlap of P-Diffusion < %d (DF.4e)"
- surround *mvpdiff,*mvpdiode,mvpfet,mvpcap dnwell 1100 absence_okay \
+ surround *mvpdiff,*mvpdiode,hvpfet,mvpfet,mvpcap dnwell 1100 absence_okay \
"Deep N-well overlap of P-Diffusion < %d (DF.4e)"
@@ -3222,12 +3247,12 @@
spacing allpolynonfet *srammvndiff 120 corner_ok allfets \
"Poly spacing to MV diffusion in SRAM < %d (S.PL.5a_MV)"
overhang *ndiff,rndiff nfet,nnfet,ncap 230 "N-Diffusion overhang of nmos < %d (DF.6)"
- overhang *mvndiff,mvrndiff mvnfet,mvncap,mvnnfet 230 \
+ overhang *mvndiff,mvrndiff hvnfet,mvnfet,mvncap,mvnnfet 230 \
"N-Diffusion overhang of nmos < %d (DF.6)"
overhang *srammvndiff srammvnfet 230 \
"N-Diffusion overhang of nmos < %d (DF.6)"
overhang *pdiff,rpdiff pfet,pcap 230 "P-Diffusion overhang of pmos < %d (DF.6)"
- overhang *mvpdiff,mvrpdiff mvpfet,mvpcap 230 "P-Diffusion overhang of pmos < %d (DF.6)"
+ overhang *mvpdiff,mvrpdiff hvpfet,mvpfet,mvpcap 230 "P-Diffusion overhang of pmos < %d (DF.6)"
overhang *srammvpdiff srammvpfet 230 "P-Diffusion overhang of pmos < %d (DF.6)"
overhang *poly allfetsnonnat 220 "Poly overhang of transistor < %d (PL.4)"
overhang *poly nnfet,mvnnfet 350 "Poly overhang of NAT transistor < %d (NAT.6)"
@@ -3646,25 +3671,27 @@
extend mvnnfet *mvndiff 1200 exclusive "MV nn Transistor length < %d (NAT.4)"
width mvnnfet 400 "MV nn Transistor width < %d (DF.2c)"
- extend pfet,pcap *pdiff 280 exclusive "Transistor length < %d (PL.1a)"
- extend nfet,ncap *ndiff 280 exclusive "Transistor length < %d (PL.1a)"
- extend srampfet *srampdiff 280 exclusive "Transistor length < %d (PL.1a)"
- extend sramnfet *sramndiff 280 exclusive "Transistor length < %d (PL.1a)"
+ extend pfet,pcap *pdiff 280 exclusive "Transistor length < %d (PL.2)"
+ extend nfet,ncap *ndiff 280 exclusive "Transistor length < %d (PL.2)"
+ extend srampfet *srampdiff 280 exclusive "Transistor length < %d (PL.2)"
+ extend sramnfet *sramndiff 280 exclusive "Transistor length < %d (PL.2)"
width pfet,pcap 300 angles "Bent Transistor length < %d (PL.7)"
width nfet,ncap 300 angles "Bent Transistor length < %d (PL.7)"
- extend mvpfet,mvpcap *mvpdiff 500 exclusive "MV Transistor length < %d (PL.1a)"
- extend mvnfet,mvncap *mvndiff 600 exclusive "MV Transistor length < %d (PL.1a)"
- extend srammvpfet *srammvpdiff 500 exclusive "MV Transistor length < %d (PL.1a)"
- extend srammvnfet *srammvndiff 600 exclusive "MV Transistor length < %d (PL.1a)"
+ extend mvpfet,mvpcap *mvpdiff 500 exclusive "MV Transistor length < %d (PL.2)"
+ extend mvnfet,mvncap *mvndiff 600 exclusive "MV Transistor length < %d (PL.2)"
+ extend hvpfet *mvpdiff 550 exclusive "6V MV Transistor length < %d (PL.2)"
+ extend hvnfet *mvndiff 700 exclusive "6V MV Transistor length < %d (PL.2)"
+ extend srammvpfet *srammvpdiff 500 exclusive "MV Transistor length < %d (PL.2)"
+ extend srammvnfet *srammvndiff 600 exclusive "MV Transistor length < %d (PL.2)"
- width mvpfet,mvpcap 700 angles "Bent MV Transistor length < %d (PL.7)"
- width mvnfet,mvncap 700 angles "Bent MV Transistor length < %d (PL.7)"
+ width hvpfet,mvpfet,mvpcap 700 angles "Bent MV Transistor length < %d (PL.7)"
+ width hvnfet,mvnfet,mvncap 700 angles "Bent MV Transistor length < %d (PL.7)"
- edge4way pfet,pcap,mvpfet,mvpcap *poly/a 330 \
+ edge4way pfet,pcap,hvpfet,mvpfet,mvpcap *poly/a 330 \
~(*nsd,*mvnsd)/a (*pdiff,*mvpdiff)/a 300 \
"n-ohmic spacing to PMOS gate < %d (NP.4b + PP.4c)"
- edge4way nfet,ncap,nnfet,mvnnfet,mvnfet,mvncap *poly/a 330 \
+ edge4way nfet,ncap,nnfet,mvnnfet,hvnfet,mvnfet,mvncap *poly/a 330 \
~(*psd,*mvpsd)/a (*ndiff,*mvndiff)/a 300 \
"p-ohmic spacing to NMOS gate < %d (PP.4b + NP.4c)"
@@ -5078,25 +5105,27 @@
allnwell error l=l w=w a1=as p1=ps a2=ad p2=pd
device msubcircuit nfet_03v3 sramnfet sramndiff,sramndc sramndiff,sramndc \
allpsub error l=l w=w a1=as p1=ps a2=ad p2=pd
- device msubcircuit pfet_06v0 srammvpfet srammvpdiff,srammvpdc \
+ device msubcircuit pfet_05v0 srammvpfet srammvpdiff,srammvpdc \
srammvpdiff,srammvpdc allnwell error l=l w=w a1=as p1=ps a2=ad p2=pd
- device msubcircuit pfet_06v0 mvpfet mvpdiff,mvpdc mvpdiff,mvpdc allnwell error \
- l>=0.55 l=l w=w a1=as p1=ps a2=ad p2=pd
+ device msubcircuit pfet_06v0 hvpfet mvpdiff,mvpdc mvpdiff,mvpdc allnwell error \
+ l=l w=w a1=as p1=ps a2=ad p2=pd
device msubcircuit pfet_05v0 mvpfet mvpdiff,mvpdc mvpdiff,mvpdc allnwell error \
- l<0.55 l=l w=w a1=as p1=ps a2=ad p2=pd
- device msubcircuit nfet_06v0 srammvnfet srammvndiff,srammvndc \
+ l=l w=w a1=as p1=ps a2=ad p2=pd
+ device msubcircuit nfet_05v0 srammvnfet srammvndiff,srammvndc \
srammvndiff,srammvndc allpsub error l=l w=w a1=as p1=ps a2=ad p2=pd
- device msubcircuit nfet_06v0 mvnfet mvndiff,mvndc mvndiff,mvndc allpsub error \
- l>=0.7 l=l w=w a1=as p1=ps a2=ad p2=pd
+ device msubcircuit nfet_05v0 srammvnfet srammvndiff,srammvndc \
+ srammvndiff,srammvndc allpsub error l=l w=w a1=as p1=ps a2=ad p2=pd
+ device msubcircuit nfet_06v0 hvnfet mvndiff,mvndc mvndiff,mvndc allpsub error \
+ l=l w=w a1=as p1=ps a2=ad p2=pd
device msubcircuit nfet_05v0 mvnfet mvndiff,mvndc mvndiff,mvndc allpsub error \
- l<0.7 l=l w=w a1=as p1=ps a2=ad p2=pd
+ l=l w=w a1=as p1=ps a2=ad p2=pd
device msubcircuit pfet_03v3_dss pfet pdiffres pdiffres allnwell error \
l=l w=w a1=as p1=ps a2=ad p2=pd l1=s_sab l2=d_sab
device msubcircuit nfet_03v3_dss nfet ndiffres ndiffres allpsub error \
l=l w=w a1=as p1=ps a2=ad p2=pd l1=s_sab l2=d_sab
- device msubcircuit pfet_06v0_dss mvpfet mvpdiffres mvpdiffres allnwell error \
+ device msubcircuit pfet_06v0_dss hvpfet,mvpfet mvpdiffres mvpdiffres allnwell error \
l=l w=w a1=as p1=ps a2=ad p2=pd l1=s_sab l2=d_sab
- device msubcircuit nfet_06v0_dss mvnfet mvndiffres mvndiffres allpsub error \
+ device msubcircuit nfet_06v0_dss hvnfet,mvnfet mvndiffres mvndiffres allpsub error \
l=l w=w a1=as p1=ps a2=ad p2=pd l1=s_sab l2=d_sab
device msubcircuit nfet_06v0_nvt mvnnfet mvndiff,mvndiffres,mvndc \
mvndiff,mvndiffres,mvndc allpsub error \
@@ -5200,8 +5229,8 @@
device rsubcircuit nwell rnw nwell allpsub error l=r_length w=r_width
# The following absorbs the source/drain resistor into a *_dss FET device
- device subcircuit Short mvndiffres *mvndiff mvnfet allpsub error
- device subcircuit Short mvpdiffres *mvpdiff mvpfet allnwell error
+ device subcircuit Short mvndiffres *mvndiff hvnfet allpsub error
+ device subcircuit Short mvpdiffres *mvpdiff hvpfet allnwell error
device subcircuit Short ndiffres *ndiff nfet allpsub error
device subcircuit Short pdiffres *pdiff pfet allnwell error