@@ -55,25 +55,29 @@ void LatenciesBalancer::initSta()
5555 timingGraph_ = openSta_->graph ();
5656}
5757
58- sta::ArcDelay LatenciesBalancer::computeBufferDelay (sta::LibertyCell *buffer_cell, float extra_out_cap)
58+ sta::ArcDelay LatenciesBalancer::computeBufferDelay (
59+ sta::LibertyCell* buffer_cell,
60+ float extra_out_cap)
5961{
6062 sta::ArcDelay max_rise_delay = 0 ;
6163
6264 sta::LibertyPort *input, *output;
6365 buffer_cell->bufferPorts (input, output);
6466 for (sta::Corner* corner : *openSta_->corners ()) {
65- const sta::DcalcAnalysisPt* dcalc_ap = corner->findDcalcAnalysisPt (sta::MinMax::max ());
67+ const sta::DcalcAnalysisPt* dcalc_ap
68+ = corner->findDcalcAnalysisPt (sta::MinMax::max ());
6669 const sta::Pvt* pvt = dcalc_ap->operatingConditions ();
6770
68- for (sta::TimingArcSet* arc_set : buffer_cell->timingArcSets (input, output)) {
71+ for (sta::TimingArcSet* arc_set :
72+ buffer_cell->timingArcSets (input, output)) {
6973 for (sta::TimingArc* arc : arc_set->arcs ()) {
70- sta::GateTimingModel* model = dynamic_cast <sta::GateTimingModel*>(arc->model ());
74+ sta::GateTimingModel* model
75+ = dynamic_cast <sta::GateTimingModel*>(arc->model ());
7176 const sta::RiseFall* in_rf = arc->fromEdge ()->asRiseFall ();
7277 const sta::RiseFall* out_rf = arc->toEdge ()->asRiseFall ();
7378 // Only look at rise-rise arcs
74- if (model != nullptr &&
75- in_rf == sta::RiseFall::rise () &&
76- out_rf == sta::RiseFall::rise ()) {
79+ if (model != nullptr && in_rf == sta::RiseFall::rise ()
80+ && out_rf == sta::RiseFall::rise ()) {
7781 float in_cap = input->capacitance (in_rf, sta::MinMax::max ());
7882 float load_cap = in_cap + extra_out_cap;
7983 sta::ArcDelay arc_delay;
@@ -156,11 +160,12 @@ void LatenciesBalancer::buildGraph(odb::dbNet* clkInputNet)
156160 continue ;
157161 }
158162
159- if (isSink (sinkIterm)) {
163+ if (isSink (sinkIterm)) {
160164 sta::Pin* pin = network_->dbToSta (sinkIterm);
161165 if (pin) {
162166 sta::Vertex* sinkVertex = timingGraph_->pinDrvrVertex (pin);
163- float arrival = getVertexClkArrival (sinkVertex, clkInputNet, sinkIterm);
167+ float arrival
168+ = getVertexClkArrival (sinkVertex, clkInputNet, sinkIterm);
164169 graph_[sinkId].delay = arrival;
165170 }
166171 continue ;
@@ -332,8 +337,7 @@ void LatenciesBalancer::balanceLatencies(int nodeId)
332337 " For node {}, isert {:2f} buffers" ,
333338 node->name ,
334339 (worseDelay_ - node->delay ) / buffer_delay_);
335- node->nBuffInsert
336- = (int ) ((worseDelay_ - node->delay ) / buffer_delay_);
340+ node->nBuffInsert = (int ) ((worseDelay_ - node->delay ) / buffer_delay_);
337341 }
338342 return ;
339343 }
@@ -398,9 +402,8 @@ odb::dbITerm* LatenciesBalancer::insertDelayBuffers(
398402 const std::vector<odb::dbITerm*>& sinksInput)
399403{
400404 // get bbox of current load pins without driver output pin
401- int maxSinkX = 0 , maxSinkY = 0 ;
402- int minSinkX = std::numeric_limits<int >::max (),
403- minSinkY = std::numeric_limits<int >::max ();
405+ odb::Rect loadPinsBbox = odb::Rect ();
406+ loadPinsBbox.mergeInit ();
404407 odb::dbNet* drivingNet = nullptr ;
405408 debugPrint (logger_,
406409 CTS,
@@ -417,16 +420,11 @@ odb::dbITerm* LatenciesBalancer::insertDelayBuffers(
417420 sinkInput->disconnect ();
418421 int sinkX, sinkY;
419422 sinkInput->getAvgXY (&sinkX, &sinkY);
420- maxSinkX = std::max (maxSinkX, sinkX);
421- maxSinkY = std::max (maxSinkY, sinkY);
422- minSinkX = std::min (minSinkX, sinkX);
423- minSinkY = std::min (minSinkY, sinkY);
423+ loadPinsBbox.merge ({sinkX, sinkY});
424424 }
425425
426- int destX = (maxSinkX + minSinkX) / 2 ;
427- int destY = (maxSinkY + minSinkY) / 2 ;
428- float offsetX = (float ) (destX - srcX) / (numBuffers + 1 );
429- float offsetY = (float ) (destY - srcY) / (numBuffers + 1 );
426+ float offsetX = (float ) (loadPinsBbox.xCenter () - srcX) / (numBuffers + 1 );
427+ float offsetY = (float ) (loadPinsBbox.yCenter () - srcY) / (numBuffers + 1 );
430428 odb::dbInst* returnBuffer = nullptr ;
431429 for (int i = 0 ; i < numBuffers; i++) {
432430 double locX = (double ) (srcX + offsetX * (i + 1 )) / wireSegmentUnit_;
@@ -546,7 +544,7 @@ bool LatenciesBalancer::isSink(odb::dbITerm* iterm)
546544
547545void LatenciesBalancer::showGraph ()
548546{
549- logger_->report (" Graph builded :" );
547+ logger_->report (" Graph built :" );
550548 for (const auto & node : graph_) {
551549 odb::dbITerm* inputTerm = node.inputTerm ;
552550 logger_->report (" Node {}" , node.name );
0 commit comments