Skip to content

Commit 3df4ce0

Browse files
authored
Merge pull request #8996 from rafaelmoresco/cugrAP
grt: Add use of DRT access points to CUGR
2 parents 7e40461 + 29bfb0e commit 3df4ce0

22 files changed

+5966
-4420
lines changed

src/grt/src/cugr/src/GridGraph.cpp

Lines changed: 112 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "GRNet.h"
2222
#include "GRTree.h"
2323
#include "geo.h"
24+
#include "odb/db.h"
2425
#include "robin_hood.h"
2526
#include "utl/Logger.h"
2627

@@ -36,6 +37,7 @@ GridGraph::GridGraph(const Design* design,
3637
num_layers_(design->getNumLayers()),
3738
x_size_(gridlines_[0].size() - 1),
3839
y_size_(gridlines_[1].size() - 1),
40+
design_(design),
3941
constants_(constants)
4042
{
4143
grid_centers_.resize(2);
@@ -365,6 +367,72 @@ CostT GridGraph::getViaCost(const int layer_index, const PointT loc) const
365367
return cost;
366368
}
367369

370+
void GridGraph::convertODBtoCUGR(AccessPointSet& selected_access_points,
371+
odb::dbAccessPoint* ap,
372+
int x,
373+
int y) const
374+
{
375+
const int amount_per_x = design_->getDieRegion().hx() / x_size_;
376+
const int amount_per_y = design_->getDieRegion().hy() / y_size_;
377+
auto point = ap->getPoint();
378+
auto layer = ap->getLayer();
379+
const int ap_x = ((point.getX() + x) / amount_per_x >= x_size_)
380+
? x_size_ - 1
381+
: (point.getX() + x) / amount_per_x;
382+
const int ap_y = ((point.getY() + y) / amount_per_y >= y_size_)
383+
? y_size_ - 1
384+
: (point.getY() + y) / amount_per_y;
385+
const PointT selected_point = PointT(ap_x, ap_y);
386+
const int num_layer = ((layer->getNumber() - 2) > (getNumLayers() - 1))
387+
? getNumLayers() - 1
388+
: layer->getNumber() - 2;
389+
const IntervalT selected_layer = IntervalT(num_layer);
390+
const AccessPoint ap_new{.point = selected_point, .layers = selected_layer};
391+
selected_access_points.emplace(ap_new);
392+
}
393+
394+
bool GridGraph::findODBAccessPoints(
395+
const GRNet* net,
396+
AccessPointSet& selected_access_points) const
397+
{
398+
std::vector<odb::dbAccessPoint*> access_points;
399+
odb::dbNet* db_net = net->getDbNet();
400+
if (db_net->getBTermCount() != 0) {
401+
for (odb::dbBTerm* bterms : db_net->getBTerms()) {
402+
for (const odb::dbBPin* bpin : bterms->getBPins()) {
403+
const std::vector<odb::dbAccessPoint*>& bpin_pas
404+
= bpin->getAccessPoints();
405+
// Iterates per each AP and converts to CUGR structures
406+
access_points.insert(
407+
access_points.begin(), bpin_pas.begin(), bpin_pas.end());
408+
for (auto ap : bpin_pas) {
409+
convertODBtoCUGR(selected_access_points, ap, 0, 0);
410+
}
411+
}
412+
}
413+
} else {
414+
for (auto iterms : db_net->getITerms()) {
415+
auto pref_access_points = iterms->getPrefAccessPoints();
416+
if (!pref_access_points.empty()) {
417+
access_points.insert(access_points.end(),
418+
pref_access_points.begin(),
419+
pref_access_points.end());
420+
// Iterates in ITerm prefered APs and convert to CUGR strucutres
421+
for (auto ap : pref_access_points) {
422+
int x, y;
423+
iterms->getInst()->getLocation(x, y);
424+
convertODBtoCUGR(selected_access_points, ap, x, y);
425+
}
426+
}
427+
// Currently ignoring non preferred APs
428+
}
429+
}
430+
if (access_points.empty()) {
431+
return false;
432+
}
433+
return true;
434+
}
435+
368436
AccessPointSet GridGraph::selectAccessPoints(const GRNet* net) const
369437
{
370438
AccessPointHash hasher(y_size_);
@@ -373,62 +441,60 @@ AccessPointSet GridGraph::selectAccessPoints(const GRNet* net) const
373441
selected_access_points.reserve(net->getNumPins());
374442
const auto& boundingBox = net->getBoundingBox();
375443
const PointT netCenter(boundingBox.cx(), boundingBox.cy());
376-
for (const std::vector<GRPoint>& accessPoints : net->getPinAccessPoints()) {
377-
std::pair<int, int> bestAccessDist = {0, std::numeric_limits<int>::max()};
378-
int bestIndex = -1;
379-
for (int index = 0; index < accessPoints.size(); index++) {
380-
const GRPoint& point = accessPoints[index];
381-
int accessibility = 0;
382-
if (point.getLayerIdx() >= constants_.min_routing_layer) {
383-
const int direction = getLayerDirection(point.getLayerIdx());
384-
accessibility
385-
+= getEdge(point.getLayerIdx(), point.x(), point.y()).capacity >= 1;
386-
if (point[direction] > 0) {
387-
auto lower = point;
388-
lower[direction] -= 1;
444+
// Skips calculations if DRT already created APs in ODB
445+
if (!findODBAccessPoints(net, selected_access_points)) {
446+
for (const std::vector<GRPoint>& accessPoints : net->getPinAccessPoints()) {
447+
std::pair<int, int> bestAccessDist = {0, std::numeric_limits<int>::max()};
448+
int bestIndex = -1;
449+
for (int index = 0; index < accessPoints.size(); index++) {
450+
const GRPoint& point = accessPoints[index];
451+
int accessibility = 0;
452+
if (point.getLayerIdx() >= constants_.min_routing_layer) {
453+
const int direction = getLayerDirection(point.getLayerIdx());
389454
accessibility
390-
+= getEdge(lower.getLayerIdx(), lower.x(), lower.y()).capacity
455+
+= getEdge(point.getLayerIdx(), point.x(), point.y()).capacity
391456
>= 1;
457+
if (point[direction] > 0) {
458+
auto lower = point;
459+
lower[direction] -= 1;
460+
accessibility
461+
+= getEdge(lower.getLayerIdx(), lower.x(), lower.y()).capacity
462+
>= 1;
463+
}
464+
} else {
465+
accessibility = 1;
466+
}
467+
const int distance
468+
= abs(netCenter.x() - point.x()) + abs(netCenter.y() - point.y());
469+
if (accessibility > bestAccessDist.first
470+
|| (accessibility == bestAccessDist.first
471+
&& distance < bestAccessDist.second)) {
472+
bestIndex = index;
473+
bestAccessDist = {accessibility, distance};
392474
}
393-
} else {
394-
accessibility = 1;
395475
}
396-
const int distance
397-
= abs(netCenter.x() - point.x()) + abs(netCenter.y() - point.y());
398-
if (accessibility > bestAccessDist.first
399-
|| (accessibility == bestAccessDist.first
400-
&& distance < bestAccessDist.second)) {
401-
bestIndex = index;
402-
bestAccessDist = {accessibility, distance};
476+
if (bestAccessDist.first == 0) {
477+
logger_->warn(utl::GRT, 274, "pin is hard to access.");
403478
}
404-
}
405-
if (bestAccessDist.first == 0) {
406-
logger_->warn(utl::GRT, 274, "pin is hard to access.");
407-
}
408479

409-
if (bestIndex == -1) {
410-
logger_->error(utl::GRT,
411-
283,
412-
"No preferred access point found for pin on net {}.",
413-
net->getName());
414-
}
480+
if (bestIndex == -1) {
481+
logger_->error(utl::GRT,
482+
283,
483+
"No preferred access point found for pin on net {}.",
484+
net->getName());
485+
}
415486

416-
const PointT selectedPoint = accessPoints[bestIndex];
417-
const AccessPoint ap{selectedPoint, {}};
418-
auto it = selected_access_points.emplace(ap).first;
419-
IntervalT& fixedLayerInterval = it->layers;
420-
for (const auto& point : accessPoints) {
421-
if (point.x() == selectedPoint.x() && point.y() == selectedPoint.y()) {
422-
fixedLayerInterval.Update(point.getLayerIdx());
487+
const PointT selectedPoint = accessPoints[bestIndex];
488+
const AccessPoint ap{.point = selectedPoint, .layers = {}};
489+
auto it = selected_access_points.emplace(ap).first;
490+
IntervalT& fixedLayerInterval = it->layers;
491+
for (const auto& point : accessPoints) {
492+
if (point.x() == selectedPoint.x() && point.y() == selectedPoint.y()) {
493+
fixedLayerInterval.Update(point.getLayerIdx());
494+
}
423495
}
424496
}
425497
}
426-
// Extend the fixed layers to 2 layers higher to facilitate track switching
427-
for (auto& accessPoint : selected_access_points) {
428-
IntervalT& fixedLayers = accessPoint.layers;
429-
fixedLayers.SetHigh(
430-
std::min(fixedLayers.high() + 2, (int) getNumLayers() - 1));
431-
}
432498
return selected_access_points;
433499
}
434500

src/grt/src/cugr/src/GridGraph.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "GRTree.h"
1414
#include "Layers.h"
1515
#include "geo.h"
16+
#include "odb/db.h"
1617
#include "robin_hood.h"
1718

1819
namespace grt {
@@ -150,6 +151,12 @@ class GridGraph
150151
{
151152
return unit_length_short_costs_[layer_index];
152153
}
154+
void convertODBtoCUGR(AccessPointSet& selected_access_points,
155+
odb::dbAccessPoint* ap,
156+
int x,
157+
int y) const;
158+
bool findODBAccessPoints(const GRNet* net,
159+
AccessPointSet& selected_access_points) const;
153160

154161
double logistic(const CapacityT& input, double slope) const;
155162
CostT getWireCost(int layer_index,
@@ -175,6 +182,8 @@ class GridGraph
175182
const int x_size_;
176183
const int y_size_;
177184

185+
const Design* design_;
186+
178187
// Unit costs
179188
CostT unit_length_wire_cost_;
180189
CostT unit_via_cost_;

src/grt/test/BUILD

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ TESTS = [
4747
"pd3",
4848
"pd4",
4949
"pin_access1",
50+
"pin_access1_cugr",
5051
"pin_access2",
52+
"pin_access2_cugr",
5153
"pin_edge",
5254
"pin_track_not_aligned",
5355
"pre_routed1",
@@ -118,6 +120,8 @@ MANUAL_FOR_BAZEL_TESTS = [
118120
"cugr_adjustment2",
119121
"cugr_adjustment3",
120122
"gcd_cugr",
123+
"pin_access1_cugr",
124+
"pin_access2_cugr",
121125
]
122126

123127
[regression_test(

src/grt/test/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ or_integration_tests(
4545
pd3
4646
pd4
4747
pin_access1
48+
pin_access1_cugr
4849
pin_access2
50+
pin_access2_cugr
4951
pin_edge
5052
pin_track_not_aligned
5153
pre_routed1

src/grt/test/clock_route_cugr.guideok

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
clk
22
(
3-
0 201600 7200 208800 met3
4-
0 151200 7200 208800 met4
5-
0 201600 7200 208800 met4
6-
0 151200 7200 158400 met3
7-
0 151200 136800 158400 met3
3+
0 201600 136800 208800 met3
4+
129600 201600 136800 208800 met3
5+
129600 151200 136800 208800 met4
86
129600 151200 136800 158400 li1
97
129600 151200 136800 158400 met1
108
129600 151200 136800 158400 met2
9+
129600 151200 136800 158400 met3
1110
)
1211
clknet_0_clk
1312
(
@@ -272,7 +271,6 @@ net56
272271
129600 122400 136800 129600 met2
273272
115200 122400 122400 144000 met2
274273
115200 136800 122400 144000 met1
275-
115200 136800 122400 144000 met2
276274
)
277275
net57
278276
(
@@ -289,22 +287,16 @@ net58
289287
108000 172800 115200 180000 met1
290288
108000 172800 115200 187200 met2
291289
108000 180000 115200 187200 met1
292-
108000 180000 115200 187200 met2
293290
)
294291
net59
295292
(
296293
108000 194400 115200 201600 li1
297294
108000 194400 115200 201600 met1
298-
108000 194400 115200 201600 met1
299-
108000 194400 115200 201600 met2
300-
108000 194400 115200 201600 met2
301-
108000 194400 115200 201600 met3
302295
)
303296
net60
304297
(
305298
115200 194400 122400 201600 met1
306299
115200 194400 122400 208800 met2
307-
115200 194400 122400 201600 met2
308300
115200 201600 122400 208800 li1
309301
115200 201600 122400 208800 met1
310302
)
@@ -314,7 +306,6 @@ net61
314306
122400 187200 129600 194400 met1
315307
122400 187200 129600 201600 met2
316308
122400 194400 129600 201600 met1
317-
122400 194400 129600 201600 met2
318309
)
319310
net62
320311
(
@@ -330,7 +321,6 @@ net63
330321
(
331322
129600 187200 136800 194400 met1
332323
129600 187200 136800 201600 met2
333-
129600 187200 136800 194400 met2
334324
129600 194400 136800 208800 met2
335325
129600 194400 136800 201600 li1
336326
129600 194400 136800 201600 met1

src/grt/test/clock_route_cugr.ok

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ stage 1: pattern routing
2929
0 / 15 nets have overflow.
3030
routing statistics
3131
wire length (metric): 2918
32-
total via count: 211
32+
total via count: 203
3333
total wire overflow: 0
3434
min resource: 2
3535
bottleneck: (5, 0, 0)

src/grt/test/clock_route_cugr2.guideok

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
clk
22
(
33
0 201600 136800 208800 met3
4-
0 201600 7200 208800 met3
5-
0 201600 7200 208800 met4
64
129600 201600 136800 208800 met3
75
129600 151200 136800 208800 met4
86
129600 151200 136800 158400 li1
@@ -274,7 +272,6 @@ net56
274272
129600 122400 136800 129600 met2
275273
115200 122400 122400 144000 met2
276274
115200 136800 122400 144000 met1
277-
115200 136800 122400 144000 met2
278275
)
279276
net57
280277
(
@@ -291,22 +288,16 @@ net58
291288
108000 172800 115200 180000 met1
292289
108000 172800 115200 187200 met2
293290
108000 180000 115200 187200 met1
294-
108000 180000 115200 187200 met2
295291
)
296292
net59
297293
(
298294
108000 194400 115200 201600 li1
299295
108000 194400 115200 201600 met1
300-
108000 194400 115200 201600 met1
301-
108000 194400 115200 201600 met2
302-
108000 194400 115200 201600 met2
303-
108000 194400 115200 201600 met3
304296
)
305297
net60
306298
(
307299
115200 194400 122400 201600 met1
308300
115200 194400 122400 208800 met2
309-
115200 194400 122400 201600 met2
310301
115200 201600 122400 208800 li1
311302
115200 201600 122400 208800 met1
312303
)
@@ -316,7 +307,6 @@ net61
316307
122400 187200 129600 194400 met1
317308
122400 187200 129600 201600 met2
318309
122400 194400 129600 201600 met1
319-
122400 194400 129600 201600 met2
320310
)
321311
net62
322312
(
@@ -332,7 +322,6 @@ net63
332322
(
333323
129600 187200 136800 194400 met1
334324
129600 187200 136800 201600 met2
335-
129600 187200 136800 194400 met2
336325
129600 194400 136800 208800 met2
337326
129600 194400 136800 201600 li1
338327
129600 194400 136800 201600 met1

src/grt/test/clock_route_cugr2.ok

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ stage 1: pattern routing
2929
0 / 15 nets have overflow.
3030
routing statistics
3131
wire length (metric): 2918
32-
total via count: 213
32+
total via count: 204
3333
total wire overflow: 0
3434
min resource: 1
3535
bottleneck: (5, 0, 0)

0 commit comments

Comments
 (0)