Skip to content

Commit 1015e1f

Browse files
authored
Merge pull request #8341 from eder-matheus/grt_report_wirelength
grt: report wire length per layer
2 parents 82d1dc5 + e59e0b0 commit 1015e1f

File tree

12 files changed

+7776
-27
lines changed

12 files changed

+7776
-27
lines changed

src/grt/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ report_wire_length
264264
[-global_route]
265265
[-detailed_route]
266266
[-verbose]
267+
[-summary]
267268
```
268269

269270
#### Options
@@ -275,6 +276,7 @@ report_wire_length
275276
| `-global_route` | Report the wire length of the global routing. |
276277
| `-detailed_route` | Report the wire length of the detailed routing. |
277278
| `-verbose` | This flag enables the full reporting of the layer-wise wirelength information. |
279+
| `-summary` | This flag reports the wire length for each layer of the design. |
278280

279281
### Global Route Debug Mode
280282

src/grt/include/grt/GlobalRouter.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ class GlobalRouter
262262

263263
// Report the wire length on each layer.
264264
void reportNetLayerWirelengths(odb::dbNet* db_net, std::ofstream& out);
265-
void reportLayerWireLengths();
265+
void reportLayerWireLengths(bool global_route, bool detailed_route);
266266
odb::Rect globalRoutingToBox(const GSegment& route);
267267
void boxToGlobalRouting(const odb::Rect& route_bds,
268268
int layer,

src/grt/src/GlobalRouter.cpp

Lines changed: 78 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4781,32 +4781,89 @@ void GlobalRouter::reportNetLayerWirelengths(odb::dbNet* db_net,
47814781
}
47824782
}
47834783

4784-
void GlobalRouter::reportLayerWireLengths()
4784+
void GlobalRouter::reportLayerWireLengths(bool global_route,
4785+
bool detailed_route)
47854786
{
4786-
std::vector<int64_t> lengths(db_->getTech()->getRoutingLayerCount() + 1);
4787-
int64_t total_length = 0;
4788-
for (auto& net_route : routes_) {
4789-
GRoute& route = net_route.second;
4790-
for (GSegment& seg : route) {
4791-
int layer1 = seg.init_layer;
4792-
int layer2 = seg.final_layer;
4793-
if (layer1 == layer2) {
4794-
int seg_length = seg.length();
4795-
lengths[layer1] += seg_length;
4796-
total_length += seg_length;
4787+
if (block_ == nullptr) {
4788+
block_ = db_->getChip()->getBlock();
4789+
}
4790+
4791+
if (global_route) {
4792+
logger_->info(GRT, 278, "Global route wire length by layer:");
4793+
std::vector<int64_t> lengths(db_->getTech()->getRoutingLayerCount() + 1);
4794+
int64_t total_length = 0;
4795+
for (auto& net_route : routes_) {
4796+
GRoute& route = net_route.second;
4797+
for (GSegment& seg : route) {
4798+
int layer1 = seg.init_layer;
4799+
int layer2 = seg.final_layer;
4800+
if (layer1 == layer2) {
4801+
int seg_length = seg.length();
4802+
lengths[layer1] += seg_length;
4803+
total_length += seg_length;
4804+
}
4805+
}
4806+
}
4807+
if (total_length > 0) {
4808+
logger_->report("Layer Wire length Percentage");
4809+
logger_->report("--------------------------------");
4810+
for (size_t i = 0; i < lengths.size(); i++) {
4811+
int64_t length = lengths[i];
4812+
if (length > 0) {
4813+
odb::dbTechLayer* layer = routing_layers_[i];
4814+
logger_->report("{:7s} {:8.2f}um {:5}%",
4815+
layer->getName(),
4816+
block_->dbuToMicrons(length),
4817+
static_cast<int>((100.0 * length) / total_length));
4818+
}
47974819
}
4820+
logger_->report("--------------------------------");
47984821
}
47994822
}
4800-
if (total_length > 0) {
4801-
for (size_t i = 0; i < lengths.size(); i++) {
4802-
int64_t length = lengths[i];
4803-
if (length > 0) {
4804-
odb::dbTechLayer* layer = routing_layers_[i];
4805-
logger_->report("{:5s} {:8d}um {:3d}%",
4806-
layer->getName(),
4807-
block_->dbuToMicrons(length),
4808-
static_cast<int>((100.0 * length) / total_length));
4823+
4824+
if (detailed_route) {
4825+
logger_->info(GRT, 279, "Detailed route wire length by layer:");
4826+
std::vector<int64_t> lengths(db_->getTech()->getRoutingLayerCount() + 1);
4827+
int64_t total_length = 0;
4828+
odb::dbSet<odb::dbNet> nets = block_->getNets();
4829+
for (odb::dbNet* db_net : nets) {
4830+
odb::dbWire* wire = db_net->getWire();
4831+
if (wire == nullptr || db_net->getSigType().isSupply()
4832+
|| db_net->isSpecial() || !db_net->getSWires().empty()
4833+
|| db_net->isConnectedByAbutment()) {
4834+
continue;
4835+
}
4836+
4837+
odb::dbWirePath path;
4838+
odb::dbWirePathShape pshape;
4839+
odb::dbWirePathItr pitr;
4840+
for (pitr.begin(wire); pitr.getNextPath(path);) {
4841+
while (pitr.getNextShape(pshape)) {
4842+
const odb::dbShape& shape = pshape.shape;
4843+
if (!shape.isVia()) {
4844+
int layer = shape.getTechLayer()->getRoutingLevel();
4845+
int seg_length = shape.getLength();
4846+
lengths[layer] += seg_length;
4847+
total_length += seg_length;
4848+
}
4849+
}
4850+
}
4851+
}
4852+
4853+
if (total_length > 0) {
4854+
logger_->report("Layer Wire length Percentage");
4855+
logger_->report("--------------------------------");
4856+
for (size_t i = 0; i < lengths.size(); i++) {
4857+
int64_t length = lengths[i];
4858+
if (length > 0) {
4859+
odb::dbTechLayer* layer = db_->getTech()->findRoutingLayer(i);
4860+
logger_->report("{:7s} {:8.2f}um {:5}%",
4861+
layer->getName(),
4862+
block_->dbuToMicrons(length),
4863+
static_cast<int>((100.0 * length) / total_length));
4864+
}
48094865
}
4866+
logger_->report("--------------------------------");
48104867
}
48114868
}
48124869
}

src/grt/src/GlobalRouter.i

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,9 @@ clear_route_guides()
237237
}
238238

239239
void
240-
report_layer_wire_lengths()
240+
report_layer_wire_lengths(bool global_route, bool detailed_route)
241241
{
242-
getGlobalRouter()->reportLayerWireLengths();
242+
getGlobalRouter()->reportLayerWireLengths(global_route, detailed_route);
243243
}
244244

245245
void write_segments(const char* file_name)

src/grt/src/GlobalRouter.tcl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,13 +403,14 @@ sta::define_cmd_args "report_wire_length" { [-net net_list] \
403403
[-file file] \
404404
[-global_route] \
405405
[-detailed_route] \
406-
[-verbose]
406+
[-verbose] \
407+
[-summary]
407408
}
408409

409410
proc report_wire_length { args } {
410411
sta::parse_key_args "report_wire_length" args \
411412
keys {-net -file} \
412-
flags {-global_route -detailed_route -verbose}
413+
flags {-global_route -detailed_route -verbose -summary}
413414

414415
set block [ord::get_db_block]
415416
if { $block == "NULL" } {
@@ -431,7 +432,9 @@ proc report_wire_length { args } {
431432
grt::create_wl_report_file $file $verbose
432433
}
433434

434-
if { [info exists keys(-net)] } {
435+
if { [info exists flags(-summary)] } {
436+
grt::report_layer_wire_lengths $global_route_wl $detailed_route_wl
437+
} elseif { [info exists keys(-net)] } {
435438
foreach net [get_nets $keys(-net)] {
436439
set db_net [sta::sta_to_db_net $net]
437440
if {

src/grt/test/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ TESTS = [
6666
"report_wire_length4",
6767
"report_wire_length5",
6868
"report_wire_length6",
69+
"report_wire_length7",
70+
"report_wire_length8",
6971
"set_nets_to_route1",
7072
"silence",
7173
"single_row",

src/grt/test/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ or_integration_tests(
6666
report_wire_length4
6767
report_wire_length5
6868
report_wire_length6
69+
report_wire_length7
70+
report_wire_length8
6971
set_nets_to_route1
7072
silence
7173
single_row

0 commit comments

Comments
 (0)