@@ -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+
478516double MakeWireParasitics::dbuToMeters (int dbu) const
479517{
480518 return (double ) dbu / (tech_->getDbUnitsPerMicron () * 1E+6 );
0 commit comments