Skip to content

Commit f1c593a

Browse files
authored
Merge pull request The-OpenROAD-Project#6870 from eder-matheus/ppl_odb_exclude
ppl/odb: add function to define excluded regions for pin placement
2 parents 44269ad + 2ed6176 commit f1c593a

File tree

9 files changed

+505
-31
lines changed

9 files changed

+505
-31
lines changed

src/odb/src/db/odb.tcl

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,7 @@ sta::define_cmd_args "set_io_pin_constraint" {[-direction direction] \
682682
[-pin_names names] \
683683
[-region region] \
684684
[-mirrored_pins pins] \
685-
[-group]
685+
[-group] \
686686
[-order]}
687687

688688
proc set_io_pin_constraint { args } {
@@ -795,6 +795,54 @@ proc set_io_pin_constraint { args } {
795795
}
796796
}
797797

798+
sta::define_cmd_args "exclude_io_pin_region" { [-region region] }
799+
800+
proc exclude_io_pin_region { args } {
801+
ord::parse_list_args "exclude_io_pin_region" args list {-region}
802+
sta::parse_key_args "exclude_io_pin_region" args keys {-region} flags {}
803+
804+
sta::check_argc_eq0 "exclude_io_pin_region" $args
805+
806+
set regions $list(-region)
807+
808+
if { [llength $regions] != 0 } {
809+
set block [odb::get_block]
810+
set db_tech [ord::get_db_tech]
811+
set lef_units [$db_tech getLefUnits]
812+
813+
foreach region $regions {
814+
if { [regexp -all {(top|bottom|left|right):(.+)} $region - edge interval] } {
815+
if {
816+
[regexp -all {([0-9]+[.]*[0-9]*|[*]+)-([0-9]+[.]*[0-9]*|[*]+)} $interval - begin end]
817+
} {
818+
if { $begin == "*" } {
819+
set begin [ppl::get_edge_extreme "-exclude" 1 $edge]
820+
}
821+
if { $end == "*" } {
822+
set end [ppl::get_edge_extreme "-exclude" 0 $edge]
823+
}
824+
set begin [expr { int($begin * $lef_units) }]
825+
set end [expr { int($end * $lef_units) }]
826+
827+
set excluded_region [$block findConstraintRegion $edge $begin $end]
828+
$block addBlockedRegionForPins $excluded_region
829+
} elseif { $interval == "*" } {
830+
set begin [ppl::get_edge_extreme "-exclude" 1 $edge]
831+
set end [ppl::get_edge_extreme "-exclude" 0 $edge]
832+
833+
set excluded_region [$block findConstraintRegion $edge $begin $end]
834+
$block addBlockedRegionForPins $excluded_region
835+
} else {
836+
utl::error ODB 27 "-exclude: $interval is an invalid region."
837+
}
838+
} else {
839+
utl::error ODB 28 "-exclude: invalid syntax in $region.\
840+
Use (top|bottom|left|right):interval."
841+
}
842+
}
843+
}
844+
}
845+
798846
sta::define_cmd_args "clear_io_pin_constraints" {}
799847

800848
proc clear_io_pin_constraints { args } {

src/ppl/README.md

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,25 @@ pin placement grid defined with `define_pin_shape_pattern` use:
9595
The `up` option is only available when the pin placement grid is created with
9696
the `define_pin_shape_pattern` command.
9797

98+
### Exclude IO Pin Region
99+
100+
The `exclude_io_pin_region` command sets regions in the die edges where pins
101+
cannot be placed.
102+
103+
It is possible to use the `-region` argument multiple times in a single call
104+
of `exclude_io_pin_region`.
105+
106+
```tcl
107+
exclude_io_pin_region
108+
[-region edge:interval]
109+
```
110+
111+
#### Options
112+
113+
| Switch Name | Description |
114+
| ----- | ----- |
115+
| `-region` | Syntax is `-region edge:interval`. The `edge` values are (`top\|bottom\|left\|right`). The `interval` can be the whole edge with the wildcard `*` value or a range of values. |
116+
98117
### Clear IO Pin Constraints
99118

100119
The `clear_io_pin_constraints` command clears all the previously-defined
@@ -263,7 +282,7 @@ place_pins
263282
| `-corner_avoidance` | The distance (in microns) from each corner within which pin placement should be avoided. |
264283
| `-min_distance` | The minimum distance between pins on the die boundary. This distance can be in microns (default) or in number of tracks between each pin. The default value is the length of two routing tracks between each pin. |
265284
| `-min_distance_in_tracks` | Flag that allows setting the min distance in number of tracks instead of microns. |
266-
| `-exclude` | A region where pins cannot be placed. Either `top|bottom|left|right:edge_interval`, which is the edge interval from the selected edge; `begin:end` for begin-end of all edges. |
285+
| `-exclude` | A region where pins cannot be placed. Either `top\|bottom\|left\|right:edge_interval`, which is the edge interval from the selected edge; `begin:end` for begin-end of all edges. |
267286
| `-group_pins` | A list of pins to be placed together on the die boundary. |
268287
| `-annealing` | Flag to enable simulated annealing pin placement. |
269288
| `-write_pin_placement` | A file with the pin placement generated in the format of multiple calls for the `place_pin` command. |

src/ppl/include/ppl/IOPlacer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ class IOPlacer
207207
std::vector<Section> createSectionsPerConstraint(Constraint& constraint);
208208
void getPinsFromDirectionConstraint(Constraint& constraint);
209209
void initMirroredPins(bool annealing = false);
210+
void initExcludedIntervals();
210211
Interval findIntervalFromRect(const odb::Rect& rect);
211212
void getConstraintsFromDB();
212213
void initConstraints(bool annealing = false);

src/ppl/src/IOPlacer.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1895,6 +1895,15 @@ void IOPlacer::initMirroredPins(bool annealing)
18951895
}
18961896
}
18971897

