Skip to content

Commit 343d3c0

Browse files
authored
Merge pull request The-OpenROAD-Project#5262 from The-OpenROAD-Project-staging/grt-rudy-width-fix
Grt rudy width fix
2 parents 0ee8029 + 9e64760 commit 343d3c0

File tree

9 files changed

+467
-627
lines changed

9 files changed

+467
-627
lines changed

src/gpl/test/simple03-rd.ok

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@
7272
[INFO GPL-0040] NumTiles: 196
7373
[INFO GPL-0081] TotalRouteOverflow: 0.0
7474
[INFO GPL-0082] OverflowTileCnt: 0
75-
[INFO GPL-0083] 0.5%RC: 0.8663694858551025
76-
[INFO GPL-0084] 1.0%RC: 0.7915560305118561
77-
[INFO GPL-0085] 2.0%RC: 0.7390100508928299
78-
[INFO GPL-0086] 5.0%RC: 0.6729927897453308
79-
[INFO GPL-0087] FinalRC: 0.82896274
75+
[INFO GPL-0083] 0.5%RC: 0.48812615871429443
76+
[INFO GPL-0084] 1.0%RC: 0.4571320414543152
77+
[INFO GPL-0085] 2.0%RC: 0.4332096576690674
78+
[INFO GPL-0086] 5.0%RC: 0.3979834884405136
79+
[INFO GPL-0087] FinalRC: 0.4726291
8080
[INFO GPL-0077] FinalRC lower than targetRC(1.25), routability not needed.
8181
[NesterovSolve] Iter: 290 overflow: 0.267 HPWL: 4778698
8282
[NesterovSolve] Iter: 300 overflow: 0.233 HPWL: 4810713

src/gpl/test/simple04-rd.defok

Lines changed: 294 additions & 294 deletions
Large diffs are not rendered by default.

src/gpl/test/simple04-rd.ok

