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