Corrections to the device generation script and magic techfile to support the specific-width xhrpoly and uhrpoly devices.
diff --git a/sky130/magic/sky130.tcl b/sky130/magic/sky130.tcl index bf66b4f..c97d9a9 100644 --- a/sky130/magic/sky130.tcl +++ b/sky130/magic/sky130.tcl
@@ -175,9 +175,9 @@ magic::add_toolkit_command $layoutframe "mrp1 - 48.2 Ohm/sq" \ "magic::gencell sky130::mrp1" pdk2 - magic::add_toolkit_command $layoutframe "xhrpoly - 319.8 Ohm/sq" \ + magic::add_toolkit_command $layoutframe "xhrpoly_0p35 - 319.8 Ohm/sq" \ "magic::gencell sky130::xhrpoly" pdk2 - magic::add_toolkit_command $layoutframe "uhrpoly - 2000 Ohm/sq" \ + magic::add_toolkit_command $layoutframe "uhrpoly_0p35 - 2000 Ohm/sq" \ "magic::gencell sky130::uhrpoly" pdk2 magic::add_toolkit_command $layoutframe "xpwres - 3050 Ohm/sq" \ "magic::gencell sky130::xpwres" pdk2 @@ -2077,7 +2077,7 @@ proc sky130::xpwres_defaults {} { return {w 2.650 l 26.50 m 1 nx 1 wmin 2.650 lmin 26.50 \ rho 975 val 4875 dummy 0 dw 0.25 term 1.0 \ - endcov 100 full_metal 1} + guard 1 endcov 100 full_metal 1} } #---------------------------------------------------------------- @@ -2088,25 +2088,93 @@ proc sky130::mrp1_defaults {} { return {w 0.330 l 1.650 m 1 nx 1 wmin 0.330 lmin 1.650 \ rho 48.2 val 241 dummy 0 dw 0.0 term 0.0 \ - sterm 0.0 caplen 0.4 snake 0 \ + sterm 0.0 caplen 0.4 snake 0 guard 1 \ glc 1 grc 1 gtc 1 gbc 1 roverlap 0 endcov 100 \ full_metal 1} } # "term" is rho * 0.06, the distance between xpc edge and CONT. -proc sky130::xhrpoly_defaults {} { +proc sky130::xhrpoly_0p35_defaults {} { return {w 0.350 l 0.50 m 1 nx 1 wmin 0.350 lmin 0.50 \ rho 319.8 val 456.857 dummy 0 dw 0.0 term 19.188 \ - sterm 0.0 caplen 0 glc 1 grc 1 gtc 1 gbc 1 \ - full_metal 1} + sterm 0.0 caplen 0 guard 1 glc 1 grc 1 gtc 1 gbc 1 \ + compatible {xhrpoly_0p35 xhrpoly_0p69 xhrpoly_1p41 \ + xhrpoly_2p85 xhrpoly_5p73} \ + full_metal 1 wmax 0.350} +} +proc sky130::xhrpoly_0p69_defaults {} { + return {w 0.690 l 1.00 m 1 nx 1 wmin 0.690 lmin 0.50 \ + rho 319.8 val 463.480 dummy 0 dw 0.0 term 19.188 \ + sterm 0.0 caplen 0 guard 1 glc 1 grc 1 gtc 1 gbc 1 \ + compatible {xhrpoly_0p35 xhrpoly_0p69 xhrpoly_1p41 \ + xhrpoly_2p85 xhrpoly_5p73} \ + full_metal 1 wmax 0.690} +} +proc sky130::xhrpoly_1p41_defaults {} { + return {w 1.410 l 2.00 m 1 nx 1 wmin 1.410 lmin 0.50 \ + rho 319.8 val 453.620 dummy 0 dw 0.0 term 19.188 \ + sterm 0.0 caplen 0 guard 1 glc 1 grc 1 gtc 1 gbc 1 \ + compatible {xhrpoly_0p35 xhrpoly_0p69 xhrpoly_1p41 \ + xhrpoly_2p85 xhrpoly_5p73} \ + full_metal 1 wmax 1.410} +} +proc sky130::xhrpoly_2p85_defaults {} { + return {w 2.850 l 3.00 m 1 nx 1 wmin 2.850 lmin 0.50 \ + rho 319.8 val 336.630 dummy 0 dw 0.0 term 19.188 \ + sterm 0.0 caplen 0 guard 1 glc 1 grc 1 gtc 1 gbc 1 \ + compatible {xhrpoly_0p35 xhrpoly_0p69 xhrpoly_1p41 \ + xhrpoly_2p85 xhrpoly_5p73} \ + full_metal 1 wmax 2.850} +} +proc sky130::xhrpoly_5p73_defaults {} { + return {w 5.730 l 6.00 m 1 nx 1 wmin 5.730 lmin 0.50 \ + rho 319.8 val 334.870 dummy 0 dw 0.0 term 19.188 \ + sterm 0.0 caplen 0 guard 1 glc 1 grc 1 gtc 1 gbc 1 \ + compatible {xhrpoly_0p35 xhrpoly_0p69 xhrpoly_1p41 \ + xhrpoly_2p85 xhrpoly_5p73} \ + full_metal 1 wmax 5.730} } # "term" is rho * 0.06, the distance between xpc edge and CONT. -proc sky130::uhrpoly_defaults {} { +proc sky130::uhrpoly_0p35_defaults {} { return {w 0.350 l 0.50 m 1 nx 1 wmin 0.350 lmin 0.50 \ rho 2000 val 2875.143 dummy 0 dw 0.0 term 120 \ - sterm 0.0 caplen 0 \ - glc 1 grc 1 gtc 1 gbc 1 full_metal 1} + sterm 0.0 caplen 0 wmax 0.350 \ + guard 1 glc 1 grc 1 gtc 1 gbc 1 \ + compatible {uhrpoly_0p35 uhrpoly_0p69 uhrpoly_1p41 \ + uhrpoly_2p85 uhrpoly_5p73} full_metal 1} +} +proc sky130::uhrpoly_0p69_defaults {} { + return {w 0.690 l 1.00 m 1 nx 1 wmin 0.690 lmin 0.50 \ + rho 2000 val 2898.600 dummy 0 dw 0.0 term 120 \ + sterm 0.0 caplen 0 wmax 0.690 \ + guard 1 glc 1 grc 1 gtc 1 gbc 1 \ + compatible {uhrpoly_0p35 uhrpoly_0p69 uhrpoly_1p41 \ + uhrpoly_2p85 uhrpoly_5p73} full_metal 1} +} +proc sky130::uhrpoly_1p41_defaults {} { + return {w 1.410 l 2.00 m 1 nx 1 wmin 1.410 lmin 0.50 \ + rho 2000 val 2836.900 dummy 0 dw 0.0 term 120 \ + sterm 0.0 caplen 0 wmax 1.410 \ + guard 1 glc 1 grc 1 gtc 1 gbc 1 \ + compatible {uhrpoly_0p35 uhrpoly_0p69 uhrpoly_1p41 \ + uhrpoly_2p85 uhrpoly_5p73} full_metal 1} +} +proc sky130::uhrpoly_2p85_defaults {} { + return {w 2.850 l 3.00 m 1 nx 1 wmin 2.850 lmin 0.50 \ + rho 2000 val 2105.300 dummy 0 dw 0.0 term 120 \ + sterm 0.0 caplen 0 wmax 2.850 \ + guard 1 glc 1 grc 1 gtc 1 gbc 1 \ + compatible {uhrpoly_0p35 uhrpoly_0p69 uhrpoly_1p41 \ + uhrpoly_2p85 uhrpoly_5p73} full_metal 1} +} +proc sky130::uhrpoly_5p73_defaults {} { + return {w 5.730 l 6.00 m 1 nx 1 wmin 5.730 lmin 0.50 \ + rho 2000 val 2094.200 dummy 0 dw 0.0 term 120 \ + sterm 0.0 caplen 0 wmax 5.730 \ + guard 1 glc 1 grc 1 gtc 1 gbc 1 \ + compatible {uhrpoly_0p35 uhrpoly_0p69 uhrpoly_1p41 \ + uhrpoly_2p85 uhrpoly_5p73} full_metal 1} } #---------------------------------------------------------------- @@ -2117,7 +2185,7 @@ proc sky130::mrdn_defaults {} { return {w 0.420 l 2.100 m 1 nx 1 wmin 0.42 lmin 2.10 \ rho 120 val 600.0 dummy 0 dw 0.05 term 0.0 \ - sterm 0.0 caplen 0.4 snake 0 \ + sterm 0.0 caplen 0.4 snake 0 guard 1 \ glc 1 grc 1 gtc 1 gbc 1 roverlap 0 endcov 100 \ full_metal 1} } @@ -2125,7 +2193,7 @@ proc sky130::mrdn_hv_defaults {} { return {w 0.420 l 2.100 m 1 nx 1 wmin 0.42 lmin 2.10 \ rho 120 val 600.0 dummy 0 dw 0.02 term 0.0 \ - sterm 0.0 caplen 0.4 snake 0 \ + sterm 0.0 caplen 0.4 snake 0 guard 1 \ glc 1 grc 1 gtc 1 gbc 1 roverlap 0 endcov 100 \ full_metal 1} } @@ -2138,7 +2206,7 @@ proc sky130::mrdp_defaults {} { return {w 0.420 l 2.100 m 1 nx 1 wmin 0.42 lmin 2.10 \ rho 197 val 985.0 dummy 0 dw 0.02 term 0.0 \ - sterm 0.0 caplen 0.60 snake 0 \ + sterm 0.0 caplen 0.60 snake 0 guard 1 \ glc 1 grc 1 gtc 1 gbc 1 roverlap 0 endcov 100 \ full_metal 1} } @@ -2146,7 +2214,7 @@ proc sky130::mrdp_hv_defaults {} { return {w 0.420 l 2.100 m 1 nx 1 wmin 0.42 lmin 2.10 \ rho 197 val 985.0 dummy 0 dw 0.02 term 0.0 \ - sterm 0.0 caplen 0.60 snake 0 \ + sterm 0.0 caplen 0.60 snake 0 guard 1 \ glc 1 grc 1 gtc 1 gbc 1 roverlap 0 endcov 100 \ full_metal 1} } @@ -2244,11 +2312,35 @@ return [sky130::res_convert $parameters] } -proc sky130::xhrpoly_convert {parameters} { +proc sky130::xhrpoly_0p35_convert {parameters} { + return [sky130::res_convert $parameters] +} +proc sky130::xhrpoly_0p69_convert {parameters} { + return [sky130::res_convert $parameters] +} +proc sky130::xhrpoly_1p41_convert {parameters} { + return [sky130::res_convert $parameters] +} +proc sky130::xhrpoly_2p85_convert {parameters} { + return [sky130::res_convert $parameters] +} +proc sky130::xhrpoly_5p73_convert {parameters} { return [sky130::res_convert $parameters] } -proc sky130::uhrpoly_convert {parameters} { +proc sky130::uhrpoly_0p35_convert {parameters} { + return [sky130::res_convert $parameters] +} +proc sky130::uhrpoly_0p69_convert {parameters} { + return [sky130::res_convert $parameters] +} +proc sky130::uhrpoly_1p41_convert {parameters} { + return [sky130::res_convert $parameters] +} +proc sky130::uhrpoly_2p85_convert {parameters} { + return [sky130::res_convert $parameters] +} +proc sky130::uhrpoly_5p73_convert {parameters} { return [sky130::res_convert $parameters] } @@ -2314,6 +2406,11 @@ magic::add_entry endcov "End contact coverage (%)" $parameters } + if {[dict exists $parameters compatible]} { + set sellist [dict get $parameters compatible] + magic::add_selectlist gencell "Device type" $sellist $parameters $device + } + # magic::add_checkbox dummy "Add dummy" $parameters if {[dict exists $parameters snake]} { @@ -2326,22 +2423,24 @@ magic::add_checkbox roverlap "Overlap at ends" $parameters } } - magic::add_checkbox guard "Add guard ring" $parameters + if {[dict exists $parameters guard]} { + magic::add_checkbox guard "Add guard ring" $parameters - if {[dict exists $parameters full_metal]} { - magic::add_checkbox full_metal "Full metal guard ring" $parameters - } - if {[dict exists $parameters glc]} { - magic::add_checkbox glc "Add left guard ring contact" $parameters - } - if {[dict exists $parameters grc]} { - magic::add_checkbox grc "Add right guard ring contact" $parameters - } - if {[dict exists $parameters gtc]} { - magic::add_checkbox gtc "Add top guard ring contact" $parameters - } - if {[dict exists $parameters gbc]} { - magic::add_checkbox gbc "Add bottom guard ring contact" $parameters + if {[dict exists $parameters full_metal]} { + magic::add_checkbox full_metal "Full metal guard ring" $parameters + } + if {[dict exists $parameters glc]} { + magic::add_checkbox glc "Add left guard ring contact" $parameters + } + if {[dict exists $parameters grc]} { + magic::add_checkbox grc "Add right guard ring contact" $parameters + } + if {[dict exists $parameters gtc]} { + magic::add_checkbox gtc "Add top guard ring contact" $parameters + } + if {[dict exists $parameters gbc]} { + magic::add_checkbox gbc "Add bottom guard ring contact" $parameters + } } if {[dict exists $parameters snake]} { @@ -2361,12 +2460,36 @@ sky130::res_dialog mrp1 $parameters } -proc sky130::xhrpoly_dialog {parameters} { - sky130::res_dialog xhrpoly $parameters +proc sky130::xhrpoly_0p35_dialog {parameters} { + sky130::res_dialog xhrpoly_0p35 $parameters +} +proc sky130::xhrpoly_0p69_dialog {parameters} { + sky130::res_dialog xhrpoly_0p69 $parameters +} +proc sky130::xhrpoly_1p41_dialog {parameters} { + sky130::res_dialog xhrpoly_1p41 $parameters +} +proc sky130::xhrpoly_2p85_dialog {parameters} { + sky130::res_dialog xhrpoly_2p85 $parameters +} +proc sky130::xhrpoly_5p73_dialog {parameters} { + sky130::res_dialog xhrpoly_5p73 $parameters } -proc sky130::uhrpoly_dialog {parameters} { - sky130::res_dialog uhrpoly $parameters +proc sky130::uhrpoly_0p35_dialog {parameters} { + sky130::res_dialog uhrpoly_0p35 $parameters +} +proc sky130::uhrpoly_0p69_dialog {parameters} { + sky130::res_dialog uhrpoly_0p69 $parameters +} +proc sky130::uhrpoly_1p41_dialog {parameters} { + sky130::res_dialog uhrpoly_1p41 $parameters +} +proc sky130::uhrpoly_2p85_dialog {parameters} { + sky130::res_dialog uhrpoly_2p85 $parameters +} +proc sky130::uhrpoly_5p73_dialog {parameters} { + sky130::res_dialog uhrpoly_5p73 $parameters } proc sky130::mrdn_dialog {parameters} { @@ -2424,6 +2547,7 @@ set well_res_overlap 0 ;# not a well resistor set end_contact_type "" ;# no contacts for metal resistors set end_overlap_cont 0 ;# additional end overlap on sides + set res_idtype none # Set a local variable for each parameter (e.g., $l, $w, etc.) foreach key [dict keys $parameters] { @@ -2465,6 +2589,10 @@ erase ${end_type} } paint ${res_type} + if {"$res_idtype" != "none"} { + box grow c 2 + paint ${res_idtype} + } popbox # Reduce contact sizes by (end type) surround so that @@ -2740,10 +2868,12 @@ # Set defaults if they are not in parameters set snake 0 ;# some resistors don't allow snake geometry set roverlap 0 ;# overlap resistors at contacts - set guard 1 ;# draw a guard ring + set guard 0 ;# draw a guard ring set plus_diff_type nsd ;# guard ring diffusion type set overlap_compress 0 ;# special Y distance compression set well_res_overlap 0 ;# additional well extension behind contact + set res_diff_spacing 0 ;# spacing from resistor to diffusion + set res_idtype none # Set a local variable for each parameter (e.g., $l, $w, etc.) foreach key [dict keys $parameters] { @@ -2880,7 +3010,7 @@ #---------------------------------------------------------------- -proc sky130::xhrpoly_draw {parameters} { +proc sky130::xhrpoly_0p35_draw {parameters} { # Set a local variable for each rule in ruleset foreach key [dict keys $sky130::ruleset] { @@ -2889,6 +3019,127 @@ set newdict [dict create \ res_type ppres \ + res_idtype res0p35 \ + end_type xpc \ + end_contact_type xpc \ + end_contact_size 0 \ + plus_diff_type psd \ + plus_contact_type psc \ + sub_type psub \ + end_surround $poly_surround \ + end_spacing 0.48 \ + end_to_end_space 0.52 \ + end_contact_size 0.19 \ + res_to_endcont 1.985 \ + res_spacing 1.24 \ + res_diff_spacing 0.48 \ + mask_clearance 0.52 \ + overlap_compress 0.36 \ + ] + set drawdict [dict merge $sky130::ruleset $newdict $parameters] + return [sky130::res_draw $drawdict] +} + +proc sky130::xhrpoly_0p69_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 \ + res_type ppres \ + res_idtype res0p69 \ + end_type xpc \ + end_contact_type xpc \ + end_contact_size 0 \ + plus_diff_type psd \ + plus_contact_type psc \ + sub_type psub \ + end_surround $poly_surround \ + end_spacing 0.48 \ + end_to_end_space 0.52 \ + end_contact_size 0.19 \ + res_to_endcont 1.985 \ + res_spacing 1.24 \ + res_diff_spacing 0.48 \ + mask_clearance 0.52 \ + overlap_compress 0.36 \ + ] + set drawdict [dict merge $sky130::ruleset $newdict $parameters] + return [sky130::res_draw $drawdict] +} + +proc sky130::xhrpoly_1p41_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 \ + res_type ppres \ + res_idtype res1p41 \ + end_type xpc \ + end_contact_type xpc \ + end_contact_size 0 \ + plus_diff_type psd \ + plus_contact_type psc \ + sub_type psub \ + end_surround $poly_surround \ + end_spacing 0.48 \ + end_to_end_space 0.52 \ + end_contact_size 0.19 \ + res_to_endcont 1.985 \ + res_spacing 1.24 \ + res_diff_spacing 0.48 \ + mask_clearance 0.52 \ + overlap_compress 0.36 \ + ] + set drawdict [dict merge $sky130::ruleset $newdict $parameters] + return [sky130::res_draw $drawdict] +} + +proc sky130::xhrpoly_2p85_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 \ + res_type ppres \ + res_idtype res2p85 \ + end_type xpc \ + end_contact_type xpc \ + end_contact_size 0 \ + plus_diff_type psd \ + plus_contact_type psc \ + sub_type psub \ + end_surround $poly_surround \ + end_spacing 0.48 \ + end_to_end_space 0.52 \ + end_contact_size 0.19 \ + res_to_endcont 1.985 \ + res_spacing 1.24 \ + res_diff_spacing 0.48 \ + mask_clearance 0.52 \ + overlap_compress 0.36 \ + ] + set drawdict [dict merge $sky130::ruleset $newdict $parameters] + return [sky130::res_draw $drawdict] +} + +proc sky130::xhrpoly_5p73_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 \ + res_type ppres \ + res_idtype res5p73 \ end_type xpc \ end_contact_type xpc \ end_contact_size 0 \ @@ -2911,7 +3162,7 @@ #---------------------------------------------------------------- -proc sky130::uhrpoly_draw {parameters} { +proc sky130::uhrpoly_0p35_draw {parameters} { # Set a local variable for each rule in ruleset foreach key [dict keys $sky130::ruleset] { @@ -2920,6 +3171,127 @@ set newdict [dict create \ res_type xpres \ + res_idtype res0p35 \ + end_type xpc \ + end_contact_type xpc \ + end_contact_size 0 \ + plus_diff_type psd \ + plus_contact_type psc \ + sub_type psub \ + end_surround $poly_surround \ + end_spacing 0.48 \ + end_to_end_space 0.52 \ + end_contact_size 0.19 \ + res_to_endcont 1.985 \ + res_spacing 1.24 \ + res_diff_spacing 0.48 \ + mask_clearance 0.52 \ + overlap_compress 0.36 \ + ] + set drawdict [dict merge $sky130::ruleset $newdict $parameters] + return [sky130::res_draw $drawdict] +} + +proc sky130::uhrpoly_0p69_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 \ + res_type xpres \ + res_idtype res0p69 \ + end_type xpc \ + end_contact_type xpc \ + end_contact_size 0 \ + plus_diff_type psd \ + plus_contact_type psc \ + sub_type psub \ + end_surround $poly_surround \ + end_spacing 0.48 \ + end_to_end_space 0.52 \ + end_contact_size 0.19 \ + res_to_endcont 1.985 \ + res_spacing 1.24 \ + res_diff_spacing 0.48 \ + mask_clearance 0.52 \ + overlap_compress 0.36 \ + ] + set drawdict [dict merge $sky130::ruleset $newdict $parameters] + return [sky130::res_draw $drawdict] +} + +proc sky130::uhrpoly_1p41_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 \ + res_type xpres \ + res_idtype res1p41 \ + end_type xpc \ + end_contact_type xpc \ + end_contact_size 0 \ + plus_diff_type psd \ + plus_contact_type psc \ + sub_type psub \ + end_surround $poly_surround \ + end_spacing 0.48 \ + end_to_end_space 0.52 \ + end_contact_size 0.19 \ + res_to_endcont 1.985 \ + res_spacing 1.24 \ + res_diff_spacing 0.48 \ + mask_clearance 0.52 \ + overlap_compress 0.36 \ + ] + set drawdict [dict merge $sky130::ruleset $newdict $parameters] + return [sky130::res_draw $drawdict] +} + +proc sky130::uhrpoly_2p85_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 \ + res_type xpres \ + res_idtype res2p85 \ + end_type xpc \ + end_contact_type xpc \ + end_contact_size 0 \ + plus_diff_type psd \ + plus_contact_type psc \ + sub_type psub \ + end_surround $poly_surround \ + end_spacing 0.48 \ + end_to_end_space 0.52 \ + end_contact_size 0.19 \ + res_to_endcont 1.985 \ + res_spacing 1.24 \ + res_diff_spacing 0.48 \ + mask_clearance 0.52 \ + overlap_compress 0.36 \ + ] + set drawdict [dict merge $sky130::ruleset $newdict $parameters] + return [sky130::res_draw $drawdict] +} + +proc sky130::uhrpoly_5p73_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 \ + res_type xpres \ + res_idtype res5p73 \ end_type xpc \ end_contact_type xpc \ end_contact_size 0 \ @@ -3259,6 +3631,7 @@ set snake 0 set sterm 0.0 set caplen 0 + set wmax 0 foreach key [dict keys $parameters] { set $key [dict get $parameters $key] @@ -3288,6 +3661,11 @@ puts stderr "Resistor width must be >= $wmin um" dict set parameters w $wmin } + if {$wmax > 0 && $w > $wmax} { + puts stderr "Resistor width must be <= $wmax um" + dict set parameters w $wmax + } + # Val and W specified - no L if {$l == 0} { set l [expr ($w - $dw) * $val / $rho] @@ -3380,12 +3758,36 @@ return [sky130::res_check mrp1 $parameters] } -proc sky130::xhrpoly_check {parameters} { - return [sky130::res_check xhrpoly $parameters] +proc sky130::xhrpoly_0p35_check {parameters} { + return [sky130::res_check xhrpoly_0p35 $parameters] +} +proc sky130::xhrpoly_0p69_check {parameters} { + return [sky130::res_check xhrpoly_0p69 $parameters] +} +proc sky130::xhrpoly_1p41_check {parameters} { + return [sky130::res_check xhrpoly_1p41 $parameters] +} +proc sky130::xhrpoly_2p85_check {parameters} { + return [sky130::res_check xhrpoly_2p85 $parameters] +} +proc sky130::xhrpoly_5p73_check {parameters} { + return [sky130::res_check xhrpoly_5p73 $parameters] } -proc sky130::uhrpoly_check {parameters} { - return [sky130::res_check uhrpoly $parameters] +proc sky130::uhrpoly_0p35_check {parameters} { + return [sky130::res_check uhrpoly_0p35 $parameters] +} +proc sky130::uhrpoly_0p69_check {parameters} { + return [sky130::res_check uhrpoly_0p69 $parameters] +} +proc sky130::uhrpoly_1p41_check {parameters} { + return [sky130::res_check uhrpoly_1p41 $parameters] +} +proc sky130::uhrpoly_2p85_check {parameters} { + return [sky130::res_check uhrpoly_2p85 $parameters] +} +proc sky130::uhrpoly_5p73_check {parameters} { + return [sky130::res_check uhrpoly_5p73 $parameters] } proc sky130::mrdn_check {parameters} {
diff --git a/sky130/magic/sky130.tech b/sky130/magic/sky130.tech index 1e2861d..ee75912 100644 --- a/sky130/magic/sky130.tech +++ b/sky130/magic/sky130.tech
@@ -303,6 +303,12 @@ -block fillblock -comment comment -comment obscomment +# fixed resistor width identifiers + -comment res0p35 + -comment res0p69 + -comment res1p41 + -comment res2p85 + -comment res5p73 end @@ -354,6 +360,12 @@ padl m1 m2 m3 glass #endif (!METAL5) + res0p35 implant1 + res0p69 implant1 + res1p41 implant1 + res2p85 implant1 + res5p73 implant1 + #ifdef REDISTRIBUTION mrdlc metal5 mrdl #endif (REDISTRIBUTION) @@ -4333,8 +4345,19 @@ device rsubcircuit short rm5 *m5 space/w,pwell,nwell error l=l w=w #endif (METAL5) + device rsubcircuit xhrpoly_0p35 xhrpoly xpc pwell,space/w error +res0p35 l=l w=w + device rsubcircuit xhrpoly_0p69 xhrpoly xpc pwell,space/w error +res0p69 l=l w=w + device rsubcircuit xhrpoly_1p41 xhrpoly xpc pwell,space/w error +res1p41 l=l w=w + device rsubcircuit xhrpoly_2p85 xhrpoly xpc pwell,space/w error +res2p85 l=l w=w + device rsubcircuit xhrpoly_5p73 xhrpoly xpc pwell,space/w error +res5p73 l=l w=w device rsubcircuit xhrpoly xhrpoly xpc pwell,space/w error l=l w=w + device rsubcircuit uhrpoly_0p35 uhrpoly xpc pwell,space/w error +res0p35 l=l w=w + device rsubcircuit uhrpoly_0p69 uhrpoly xpc pwell,space/w error +res0p69 l=l w=w + device rsubcircuit uhrpoly_1p41 uhrpoly xpc pwell,space/w error +res1p41 l=l w=w + device rsubcircuit uhrpoly_2p85 uhrpoly xpc pwell,space/w error +res2p85 l=l w=w + device rsubcircuit uhrpoly_5p73 uhrpoly xpc pwell,space/w error +res5p73 l=l w=w device rsubcircuit uhrpoly uhrpoly xpc pwell,space/w error l=l w=w + device rsubcircuit mrp1 mrp1 *poly pwell,space/w error l=l w=w device rsubcircuit mrdn ndiffres *ndiff pwell,space/w error l=l w=w @@ -4390,7 +4413,17 @@ device resistor short rm5 *m5 #endif (METAL5) + device resistor xhrpoly_0p35 xhrpoly xpc +res0p35 + device resistor xhrpoly_0p69 xhrpoly xpc +res0p69 + device resistor xhrpoly_1p41 xhrpoly xpc +res1p41 + device resistor xhrpoly_2p85 xhrpoly xpc +res2p85 + device resistor xhrpoly_5p73 xhrpoly xpc +res5p73 device resistor xhrpoly xhrpoly xpc + device resistor uhrpoly_0p35 uhrpoly xpc +res0p35 + device resistor uhrpoly_0p69 uhrpoly xpc +res0p69 + device resistor uhrpoly_1p41 uhrpoly xpc +res1p41 + device resistor uhrpoly_2p85 uhrpoly xpc +res2p85 + device resistor uhrpoly_5p73 uhrpoly xpc +res5p73 device resistor uhrpoly uhrpoly xpc device resistor mrp1 mrp1 *poly device resistor mrdn ndiffres *ndiff @@ -4430,11 +4463,11 @@ scalefactor 10 contact lic 170 li 0 0 m1 30 60 - contact v1 260 m1 0 30 m2 0 30 + contact v1 260 m1 0 30 m2 0 30 contact v2 280 m2 0 45 m3 25 0 #ifdef METAL5 contact v3 320 m3 0 30 m4 5 5 - contact v4 1180 m4 0 m5 120 + contact v4 1180 m4 0 m5 120 #endif (METAL5) contact pc 170 poly 50 80 li 0 80