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
}