Lines changed: 14 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -72,167 +72,18 @@
7272
[INFO GPL-0040] NumTiles: 196
7373
[INFO GPL-0081] TotalRouteOverflow: 0.0
7474
[INFO GPL-0082] OverflowTileCnt: 0
75-
[INFO GPL-0083] 0.5%RC: 0.8663694858551025
76-
[INFO GPL-0084] 1.0%RC: 0.7915560305118561
77-
[INFO GPL-0085] 2.0%RC: 0.7390100508928299
78-
[INFO GPL-0086] 5.0%RC: 0.6729927897453308
79-
[INFO GPL-0087] FinalRC: 0.82896274
80-
[INFO GPL-0078] FinalRC lower than minRC (1e+30), min RC updated.
81-
[INFO GPL-0045] InflatedAreaDelta: 0.000 um^2
82-
[INFO GPL-0046] TargetDensity: 0.700
83-
[INFO GPL-0049] WhiteSpaceArea: 953.876 um^2
84-
[INFO GPL-0050] NesterovInstsArea: 569.772 um^2
85-
[INFO GPL-0051] TotalFillerArea: 97.941 um^2
86-
[INFO GPL-0052] TotalGCellsArea: 667.713 um^2
87-
[INFO GPL-0053] ExpectedGCellsArea: 667.713 um^2
88-
[INFO GPL-0054] NewTargetDensity: 0.700
89-
[INFO GPL-0055] NewWhiteSpaceArea: 953.876 um^2
90-
[INFO GPL-0056] MovableArea: 667.713 um^2
91-
[INFO GPL-0057] NewNesterovInstArea: 569.772 um^2
92-
[INFO GPL-0058] NewTotalFillerArea: 97.941 um^2
93-
[INFO GPL-0059] NewTotalGCellsArea: 667.713 um^2
94-
[NesterovSolve] Revert back to snapshot coordi
95-
[NesterovSolve] Iter: 290 overflow: 0.569 HPWL: 4622568
96-
[NesterovSolve] Iter: 300 overflow: 0.534 HPWL: 4678132
97-
[NesterovSolve] Iter: 310 overflow: 0.488 HPWL: 4696790
98-
[NesterovSolve] Iter: 320 overflow: 0.446 HPWL: 4684731
99-
[NesterovSolve] Iter: 330 overflow: 0.400 HPWL: 4669364
100-
[NesterovSolve] Iter: 340 overflow: 0.357 HPWL: 4655730
101-
[NesterovSolve] Iter: 350 overflow: 0.319 HPWL: 4686260
102-
[INFO GPL-0075] Routability numCall: 2 inflationIterCnt: 2 bloatIterCnt: 0
103-
[INFO GPL-0036] TileBBox: ( 0 0 ) ( 4200 4200 ) DBU
104-
[INFO GPL-0038] TileCnt: 14 14
105-
[INFO GPL-0040] NumTiles: 196
106-
[INFO GPL-0081] TotalRouteOverflow: 0.0
107-
[INFO GPL-0082] OverflowTileCnt: 0
108-
[INFO GPL-0083] 0.5%RC: 0.8215832710266113
109-
[INFO GPL-0084] 1.0%RC: 0.781876266002655
110-
[INFO GPL-0085] 2.0%RC: 0.7435924112796783
111-
[INFO GPL-0086] 5.0%RC: 0.6735508263111114
112-
[INFO GPL-0087] FinalRC: 0.8017298
113-
[INFO GPL-0078] FinalRC lower than minRC (0.82896274), min RC updated.
114-
[INFO GPL-0045] InflatedAreaDelta: 0.000 um^2
115-
[INFO GPL-0046] TargetDensity: 0.700
116-
[INFO GPL-0049] WhiteSpaceArea: 953.876 um^2
117-
[INFO GPL-0050] NesterovInstsArea: 569.772 um^2
118-
[INFO GPL-0051] TotalFillerArea: 97.941 um^2
119-
[INFO GPL-0052] TotalGCellsArea: 667.713 um^2
120-
[INFO GPL-0053] ExpectedGCellsArea: 667.713 um^2
121-
[INFO GPL-0054] NewTargetDensity: 0.700
122-
[INFO GPL-0055] NewWhiteSpaceArea: 953.876 um^2
123-
[INFO GPL-0056] MovableArea: 667.713 um^2
124-
[INFO GPL-0057] NewNesterovInstArea: 569.772 um^2
125-
[INFO GPL-0058] NewTotalFillerArea: 97.941 um^2
126-
[INFO GPL-0059] NewTotalGCellsArea: 667.713 um^2
127-
[NesterovSolve] Revert back to snapshot coordi
128-
[NesterovSolve] Iter: 360 overflow: 0.587 HPWL: 4587768
129-
[NesterovSolve] Iter: 370 overflow: 0.556 HPWL: 4648997
130-
[NesterovSolve] Iter: 380 overflow: 0.518 HPWL: 4695007
131-
[NesterovSolve] Iter: 390 overflow: 0.475 HPWL: 4690204
132-
[NesterovSolve] Iter: 400 overflow: 0.434 HPWL: 4683351
133-
[NesterovSolve] Iter: 410 overflow: 0.377 HPWL: 4645116
134-
[NesterovSolve] Iter: 420 overflow: 0.344 HPWL: 4663512
135-
[NesterovSolve] Iter: 430 overflow: 0.307 HPWL: 4699230
136-
[INFO GPL-0075] Routability numCall: 3 inflationIterCnt: 3 bloatIterCnt: 0
137-
[INFO GPL-0036] TileBBox: ( 0 0 ) ( 4200 4200 ) DBU
138-
[INFO GPL-0038] TileCnt: 14 14
139-
[INFO GPL-0040] NumTiles: 196
140-
[INFO GPL-0081] TotalRouteOverflow: 0.0
141-
[INFO GPL-0082] OverflowTileCnt: 0
142-
[INFO GPL-0083] 0.5%RC: 0.8215832710266113
143-
[INFO GPL-0084] 1.0%RC: 0.781876266002655
144-
[INFO GPL-0085] 2.0%RC: 0.7435924112796783
145-
[INFO GPL-0086] 5.0%RC: 0.6735508263111114
146-
[INFO GPL-0087] FinalRC: 0.8017298
147-
[INFO GPL-0079] MinRC (0.8017298) violation occurred, total count: 1.
148-
[INFO GPL-0045] InflatedAreaDelta: 0.000 um^2
149-
[INFO GPL-0046] TargetDensity: 0.700
150-
[INFO GPL-0049] WhiteSpaceArea: 953.876 um^2
151-
[INFO GPL-0050] NesterovInstsArea: 569.772 um^2
152-
[INFO GPL-0051] TotalFillerArea: 97.941 um^2
153-
[INFO GPL-0052] TotalGCellsArea: 667.713 um^2
154-
[INFO GPL-0053] ExpectedGCellsArea: 667.713 um^2
155-
[INFO GPL-0054] NewTargetDensity: 0.700
156-
[INFO GPL-0055] NewWhiteSpaceArea: 953.876 um^2
157-
[INFO GPL-0056] MovableArea: 667.713 um^2
158-
[INFO GPL-0057] NewNesterovInstArea: 569.772 um^2
159-
[INFO GPL-0058] NewTotalFillerArea: 97.941 um^2
160-
[INFO GPL-0059] NewTotalGCellsArea: 667.713 um^2
161-
[NesterovSolve] Revert back to snapshot coordi
162-
[NesterovSolve] Iter: 440 overflow: 0.575 HPWL: 4610091
163-
[NesterovSolve] Iter: 450 overflow: 0.541 HPWL: 4672342
164-
[NesterovSolve] Iter: 460 overflow: 0.499 HPWL: 4694087
165-
[NesterovSolve] Iter: 470 overflow: 0.455 HPWL: 4691130
166-
[NesterovSolve] Iter: 480 overflow: 0.411 HPWL: 4681679
167-
[NesterovSolve] Iter: 490 overflow: 0.364 HPWL: 4647002
168-
[NesterovSolve] Iter: 500 overflow: 0.327 HPWL: 4684079
169-
[INFO GPL-0075] Routability numCall: 4 inflationIterCnt: 4 bloatIterCnt: 0
170-
[INFO GPL-0036] TileBBox: ( 0 0 ) ( 4200 4200 ) DBU
171-
[INFO GPL-0038] TileCnt: 14 14
172-
[INFO GPL-0040] NumTiles: 196
173-
[INFO GPL-0081] TotalRouteOverflow: 0.0
174-
[INFO GPL-0082] OverflowTileCnt: 0
175-
[INFO GPL-0083] 0.5%RC: 0.8215832710266113
176-
[INFO GPL-0084] 1.0%RC: 0.781876266002655
177-
[INFO GPL-0085] 2.0%RC: 0.7435924112796783
178-
[INFO GPL-0086] 5.0%RC: 0.6735508263111114
179-
[INFO GPL-0087] FinalRC: 0.8017298
180-
[INFO GPL-0079] MinRC (0.8017298) violation occurred, total count: 2.
181-
[INFO GPL-0045] InflatedAreaDelta: 0.000 um^2
182-
[INFO GPL-0046] TargetDensity: 0.700
183-
[INFO GPL-0049] WhiteSpaceArea: 953.876 um^2
184-
[INFO GPL-0050] NesterovInstsArea: 569.772 um^2
185-
[INFO GPL-0051] TotalFillerArea: 97.941 um^2
186-
[INFO GPL-0052] TotalGCellsArea: 667.713 um^2
187-
[INFO GPL-0053] ExpectedGCellsArea: 667.713 um^2
188-
[INFO GPL-0054] NewTargetDensity: 0.700
189-
[INFO GPL-0055] NewWhiteSpaceArea: 953.876 um^2
190-
[INFO GPL-0056] MovableArea: 667.713 um^2
191-
[INFO GPL-0057] NewNesterovInstArea: 569.772 um^2
192-
[INFO GPL-0058] NewTotalFillerArea: 97.941 um^2
193-
[INFO GPL-0059] NewTotalGCellsArea: 667.713 um^2
194-
[NesterovSolve] Revert back to snapshot coordi
195-
[NesterovSolve] Iter: 510 overflow: 0.594 HPWL: 4571046
196-
[NesterovSolve] Iter: 520 overflow: 0.563 HPWL: 4637180
197-
[NesterovSolve] Iter: 530 overflow: 0.526 HPWL: 4686839
198-
[NesterovSolve] Iter: 540 overflow: 0.482 HPWL: 4691202
199-
[NesterovSolve] Iter: 550 overflow: 0.439 HPWL: 4682012
200-
[NesterovSolve] Iter: 560 overflow: 0.387 HPWL: 4658075
201-
[NesterovSolve] Iter: 570 overflow: 0.348 HPWL: 4662159
202-
[NesterovSolve] Iter: 580 overflow: 0.313 HPWL: 4691486
203-
[INFO GPL-0075] Routability numCall: 5 inflationIterCnt: 0 bloatIterCnt: 1
204-
[INFO GPL-0036] TileBBox: ( 0 0 ) ( 4200 4200 ) DBU
205-
[INFO GPL-0038] TileCnt: 14 14
206-
[INFO GPL-0040] NumTiles: 196
207-
[INFO GPL-0081] TotalRouteOverflow: 0.0
208-
[INFO GPL-0082] OverflowTileCnt: 0
209-
[INFO GPL-0083] 0.5%RC: 0.8215832710266113
210-
[INFO GPL-0084] 1.0%RC: 0.781876266002655
211-
[INFO GPL-0085] 2.0%RC: 0.7435924112796783
212-
[INFO GPL-0086] 5.0%RC: 0.6735508263111114
213-
[INFO GPL-0087] FinalRC: 0.8017298
214-
[INFO GPL-0079] MinRC (0.8017298) violation occurred, total count: 3.
215-
[INFO GPL-0045] InflatedAreaDelta: 0.000 um^2
216-
[INFO GPL-0046] TargetDensity: 0.700
217-
Revert Routability Procedure. Target density higher than max, or minRC max violations.
218-
[INFO GPL-0080] minRcViolatedCnt: 3
219-
[INFO GPL-0047] SavedMinRC: 0.8017
220-
[INFO GPL-0048] SavedTargetDensity: 0.7000
221-
[NesterovSolve] Revert back to snapshot coordi
222-
[NesterovSolve] Iter: 590 overflow: 0.581 HPWL: 4598491
223-
[NesterovSolve] Iter: 600 overflow: 0.549 HPWL: 4661193
224-
[NesterovSolve] Iter: 610 overflow: 0.508 HPWL: 4695290
225-
[NesterovSolve] Iter: 620 overflow: 0.462 HPWL: 4702654
226-
[NesterovSolve] Iter: 630 overflow: 0.422 HPWL: 4689847
227-
[NesterovSolve] Iter: 640 overflow: 0.370 HPWL: 4639836
228-
[NesterovSolve] Iter: 650 overflow: 0.336 HPWL: 4674234
229-
[NesterovSolve] Iter: 660 overflow: 0.303 HPWL: 4711304
230-
[NesterovSolve] Iter: 670 overflow: 0.273 HPWL: 4774258
231-
[NesterovSolve] Iter: 680 overflow: 0.236 HPWL: 4804987
232-
[NesterovSolve] Iter: 690 overflow: 0.204 HPWL: 4845754
233-
[NesterovSolve] Iter: 700 overflow: 0.174 HPWL: 4878074
234-
[NesterovSolve] Iter: 710 overflow: 0.146 HPWL: 4911284
235-
[NesterovSolve] Iter: 720 overflow: 0.122 HPWL: 4938747
236-
[NesterovSolve] Iter: 730 overflow: 0.103 HPWL: 4964040
237-
[NesterovSolve] Finished with Overflow: 0.099315
75+
[INFO GPL-0083] 0.5%RC: 0.48812615871429443
76+
[INFO GPL-0084] 1.0%RC: 0.4571320414543152
77+
[INFO GPL-0085] 2.0%RC: 0.4332096576690674
78+
[INFO GPL-0086] 5.0%RC: 0.3979834884405136
79+
[INFO GPL-0087] FinalRC: 0.4726291
80+
[INFO GPL-0077] FinalRC lower than targetRC(0.67), routability not needed.
81+
[NesterovSolve] Iter: 290 overflow: 0.267 HPWL: 4778698
82+
[NesterovSolve] Iter: 300 overflow: 0.233 HPWL: 4810713
83+
[NesterovSolve] Iter: 310 overflow: 0.202 HPWL: 4848299
84+
[NesterovSolve] Iter: 320 overflow: 0.171 HPWL: 4881515
85+
[NesterovSolve] Iter: 330 overflow: 0.143 HPWL: 4916941
86+
[NesterovSolve] Iter: 340 overflow: 0.123 HPWL: 4942028
87+
[NesterovSolve] Iter: 350 overflow: 0.101 HPWL: 4964095
88+
[NesterovSolve] Finished with Overflow: 0.099533
23889
No differences found.

