1# Copyright (c) 2020, The Regents of the University of California 2# 3# This program is free software: you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation, either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <https://www.gnu.org/licenses/>. 15 16sta::define_cmd_args "define_process_corner" { 17 [-ext_model_index index] filename 18} 19 20proc define_process_corner { args } { 21 sta::parse_key_args "define_process_corner" args keys {-ext_model_index} 22 sta::check_argc_eq1 "define_process_corner" $args 23 24 set ext_model_index 0 25 if { [info exists keys(-ext_model_index)] } { 26 set ext_model_index $keys(-ext_model_index) 27 } 28 29 set filename [file nativename [lindex $args 0]] 30 31 rcx::define_process_corner $ext_model_index $filename 32} 33 34sta::define_cmd_args "extract_parasitics" { 35 [-ext_model_file filename] 36 [-corner_cnt count] 37 [-max_res ohms] 38 [-coupling_threshold fF] 39 [-signal_table value] 40 [-debug_net_id id] 41 [-lef_res] 42 [-cc_model track] 43 [-context_depth depth] 44 [-no_merge_via_res] 45} 46 47proc extract_parasitics { args } { 48 sta::parse_key_args "extract_parasitics" args keys \ 49 { -ext_model_file 50 -corner_cnt 51 -max_res 52 -coupling_threshold 53 -signal_table 54 -debug_net_id 55 -context_depth 56 -cc_model } \ 57 flags { -lef_res } 58 59 set ext_model_file "" 60 if { [info exists keys(-ext_model_file)] } { 61 set ext_model_file $keys(-ext_model_file) 62 } 63 64 set corner_cnt 1 65 if { [info exists keys(-corner_cnt)] } { 66 set corner_cnt $keys(-corner_cnt) 67 sta::check_positive_integer "-corner_cnt" $corner_cnt 68 } 69 70 set max_res 50.0 71 if { [info exists keys(-max_res)] } { 72 set max_res $keys(-max_res) 73 sta::check_positive_float "-max_res" $max_res 74 } 75 76 set coupling_threshold 0.1 77 if { [info exists keys(-coupling_threshold)] } { 78 set coupling_threshold $keys(-coupling_threshold) 79 sta::check_positive_float "-coupling_threshold" $coupling_threshold 80 } 81 82 set signal_table 3 83 if { [info exists keys(-signal_table)] } { 84 set signal_table $keys(-signal_table) 85 sta::check_positive_integer "-signal_table" $signal_table 86 } 87 88 set lef_res [info exists flags(-lef_res)] 89 set no_merge_via_res [info exists flags(-no_merge_via_res)] 90 91 set cc_model 10 92 if { [info exists keys(-cc_model)] } { 93 set cc_model $keys(-cc_model) 94 } 95 96 set depth 5 97 if { [info exists keys(-context_depth)] } { 98 set depth $keys(-context_depth) 99 sta::check_positive_integer "-context_depth" $depth 100 } 101 102 set debug_net_id "" 103 if { [info exists keys(-debug_net_id)] } { 104 set debug_net_id $keys(-debug_net_id) 105 } 106 107 rcx::extract $ext_model_file $corner_cnt $max_res \ 108 $coupling_threshold $signal_table $cc_model \ 109 $depth $debug_net_id $lef_res $no_merge_via_res 110} 111 112sta::define_cmd_args "write_spef" { 113 [-net_id net_id] 114 [-nets nets] filename } 115 116proc write_spef { args } { 117 sta::parse_key_args "write_spef" args keys \ 118 { -net_id 119 -nets } 120 sta::check_argc_eq1 "write_spef" $args 121 122 set spef_file $args 123 124 set nets "" 125 if { [info exists keys(-nets)] } { 126 set nets $keys(-nets) 127 } 128 129 set net_id 0 130 if { [info exists keys(-net_id)] } { 131 set net_id $keys(-net_id) 132 } 133 134 rcx::write_spef $spef_file $nets $net_id 135} 136 137sta::define_cmd_args "adjust_rc" { 138 [-res_factor res] 139 [-cc_factor cc] 140 [-gndc_factor gndc] 141} 142 143proc adjust_rc { args } { 144 sta::parse_key_args "adjust_rc" args keys \ 145 { -res_factor 146 -cc_factor 147 -gndc_factor } 148 149 set res_factor 1.0 150 if { [info exists keys(-res_factor)] } { 151 set res_factor $keys(-res_factor) 152 sta::check_positive_float "-res_factor" $res_factor 153 } 154 155 set cc_factor 1.0 156 if { [info exists keys(-cc_factor)] } { 157 set cc_factor $keys(-cc_factor) 158 sta::check_positive_float "-cc_factor" $cc_factor 159 } 160 161 set gndc_factor 1.0 162 if { [info exists keys(-gndc_factor)] } { 163 set gndc_factor $keys(-gndc_factor) 164 sta::check_positive_float "-gndc_factor" $gndc_factor 165 } 166 167 rcx::adjust_rc $res_factor $cc_factor $gndc_factor 168} 169 170sta::define_cmd_args "diff_spef" { 171 [-file filename] 172 [-r_res] 173 [-r_cap] 174 [-r_cc_cap] 175 [-r_conn] 176} 177 178proc diff_spef { args } { 179 sta::parse_key_args "diff_spef" args keys \ 180 { -file } \ 181 flags { -r_res -r_cap -r_cc_cap -r_conn } 182 183 set filename "" 184 if { [info exists keys(-file)] } { 185 set filename [file nativename $keys(-file)] 186 } 187 set res [info exists flags(-over)] 188 set cap [info exists flags(-over)] 189 set cc_cap [info exists flags(-over)] 190 set conn [info exists flags(-over)] 191 192 rcx::diff_spef $filename $conn $res $cap $cc_cap 193} 194 195sta::define_cmd_args "bench_wires" { 196 [-met_cnt mcnt] 197 [-cnt count] 198 [-len wire_len] 199 [-over] 200 [-diag] 201 [-all] 202 [-db_only] 203 [-under_met layer] 204 [-w_list width] 205 [-s_list space] 206} 207 208proc bench_wires { args } { 209 sta::parse_key_args "bench_wires" args keys \ 210 { -met_cnt -cnt -len -under_met 211 -w_list -s_list } \ 212 flags { -diag -over -all -db_only } 213 214 if { ![ord::db_has_tech] } { 215 utl::error RCX 357 "No LEF technology has been read." 216 } 217 218 set over [info exists flags(-over)] 219 set all [info exists flags(-all)] 220 set diag [info exists flags(-diag)] 221 set db_only [info exists flags(-db_only)] 222 223 set met_cnt 1000 224 if { [info exists keys(-met_cnt)] } { 225 set met_cnt $keys(-met_cnt) 226 } 227 228 set cnt 5 229 if { [info exists keys(-cnt)] } { 230 set cnt $keys(-cnt) 231 } 232 233 set len 100 234 if { [info exists keys(-len)] } { 235 set len $keys(-len) 236 } 237 238 set under_met -1 239 if { [info exists keys(-under_met)] } { 240 set under_met $keys(-under_met) 241 } 242 243 set w_list "1" 244 if { [info exists keys(-w_list)] } { 245 set w_list $keys(-w_list) 246 } 247 248 set s_list "1 2 2.5 3 3.5 4 4.5 5 6 8 10 12" 249 if { [info exists keys(-s_list)] } { 250 set s_list $keys(-s_list) 251 } 252 253 rcx::bench_wires $db_only $over $diag $all $met_cnt $cnt $len $under_met $w_list $s_list 254} 255 256sta::define_cmd_args "bench_verilog" { filename } 257 258proc bench_verilog { args } { 259 sta::check_argc_eq1 "bench_verilog" $args 260 rcx::bench_verilog $args 261} 262 263sta::define_cmd_args "bench_read_spef" { filename } 264 265proc bench_read_spef { args } { 266 sta::check_argc_eq1 "bench_read_spef" $args 267 rcx::read_spef $args 268} 269 270sta::define_cmd_args "write_rules" { 271 [-file filename] 272 [-dir dir] 273 [-name name] 274 [-pattern pattern] 275 [-read_from_solver] 276 [-db] 277} 278 279proc write_rules { args } { 280 sta::parse_key_args "write_rules" args keys \ 281 { -file -dir -name -pattern } \ 282 flags { -read_from_solver -db } 283 284 set filename "extRules" 285 if { [info exists keys(-file)] } { 286 set filename $keys(-file) 287 } 288 289 set dir "./" 290 if { [info exists keys(-dir)] } { 291 set dir $keys(-dir) 292 } 293 294 set name "TYP" 295 if { [info exists keys(-name)] } { 296 set name $keys(-name) 297 } 298 299 set pattern 0 300 if { [info exists keys(-pattern)] } { 301 set pattern $keys(-pattern) 302 } 303 set solver [info exists flags(-read_from_solver)] 304 set db [info exists flags(-db)] 305 306 rcx::write_rules $filename $dir $name $pattern $db $solver 307} 308 309