@@ -208,6 +208,8 @@ proc write_pin_placement { args } {
208208
209209sta::define_cmd_args " place_pins" {[-hor_layers h_layers]\
210210 [-ver_layers v_layers]\
211+ [-random_seed seed]\
212+ [-random]\
211213 [-corner_avoidance distance]\
212214 [-min_distance min_dist]\
213215 [-min_distance_in_tracks]\
@@ -220,146 +222,150 @@ sta::define_cmd_args "place_pins" {[-hor_layers h_layers]\
220222proc place_pins { args } {
221223 ord::parse_list_args " place_pins" args list {-exclude -group_pins}
222224 sta::parse_key_args " place_pins" args \
223- keys {-hor_layers -ver_layers -corner_avoidance \
225+ keys {-hor_layers -ver_layers -random_seed - corner_avoidance \
224226 -min_distance -write_pin_placement} \
225- flags {-min_distance_in_tracks -annealing} ;# checker off
227+ flags {-random - min_distance_in_tracks -annealing} ;# checker off
226228
227229 sta::check_argc_eq0 " place_pins" $args
228230
229- set regions $list(-exclude)
230- set pin_groups $list(-group_pins)
231+ if { [info exists flags(-random)] || [info exists keys(-random_seed)] } {
232+ utl::warn PPL 113 " -random and -random_seed are deprecated."
233+ } else {
234+ set regions $list(-exclude)
235+ set pin_groups $list(-group_pins)
231236
232- set dbTech [ord::get_db_tech]
233- if { $dbTech == " NULL" } {
234- utl::error PPL 31 " No technology found."
235- }
237+ set dbTech [ord::get_db_tech]
238+ if { $dbTech == " NULL" } {
239+ utl::error PPL 31 " No technology found."
240+ }
236241
237- set dbBlock [ord::get_db_block]
238- if { $dbBlock == " NULL" } {
239- utl::error PPL 32 " No block found."
240- }
242+ set dbBlock [ord::get_db_block]
243+ if { $dbBlock == " NULL" } {
244+ utl::error PPL 32 " No block found."
245+ }
241246
242- set db [ord::get_db]
247+ set db [ord::get_db]
243248
244- set blockages {}
249+ set blockages {}
245250
246- foreach inst [$dbBlock getInsts] {
247- if { [$inst isBlock] } {
248- if { ![$inst isPlaced] } {
249- utl::warn PPL 15 " Macro [ $inst getName] is not placed."
250- } else {
251- lappend blockages $inst
251+ foreach inst [$dbBlock getInsts] {
252+ if { [$inst isBlock] } {
253+ if { ![$inst isPlaced] } {
254+ utl::warn PPL 15 " Macro [ $inst getName] is not placed."
255+ } else {
256+ lappend blockages $inst
257+ }
252258 }
253259 }
254- }
255-
256- utl::report " Found [ llength $blockages ] macro blocks."
257-
258- if { [info exists keys(-hor_layers)] } {
259- set hor_layers $keys(-hor_layers)
260- } else {
261- utl::error PPL 17 " -hor_layers is required."
262- }
263260
264- if { [info exists keys(-ver_layers)] } {
265- set ver_layers $keys(-ver_layers)
266- } else {
267- utl::error PPL 18 " -ver_layers is required."
268- }
261+ utl::report " Found [ llength $blockages ] macro blocks."
269262
270- # set default interval_length from boundaries as 1u
271- set distance 1
272- if { [info exists keys(-corner_avoidance)] } {
273- set distance $keys(-corner_avoidance)
274- ppl::set_corner_avoidance [ord::microns_to_dbu $distance ]
275- }
263+ if { [info exists keys(-hor_layers)] } {
264+ set hor_layers $keys(-hor_layers)
265+ } else {
266+ utl::error PPL 17 " -hor_layers is required."
267+ }
276268
277- set min_dist 2
278- set dist_in_tracks [info exists flags(-min_distance_in_tracks)]
279- if { [info exists keys(-min_distance)] } {
280- set min_dist $keys(-min_distance)
281- if { $dist_in_tracks } {
282- ppl::set_min_distance $min_dist
269+ if { [info exists keys(-ver_layers)] } {
270+ set ver_layers $keys(-ver_layers)
283271 } else {
284- ppl::set_min_distance [ord::microns_to_dbu $min_dist ]
272+ utl::error PPL 18 " -ver_layers is required. "
285273 }
286- } else {
287- utl::report " Using $min_dist tracks default min distance between IO pins."
288- # setting min distance as 0u leads to the default min distance
289- ppl::set_min_distance 0
290- }
291- ppl::set_min_distance_in_tracks $dist_in_tracks
292274
293- set bterms_cnt [llength [$dbBlock getBTerms]]
275+ # set default interval_length from boundaries as 1u
276+ set distance 1
277+ if { [info exists keys(-corner_avoidance)] } {
278+ set distance $keys(-corner_avoidance)
279+ ppl::set_corner_avoidance [ord::microns_to_dbu $distance ]
280+ }
294281
295- if { $bterms_cnt == 0 } {
296- utl::error PPL 19 " Design without pins."
297- }
282+ set min_dist 2
283+ set dist_in_tracks [info exists flags(-min_distance_in_tracks)]
284+ if { [info exists keys(-min_distance)] } {
285+ set min_dist $keys(-min_distance)
286+ if { $dist_in_tracks } {
287+ ppl::set_min_distance $min_dist
288+ } else {
289+ ppl::set_min_distance [ord::microns_to_dbu $min_dist ]
290+ }
291+ } else {
292+ utl::report " Using $min_dist tracks default min distance between IO pins."
293+ # setting min distance as 0u leads to the default min distance
294+ ppl::set_min_distance 0
295+ }
296+ ppl::set_min_distance_in_tracks $dist_in_tracks
298297
298+ set bterms_cnt [llength [$dbBlock getBTerms]]
299299
300- set num_tracks_y 0
301- foreach hor_layer_name $hor_layers {
302- set hor_layer [ppl::parse_layer_name $hor_layer_name ]
303- if { ![ord::db_layer_has_hor_tracks $hor_layer ] } {
304- utl::error PPL 21 " Horizontal routing tracks not found for layer $hor_layer_name ."
300+ if { $bterms_cnt == 0 } {
301+ utl::error PPL 19 " Design without pins."
305302 }
306303
307- if { [$hor_layer getDirection] != " HORIZONTAL" } {
308- utl::error PPL 45 " Layer $hor_layer_name preferred direction is not horizontal."
309- }
310304
311- set hor_track_grid [$dbBlock findTrackGrid $hor_layer ]
305+ set num_tracks_y 0
306+ foreach hor_layer_name $hor_layers {
307+ set hor_layer [ppl::parse_layer_name $hor_layer_name ]
308+ if { ![ord::db_layer_has_hor_tracks $hor_layer ] } {
309+ utl::error PPL 21 " Horizontal routing tracks not found for layer $hor_layer_name ."
310+ }
312311
313- set num_tracks_y [expr $num_tracks_y +[llength [$hor_track_grid getGridY]]]
312+ if { [$hor_layer getDirection] != " HORIZONTAL" } {
313+ utl::error PPL 45 " Layer $hor_layer_name preferred direction is not horizontal."
314+ }
314315
315- ppl::add_hor_layer $hor_layer
316- }
316+ set hor_track_grid [$dbBlock findTrackGrid $hor_layer ]
317317
318- set num_tracks_x 0
319- foreach ver_layer_name $ver_layers {
320- set ver_layer [ppl::parse_layer_name $ver_layer_name ]
321- if { ![ord::db_layer_has_ver_tracks $ver_layer ] } {
322- utl::error PPL 23 " Vertical routing tracks not found for layer $ver_layer_name ."
323- }
318+ set num_tracks_y [expr $num_tracks_y +[llength [$hor_track_grid getGridY]]]
324319
325- if { [$ver_layer getDirection] != " VERTICAL" } {
326- utl::error PPL 46 " Layer $ver_layer_name preferred direction is not vertical."
320+ ppl::add_hor_layer $hor_layer
327321 }
328322
329- set ver_track_grid [$dbBlock findTrackGrid $ver_layer ]
323+ set num_tracks_x 0
324+ foreach ver_layer_name $ver_layers {
325+ set ver_layer [ppl::parse_layer_name $ver_layer_name ]
326+ if { ![ord::db_layer_has_ver_tracks $ver_layer ] } {
327+ utl::error PPL 23 " Vertical routing tracks not found for layer $ver_layer_name ."
328+ }
330329
331- set num_tracks_x [expr $num_tracks_x +[llength [$ver_track_grid getGridX]]]
330+ if { [$ver_layer getDirection] != " VERTICAL" } {
331+ utl::error PPL 46 " Layer $ver_layer_name preferred direction is not vertical."
332+ }
332333
333- ppl::add_ver_layer $ver_layer
334- }
334+ set ver_track_grid [$dbBlock findTrackGrid $ver_layer ]
335335
336- set num_slots [expr (2* $num_tracks_x + 2* $num_tracks_y )/ $min_dist ]
336+ set num_tracks_x [expr $num_tracks_x +[ llength [ $ver_track_grid getGridX]] ]
337337
338- if { [llength $regions ] != 0 } {
339- set lef_units [$dbTech getLefUnits]
338+ ppl::add_ver_layer $ver_layer
339+ }
340+
341+ set num_slots [expr (2*$num_tracks_x + 2*$num_tracks_y )/$min_dist ]
342+
343+ if { [llength $regions ] != 0 } {
344+ set lef_units [$dbTech getLefUnits]
340345
341- foreach region $regions {
342- exclude_io_pin_region -region $region
346+ foreach region $regions {
347+ exclude_io_pin_region -region $region
348+ }
343349 }
344- }
345350
346- if { [llength $pin_groups ] != 0 } {
347- foreach group $pin_groups {
348- set pins [ppl::parse_pin_names " place_pins -group_pins" $group ]
349- if { [llength $pins ] != 0 } {
350- odb::add_pin_group $pins 0
351+ if { [llength $pin_groups ] != 0 } {
352+ foreach group $pin_groups {
353+ set pins [ppl::parse_pin_names " place_pins -group_pins" $group ]
354+ if { [llength $pins ] != 0 } {
355+ odb::add_pin_group $pins 0
356+ }
351357 }
352358 }
353- }
354359
355- if { [info exists keys(-write_pin_placement)] } {
356- ppl::set_pin_placement_file $keys(-write_pin_placement)
357- }
360+ if { [info exists keys(-write_pin_placement)] } {
361+ ppl::set_pin_placement_file $keys(-write_pin_placement)
362+ }
358363
359- if { [info exists flags(-annealing)] } {
360- ppl::run_annealing
361- } else {
362- ppl::run_hungarian_matching
364+ if { [info exists flags(-annealing)] } {
365+ ppl::run_annealing
366+ } else {
367+ ppl::run_hungarian_matching
368+ }
363369 }
364370}
365371
0 commit comments