src/grt/include/grt/GlobalRouter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ class GlobalRouter : public ant::GlobalRouteSource
161161
void setAdjustment(const float adjustment);
162162
void setMinRoutingLayer(const int min_layer);
163163
void setMaxRoutingLayer(const int max_layer);
164+
int getMinRoutingLayer() const { return min_routing_layer_; }
164165
int getMaxRoutingLayer() const { return max_routing_layer_; }
165166
void setMinLayerForClock(const int min_layer);
166167
void setMaxLayerForClock(const int max_layer);
@@ -180,7 +181,6 @@ class GlobalRouter : public ant::GlobalRouteSource
180181
void setAllowCongestion(bool allow_congestion);
181182
void setMacroExtension(int macro_extension);
182183
void setPinOffset(int pin_offset);
183-
int getMinRoutingLayer() const { return min_routing_layer_; }
184184

185185
// flow functions
186186
void readGuides(const char* file_name);

src/grt/src/Rudy.cpp

Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ Rudy::Rudy(odb::dbBlock* block, grt::GlobalRouter* grouter)
4646
if (grid_block_.area() == 0) {
4747
return;
4848
}
49-
// TODO: Match the wire width with the paper definition
50-
wire_width_ = block_->getTech()->findRoutingLayer(1)->getWidth();
5149

