Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 1 | ### |
| 2 | ### Source file sky130_setup.tcl |
| 3 | ### Process this file with the preproc.py processor |
| 4 | ### |
| 5 | #--------------------------------------------------------------- |
| 6 | # Setup file for netgen LVS |
| 7 | # SkyWater TECHNAME |
| 8 | #--------------------------------------------------------------- |
| 9 | permute default |
| 10 | property default |
| 11 | property parallel none |
| 12 | |
| 13 | #--------------------------------------------------------------- |
| 14 | # For the following, get the cell lists from |
| 15 | # circuit1 and circuit2. |
| 16 | #--------------------------------------------------------------- |
| 17 | |
| 18 | set cells1 [cells list -all -circuit1] |
| 19 | set cells2 [cells list -all -circuit2] |
| 20 | |
| 21 | # NOTE: In accordance with the LVS manager GUI, the schematic is |
| 22 | # always circuit2, so some items like property "par1" only need to |
| 23 | # be specified for circuit2. |
| 24 | |
| 25 | #------------------------------------------- |
| 26 | # Resistors (except metal) |
| 27 | #------------------------------------------- |
| 28 | |
| 29 | set devices {xpwres mrp1 xhrpoly uhrpoly mrdn mrdp mrdn_hv mrdp_hv} |
| 30 | |
| 31 | foreach dev $devices { |
| 32 | if {[lsearch $cells1 $dev] >= 0} { |
| 33 | permute "-circuit1 $dev" 1 2 |
| 34 | property "-circuit1 $dev" series enable |
| 35 | property "-circuit1 $dev" series {w critical} |
| 36 | property "-circuit1 $dev" series {l add} |
| 37 | property "-circuit1 $dev" parallel enable |
| 38 | property "-circuit1 $dev" parallel {l critical} |
| 39 | property "-circuit1 $dev" parallel {w add} |
| 40 | property "-circuit1 $dev" parallel {value par} |
| 41 | property "-circuit1 $dev" tolerance {l 0.01} {w 0.01} |
| 42 | # Ignore these properties |
Tim Edwards | 23c9766 | 2020-08-09 11:57:32 -0400 | [diff] [blame] | 43 | property "-circuit2 $dev" delete mult |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 44 | } |
| 45 | if {[lsearch $cells2 $dev] >= 0} { |
| 46 | permute "-circuit2 $dev" 1 2 |
| 47 | property "-circuit1 $dev" series enable |
| 48 | property "-circuit1 $dev" series {w critical} |
| 49 | property "-circuit1 $dev" series {l add} |
| 50 | property "-circuit1 $dev" parallel enable |
| 51 | property "-circuit1 $dev" parallel {l critical} |
| 52 | property "-circuit1 $dev" parallel {w add} |
| 53 | property "-circuit1 $dev" parallel {value par} |
| 54 | property "-circuit1 $dev" tolerance {l 0.01} {w 0.01} |
| 55 | # Ignore these properties |
Tim Edwards | 23c9766 | 2020-08-09 11:57:32 -0400 | [diff] [blame] | 56 | property "-circuit2 $dev" delete mult |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 57 | } |
| 58 | } |
| 59 | |
| 60 | #------------------------------------------- |
| 61 | # MRM (metal) resistors |
| 62 | #------------------------------------------- |
| 63 | |
| 64 | set devices {mrl1 mrm1 mrm2 mrm3} |
| 65 | #ifdef METAL5 |
Tim Edwards | 7cbaaba | 2020-08-05 12:19:18 -0400 | [diff] [blame] | 66 | lappend devices mrm4 mrm5 |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 67 | #endif (METAL5) |
| 68 | |
| 69 | foreach dev $devices { |
| 70 | if {[lsearch $cells1 $dev] >= 0} { |
| 71 | permute "-circuit1 $dev" 1 2 |
| 72 | property "-circuit1 $dev" series enable |
| 73 | property "-circuit1 $dev" series {w critical} |
| 74 | property "-circuit1 $dev" series {l add} |
| 75 | property "-circuit1 $dev" parallel enable |
| 76 | property "-circuit1 $dev" parallel {l critical} |
| 77 | property "-circuit1 $dev" parallel {w add} |
| 78 | property "-circuit1 $dev" parallel {value par} |
| 79 | property "-circuit1 $dev" tolerance {l 0.01} {w 0.01} |
| 80 | # Ignore these properties |
Tim Edwards | 23c9766 | 2020-08-09 11:57:32 -0400 | [diff] [blame] | 81 | property "-circuit2 $dev" delete mult |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 82 | } |
| 83 | if {[lsearch $cells2 $dev] >= 0} { |
| 84 | permute "-circuit2 $dev" 1 2 |
| 85 | property "-circuit1 $dev" series enable |
| 86 | property "-circuit1 $dev" series {w critical} |
| 87 | property "-circuit1 $dev" series {l add} |
| 88 | property "-circuit1 $dev" parallel enable |
| 89 | property "-circuit1 $dev" parallel {l critical} |
| 90 | property "-circuit1 $dev" parallel {w add} |
| 91 | property "-circuit1 $dev" parallel {value par} |
| 92 | property "-circuit1 $dev" tolerance {l 0.01} {w 0.01} |
| 93 | # Ignore these properties |
Tim Edwards | 23c9766 | 2020-08-09 11:57:32 -0400 | [diff] [blame] | 94 | property "-circuit2 $dev" delete mult |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 95 | } |
| 96 | } |
| 97 | |
| 98 | #------------------------------------------- |
| 99 | # (MOS) transistors |
| 100 | #------------------------------------------- |
| 101 | |
| 102 | set devices {nshort nlowvt sonos_e nhvnative nhv pshort plowvt phighvt phv} |
Tim Edwards | 7cbaaba | 2020-08-05 12:19:18 -0400 | [diff] [blame] | 103 | lappend devices ppu npass npd |
| 104 | lappend devices xcnwvc xcnwvc2 xchvnwc |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 105 | |
| 106 | foreach dev $devices { |
| 107 | if {[lsearch $cells1 $dev] >= 0} { |
| 108 | permute "-circuit1 $dev" 1 3 |
| 109 | property "-circuit1 $dev" parallel enable |
| 110 | property "-circuit1 $dev" parallel {l critical} |
| 111 | property "-circuit1 $dev" parallel {w add} |
| 112 | property "-circuit1 $dev" tolerance {w 0.01} {l 0.01} |
| 113 | # Ignore these properties |
Tim Edwards | 23c9766 | 2020-08-09 11:57:32 -0400 | [diff] [blame] | 114 | property "-circuit2 $dev" delete as ad ps pd mult sa sb sd |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 115 | } |
| 116 | if {[lsearch $cells2 $dev] >= 0} { |
| 117 | permute "-circuit2 $dev" 1 3 |
| 118 | property "-circuit1 $dev" parallel enable |
| 119 | property "-circuit1 $dev" parallel {l critical} |
| 120 | property "-circuit1 $dev" parallel {w add} |
| 121 | property "-circuit2 $dev" tolerance {w 0.01} {l 0.01} |
| 122 | # Ignore these properties |
Tim Edwards | 23c9766 | 2020-08-09 11:57:32 -0400 | [diff] [blame] | 123 | property "-circuit2 $dev" delete as ad ps pd mult sa sb sd |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 124 | } |
| 125 | } |
| 126 | |
| 127 | #------------------------------------------- |
| 128 | # diodes |
| 129 | #------------------------------------------- |
| 130 | |
| 131 | set devices {ndiode ndiode_lvt pdiode pdiode_lvt pdiode_hvt ndiode_h pdiode_h} |
| 132 | lappend devices ndiode_native |
| 133 | |
| 134 | foreach dev $devices { |
| 135 | if {[lsearch $cells1 $dev] >= 0} { |
| 136 | property "-circuit1 $dev" parallel enable |
| 137 | property "-circuit1 $dev" parallel {area add} |
| 138 | property "-circuit1 $dev" parallel {value add} |
| 139 | property "-circuit1 $dev" tolerance {area 0.02} |
| 140 | # Ignore these properties |
Tim Edwards | 23c9766 | 2020-08-09 11:57:32 -0400 | [diff] [blame] | 141 | property "-circuit2 $dev" delete mult perim |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 142 | } |
| 143 | if {[lsearch $cells2 $dev] >= 0} { |
| 144 | property "-circuit2 $dev" parallel enable |
| 145 | property "-circuit1 $dev" parallel {area add} |
| 146 | property "-circuit1 $dev" parallel {value add} |
| 147 | property "-circuit2 $dev" tolerance {area 0.02} |
| 148 | # Ignore these properties |
Tim Edwards | 23c9766 | 2020-08-09 11:57:32 -0400 | [diff] [blame] | 149 | property "-circuit2 $dev" delete mult perim |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 150 | } |
| 151 | } |
| 152 | |
| 153 | #------------------------------------------- |
| 154 | # capacitors |
| 155 | # MiM capacitors |
| 156 | #------------------------------------------- |
| 157 | |
| 158 | set devices {xcmimc1 xcmimc2} |
| 159 | |
| 160 | foreach dev $devices { |
| 161 | if {[lsearch $cells1 $dev] >= 0} { |
| 162 | property "-circuit1 $dev" parallel enable |
| 163 | property "-circuit1 $dev" parallel {area add} |
| 164 | property "-circuit1 $dev" parallel {value add} |
| 165 | property "-circuit1 $dev" tolerance {l 0.01} {w 0.01} |
| 166 | # Ignore these properties |
Tim Edwards | 23c9766 | 2020-08-09 11:57:32 -0400 | [diff] [blame] | 167 | property "-circuit2 $dev" delete mult perim |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 168 | } |
| 169 | if {[lsearch $cells2 $dev] >= 0} { |
| 170 | property "-circuit1 $dev" parallel enable |
| 171 | property "-circuit1 $dev" parallel {area add} |
| 172 | property "-circuit1 $dev" parallel {value add} |
| 173 | property "-circuit1 $dev" tolerance {l 0.01} {w 0.01} |
| 174 | # Ignore these properties |
Tim Edwards | 23c9766 | 2020-08-09 11:57:32 -0400 | [diff] [blame] | 175 | property "-circuit2 $dev" delete mult perim |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 176 | } |
| 177 | } |
| 178 | |
| 179 | #------------------------------------------- |
| 180 | # Fixed-layout devices |
| 181 | # bipolar transistors, |
| 182 | # VPP capacitors |
| 183 | #------------------------------------------- |
| 184 | |
| 185 | set devices {sky130rf_npn_1x1 sky130rf_npn_1x2 sky130rf_pnp5x} |
| 186 | #ifdef METAL5 |
| 187 | lappend devices balun xint4_011 xind4_02 |
| 188 | lappend devices sky130rf2_xcmvpp11p5x11p7_lim5shield |
| 189 | lappend devices sky130rf2_xcmvpp11p5x11p7_m3_lim5shield |
| 190 | lappend devices sky130rf2_xcmvpp11p5x11p7_m4shield |
| 191 | lappend devices sky130rf2_xcmvpp11p5x11p7_polym4shield |
| 192 | lappend devices sky130rf2_xcmvpp11p5x11p7_polym50p4shield |
| 193 | lappend devices sky130rf2_xcmvpp4p4x4p6_m3_lim5shield |
| 194 | lappend devices sky130rf2_xcmvpp6p8x6p1_lim4shield |
| 195 | lappend devices sky130rf2_xcmvpp6p8x6p1_polym4shield |
| 196 | #endif (METAL5) |
| 197 | lappend devices sky130rf2_xcmvpp8p6x7p9_m3_lim5shield |
| 198 | lappend devices sky130rf2_xcmvppx4_2xnhvnative10x4 |
| 199 | lappend devices sky130rf_xcmvpp11p5x11p7_m3_lishield |
| 200 | lappend devices sky130rf_xcmvpp11p5x11p7_m3shield |
| 201 | lappend devices sky130rf_xcmvpp1p8x1p8_lishield |
| 202 | lappend devices sky130rf_xcmvpp1p8x1p8_m3shield |
| 203 | lappend devices sky130rf_xcmvpp2 |
| 204 | lappend devices sky130rf_xcmvpp2_nwell |
| 205 | lappend devices sky130rf_xcmvpp4p4x4p6_m3_lishield |
| 206 | lappend devices sky130rf_xcmvpp4p4x4p6_m3shield |
| 207 | lappend devices sky130rf_xcmvpp8p6x7p9_m3_lishield |
| 208 | lappend devices sky130rf_xcmvpp8p6x7p9_m3shield |
| 209 | |
| 210 | foreach dev $devices { |
| 211 | if {[lsearch $cells1 $dev] >= 0} { |
| 212 | property "-circuit1 $dev" parallel enable |
| 213 | # Ignore these properties |
Tim Edwards | 23c9766 | 2020-08-09 11:57:32 -0400 | [diff] [blame] | 214 | property "-circuit2 $dev" delete mult |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 215 | } |
| 216 | if {[lsearch $cells2 $dev] >= 0} { |
| 217 | property "-circuit2 $dev" parallel enable |
| 218 | # Ignore these properties |
Tim Edwards | 23c9766 | 2020-08-09 11:57:32 -0400 | [diff] [blame] | 219 | property "-circuit2 $dev" delete mult |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 220 | } |
| 221 | } |
| 222 | |
| 223 | #--------------------------------------------------------------- |
| 224 | # Digital cells (ignore decap, fill, and tap cells) |
| 225 | # Make a separate list for each supported library |
| 226 | #--------------------------------------------------------------- |
| 227 | # e.g., ignore class "-circuit2 sky130_fc_sc_hd_decap_3" |
| 228 | #--------------------------------------------------------------- |
| 229 | |
| 230 | foreach cell $cells1 { |
Ahmed Ghazy | 32982b7 | 2020-07-27 14:46:07 +0200 | [diff] [blame] | 231 | if {[regexp {sky130_fd_sc_\w\w__decap_[[:digit:]]+} $cell match]} { |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 232 | ignore class "-circuit1 $cell" |
| 233 | } |
Ahmed Ghazy | 32982b7 | 2020-07-27 14:46:07 +0200 | [diff] [blame] | 234 | if {[regexp {sky130_fd_sc_\w\w__fill_[[:digit:]]+} $cell match]} { |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 235 | ignore class "-circuit1 $cell" |
| 236 | } |
| 237 | } |
| 238 | foreach cell $cells2 { |
Ahmed Ghazy | 32982b7 | 2020-07-27 14:46:07 +0200 | [diff] [blame] | 239 | if {[regexp {sky130_fd_sc_\w\w__decap_[[:digit:]]+} $cell match]} { |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 240 | ignore class "-circuit2 $cell" |
| 241 | } |
Ahmed Ghazy | 32982b7 | 2020-07-27 14:46:07 +0200 | [diff] [blame] | 242 | if {[regexp {sky130_fd_sc_\w\w__fill_[[:digit:]]+} $cell match]} { |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 243 | ignore class "-circuit2 $cell" |
| 244 | } |
| 245 | } |
| 246 | |
| 247 | #--------------------------------------------------------------- |
| 248 | # Handle cells captured from Electric |
| 249 | # |
| 250 | # Find cells of the form "<library>__<cellname>" in the netlist |
| 251 | # from Electric where the extracted layout netlist has only |
| 252 | # "<cellname>". Cross-check by ensuring that the full name |
| 253 | # "<library>__<cellname>" does not exist in both cells, and that |
| 254 | # the truncated name "<cellname>" does not exist in both cells. |
| 255 | #--------------------------------------------------------------- |
| 256 | # e.g., hydra_spi_controller__hydra_spi_controller |
| 257 | #--------------------------------------------------------------- |
Ahmed Ghazy | 32982b7 | 2020-07-27 14:46:07 +0200 | [diff] [blame] | 258 | |
Tim Edwards | 55f4d0e | 2020-07-05 15:41:02 -0400 | [diff] [blame] | 259 | foreach cell $cells1 { |
| 260 | if {[regexp "(.+)__(.+)" $cell match library cellname]} { |
| 261 | if {([lsearch $cells2 $cell] < 0) && \ |
| 262 | ([lsearch $cells2 $cellname] >= 0) && \ |
| 263 | ([lsearch $cells1 $cellname] < 0)} { |
| 264 | equate classes "-circuit1 $cell" "-circuit2 $cellname" |
| 265 | puts stdout "Matching pins of $cell in circuit 1 and $cellname in circuit 2" |
| 266 | equate pins "-circuit1 $cell" "-circuit2 $cellname" |
| 267 | } |
| 268 | } |
| 269 | } |
| 270 | |
| 271 | foreach cell $cells2 { |
| 272 | if {[regexp "(.+)__(.+)" $cell match library cellname]} { |
| 273 | if {([lsearch $cells1 $cell] < 0) && \ |
| 274 | ([lsearch $cells1 $cellname] >= 0) && \ |
| 275 | ([lsearch $cells2 $cellname] < 0)} { |
| 276 | equate classes "-circuit1 $cellname" "-circuit2 $cell" |
| 277 | puts stdout "Matching pins of $cellname in circuit 1 and $cell in circuit 2" |
| 278 | equate pins "-circuit1 $cellname" "-circuit2 $cell" |
| 279 | } |
| 280 | } |
| 281 | } |
| 282 | |
| 283 | # Match pins on black-box cells if LVS is called with "-blackbox" |
| 284 | if {[model blackbox]} { |
| 285 | foreach cell $cells1 { |
| 286 | if {[model "-circuit1 $cell"] == "blackbox"} { |
| 287 | if {[lsearch $cells2 $cell] >= 0} { |
| 288 | puts stdout "Matching pins of $cell in circuits 1 and 2" |
| 289 | equate pins "-circuit1 $cell" "-circuit2 $cell" |
| 290 | } |
| 291 | } |
| 292 | } |
| 293 | } |
| 294 | |
| 295 | #--------------------------------------------------------------- |