Skip to content

Commit 7c1ac4d

Browse files
authored
Merge pull request #8686 from The-OpenROAD-Project-staging/grt-resistance-aware-update
grt: resistance-aware update
2 parents a7e05ad + 4272729 commit 7c1ac4d

12 files changed

Lines changed: 300 additions & 108 deletions

File tree

src/est/src/EstimateParasitics.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,18 @@ void EstimateParasitics::makeWireParasitic(Net* net,
618618
double wire_cap = wire_length * wireSignalCapacitance(corner);
619619
double wire_res = wire_length * wireSignalResistance(corner);
620620
parasitics->incrCap(n1, wire_cap / 2.0);
621+
622+
// Reduce resistance if the net has NDR with increased width
623+
odb::dbTechNonDefaultRule* ndr
624+
= db_network_->staToDb(net)->getNonDefaultRule();
625+
if (ndr) {
626+
std::vector<odb::dbTechLayerRule*> layer_rules;
627+
ndr->getLayerRules(layer_rules);
628+
float ndr_ratio = (float) layer_rules.at(0)->getWidth()
629+
/ layer_rules.at(0)->getLayer()->getWidth();
630+
wire_res /= ndr_ratio;
631+
}
632+
621633
parasitics->makeResistor(parasitic, 1, wire_res, n1, n2);
622634
parasitics->incrCap(n2, wire_cap / 2.0);
623635
}
@@ -719,6 +731,18 @@ void EstimateParasitics::estimateWireParasiticSteiner(const Pin* drvr_pin,
719731
double length = dbuToMeters(wire_length_dbu);
720732
double cap = length * wire_cap;
721733
double res = length * wire_res;
734+
735+
// Reduce resistance if the net has NDR with increased width
736+
odb::dbTechNonDefaultRule* ndr
737+
= db_network_->staToDb(net)->getNonDefaultRule();
738+
if (ndr) {
739+
std::vector<odb::dbTechLayerRule*> layer_rules;
740+
ndr->getLayerRules(layer_rules);
741+
float ratio = (float) layer_rules.at(0)->getWidth()
742+
/ layer_rules.at(0)->getLayer()->getWidth();
743+
res /= ratio;
744+
}
745+
722746
// Make pi model for the wire.
723747
debugPrint(logger_,
724748
EST,

src/est/src/EstimateParasiticsCallBack.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace est {
1111
void EstimateParasiticsCallBack::onEstimateParasiticsRequired()
1212
{
1313
estimate_parasitics_->clearParasitics();
14-
auto routes = estimate_parasitics_->getGlobalRouter()->getRoutes();
14+
auto routes = estimate_parasitics_->getGlobalRouter()->getPartialRoutes();
1515
for (auto& [db_net, route] : routes) {
1616
estimate_parasitics_->estimateGlobalRouteParasitics(db_net, route);
1717
}

src/est/src/MakeWireParasitics.cpp

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ void MakeWireParasitics::makeRouteParasitics(
215215
segment.final_layer,
216216
units->resistanceUnit()->asString(res));
217217
} else if (segment.init_layer == segment.final_layer) {
218-
layerRC(wire_length_dbu, segment.init_layer, corner, res, cap);
218+
layerRC(wire_length_dbu, segment.init_layer, corner, net, res, cap);
219219
debugPrint(logger_,
220220
EST,
221221
"est_rc",
@@ -297,7 +297,7 @@ void MakeWireParasitics::makeParasiticsToPin(
297297
int wire_length_dbu
298298
= abs(pt.getX() - grid_pt.getX()) + abs(pt.getY() - grid_pt.getY());
299299
float res, cap;
300-
layerRC(wire_length_dbu, layer, corner, res, cap);
300+
layerRC(wire_length_dbu, layer, corner, net, res, cap);
301301
sta::Units* units = sta_->units();
302302
debugPrint(
303303
logger_,
@@ -404,7 +404,7 @@ void MakeWireParasitics::makePartialParasiticsToPin(
404404
int wire_length_dbu
405405
= abs(pt.getX() - grid_pt.getX()) + abs(pt.getY() - grid_pt.getY());
406406
float res, cap;
407-
layerRC(wire_length_dbu, layer, corner, res, cap);
407+
layerRC(wire_length_dbu, layer, corner, net, res, cap);
408408
sta::Units* units = sta_->units();
409409
debugPrint(
410410
logger_,
@@ -466,7 +466,7 @@ void MakeWireParasitics::layerRC(int wire_length_dbu,
466466

467467
if (cap_per_meter == 0.0) {
468468
const float cap_pf_per_micron = layer_width * layer->getCapacitance()
469-
+ 2 * layer->getEdgeCapacitance();
469+
+ (2 * layer->getEdgeCapacitance());
470470
cap_per_meter = 1E+6 * 1E-12 * cap_pf_per_micron; // F/meter
471471
}
472472

@@ -475,6 +475,44 @@ void MakeWireParasitics::layerRC(int wire_length_dbu,
475475
cap = cap_per_meter * wire_length;
476476
}
477477

478+
void MakeWireParasitics::layerRC(int wire_length_dbu,
479+
int layer_id,
480+
sta::Corner* corner,
481+
odb::dbNet* net,
482+
// Return values.
483+
float& res,
484+
float& cap) const
485+
{
486+
odb::dbTechLayer* layer = tech_->findRoutingLayer(layer_id);
487+
double r_per_meter = 0.0; // ohm/meter
488+
double cap_per_meter = 0.0; // F/meter
489+
490+
estimate_parasitics_->layerRC(layer, corner, r_per_meter, cap_per_meter);
491+
492+
const float layer_width = block_->dbuToMicrons(layer->getWidth());
493+
if (r_per_meter == 0.0) {
494+
const float res_ohm_per_micron = layer->getResistance() / layer_width;
495+
r_per_meter = 1E+6 * res_ohm_per_micron; // ohm/meter
496+
}
497+
498+
if (cap_per_meter == 0.0) {
499+
const float cap_pf_per_micron = (layer_width * layer->getCapacitance())
500+
+ (2 * layer->getEdgeCapacitance());
501+
cap_per_meter = 1E+6 * 1E-12 * cap_pf_per_micron; // F/meter
502+
}
503+
504+
// Reduce resistance if the net has NDR with increased width
505+
if (net->getNonDefaultRule()) {
506+
odb::dbTechLayerRule* rule = net->getNonDefaultRule()->getLayerRule(layer);
507+
float ndr_ratio = (float) rule->getWidth() / layer->getWidth();
508+
r_per_meter /= ndr_ratio;
509+
}
510+
511+
const float wire_length = dbuToMeters(wire_length_dbu);
512+
res = r_per_meter * wire_length;
513+
cap = cap_per_meter * wire_length;
514+
}
515+
478516
double MakeWireParasitics::dbuToMeters(int dbu) const
479517
{
480518
return (double) dbu / (tech_->getDbUnitsPerMicron() * 1E+6);

src/est/src/MakeWireParasitics.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,13 @@ class MakeWireParasitics
106106
// Return values.
107107
float& res,
108108
float& cap) const;
109+
void layerRC(int wire_length_dbu,
110+
int layer,
111+
sta::Corner* corner,
112+
odb::dbNet* net,
113+
// Return values.
114+
float& res,
115+
float& cap) const;
109116
float getCutLayerRes(odb::dbTechLayer* cut_layer,
110117
sta::Corner* corner,
111118
int num_cuts = 1) const;

src/grt/include/grt/GlobalRouter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ class GlobalRouter
180180
bool end_incremental = false);
181181
void saveCongestion();
182182
NetRouteMap& getRoutes();
183+
NetRouteMap getPartialRoutes();
183184
Net* getNet(odb::dbNet* db_net);
184185
int getTileSize() const;
185186
bool isNonLeafClock(odb::dbNet* db_net);
@@ -480,6 +481,7 @@ class GlobalRouter
480481
std::vector<RoutingTracks> routing_tracks_;
481482

482483
// Flow variables
484+
bool is_incremental;
483485
float adjustment_;
484486
int layer_for_guide_dimension_;
485487
int congestion_iterations_{50};

src/grt/src/GlobalRouter.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,29 @@ NetRouteMap& GlobalRouter::getRoutes()
213213
return routes_;
214214
}
215215

216+
NetRouteMap GlobalRouter::getPartialRoutes()
217+
{
218+
NetRouteMap net_routes;
219+
// TODO: still need to fix this during incremental grt
220+
if (is_incremental) {
221+
for (const auto& [db_net, net] : db_net_map_) {
222+
if (routes_[db_net].empty()) {
223+
GRoute route;
224+
net_routes.insert({db_net, route});
225+
fastroute_->getPlanarRoute(db_net, net_routes[db_net]);
226+
}
227+
}
228+
} else {
229+
partial_routes_.clear();
230+
if (routes_.empty()) {
231+
partial_routes_ = fastroute_->getPlanarRoutes();
232+
net_routes = partial_routes_;
233+
}
234+
}
235+
236+
return net_routes;
237+
}
238+
216239
bool GlobalRouter::haveRoutes()
217240
{
218241
if (!designIsPlaced()) {
@@ -281,6 +304,8 @@ void GlobalRouter::globalRoute(bool save_guides,
281304
bool end_incremental)
282305
{
283306
bool has_routable_nets = false;
307+
is_incremental = (start_incremental || end_incremental);
308+
284309
for (auto net : db_->getChip()->getBlock()->getNets()) {
285310
if (net->getITerms().size() + net->getBTerms().size() > 1) {
286311
has_routable_nets = true;

src/grt/src/fastroute/include/DataType.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ struct FrNet // A Net is a set of connected MazePoints
111111
void setIsCritical(bool is_critical) { is_critical_ = is_critical; }
112112
void setIsSoftNDR(bool is_soft) { is_soft_ndr_ = is_soft; }
113113
bool isSoftNDR() { return is_soft_ndr_; }
114+
void setIsResAware(bool res_aware) { is_res_aware_ = res_aware; }
115+
bool isResAware() { return is_res_aware_; }
114116

115117
private:
116118
odb::dbNet* db_net_;
@@ -125,6 +127,7 @@ struct FrNet // A Net is a set of connected MazePoints
125127
int max_layer_;
126128
float slack_;
127129
bool is_soft_ndr_ = false;
130+
bool is_res_aware_ = false;
128131
// Non-null when an NDR has been applied to the net.
129132
std::unique_ptr<std::vector<int8_t>> edge_cost_per_layer_;
130133
};
@@ -241,6 +244,7 @@ struct OrderNetPin
241244
int minX;
242245
float length_per_pin; // net length over pin count
243246
int ndr_priority; // NDR nets are assigned first
247+
int res_aware;
244248
float slack;
245249
};
246250

src/grt/src/fastroute/include/FastRoute.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,8 @@ class FastRouteCore
250250
std::string getSttInputFileName();
251251
const odb::dbNet* getDebugNet();
252252
bool hasSaveSttInput();
253+
254+
// NDR related functions
253255
void clearNDRnets();
254256
void computeCongestedNDRnets();
255257
void updateSoftNDRNetUsage(int net_id, int edge_cost);
@@ -268,6 +270,7 @@ class FastRouteCore
268270
std::vector<std::pair<odb::Point, bool>>& overflow_pos);
269271

270272
NetRouteMap getPlanarRoutes();
273+
void getPlanarRoute(odb::dbNet* db_net, GRoute& route);
271274

272275
private:
273276
int getEdgeCapacity(FrNet* net, int x1, int y1, EdgeDirection direction);
@@ -277,6 +280,9 @@ class FastRouteCore
277280
double dbuToMicrons(int dbu);
278281
odb::Rect globalRoutingToBox(const GSegment& route);
279282
NetRouteMap getRoutes();
283+
void updateSlacks(float percentage = 0.75);
284+
void preProcessTechLayers();
285+
odb::dbTechLayer* getTechLayer(int layer, bool is_via);
280286

281287
// maze functions
282288
// Maze-routing in different orders
@@ -525,6 +531,7 @@ class FastRouteCore
525531
void assignEdge(int netID, int edgeID, bool processDIR);
526532
int getLayerResistance(int layer, int length, FrNet* net);
527533
int getViaResistance(int from_layer, int to_layer);
534+
bool needResistanceAware(int net_id);
528535
void recoverEdge(int netID, int edgeID);
529536
void layerAssignmentV4();
530537
void netpinOrderInc();
@@ -598,10 +605,13 @@ class FastRouteCore
598605
int congestion_report_iter_step_;
599606
std::string congestion_file_name_;
600607
std::vector<odb::dbTechLayerDir> layer_directions_;
608+
std::vector<odb::dbTechLayer*> db_layers_;
601609
int x_range_;
602610
int y_range_;
603611

612+
bool estimate_parasitics_ = false;
604613
bool resistance_aware_ = false;
614+
bool enable_resistance_aware_ = false;
605615
int num_adjust_;
606616
int v_capacity_;
607617
int h_capacity_;

0 commit comments

Comments
 (0)