5250
if (!grouter_->isInitialized()) {
5351
int min_layer, max_layer;
@@ -56,6 +54,23 @@ Rudy::Rudy(odb::dbBlock* block, grt::GlobalRouter* grouter)
5654
grouter_->initFastRoute(min_layer, max_layer);
5755
}
5856

57+
// The wire width is the harmonic average pitch divided by the number of
58+
// routing layers.
59+
double pitch_terms = 0;
60+
const int min_routing_layer = grouter->getMinRoutingLayer();
61+
const int max_routing_layer = grouter->getMaxRoutingLayer();
62+
const auto tech = block_->getTech();
63+
for (int layer_idx = min_routing_layer; layer_idx <= max_routing_layer;
64+
++layer_idx) {
65+
const auto layer = tech->findRoutingLayer(layer_idx);
66+
int pitch = layer->getPitch();
67+
if (pitch == 0) {
68+
pitch = layer->getWidth() + layer->getSpacing();
69+
}
70+
pitch_terms += 1.0 / pitch;
71+
}
72+
wire_width_ = 1 / pitch_terms; // = harm. mean / num_routing_layers
73+
5974
int x_grids, y_grids;
6075
grouter_->getGridSize(x_grids, y_grids);
6176
tile_size_ = grouter_->getGridTileSize();
@@ -131,36 +146,6 @@ void Rudy::calculateRudy()
131146
processIntersectionSignalNet(net_rect);
132147
}
133148
}
134-
135-
double min_rudy = std::numeric_limits<double>::max();
136-
double max_observed_rudy = std::numeric_limits<double>::lowest();
137-
138-
for (int x = 0; x < grid_.size(); x++) {
139-
for (int y = 0; y < grid_[x].size(); y++) {
140-
const Tile& tile = getEditableTile(x, y);
141-
const double rudy_value = tile.getRudy();
142-
min_rudy = std::min(min_rudy, rudy_value);
143-
max_observed_rudy = std::max(max_observed_rudy, rudy_value);
144-
}
145-
}
146-
147-
for (int x = 0; x < grid_.size(); x++) {
148-
for (int y = 0; y < grid_[x].size(); y++) {
149-
Tile& tile = getEditableTile(x, y);
150-
const float rudy_value = tile.getRudy();
151-
float normalized_rudy = min_rudy;
152-
if (rudy_value > min_rudy) {
153-
normalized_rudy = min_rudy
154-
+ (rudy_value - min_rudy)
155-
/ (max_observed_rudy - min_rudy)
156-
* (140 - min_rudy);
157-
}
158-
if (normalized_rudy < rudy_value) {
159-
tile.clearRudy();
160-
tile.addRudy(normalized_rudy);
161-
}
162-
}
163-
}
164149
}
165150

166151
void Rudy::processIntersectionSignalNet(const odb::Rect net_rect)

0 commit comments

Comments
 (0)