1898+
void IOPlacer::initExcludedIntervals()
1899+
{
1900+
for (const odb::Rect& excluded_region :
1901+
getBlock()->getBlockedRegionsForPins()) {
1902+
Interval excluded_interv = findIntervalFromRect(excluded_region);
1903+
excluded_intervals_.push_back(excluded_interv);
1904+
}
1905+
}
1906+
18981907
Interval IOPlacer::findIntervalFromRect(const odb::Rect& rect)
18991908
{
19001909
int begin;
@@ -2211,7 +2220,7 @@ void IOPlacer::updateSlots()
22112220
void IOPlacer::runHungarianMatching(bool random_mode)
22122221
{
22132222
slots_per_section_ = parms_->getSlotsPerSection();
2214-
2223+
initExcludedIntervals();
22152224
initNetlistAndCore(hor_layers_, ver_layers_);
22162225
getBlockedRegionsFromMacros();
22172226

@@ -2355,6 +2364,7 @@ void IOPlacer::setAnnealingDebugNoPauseMode(const bool no_pause_mode)
23552364
void IOPlacer::runAnnealing(bool random)
23562365
{
23572366
slots_per_section_ = parms_->getSlotsPerSection();
2367+
initExcludedIntervals();
23582368
initNetlistAndCore(hor_layers_, ver_layers_);
23592369
getBlockedRegionsFromMacros();
23602370

src/ppl/src/IOPlacer.tcl

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -463,34 +463,7 @@ proc place_pins { args } {
463463
set lef_units [$dbTech getLefUnits]
464464

465465
foreach region $regions {
466-
if { [regexp -all {(top|bottom|left|right):(.+)} $region - edge interval] } {
467-
set edge_ [ppl::parse_edge "-exclude" $edge]
468-
469-
if {
470-
[regexp -all {([0-9]+[.]*[0-9]*|[*]+)-([0-9]+[.]*[0-9]*|[*]+)} $interval - begin end]
471-
} {
472-
if { $begin == "*" } {
473-
set begin [ppl::get_edge_extreme "-exclude" 1 $edge]
474-
}
475-
if { $end == "*" } {
476-
set end [ppl::get_edge_extreme "-exclude" 0 $edge]
477-
}
478-
set begin [expr { int($begin * $lef_units) }]
479-
set end [expr { int($end * $lef_units) }]
480-
481-
ppl::exclude_interval $edge_ $begin $end
482-
} elseif { $interval == "*" } {
483-
set begin [ppl::get_edge_extreme "-exclude" 1 $edge]
484-
set end [ppl::get_edge_extreme "-exclude" 0 $edge]
485-
486-
ppl::exclude_interval $edge_ $begin $end
487-
} else {
488-
utl::error PPL 25 "-exclude: $interval is an invalid region."
489-
}
490-
} else {
491-
utl::error PPL 26 "-exclude: invalid syntax in $region.\
492-
Use (top|bottom|left|right):interval."
493-
}
466+
exclude_io_pin_region -region $region
494467
}
495468
}
496469

src/ppl/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ or_integration_tests(
5151
exclude1
5252
exclude2
5353
exclude3
54+
exclude4
5455
gcd
5556
group_pins1
5657
group_pins2

0 commit comments

Comments
 (0)