@@ -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}
0 commit comments