Skip to content

Commit 66559c8

Browse files
authored
Merge pull request #7254 from The-OpenROAD-Project-staging/grt-rc-correlate
Update grt, drt, rsz utilities to support RC correlation
2 parents 3c6b3fe + 5f78034 commit 66559c8

File tree

10 files changed

+103
-27
lines changed

10 files changed

+103
-27
lines changed

src/drt/include/triton_route/TritonRoute.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class dbDatabase;
2020
class dbInst;
2121
class dbBTerm;
2222
class dbNet;
23+
class dbWire;
2324
} // namespace odb
2425

2526
namespace utl {
@@ -163,6 +164,7 @@ class TritonRoute
163164
const std::list<std::unique_ptr<frMarker>>& markers,
164165
const std::string& marker_name,
165166
odb::Rect drcBox = odb::Rect(0, 0, 0, 0)) const;
167+
std::vector<int> routeLayerLengths(odb::dbWire* wire) const;
166168
void checkDRC(const char* filename,
167169
int x1,
168170
int y1,

src/drt/src/TritonRoute.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1385,4 +1385,24 @@ void TritonRoute::reportDRC(const std::string& file_name,
13851385
tool_category->writeTR(file_name);
13861386
}
13871387

1388+
std::vector<int> TritonRoute::routeLayerLengths(odb::dbWire* wire) const
1389+
{
1390+
std::vector<int> lengths;
1391+
lengths.resize(db_->getTech()->getLayerCount());
1392+
odb::dbWireShapeItr shapes;
1393+
odb::dbShape s;
1394+
1395+
for (shapes.begin(wire); shapes.next(s);) {
1396+
if (!s.isVia()) {
1397+
lengths[s.getTechLayer()->getNumber()] += s.getLength();
1398+
} else {
1399+
if (s.getTechVia()) {
1400+
lengths[s.getTechVia()->getBottomLayer()->getNumber() + 1] += 1;
1401+
}
1402+
}
1403+
}
1404+
1405+
return lengths;
1406+
}
1407+
13881408
} // namespace drt

src/drt/src/TritonRoute.i

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414
%include "../../Exception.i"
1515

16+
%import <stl.i>
17+
%import <std_vector.i>
18+
%template(vector_int) std::vector<int>;
19+
1620
%inline %{
1721

1822
int detailed_route_num_drvs()
@@ -218,4 +222,12 @@ void check_drc_cmd(const char* drc_file, int x1, int y1, int x2, int y2, const c
218222
const int num_threads = ord::OpenRoad::openRoad()->getThreadCount();
219223
router->checkDRC(drc_file, x1, y1, x2, y2, marker_name, num_threads);
220224
}
225+
226+
std::vector<int>
227+
route_layer_lengths(odb::dbWire* db_wire)
228+
{
229+
auto* router = ord::OpenRoad::openRoad()->getTritonRoute();
230+
return router->routeLayerLengths(db_wire);
231+
}
232+
221233
%} // inline

src/grt/src/GlobalRouter.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ void GlobalRouter::estimateRC(sta::SpefWriter* spef_writer)
517517
for (auto& [db_net, route] : routes_) {
518518
if (!route.empty()) {
519519
Net* net = getNet(db_net);
520-
builder.estimateParasitcs(db_net, net->getPins(), route, spef_writer);
520+
builder.estimateParasitics(db_net, net->getPins(), route, spef_writer);
521521
}
522522
}
523523
}
@@ -533,7 +533,7 @@ void GlobalRouter::estimateRC(odb::dbNet* db_net)
533533
GRoute& route = iter->second;
534534
if (!route.empty()) {
535535
Net* net = getNet(db_net);
536-
builder.estimateParasitcs(db_net, net->getPins(), route);
536+
builder.estimateParasitics(db_net, net->getPins(), route);
537537
}
538538
}
539539

