@@ -1268,12 +1268,29 @@ void HTreeBuilder::run()
12681268 computeLevelTopology (level, regionWidth, regionHeight);
12691269
12701270 if (isNumberOfSinksTooSmall (numSinksPerSubRegion)) {
1271- logger_->info (CTS ,
1272- 32 ,
1273- " Stop criterion found. Max number of sinks is {}." ,
1274- options_->getMaxFanout () ? options_->getMaxFanout ()
1275- : numMaxLeafSinks_);
1276- break ;
1271+ if (options_->getMaxWl ()) {
1272+ double maxHPWL = topologyForEachLevel_.back ().getLargestSinkRegionHPWL (
1273+ wireSegmentUnit_);
1274+ if (maxHPWL < options_->getMaxWl ()) {
1275+ logger_->info (CTS ,
1276+ 38 ,
1277+ " Stop criterion found. Sink region hpwl "
1278+ " is smaller than max wirelength ({:.3f} um) and max "
1279+ " number of sinks is {}." ,
1280+ static_cast <double >(options_->getMaxWl ())
1281+ / options_->getDbUnits (),
1282+ options_->getMaxFanout () ? options_->getMaxFanout ()
1283+ : numMaxLeafSinks_);
1284+ break ;
1285+ }
1286+ } else {
1287+ logger_->info (CTS ,
1288+ 32 ,
1289+ " Stop criterion found. Max number of sinks is {}." ,
1290+ options_->getMaxFanout () ? options_->getMaxFanout ()
1291+ : numMaxLeafSinks_);
1292+ break ;
1293+ }
12771294 }
12781295 }
12791296
@@ -1825,6 +1842,33 @@ void HTreeBuilder::initSecondLevelSinks(
18251842 }
18261843}
18271844
1845+ double HTreeBuilder::LevelTopology::getLargestSinkRegionHPWL (
1846+ const unsigned wireSegmentUnit) const
1847+ {
1848+ double bestHpwl = 0.0 ;
1849+ for (unsigned i = 0 ; i < branchSinkLocs_.size (); ++i) {
1850+ const auto & sinks = branchSinkLocs_[i];
1851+ if (sinks.size () < 2 ) {
1852+ continue ;
1853+ }
1854+ double minX = sinks[0 ].getX ();
1855+ double maxX = minX;
1856+ double minY = sinks[0 ].getY ();
1857+ double maxY = minY;
1858+ for (unsigned j = 1 ; j < sinks.size (); ++j) {
1859+ minX = std::min (minX, sinks[j].getX ());
1860+ maxX = std::max (maxX, sinks[j].getX ());
1861+ minY = std::min (minY, sinks[j].getY ());
1862+ maxY = std::max (maxY, sinks[j].getY ());
1863+ }
1864+ const double hpwl = ((maxX - minX) + (maxY - minY));
1865+ if (hpwl > bestHpwl) {
1866+ bestHpwl = hpwl;
1867+ }
1868+ }
1869+ return bestHpwl * wireSegmentUnit;
1870+ }
1871+
18281872void HTreeBuilder::computeBranchSinks (
18291873 const LevelTopology& topology,
18301874 const unsigned branchIdx,
0 commit comments