| #--------------------------------------- |
| # Torture test generator for EFS8 |
| # (Specifically for EFS8B) |
| # (work in progress) |
| #--------------------------------------- |
| |
| namespace path {::tcl::mathop ::tcl::mathfunc} |
| |
| # Set random seed so that torture test is not random from run to run. |
| srand 1234567 |
| |
| # NxN array MOSFET devices |
| |
| proc mos_array {n devname startx starty {deltax 12700} {deltay 254}} { |
| suspendall |
| box position $startx $starty |
| set i 0 |
| for {set x 0} {$x < $n} {incr x} { |
| for {set y 0} {$y < $n} {incr y} { |
| |
| set r [int [* [rand] 20]] |
| set w [+ 0.22 [* 0.5 $r]] |
| set r [int [* [rand] 20]] |
| set l [+ 0.18 [* 0.3 $r]] |
| set m [int [+ 1 [* [rand] 8]]] |
| set nf [int [+ 1 [* [rand] 8]]] |
| |
| set r [int [* [rand] 8]] |
| set dcov [+ 20 [* 10 $r]] |
| set r [int [* [rand] 8]] |
| set pcov [+ 20 [* 10 $r]] |
| set r [int [* [rand] 8]] |
| set rlcov [+ 20 [* 10 $r]] |
| |
| if {[rand] > 0.5} {set pov 1} else {set pov 0} |
| if {[rand] > 0.5} {set dov 1} else {set dov 0} |
| if {[rand] > 0.5} {set tc 1} else {set tc 0} |
| if {[rand] > 0.5} {set bc 1} else {set bc 0} |
| if {[rand] > 0.5} {set fm 1} else {set fm 0} |
| if {[rand] > 0.5} {set gl 1} else {set gl 0} |
| if {[rand] > 0.5} {set gr 1} else {set gr 0} |
| if {[rand] > 0.5} {set gt 1} else {set gt 0} |
| if {[rand] > 0.5} {set gb 1} else {set gb 0} |
| |
| magic::gencell sky130::${devname} ${devname}_$i \ |
| w $w l $l m $m nf $nf diffcov $dcov polycov $pcov \ |
| rlcov $rlcov poverlap $pov doverlap $dov topc $tc \ |
| botc $bc full_metal $fm glc $gl grc $gr gbc $gb gtc $gt |
| select cell ${devname}_$i |
| set bh [box height] |
| set bh [+ $bh $deltay] |
| box move n $bh |
| incr i |
| } |
| set bp [box position] |
| set bpx [lindex $bp 0] |
| box position $bpx $starty |
| box move e $deltax |
| } |
| resumeall |
| } |
| |
| # NxN array resistor devices |
| |
| proc sky130_fd_pr__res_array {n devname startx starty {deltax 12700} {deltay 254}} { |
| suspendall |
| box position $startx $starty |
| set i 0 |
| for {set x 0} {$x < $n} {incr x} { |
| for {set y 0} {$y < $n} {incr y} { |
| |
| set r [int [* [rand] 10]] |
| set w [+ 0.42 [* 0.5 $r]] |
| set r [int [* [rand] 50]] |
| set l [+ 2.10 [* 2.0 $r]] |
| set m [int [+ 1 [* [rand] 2]]] |
| set nx [int [+ 1 [* [rand] 10]]] |
| |
| set r [int [* [rand] 8]] |
| set ecov [+ 20 [* 10 $r]] |
| |
| if {[rand] > 0.5} {set rov 1} else {set rov 0} |
| if {[rand] > 0.5} {set sn 1} else {set sn 0} |
| if {[rand] > 0.5} {set fm 1} else {set fm 0} |
| if {[rand] > 0.5} {set gl 1} else {set gl 0} |
| if {[rand] > 0.5} {set gr 1} else {set gr 0} |
| if {[rand] > 0.5} {set gt 1} else {set gt 0} |
| if {[rand] > 0.5} {set gb 1} else {set gb 0} |
| |
| # Snake geometry does not apply to sky130_fd_pr_res_high_po, sky130_fd_pr__res_xhigh_po, and sky130_fd_pr__res_iso_pw, and |
| # roverlap and endcov are prohibited. |
| if {$devname == "sky130_fd_pr_res_high_po" || $devname == "res_xhigh_po" || $devname == "res_iso_pw"} { |
| magic::gencell sky130::${devname} ${devname}_$i \ |
| w $w l $l m $m nx $nx full_metal $fm \ |
| glc $gl grc $gr gbc $gb gtc $gt |
| } else { |
| magic::gencell sky130::${devname} ${devname}_$i \ |
| w $w l $l m $m nx $nx endcov $ecov roverlap $rov \ |
| snake $sn full_metal $fm glc $gl grc $gr gbc $gb gtc $gt |
| } |
| select cell ${devname}_$i |
| set bh [box height] |
| set bh [+ $bh $deltay] |
| box move n $bh |
| incr i |
| } |
| set bp [box position] |
| set bpx [lindex $bp 0] |
| box position $bpx $starty |
| box move e $deltax |
| } |
| resumeall |
| } |
| |
| # NxN array diode devices |
| |
| proc diode_array {n devname startx starty} { |
| suspendall |
| box position $startx $starty |
| set i 0 |
| for {set x 0} {$x < $n} {incr x} { |
| for {set y 0} {$y < $n} {incr y} { |
| |
| set r [int [* [rand] 10]] |
| set w [+ 0.42 [* 0.5 $r]] |
| set r [int [* [rand] 10]] |
| set l [+ 0.42 [* 0.5 $r]] |
| set nx [int [+ 1 [* [rand] 4]]] |
| set ny [int [+ 1 [* [rand] 4]]] |
| |
| if {[rand] > 0.5} {set dov 1} else {set dov 0} |
| if {[rand] > 0.5} {set el 1} else {set el 0} |
| if {[rand] > 0.5} {set er 1} else {set er 0} |
| if {[rand] > 0.5} {set et 1} else {set et 0} |
| if {[rand] > 0.5} {set eb 1} else {set eb 0} |
| if {[rand] > 0.5} {set fm 1} else {set fm 0} |
| if {[rand] > 0.5} {set gl 1} else {set gl 0} |
| if {[rand] > 0.5} {set gr 1} else {set gr 0} |
| if {[rand] > 0.5} {set gt 1} else {set gt 0} |
| if {[rand] > 0.5} {set gb 1} else {set gb 0} |
| |
| magic::gencell sky130::${devname} ${devname}_$i \ |
| w $w l $l nx $nx ny $ny doverlap $dov \ |
| full_metal $fm elc $el erc $er etc $et \ |
| ebc $eb glc $gl grc $gr gbc $gb gtc $gt |
| select cell ${devname}_$i |
| set bh [box height] |
| set bh [+ $bh 254] |
| box move n $bh |
| incr i |
| } |
| set bp [box position] |
| set bpx [lindex $bp 0] |
| box position $bpx $starty |
| box move e 12700 |
| } |
| resumeall |
| } |
| |
| # NxN array cap devices |
| |
| proc cap_array {n devname startx starty {deltax 12700} {deltay 160}} { |
| suspendall |
| box position $startx $starty |
| set i 0 |
| for {set x 0} {$x < $n} {incr x} { |
| for {set y 0} {$y < $n} {incr y} { |
| |
| set r [int [* [rand] 10]] |
| set w [+ 2.00 [* 1.0 $r]] |
| set r [int [* [rand] 10]] |
| set l [+ 2.00 [* 1.0 $r]] |
| set nx [int [+ 1 [* [rand] 4]]] |
| set ny [int [+ 1 [* [rand] 4]]] |
| |
| if {[rand] > 0.5} {set bc 1} else {set bc 0} |
| if {[rand] > 0.5} {set tc 1} else {set tc 0} |
| |
| magic::gencell sky130::${devname} ${devname}_$i \ |
| w $w l $l nx $nx ny $ny bconnect $bc tconnect $tc |
| select cell ${devname}_$i |
| set bh [box height] |
| set bh [+ $bh $deltay] |
| box move n $bh |
| incr i |
| } |
| set bp [box position] |
| set bpx [lindex $bp 0] |
| box position $bpx $starty |
| box move e $deltax |
| } |
| resumeall |
| } |
| |
| # NxN fixed devices |
| |
| proc fixed_array {n devname startx starty} { |
| suspendall |
| box position $startx $starty |
| set i 0 |
| for {set x 0} {$x < $n} {incr x} { |
| for {set y 0} {$y < $n} {incr y} { |
| |
| set nx [int [+ 1 [* [rand] 4]]] |
| set ny [int [+ 1 [* [rand] 4]]] |
| |
| # Do not change the deltas---this will cause DRC problems |
| set r 0 |
| # set r [int [* [rand] 10]] |
| set deltax [/ $r 10.0] |
| # set r [int [* [rand] 10]] |
| set deltay [/ $r 10.0] |
| |
| magic::gencell sky130::${devname} ${devname}_$i \ |
| nx $nx ny $ny deltax $deltax deltay $deltay |
| select cell ${devname}_$i |
| set bh [box height] |
| set bh [* $bh [+ $ny 1]] |
| box move n $bh |
| incr i |
| } |
| set bp [box position] |
| set bpx [lindex $bp 0] |
| box position $bpx $starty |
| box move e 20000 |
| } |
| resumeall |
| } |
| |
| snap int |
| box size 0 0 |
| |
| # Layout: |
| # phv |
| # sky130_fd_pr__res_generic_l1 sky130_fd_pr__res_generic_po res_generic_pd res_generic_pd_hv |
| # nfet_g5v0d10v5 diode_pd2nw_11v0 |
| # diode_pw2nd_11v0 |
| # pfet_01v8 ndiode_pw2nd_05v5 |
| # res_high_po res_iso_pw res_generic_nd res_generic_nd_hv diode_pd2nw_05v5 |
| # nfet_01v8 diode_pw2nd_05v5 |
| # |
| |
| mos_array 6 sky130_fd_pr__nfet_01v8 0 0 |
| mos_array 6 sky130_fd_pr__pfet_01v8 0 75000 |
| mos_array 6 sky130_fd_pr__nfet_g5v0d10v5 0 150000 |
| mos_array 6 sky130_fd_pr__pfet_g5v0d10v5 0 225000 |
| mos_array 6 sky130_fd_pr__nfet_01v8_lvt 0 300000 |
| mos_array 6 sky130_fd_bs_flash__special_sonosfet_star 0 375000 12700 1650 |
| mos_array 6 sky130_fd_pr__pfet_01v8_lvt 0 450000 |
| mos_array 6 sky130_fd_pr__pfet_01v8_hvt 0 525000 |
| mos_array 6 sky130_fd_pr__nfet_03v3_nvt 0 600000 |
| |
| res_array 6 sky130_fd_pr_res_high_po 100000 0 |
| res_array 6 sky130_fd_pr__res_generic_l1 100000 180000 |
| res_array 6 sky130_fd_pr__res_xhigh_po 100000 360000 |
| |
| res_array 6 sky130_fd_pr__res_iso_pw 200000 0 13500 1100 |
| res_array 6 sky130_fd_pr__res_generic_po 200000 200000 |
| |
| res_array 6 sky130_fd_pr__res_generic_nd 300000 0 |
| res_array 6 sky130_fd_pr__res_generic_pd 300000 180000 |
| |
| diode_array 6 sky130_fd_pr__diode_pw2nd_05v5 500000 0 |
| diode_array 6 sky130_fd_pr__diode_pd2nw_05v5 500000 30000 |
| diode_array 6 sky130_fd_pr__diode_pw2nd_11v0 500000 60000 |
| diode_array 6 sky130_fd_pr__diode_pd2nw_11v0 500000 90000 |
| |
| cap_array 6 sky130_fd_pr__cap_mim_m3_1 600000 0 |
| cap_array 6 sky130_fd_pr__cap_mim_m3_2 600000 70000 18000 650 |
| |
| mos_array 6 sky130_fd_pr__cap_var_lvt 700000 0 15000 254 |
| mos_array 6 sky130_fd_pr__cap_var 700000 70000 18000 254 |
| mos_array 6 sky130_fd_pr__cap_var_hvt 700000 140000 15000 254 |
| |
| fixed_array 2 sky130_fd_pr__rf_npn_1x1 850000 0 |
| fixed_array 2 sky130_fd_pr__rf_npn_1x2 850000 30000 |
| fixed_array 2 sky130_fd_pr__rf_pnp5x 850000 60000 |
| |
| fixed_array 2 sky130_fd_pr__cap_vpp_01p8x01p8_m1m2_noshield 900000 0 |
| fixed_array 2 sky130_fd_pr__cap_vpp_02p4x04p6_m1m2_noshield 900000 30000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_02p7x6p1_m1m2m3m4_shield1_fingercap 900000 60000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_01p8x01p8_m1m2_shield1 900000 90000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_03p9x03p9_m1m2_shield1_floatm3 900000 120000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_04p4x04p6_l1m1m2_noshield 900000 150000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_04p4x04p6_l1m1m2_shieldm3_floatpo 900000 180000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_04p4x04p6_l1m1m2m3m4_shieldpom5 900000 210000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_06p8x06p1_l1m1m2_noshield 900000 240000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_06p8x06p1_l1m1m2m3m4_shieldpo_floatm5 900000 270000 |
| |
| fixed_array 2 sky130_fd_pr__cap_vpp_08p6x07p8_l1m1m2_noshield 950000 0 |
| fixed_array 2 sky130_fd_pr__cap_vpp_08p6x07p8_l1m1m2_shieldnw_nwell 950000 30000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_08p6x07p8_m1m2m3_shield1 950000 60000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_11p3x11p3_m1m2m3m4_shield1_wafflecap 950000 90000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_11p3x11p8_l1m1m2m3m4_shield5_nhv 950000 120000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2_noshield 950000 150000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2_shieldpom3 950000 180000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_11p5x11p7_l1m1m2m3m4_shieldm5 950000 210000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_11p5x11p7_m1m4_noshield 950000 240000 |
| fixed_array 2 sky130_fd_pr__cap_vpp_22p5x11p7_pol1m1m2m3m4m5_noshield 950000 270000 |
| |
| # fixed_array 1 balun 1000000 0 |
| fixed_array 1 sky130_fd_pr__ind_02_04 1000000 200000 |
| fixed_array 1 sky130_fd_pr__ind_11_04 1250000 0 |
| |
| # Draw a deep nwell region around the sonos transistor block |
| box values -5200i 369500i 76800i 427500i |
| sky130::deep_nwell_draw |
| |
| save torture_test_sky130 |
| gds write torture_test_sky130 |