Added a "gate shield" option for varactors to place a metal1 plate above the device, connected between source and drain, to force matching (so that area is not filled with density fill shapes).
diff --git a/VERSION b/VERSION index 481e49e..35734c0 100644 --- a/VERSION +++ b/VERSION
@@ -1 +1 @@ -1.0.407 +1.0.408
diff --git a/sky130/magic/sky130.tcl b/sky130/magic/sky130.tcl index 03c9d34..57ee4ee 100644 --- a/sky130/magic/sky130.tcl +++ b/sky130/magic/sky130.tcl
@@ -5083,7 +5083,7 @@ compatible {sky130_fd_pr__cap_var_lvt \ sky130_fd_pr__cap_var_hvt sky130_fd_pr__cap_var} \ full_metal 1 viasrc 100 viadrn 100 viagate 100 \ - viagb 0 viagr 0 viagl 0 viagt 0} + viagb 0 viagr 0 viagl 0 viagt 0 gshield 1} } proc sky130::sky130_fd_pr__cap_var_hvt_defaults {} { @@ -5093,7 +5093,7 @@ compatible {sky130_fd_pr__cap_var_lvt \ sky130_fd_pr__cap_var_hvt sky130_fd_pr__cap_var} \ full_metal 1 viasrc 100 viadrn 100 viagate 100 \ - viagb 0 viagr 0 viagl 0 viagt 0} + viagb 0 viagr 0 viagl 0 viagt 0 gshield 1} } proc sky130::sky130_fd_pr__cap_var_defaults {} { @@ -5103,7 +5103,7 @@ compatible {sky130_fd_pr__cap_var_lvt \ sky130_fd_pr__cap_var_hvt sky130_fd_pr__cap_var} \ full_metal 1 viasrc 100 viadrn 100 viagate 100 \ - viagb 0 viagr 0 viagl 0 viagt 0} + viagb 0 viagr 0 viagl 0 viagt 0 gshield 1} } #---------------------------------------------------------------- @@ -5221,6 +5221,9 @@ magic::add_selectlist gencell "Device type" $sellist $parameters $device } + # Default-empty message area, used by the varactor dialog. + magic::add_message minfo "" $parameters brown + magic::add_entry diffcov "Diffusion contact coverage (%)" $parameters magic::add_entry polycov "Poly contact coverage (%)" $parameters magic::add_entry rlcov "Guard ring contact coverage (%)" $parameters @@ -5244,6 +5247,10 @@ magic::add_checkbox gtc "Add top guard ring contact" $parameters } + if {[string first "cap_var" $device] != -1} { + magic::add_checkbox gshield "Metal shield over gate" $parameters + } + magic::add_entry viasrc "Source via coverage \[+/-\](%)" $parameters magic::add_entry viadrn "Drain via coverage \[+/-\](%)" $parameters magic::add_entry viagate "Gate via coverage \[+/-\](%)" $parameters @@ -5731,6 +5738,7 @@ set dev_sub_dist 0 ;# device substrate distance (if nondefault dev_sub_type) set min_effl 0 ;# gate length below which finger pitch must be stretched set diff_overlap_cont 0 ;# extra overlap of end contact by diffusion + set gshield 0 ;# no metal shield over gate (used for varactors) # Set a local variable for each parameter (e.g., $l, $w, etc.) foreach key [dict keys $parameters] { @@ -5918,6 +5926,27 @@ ${diff_type} ${diff_contact_type} li vert]] set diffarea $cext popbox + # Gate shield (only on varactors) + if {$gshield == 1} { + pushbox + box move w ${he}um + box move w ${gate_to_diffcont}um + box width [* 2 [+ ${he} ${gate_to_diffcont}]]um + box grow n [/ $cdwfull 2]um + box grow s [/ $cdwfull 2]um + paint m1 + # Enforce slotting of large metal + set gsh [magic::i2u [box height]] + if {$gsh > 25} { + box move n [/ $gsh 2]um + box move s 1.15um + box height 2.3um ;# Minimum m1 slot width + box grow w -${via_size}um + box grow e -${via_size}um + erase m1 + } + popbox + } # Top poly contact if {$topc} { pushbox @@ -6675,6 +6704,15 @@ dict set parameters nf $nf } + # Used by varactor only + if {$device == "sky130_fd_pr__cap_var"} { + # NOTE: Removed until update behavior is fixed. + # set magic::minfo_val "Warning: No model exists for this device!" + set magic::minfo_val "" + } else { + set magic::minfo_val "" + } + return $parameters }