@@ -4529,11 +4529,12 @@ void GlobalRouter::reportNetLayerWirelengths(odb::dbNet* db_net,
45294529
via_count++;
45304530
}
45314531
}
4532+
out << " " << via_count;
45324533
for (size_t i = 0; i < lengths.size(); i++) {
45334534
int64_t length = lengths[i];
45344535
odb::dbTechLayer* layer = db_->getTech()->findRoutingLayer(i);
45354536
if (i > 0 && out.is_open()) {
4536-
out << " " << via_count << " " << block_->dbuToMicrons(length);
4537+
out << " " << block_->dbuToMicrons(length);
45374538
}
45384539
if (length > 0) {
45394540
logger_->report("\tLayer {:5s}: {:5.2f}um",
@@ -4662,11 +4663,12 @@ void GlobalRouter::reportNetDetailedRouteWL(odb::dbWire* wire,
46624663
}
46634664
}
46644665

4666+
out << " " << via_count;
46654667
for (size_t i = 1; i < lengths.size(); i++) {
46664668
int64_t length = lengths[i];
46674669
odb::dbTechLayer* layer = db_->getTech()->findRoutingLayer(i);
46684670
if (i > 0 && out.is_open()) {
4669-
out << " " << via_count << " " << block_->dbuToMicrons(length);
4671+
out << " " << block_->dbuToMicrons(length);
46704672
}
46714673
if (length > 0) {
46724674
logger_->report("\tLayer {:5s}: {:5.2f}um",

src/grt/src/MakeWireParasitics.cpp

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ MakeWireParasitics::MakeWireParasitics(utl::Logger* logger,
5151
{
5252
}
5353

54-
void MakeWireParasitics::estimateParasitcs(odb::dbNet* net,
55-
std::vector<Pin>& pins,
56-
GRoute& route,
57-
sta::SpefWriter* spef_writer)
54+
void MakeWireParasitics::estimateParasitics(odb::dbNet* net,
55+
std::vector<Pin>& pins,
56+
GRoute& route,
57+
sta::SpefWriter* spef_writer)
5858
{
5959
debugPrint(logger_, GRT, "est_rc", 1, "net {}", net->getConstName());
6060
if (logger_->debugCheck(GRT, "est_rc", 2)) {
@@ -95,7 +95,7 @@ void MakeWireParasitics::estimateParasitcs(odb::dbNet* net,
9595
parasitics_->deleteParasiticNetworks(sta_net);
9696
}
9797

98-
void MakeWireParasitics::estimateParasitcs(odb::dbNet* net, GRoute& route)
98+
void MakeWireParasitics::estimateParasitics(odb::dbNet* net, GRoute& route)
9999
{
100100
debugPrint(logger_, GRT, "est_rc", 1, "net {}", net->getConstName());
101101
if (logger_->debugCheck(GRT, "est_rc", 2)) {
@@ -493,19 +493,27 @@ float MakeWireParasitics::getNetSlack(odb::dbNet* net)
493493
std::vector<int> MakeWireParasitics::routeLayerLengths(odb::dbNet* db_net) const
494494
{
495495
NetRouteMap& routes = grouter_->getRoutes();
496-
std::vector<int> layer_lengths(grouter_->getMaxRoutingLayer() + 1);
496+
497+
// dbu wirelength for wires, via count for vias
498+
std::vector<int> layer_lengths(tech_->getLayerCount());
499+
497500
if (!db_net->getSigType().isSupply()) {
498501
GRoute& route = routes[db_net];
499502
std::set<RoutePt> route_pts;
500503
for (GSegment& segment : route) {
501504
if (segment.isVia()) {
502-
route_pts.insert(
503-
RoutePt(segment.init_x, segment.init_y, segment.init_layer));
504-
route_pts.insert(
505-
RoutePt(segment.final_x, segment.final_y, segment.final_layer));
505+
auto& s = segment;
506+
// Mimic makeRouteParasitics
507+
int min_layer = min(s.init_layer, s.final_layer);
508+
odb::dbTechLayer* cut_layer
509+
= tech_->findRoutingLayer(min_layer)->getUpperLayer();
510+
layer_lengths[cut_layer->getNumber()] += 1;
511+
route_pts.insert(RoutePt(s.init_x, s.init_y, s.init_layer));
512+
route_pts.insert(RoutePt(s.final_x, s.final_y, s.final_layer));
506513
} else {
507514
int layer = segment.init_layer;
508-
layer_lengths[layer] += segment.length();
515+
layer_lengths[tech_->findRoutingLayer(layer)->getNumber()]
516+
+= segment.length();
509517
route_pts.insert(RoutePt(segment.init_x, segment.init_y, layer));
510518
route_pts.insert(RoutePt(segment.final_x, segment.final_y, layer));
511519
}
@@ -532,7 +540,8 @@ std::vector<int> MakeWireParasitics::routeLayerLengths(odb::dbNet* db_net) const
532540
layer--;
533541
int wire_length_dbu
534542
= abs(pt.getX() - grid_pt.getX()) + abs(pt.getY() - grid_pt.getY());
535-
layer_lengths[layer] += wire_length_dbu;
543+
layer_lengths[tech_->findRoutingLayer(layer)->getNumber()]
544+
+= wire_length_dbu;
536545
}
537546
}
538547
return layer_lengths;

src/grt/src/MakeWireParasitics.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ class MakeWireParasitics : public AbstractMakeWireParasitics
4848
odb::dbTech* tech,
4949
odb::dbBlock* block,
5050
GlobalRouter* grouter);
51-
void estimateParasitcs(odb::dbNet* net,
52-
std::vector<Pin>& pins,
53-
GRoute& route,
54-
sta::SpefWriter* spef_writer = nullptr);
55-
void estimateParasitcs(odb::dbNet* net, GRoute& route) override;
51+
void estimateParasitics(odb::dbNet* net,
52+
std::vector<Pin>& pins,
53+
GRoute& route,
54+
sta::SpefWriter* spef_writer = nullptr);
55+
void estimateParasitics(odb::dbNet* net, GRoute& route) override;
5656

5757
void clearParasitics() override;
5858
// Return GRT layer lengths in dbu's for db_net's route indexed by routing

src/grt/src/fastroute/include/AbstractMakeWireParasitics.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class AbstractMakeWireParasitics
1616
public:
1717
~AbstractMakeWireParasitics() = default;
1818

19-
virtual void estimateParasitcs(odb::dbNet* net, GRoute& route) = 0;
19+
virtual void estimateParasitics(odb::dbNet* net, GRoute& route) = 0;
2020

2121
virtual void clearParasitics() = 0;
2222

src/grt/src/fastroute/src/utility.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1245,7 +1245,7 @@ float FastRouteCore::CalculatePartialSlack()
12451245
odb::dbNet* db_net = net_route.first;
12461246
GRoute& route = net_route.second;
12471247
if (!route.empty()) {
1248-
parasitics_builder_->estimateParasitcs(db_net, route);
1248+
parasitics_builder_->estimateParasitics(db_net, route);
12491249
}
12501250
}
12511251
for (const int& netID : net_ids_) {
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
tool net total_wl #pins #vias li1_wl met1_wl met2_wl met3_wl met4_wl met5_wl
2-
grt: clk 201.6 2 2 0 2 0 2 0 2 144 2 57.6 2 0
3-
drt: clk 184.95 2 5 0 5 0.215 5 0.185 5 134.97 5 49.58 5 0
4-
grt: net60 14.4 2 2 0 2 0 2 14.4 2 0 2 0 2 0
5-
drt: net60 13.39 2 3 0 3 3.77 3 9.62 3 0 3 0 3 0
2+
grt: clk 201.6 2 2 0 0 0 144 57.6 0
3+
drt: clk 184.95 2 5 0 0.215 0.185 134.97 49.58 0
4+
grt: net60 14.4 2 2 0 0 14.4 0 0 0
5+
drt: net60 13.39 2 3 0 3.77 9.62 0 0 0

src/rsz/src/Resizer.i

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <fstream>
88

99
#include "sta/Liberty.hh"
10+
#include "sta/Parasitics.hh"
1011
#include "sta/Network.hh"
1112
#include "sta/Corner.hh"
1213
#include "rsz/Resizer.hh"
@@ -122,6 +123,36 @@ using rsz::ParasiticsSrc;
122123

123124
namespace rsz {
124125

126+
void
127+
report_net_parasitic(Net *net)
128+
{
129+
Resizer *resizer = getResizer();
130+
Corner *corner = sta::Sta::sta()->cmdCorner();
131+
const ParasiticAnalysisPt *ap = corner->findParasiticAnalysisPt(sta::MinMax::max());
132+
auto parasitic = resizer->parasitics()->findParasiticNetwork(net, ap);
133+
if (parasitic) {
134+
resizer->parasitics()->report(parasitic);
135+
}
136+
}
137+
138+
float
139+
sum_parasitic_network_resist(Net *net)
140+
{
141+
Resizer *resizer = getResizer();
142+
Corner *corner = sta::Sta::sta()->cmdCorner();
143+
const ParasiticAnalysisPt *ap = corner->findParasiticAnalysisPt(sta::MinMax::max());
144+
auto parasitic = resizer->parasitics()->findParasiticNetwork(net, ap);
145+
if (parasitic) {
146+
float ret = 0.0;
147+
for (auto resist : resizer->parasitics()->resistors(parasitic)) {
148+
ret += resizer->parasitics()->value(resist);
149+
}
150+
return ret;
151+
} else {
152+
return 0.0f;
153+
}
154+
}
155+
125156
void
126157
set_layer_rc_cmd(odb::dbTechLayer *layer,
127158
const Corner *corner,

0 commit comments

Comments
 (0)