Finally corrected all of the eight diode types, which had a lot of typos left over from the conversion from s8 to sky130.
diff --git a/VERSION b/VERSION index b649b91..970b756 100644 --- a/VERSION +++ b/VERSION
@@ -1 +1 @@ -1.0.53 +1.0.54
diff --git a/sky130/magic/sky130.tcl b/sky130/magic/sky130.tcl index da9f1de..a2a4cb1 100644 --- a/sky130/magic/sky130.tcl +++ b/sky130/magic/sky130.tcl
@@ -723,8 +723,8 @@ #------------------------------------------------------------------ # NOTE: sky130_fd_pr__diode_pw2nd_05v5_lvt, -# sky130_fd_pr__diode_pw2nd_05v5_nvt, sky130_fd_pr__pd2nw_05v5_lvt, -# and sky130_fd_pr__pd2nw_11v0 are all considered parasitic diodes. +# sky130_fd_pr__diode_pw2nd_05v5_nvt, sky130_fd_pr__diode_pd2nw_05v5_lvt, +# and sky130_fd_pr__diode_pd2nw_11v0 are all considered parasitic diodes. # They may be generated by invoking the build procedure on the # command line. To enable them in the PDK, add them to the # appropriate compatible {} list. @@ -735,7 +735,7 @@ nx 1 ny 1 dummy 0 lmin 0.45 wmin 0.45 \ elc 1 erc 1 etc 1 ebc 1 doverlap 0 \ compatible {sky130_fd_pr__diode_pw2nd_05v5 sky130_fd_pr__diode_pw2nd_05v5_lvt \ - sky130_fd_pr__diode_pw2nd_11v0 sky130_fd_pr__diode_pw2nd_05v5_nvt} \ + sky130_fd_pr__diode_pw2nd_05v5_nvt sky130_fd_pr__diode_pw2nd_11v0} \ full_metal 1} } @@ -744,47 +744,7 @@ nx 1 ny 1 dummy 0 lmin 0.45 wmin 0.45 \ elc 1 erc 1 etc 1 ebc 1 doverlap 0 \ compatible {sky130_fd_pr__diode_pw2nd_05v5 sky130_fd_pr__diode_pw2nd_05v5_lvt \ - sky130_fd_pr__diode_pw2nd_11v0 sky130_fd_pr__diode_pw2nd_05v5_nvt} \ - full_metal 1} -} - -proc sky130::sky130_fd_pr__pd2nw_05v5_defaults {} { - return {w 0.45 l 0.45 area 0.2025 peri 1.8 \ - nx 1 ny 1 dummy 0 lmin 0.45 wmin 0.45 \ - elc 1 erc 1 etc 1 ebc 1 \ - glc 1 grc 1 gtc 1 gbc 1 doverlap 0 \ - compatible {sky130_fd_pr__diode_pd2nw_05v5 sky130_fd_pr__diode_pd2nw_05v5_lvt \ - sky130_fd_pr__diode_pd2nw_11v0 sky130_fd_pr__diode_pd2nw_11v0} \ - full_metal 1} -} - -proc sky130::sky130_fd_pr__pd2nw_05v5_lvt_defaults {} { - return {w 0.45 l 0.45 area 0.2025 peri 1.8 \ - nx 1 ny 1 dummy 0 lmin 0.45 wmin 0.45 \ - elc 1 erc 1 etc 1 ebc 1 \ - glc 1 grc 1 gtc 1 gbc 1 doverlap 0 \ - compatible {sky130_fd_pr__diode_pd2nw_05v5 sky130_fd_pr__diode_pd2nw_05v5_lvt \ - sky130_fd_pr__diode_pd2nw_11v0 sky130_fd_pr__diode_pd2nw_11v0} \ - full_metal 1} -} - -proc sky130::sky130_fd_pr__pd2nw_11v0_defaults {} { - return {w 0.45 l 0.45 area 0.2025 peri 1.8 \ - nx 1 ny 1 dummy 0 lmin 0.45 wmin 0.45 \ - elc 1 erc 1 etc 1 ebc 1 \ - glc 1 grc 1 gtc 1 gbc 1 doverlap 0 \ - compatible {sky130_fd_pr__diode_pd2nw_05v5 sky130_fd_pr__diode_pd2nw_05v5_lvt \ - sky130_fd_pr__diode_pd2nw_11v0 sky130_fd_pr__diode_pd2nw_11v0} \ - full_metal 1} -} - - -proc sky130::sky130_fd_pr__diode_pw2nd_11v0_defaults {} { - return {w 0.45 l 0.45 area 0.2024 peri 1.8 \ - nx 1 ny 1 dummy 0 lmin 0.45 wmin 0.45 \ - elc 1 erc 1 etc 1 ebc 1 doverlap 0 \ - compatible {sky130_fd_pr__diode_pw2nd_05v5 sky130_fd_pr__diode_pw2nd_05v5_lvt \ - sky130_fd_pr__diode_pw2nd_11v0 sky130_fd_pr__diode_pw2nd_05v5_nvt} \ + sky130_fd_pr__diode_pw2nd_05v5_nvt sky130_fd_pr__diode_pw2nd_11v0} \ full_metal 1} } @@ -793,16 +753,57 @@ nx 1 ny 1 dummy 0 lmin 0.45 wmin 0.45 \ elc 1 erc 1 etc 1 ebc 1 doverlap 0 \ compatible {sky130_fd_pr__diode_pw2nd_05v5 sky130_fd_pr__diode_pw2nd_05v5_lvt \ - sky130_fd_pr__diode_pw2nd_11v0 sky130_fd_pr__diode_pw2nd_05v5_nvt} \ + sky130_fd_pr__diode_pw2nd_05v5_nvt sky130_fd_pr__diode_pw2nd_11v0} \ full_metal 1} +} -proc sky130::sky130_fd_pr__pd2nw_11v0_defaults {} { +proc sky130::sky130_fd_pr__diode_pw2nd_11v0_defaults {} { + return {w 0.45 l 0.45 area 0.2024 peri 1.8 \ + nx 1 ny 1 dummy 0 lmin 0.45 wmin 0.45 \ + elc 1 erc 1 etc 1 ebc 1 doverlap 0 \ + compatible {sky130_fd_pr__diode_pw2nd_05v5 sky130_fd_pr__diode_pw2nd_05v5_lvt \ + sky130_fd_pr__diode_pw2nd_05v5_nvt sky130_fd_pr__diode_pw2nd_11v0} \ + full_metal 1} +} + +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_defaults {} { + return {w 0.45 l 0.45 area 0.2025 peri 1.8 \ + nx 1 ny 1 dummy 0 lmin 0.45 wmin 0.45 \ + elc 1 erc 1 etc 1 ebc 1 \ + glc 1 grc 1 gtc 1 gbc 1 doverlap 0 \ + compatible {sky130_fd_pr__diode_pd2nw_05v5 sky130_fd_pr__diode_pd2nw_05v5_lvt \ + sky130_fd_pr__diode_pd2nw_05v5_hvt sky130_fd_pr__diode_pd2nw_11v0} \ + full_metal 1} +} + +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_lvt_defaults {} { + return {w 0.45 l 0.45 area 0.2025 peri 1.8 \ + nx 1 ny 1 dummy 0 lmin 0.45 wmin 0.45 \ + elc 1 erc 1 etc 1 ebc 1 \ + glc 1 grc 1 gtc 1 gbc 1 doverlap 0 \ + compatible {sky130_fd_pr__diode_pd2nw_05v5 sky130_fd_pr__diode_pd2nw_05v5_lvt \ + sky130_fd_pr__diode_pd2nw_05v5_hvt sky130_fd_pr__diode_pd2nw_11v0} \ + full_metal 1} +} + +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_hvt_defaults {} { + return {w 0.45 l 0.45 area 0.2025 peri 1.8 \ + nx 1 ny 1 dummy 0 lmin 0.45 wmin 0.45 \ + elc 1 erc 1 etc 1 ebc 1 \ + glc 1 grc 1 gtc 1 gbc 1 doverlap 0 \ + compatible {sky130_fd_pr__diode_pd2nw_05v5 sky130_fd_pr__diode_pd2nw_05v5_lvt \ + sky130_fd_pr__diode_pd2nw_05v5_hvt sky130_fd_pr__diode_pd2nw_11v0} \ + full_metal 1} +} + + +proc sky130::sky130_fd_pr__diode_pd2nw_11v0_defaults {} { return {w 0.45 l 0.45 area 0.2024 peri 1.8 \ nx 1 ny 1 dummy 0 lmin 0.45 wmin 0.45 \ elc 1 erc 1 etc 1 ebc 1 \ glc 1 grc 1 gtc 1 gbc 1 doverlap 0 \ compatible {sky130_fd_pr__diode_pd2nw_05v5 sky130_fd_pr__diode_pd2nw_05v5_lvt \ - sky130_fd_pr__diode_pd2nw_11v0 sky130_fd_pr__diode_pd2nw_11v0} \ + sky130_fd_pr__diode_pd2nw_05v5_hvt sky130_fd_pr__diode_pd2nw_11v0} \ full_metal 1} } @@ -816,15 +817,7 @@ return [sky130::diode_convert $parameters] } -proc sky130::sky130_fd_pr__pd2nw_05v5_convert {parameters} { - return [sky130::diode_convert $parameters] -} - -proc sky130::sky130_fd_pr__pd2nw_05v5_lvt_convert {parameters} { - return [sky130::diode_convert $parameters] -} - -proc sky130::sky130_fd_pr__pd2nw_11v0_convert {parameters} { +proc sky130::sky130_fd_pr__diode_pw2nd_05v5_nvt_convert {parameters} { return [sky130::diode_convert $parameters] } @@ -832,11 +825,19 @@ return [sky130::diode_convert $parameters] } -proc sky130::sky130_fd_pr__diode_pw2nd_05v5_nvt_convert {parameters} { +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_convert {parameters} { return [sky130::diode_convert $parameters] } -proc sky130::sky130_fd_pr__pd2nw_11v0_convert {parameters} { +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_lvt_convert {parameters} { + return [sky130::diode_convert $parameters] +} + +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_hvt_convert {parameters} { + return [sky130::diode_convert $parameters] +} + +proc sky130::sky130_fd_pr__diode_pd2nw_11v0_convert {parameters} { return [sky130::diode_convert $parameters] } @@ -850,28 +851,28 @@ sky130::diode_dialog sky130_fd_pr__diode_pw2nd_05v5_lvt $parameters } -proc sky130::sky130_fd_pr__pd2nw_05v5_dialog {parameters} { - sky130::diode_dialog sky130_fd_pr__pd2nw_05v5 $parameters -} - -proc sky130::sky130_fd_pr__pd2nw_05v5_lvt_dialog {parameters} { - sky130::diode_dialog sky130_fd_pr__pd2nw_05v5_lvt $parameters -} - -proc sky130::sky130_fd_pr__pd2nw_11v0_dialog {parameters} { - sky130::diode_dialog sky130_fd_pr__pd2nw_11v0 $parameters +proc sky130::sky130_fd_pr__diode_pw2nd_05v5_nvt_dialog {parameters} { + sky130::diode_dialog sky130_fd_pr__diode_pw2nd_05v5_nvt $parameters } proc sky130::sky130_fd_pr__diode_pw2nd_11v0_dialog {parameters} { sky130::diode_dialog sky130_fd_pr__diode_pw2nd_11v0 $parameters } -proc sky130::sky130_fd_pr__diode_pw2nd_05v5_nvt_dialog {parameters} { - sky130::diode_dialog sky130_fd_pr__diode_pw2nd_05v5_nvt $parameters +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_dialog {parameters} { + sky130::diode_dialog sky130_fd_pr__diode_pd2nw_05v5 $parameters } -proc sky130::sky130_fd_pr__pd2nw_11v0_dialog {parameters} { - sky130::diode_dialog sky130_fd_pr__pd2nw_11v0 $parameters +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_lvt_dialog {parameters} { + sky130::diode_dialog sky130_fd_pr__diode_pd2nw_05v5_lvt $parameters +} + +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_hvt_dialog {parameters} { + sky130::diode_dialog sky130_fd_pr__diode_pd2nw_05v5_hvt $parameters +} + +proc sky130::sky130_fd_pr__diode_pd2nw_11v0_dialog {parameters} { + sky130::diode_dialog sky130_fd_pr__diode_pd2nw_11v0 $parameters } #---------------------------------------------------------------- @@ -884,15 +885,7 @@ sky130::diode_check $parameters } -proc sky130::sky130_fd_pr__pd2nw_05v5_check {parameters} { - sky130::diode_check $parameters -} - -proc sky130::sky130_fd_pr__pd2nw_05v5_lvt_check {parameters} { - sky130::diode_check $parameters -} - -proc sky130::sky130_fd_pr__pd2nw_11v0_check {parameters} { +proc sky130::sky130_fd_pr__diode_pw2nd_05v5_nvt_check {parameters} { sky130::diode_check $parameters } @@ -900,11 +893,19 @@ sky130::diode_check $parameters } -proc sky130::sky130_fd_pr__diode_pw2nd_05v5_nvt_check {parameters} { +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_check {parameters} { sky130::diode_check $parameters } -proc sky130::sky130_fd_pr__pd2nw_11v0_check {parameters} { +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_lvt_check {parameters} { + sky130::diode_check $parameters +} + +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_hvt_check {parameters} { + sky130::diode_check $parameters +} + +proc sky130::sky130_fd_pr__diode_pd2nw_11v0_check {parameters} { sky130::diode_check $parameters } @@ -1118,7 +1119,8 @@ #---------------------------------------------------------------- # NOTE: Use ppd instead of psd so that there is additional # diffusion around the contact, allowing more space for the -# implant (likewise sky130_fd_pr__pd2nw_05v5_lvt and sky130_fd_pr__pd2nw_11v0). +# implant (likewise sky130_fd_pr__diode_pd2nw_05v5_lvt and +# sky130_fd_pr__diode_pd2nw_11v0). proc sky130::sky130_fd_pr__diode_pw2nd_05v5_lvt_draw {parameters} { @@ -1142,9 +1144,55 @@ return [sky130::diode_draw $drawdict] } +proc sky130::sky130_fd_pr__diode_pw2nd_05v5_nvt_draw {parameters} { + + # Set a local variable for each rule in ruleset + foreach key [dict keys $sky130::ruleset] { + set $key [dict get $sky130::ruleset $key] + } + + set newdict [dict create \ + dev_type nndiode \ + dev_contact_type nndic \ + end_type mvpsd \ + end_contact_type mvpsc \ + end_sub_type psub \ + dev_spacing 0.37 \ + dev_surround ${diff_surround} \ + end_spacing 0.30 \ + end_surround ${diff_surround} \ + ] + set drawdict [dict merge $sky130::ruleset $newdict $parameters] + return [sky130::diode_draw $drawdict] +} + +proc sky130::sky130_fd_pr__diode_pw2nd_11v0_draw {parameters} { + + # Set a local variable for each rule in ruleset + foreach key [dict keys $sky130::ruleset] { + set $key [dict get $sky130::ruleset $key] + } + + set newdict [dict create \ + dev_type mvndiode \ + dev_contact_type mvndic \ + end_type mvpsd \ + end_contact_type mvpsc \ + end_sub_type psub \ + diff_spacing 0.37 \ + dev_spacing 0.39 \ + dev_surround ${diff_surround} \ + end_spacing 0.36 \ + end_surround ${diff_surround} \ + ] + set drawdict [dict merge $sky130::ruleset $newdict $parameters] + return [sky130::diode_draw $drawdict] +} + + #---------------------------------------------------------------- -proc sky130::sky130_fd_pr__pd2nw_05v5_draw {parameters} { +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_draw {parameters} { # Set a local variable for each rule in ruleset foreach key [dict keys $sky130::ruleset] { @@ -1172,7 +1220,7 @@ #---------------------------------------------------------------- -proc sky130::sky130_fd_pr__pd2nw_05v5_lvt_draw {parameters} { +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_lvt_draw {parameters} { # Set a local variable for each rule in ruleset foreach key [dict keys $sky130::ruleset] { @@ -1200,7 +1248,7 @@ #---------------------------------------------------------------- -proc sky130::sky130_fd_pr__pd2nw_11v0_draw {parameters} { +proc sky130::sky130_fd_pr__diode_pd2nw_05v5_hvt_draw {parameters} { # Set a local variable for each rule in ruleset foreach key [dict keys $sky130::ruleset] { @@ -1226,58 +1274,10 @@ return [sky130::diode_draw $drawdict] } -#---------------------------------------------------------------- - -proc sky130::sky130_fd_pr__diode_pw2nd_11v0_draw {parameters} { - - # Set a local variable for each rule in ruleset - foreach key [dict keys $sky130::ruleset] { - set $key [dict get $sky130::ruleset $key] - } - - set newdict [dict create \ - dev_type mvndiode \ - dev_contact_type mvndic \ - end_type mvpsd \ - end_contact_type mvpsc \ - end_sub_type psub \ - diff_spacing 0.37 \ - dev_spacing 0.39 \ - dev_surround ${diff_surround} \ - end_spacing 0.36 \ - end_surround ${diff_surround} \ - ] - set drawdict [dict merge $sky130::ruleset $newdict $parameters] - return [sky130::diode_draw $drawdict] -} - - -proc sky130::sky130_fd_pr__diode_pw2nd_05v5_nvt_draw {parameters} { - - # Set a local variable for each rule in ruleset - foreach key [dict keys $sky130::ruleset] { - set $key [dict get $sky130::ruleset $key] - } - - set newdict [dict create \ - dev_type nndiode \ - dev_contact_type nndic \ - end_type mvpsd \ - end_contact_type mvpsc \ - end_sub_type psub \ - dev_spacing 0.37 \ - dev_surround ${diff_surround} \ - end_spacing 0.30 \ - end_surround ${diff_surround} \ - ] - set drawdict [dict merge $sky130::ruleset $newdict $parameters] - return [sky130::diode_draw $drawdict] -} - #---------------------------------------------------------------- -proc sky130::sky130_fd_pr__pd2nw_11v0_draw {parameters} { +proc sky130::sky130_fd_pr__diode_pd2nw_11v0_draw {parameters} { # Set a local variable for each rule in ruleset foreach key [dict keys $sky130::ruleset] {
diff --git a/sky130/magic/sky130.tech b/sky130/magic/sky130.tech index e9d0b99..966123e 100644 --- a/sky130/magic/sky130.tech +++ b/sky130/magic/sky130.tech
@@ -57,13 +57,13 @@ # sky130_fd_pr__nfet_g5v0d10v5 mvnfet thickox nFET # sky130_fd_pr__nfet_01v8_nvt mvnnfet thickox native nFET # sky130_fd_pr__diode_pw2nd_05v5 ndiode n+ diff diode +# sky130_fd_pr__diode_pw2nd_05v5_lvt ndiodelvt low Vt n+ diff diode +# sky130_fd_pr__diode_pw2nd_05v5_nvt nndiode diode with nndiff # sky130_fd_pr__diode_pw2nd_11v0 mvndiode thickox n+ diff diode # sky130_fd_pr__diode_pd2nw_05v5 pdiode p+ diff diode +# sky130_fd_pr__diode_pd2nw_05v5_lvt pdiodelvt low Vt p+ diff diode +# sky130_fd_pr__diode_pd2nw_05v5_hvt pdiodehvt high Vt p+ diff diode # sky130_fd_pr__diode_pd2nw_11v0 mvpdiode thickox p+ diff diode -# sky130_fd_pr__diode_pw2nd_nvt nndiode diode with nndiff -# sky130_fd_pr__diode_pw2nd_lvt ndiodelvt low Vt n+ diff diode -# sky130_fd_pr__diode_pd2nw_lvt pdiodelvt low Vt p+ diff diode -# sky130_fd_pr__diode_pd2nw_hvt pdiodehvt high Vt p+ diff diode # sky130_fd_pr__npn_05v0 pbase NPN in deep nwell # sky130_fd_pr__npn_11v0 pbase thick oxide gated NPN # sky130_fd_pr__pnp_05v0 nbase PNP @@ -6200,22 +6200,22 @@ device subcircuit sky130_fd_pr__diode_pd2nw_05v5 *pdiode \ nwell a=area - device msubcircuit sky130_fd_pr__diode_pw2nd_05v5 *ndiode \ - pwell,space/w a=area + device subcircuit sky130_fd_pr__diode_pd2nw_05v5_lvt *pdiodelvt \ + nwell a=area + device subcircuit sky130_fd_pr_diode_pd2nw_05v5_hvt *pdiodehvt \ + nwell a=area device subcircuit sky130_fd_pr__diode_pd2nw_11v0 *mvpdiode \ nwell a=area + + device msubcircuit sky130_fd_pr__diode_pw2nd_05v5 *ndiode \ + pwell,space/w a=area + device msubcircuit sky130_fd_pr__diode_pw2nd_05v5_lvt *ndiodelvt \ + pwell,space/w a=area + device msubcircuit sky130_fd_pr__diode_pw2nd_05v5_nvt *nndiode \ + pwell,space/w a=area device msubcircuit sky130_fd_pr__diode_pw2nd_11v0 *mvndiode \ pwell,space/w a=area - # These are parasitic devices - device msubcircuit sky130_fd_pr__diode_pw2nd_lvt *ndiodelvt \ - pwell,space/w a=area - device subcircuit sky130_fd_pr__diode_pd2nw_lvt *pdiodelvt \ - nwell a=area - device subcircuit sky130_fd_pr_diode_pd2nw_hvt *pdiodehvt \ - nwell a=area - device msubcircuit sky130_fd_pr__diode_pw2nd_nvt *nndiode \ - pwell,space/w a=area #ifdef MIM device csubcircuit sky130_fd_pr__cap_mim_m3_1 *mimcap *m3 w=w l=l @@ -6283,16 +6283,15 @@ device resistor mrdp_hv mvpdiffres *mvpdiff device resistor sky130_fd_pr__res_iso_pw rpw pwell - device pdiode sky130_fd_pr__diode_pd2nw_05v5 *pdiode nwell a=area device ndiode sky130_fd_pr__diode_pw2nd_05v5 *ndiode pwell,space/w a=area - device pdiode sky130_fd_pr__diode_pd2nw_11v0 *mvpdiode nwell a=area + device ndiode sky130_fd_pr__diode_pw2nd_05v5_lvt *ndiodelvt pwell,space/w a=area + device ndiode sky130_fd_pr__diode_pw2nd_05v5_nvt *nndiode pwell,space/w a=area device ndiode sky130_fd_pr__diode_pw2nd_11v0 *mvndiode pwell,space/w a=area - # These are parasitic devices - device ndiode sky130_fd_pr__diode_pw2nd_05v5_lvt *ndiodelvt pwell,space/w a=area + device pdiode sky130_fd_pr__diode_pd2nw_05v5 *pdiode nwell a=area device pdiode sky130_fd_pr__diode_pd2nw_05v5_lvt *pdiodelvt nwell a=area device pdiode sky130_fd_pr__diode_pd2nw_05v5_hvt *pdiodehvt nwell a=area - device ndiode sky130_fd_pr__diode_pw2nd_05v5_nvt *nndiode pwell,space/w a=area + device pdiode sky130_fd_pr__diode_pd2nw_11v0 *mvpdiode nwell a=area device bjt sky130_fd_pr__npn_05v5 npn dnwell *ndiff space/w error a2=area device bjt sky130_fd_pr__pnp_05v5 pnp pwell,space/w *pdiff a2=area