Skip to content

Commit

Permalink
Merge pull request The-OpenROAD-Project#2898 from eder-matheus/grt_to…
Browse files Browse the repository at this point in the history
…p_level_terms

grt: implement access from below to top level terms
  • Loading branch information
eder-matheus authored Feb 14, 2023
2 parents 1cf0b31 + 63bd658 commit 5087e0f
Show file tree
Hide file tree
Showing 12 changed files with 225 additions and 13 deletions.
2 changes: 2 additions & 0 deletions src/grt/include/grt/GlobalRouter.h
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ class GlobalRouter
void loadGuidesFromDB();
void saveGuidesFromFile(std::unordered_map<odb::dbNet*, Guides>& guides);
void saveGuides();
bool isCoveringPin(Net* net, GSegment& segment);
std::vector<Net*> initFastRoute(int min_routing_layer, int max_routing_layer);
void initFastRouteIncr(std::vector<Net*>& nets);
void estimateRC();
Expand Down Expand Up @@ -292,6 +293,7 @@ class GlobalRouter
std::vector<odb::Point> findOnGridPositions(const Pin& pin,
bool& has_access_points,
odb::Point& pos_on_grid);
int getNetMaxRoutingLayer(const Net* net);
void findPins(Net* net);
void findPins(Net* net, std::vector<RoutePt>& pins_on_grid, int& root_idx);
float getNetSlack(Net* net);
Expand Down
48 changes: 36 additions & 12 deletions src/grt/src/GlobalRouter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -652,22 +652,34 @@ void GlobalRouter::findPins(Net* net)
}
}

int GlobalRouter::getNetMaxRoutingLayer(const Net* net)
{
return net->getSignalType() == odb::dbSigType::CLOCK
&& max_layer_for_clock_ > 0
? max_layer_for_clock_
: max_routing_layer_;
}

void GlobalRouter::findPins(Net* net,
std::vector<RoutePt>& pins_on_grid,
int& root_idx)
{
root_idx = 0;
const int max_routing_layer = getNetMaxRoutingLayer(net);

for (Pin& pin : net->getPins()) {
odb::Point pin_position = pin.getOnGridPosition();
int conn_layer = pin.getConnectionLayer();
odb::dbTechLayer* layer = routing_layers_[conn_layer];
// If pin is connected to PAD, create a "fake" location in routing
// grid to avoid PAD obstructions
if ((pin.isConnectedToPadOrMacro() || pin.isPort()) && !net->isLocal()
&& gcells_offset_ != 0) {
&& gcells_offset_ != 0 && conn_layer <= max_routing_layer) {
createFakePin(pin, pin_position, layer, net);
}

conn_layer = std::min(conn_layer, max_routing_layer);

int pinX
= (int) ((pin_position.x() - grid_->getXMin()) / grid_->getTileSize());
int pinY
Expand Down Expand Up @@ -1666,6 +1678,10 @@ void GlobalRouter::saveGuides()
int layer_idx = std::min(segment.init_layer, segment.final_layer);
odb::dbTechLayer* layer = routing_layers_[layer_idx];
odb::dbGuide::create(db_net, layer, box);
if (isCoveringPin(net, segment)) {
odb::dbTechLayer* layer = routing_layers_[segment.final_layer];
odb::dbGuide::create(db_net, layer, box);
}
}
} else if (segment.init_layer == segment.final_layer) {
if (segment.init_layer < min_routing_layer_
Expand All @@ -1688,6 +1704,20 @@ void GlobalRouter::saveGuides()
}
}

bool GlobalRouter::isCoveringPin(Net* net, GSegment& segment)
{
for (auto pin : net->getPins()) {
if (pin.getConnectionLayer() == segment.final_layer
&& pin.getOnGridPosition()
== odb::Point(segment.final_x, segment.final_y)
&& (pin.isPort() || pin.isConnectedToPadOrMacro())) {
return true;
}
}

return false;
}

