@@ -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)
493493std::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;
0 commit comments