RoutingTracks GlobalRouter::getRoutingTracksByIndex(int layer)
{
for (RoutingTracks routing_tracks : *routing_tracks_) {
Expand Down Expand Up @@ -2285,8 +2315,9 @@ odb::Point GlobalRouter::findFakePinPosition(Pin& pin, odb::dbNet* db_net)
{
odb::Point fake_position = pin.getOnGridPosition();
Net* net = db_net_map_[db_net];
const int max_routing_layer = getNetMaxRoutingLayer(net);
if ((pin.isConnectedToPadOrMacro() || pin.isPort()) && !net->isLocal()
&& gcells_offset_ != 0) {
&& gcells_offset_ != 0 && pin.getConnectionLayer() <= max_routing_layer) {
odb::dbTechLayer* layer = routing_layers_[pin.getConnectionLayer()];
createFakePin(pin, fake_position, layer, net);
}
Expand Down Expand Up @@ -2856,10 +2887,6 @@ void GlobalRouter::makeBtermPins(Net* net,
odb::dbNet* db_net,
const odb::Rect& die_area)
{
bool is_clock = (net->getSignalType() == odb::dbSigType::CLOCK);
int max_routing_layer = (is_clock && max_layer_for_clock_ > 0)
? max_layer_for_clock_
: max_routing_layer_;
for (odb::dbBTerm* bterm : db_net->getBTerms()) {
int posX, posY;
bterm->getFirstPinLocation(posX, posY);
Expand Down Expand Up @@ -2892,18 +2919,15 @@ void GlobalRouter::makeBtermPins(Net* net,
}

for (auto& layer_boxes : pin_boxes) {
if (layer_boxes.first->getRoutingLevel() <= max_routing_layer) {
pin_layers.push_back(layer_boxes.first);
}
pin_layers.push_back(layer_boxes.first);
}

if (pin_layers.empty()) {
logger_->error(
GRT,
42,
"Pin {} does not have geometries below the max routing layer ({}).",
pin_name,
getLayerName(max_routing_layer, db_));
"Pin {} does not have geometries in a valid routing layer.",
pin_name);
}

Pin pin(bterm, pin_pos, pin_layers, pin_boxes, getRectMiddle(die_area));
Expand Down
1 change: 1 addition & 0 deletions src/grt/test/critical_nets_percentage.guideok
Original file line number Diff line number Diff line change
Expand Up @@ -3935,6 +3935,7 @@ req_msg[28]
14400 108000 21600 115200 li1
0 108000 7200 115200 met1
0 108000 7200 115200 met2
0 108000 7200 115200 met3
)
req_msg[29]
(
Expand Down
2 changes: 1 addition & 1 deletion src/grt/test/invalid_pin_placement.ok
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@
[INFO GRT-0088] Layer metal9 Track-Pitch = 1.6000 line-2-Via Pitch: 1.6000
[INFO GRT-0088] Layer metal10 Track-Pitch = 1.6000 line-2-Via Pitch: 1.6000
[INFO GRT-0019] Found 0 clock nets.
[ERROR GRT-0042] Pin clk does not have geometries below the max routing layer (metal10).
[ERROR GRT-0042] Pin clk does not have geometries in a valid routing layer.
GRT-0042
1 change: 1 addition & 0 deletions src/grt/test/overlapping_edges.guideok
Original file line number Diff line number Diff line change
Expand Up @@ -80947,6 +80947,7 @@ uart_i2c_usb_sel[1]
6900 593400 13800 600300 li1
0 593400 6900 600300 met1
0 593400 6900 600300 met2
0 593400 6900 600300 met3
)
uart_rstn
(
Expand Down
1 change: 1 addition & 0 deletions src/grt/test/regression_tests.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ record_tests {
report_wire_length5
report_wire_length6
silence
top_level_term
tracks1
tracks2
tracks3
Expand Down
27 changes: 27 additions & 0 deletions src/grt/test/repair_antennas2.guideok
Original file line number Diff line number Diff line change
Expand Up @@ -3877,6 +3877,7 @@ req_msg[12]
7200 93600 14400 100800 li1
0 93600 7200 100800 met1
0 93600 7200 100800 met2
0 93600 7200 100800 met3
)
req_msg[13]
(
Expand All @@ -3894,13 +3895,15 @@ req_msg[14]
7200 108000 14400 115200 li1
0 108000 7200 115200 met1
0 108000 7200 115200 met2
0 108000 7200 115200 met3
)
req_msg[15]
(
0 158400 14400 165600 met1
7200 158400 14400 165600 li1
0 158400 7200 165600 met1
0 158400 7200 165600 met2
0 158400 7200 165600 met3
)
req_msg[16]
(
Expand Down Expand Up @@ -3936,6 +3939,7 @@ req_msg[19]
7200 151200 14400 158400 li1
0 151200 7200 158400 met1
0 151200 7200 158400 met2
0 151200 7200 158400 met3
)
req_msg[1]
(
Expand All @@ -3952,6 +3956,7 @@ req_msg[20]
259200 100800 279960 108000 met1
266400 100800 279960 108000 met1
266400 100800 279960 108000 met2
266400 100800 279960 108000 met3
)
req_msg[21]
(
Expand All @@ -3965,20 +3970,23 @@ req_msg[22]
7200 158400 14400 165600 li1
0 158400 7200 165600 met1
0 158400 7200 165600 met2
0 158400 7200 165600 met3
)
req_msg[23]
(
0 100800 14400 108000 met1
7200 100800 14400 108000 li1
0 100800 7200 108000 met1
0 100800 7200 108000 met2
0 100800 7200 108000 met3
)
req_msg[24]
(
0 100800 14400 108000 met1
7200 100800 14400 108000 li1
0 100800 7200 108000 met1
0 100800 7200 108000 met2
0 100800 7200 108000 met3
)
req_msg[25]
(
Expand Down Expand Up @@ -4020,13 +4028,15 @@ req_msg[29]
7200 115200 14400 122400 li1
0 115200 7200 122400 met1
0 115200 7200 122400 met2
0 115200 7200 122400 met3
)
req_msg[2]
(
259200 180000 266400 187200 li1
259200 180000 279960 187200 met1
266400 180000 279960 187200 met1
266400 180000 279960 187200 met2
266400 180000 279960 187200 met3
)
req_msg[30]
(
Expand All @@ -4040,6 +4050,7 @@ req_msg[31]
14400 151200 21600 158400 li1
0 151200 7200 158400 met1
0 151200 7200 158400 met2
0 151200 7200 158400 met3
)
req_msg[3]
(
Expand All @@ -4056,48 +4067,55 @@ req_msg[4]
259200 122400 279960 129600 met1
266400 122400 279960 129600 met1
266400 122400 279960 129600 met2
266400 122400 279960 129600 met3
)
req_msg[5]
(
0 144000 14400 151200 met1
7200 144000 14400 151200 li1
0 144000 7200 151200 met1
0 144000 7200 151200 met2
0 144000 7200 151200 met3
)
req_msg[6]
(
0 165600 14400 172800 met1
7200 165600 14400 172800 li1
0 165600 7200 172800 met1
0 165600 7200 172800 met2
0 165600 7200 172800 met3
)
req_msg[7]
(
0 108000 14400 115200 met1
7200 108000 14400 115200 li1
0 108000 7200 115200 met1
0 108000 7200 115200 met2
0 108000 7200 115200 met3
)
req_msg[8]
(
259200 172800 266400 180000 li1
259200 172800 279960 180000 met1
266400 172800 279960 180000 met1
266400 172800 279960 180000 met2
266400 172800 279960 180000 met3
)
req_msg[9]
(
0 158400 21600 165600 met1
14400 158400 21600 165600 li1
0 158400 7200 165600 met1
0 158400 7200 165600 met2
0 158400 7200 165600 met3
)
req_rdy
(
0 201600 21600 208800 met1
14400 201600 21600 208800 li1
0 201600 7200 208800 met1
0 201600 7200 208800 met2
0 201600 7200 208800 met3
)
req_val
(
Expand Down Expand Up @@ -4125,6 +4143,7 @@ resp_msg[0]
14400 158400 21600 165600 li1
0 158400 7200 165600 met1
0 158400 7200 165600 met2
0 158400 7200 165600 met3
)
resp_msg[10]
(
Expand All @@ -4138,27 +4157,31 @@ resp_msg[11]
259200 187200 279960 194400 met1
266400 187200 279960 194400 met1
266400 187200 279960 194400 met2
266400 187200 279960 194400 met3
)
resp_msg[12]
(
0 122400 21600 129600 met1
14400 122400 21600 129600 li1
0 122400 7200 129600 met1
0 122400 7200 129600 met2
0 122400 7200 129600 met3
)
resp_msg[13]
(
0 122400 21600 129600 met1
14400 122400 21600 129600 li1
0 122400 7200 129600 met1
0 122400 7200 129600 met2
0 122400 7200 129600 met3
)
resp_msg[14]
(
0 115200 21600 122400 met1
14400 115200 21600 122400 li1
0 115200 7200 122400 met1
0 115200 7200 122400 met2
0 115200 7200 122400 met3
)
resp_msg[15]
(
Expand Down Expand Up @@ -4202,20 +4225,23 @@ resp_msg[4]
259200 108000 279960 115200 met1
266400 108000 279960 115200 met1
266400 108000 279960 115200 met2
266400 108000 279960 115200 met3
)
resp_msg[5]
(
0 108000 21600 115200 met1
14400 108000 21600 115200 li1
0 108000 7200 115200 met1
0 108000 7200 115200 met2
0 108000 7200 115200 met3
)
resp_msg[6]
(
0 151200 21600 158400 met1
14400 151200 21600 158400 li1
0 151200 7200 158400 met1
0 151200 7200 158400 met2
0 151200 7200 158400 met3
)
resp_msg[7]
(
Expand All @@ -4232,6 +4258,7 @@ resp_msg[8]
259200 172800 279960 180000 met1
266400 172800 279960 180000 met1
266400 172800 279960 180000 met2
266400 172800 279960 180000 met3
)
resp_msg[9]
(
Expand Down
Loading

0 comments on commit 5087e0f

Please sign in to comment.