@@ -80,15 +80,63 @@ void HTreeBuilder::preSinkClustering(
8080
8181 unsigned bestClusterSize = 0 ;
8282 float bestDiameter = 0.0 ;
83- // clang-format off
84- debugPrint (logger_, CTS, " clustering" , 1 , " **** match.run({}, {}, {}) ****" ,
85- clusterSize, maxDiameter, wireSegmentUnit_);
86- // clang-format on
87- matching.run (clusterSize,
88- maxDiameter,
89- wireSegmentUnit_,
90- bestClusterSize,
91- bestDiameter);
83+ if (clusterSizeSet && maxDiameterSet) {
84+ // clang-format off
85+ debugPrint (logger_, CTS, " clustering" , 1 , " **** match.run({}, {}, {}) ****" ,
86+ clusterSize, maxDiameter, wireSegmentUnit_);
87+ // clang-format on
88+ matching.run (clusterSize,
89+ maxDiameter,
90+ wireSegmentUnit_,
91+ bestClusterSize,
92+ bestDiameter);
93+ } else if (!clusterSizeSet && maxDiameterSet) {
94+ // only diameter is set, try clustering sizes of 10, 20 and 30
95+ for (unsigned clusterSize2 : options_->getSinkClusteringSizes ()) {
96+ // clang-format off
97+ debugPrint (logger_, CTS, " clustering" , 1 , " **** match.run({}, {}, {}) ****" ,
98+ clusterSize2, maxDiameter, wireSegmentUnit_);
99+ // clang-format on
100+ matching.run (clusterSize2,
101+ maxDiameter,
102+ wireSegmentUnit_,
103+ bestClusterSize,
104+ bestDiameter);
105+ }
106+ } else if (clusterSizeSet && !maxDiameterSet) {
107+ // only clustering size is set, try diameters of 50, 100 and 200 um
108+ for (unsigned clusterDiameter2 : options_->getSinkClusteringDiameters ()) {
109+ // clang-format off
110+ debugPrint (logger_, CTS, " clustering" , 1 , " **** match.run({}, {}, {}) ****" ,
111+ clusterSize, clusterDiameter2, wireSegmentUnit_);
112+ // clang-format on
113+ float maxDiameter2 = clusterDiameter2 * (float ) options_->getDbUnits ()
114+ / wireSegmentUnit_;
115+ matching.run (clusterSize,
116+ maxDiameter2,
117+ wireSegmentUnit_,
118+ bestClusterSize,
119+ bestDiameter);
120+ }
121+ } else { // neighther clustering size nor diameter is set
122+ // try diameters of 50, 100 and 200 um
123+ for (unsigned clusterDiameter2 : clusterDiameters ()) {
124+ // try clustering sizes of 10, 20 and 30
125+ for (unsigned clusterSize2 : options_->getSinkClusteringSizes ()) {
126+ // clang-format off
127+ debugPrint (logger_, CTS, " clustering" , 1 , " **** match.run({}, {}, {}) ****" ,
128+ clusterSize2, clusterDiameter2, wireSegmentUnit_);
129+ // clang-format on
130+ float maxDiameter2 = clusterDiameter2 * (float ) options_->getDbUnits ()
131+ / wireSegmentUnit_;
132+ matching.run (clusterSize2,
133+ maxDiameter2,
134+ wireSegmentUnit_,
135+ bestClusterSize,
136+ bestDiameter);
137+ }
138+ }
139+ }
92140
93141 if (clusterSizeSet || maxDiameterSet) {
94142 logger_->info (
@@ -1128,21 +1176,18 @@ void HTreeBuilder::run()
11281176 unsigned clusterSize = (type_ == TreeType::MacroTree)
11291177 ? options_->getMacroSinkClusteringSize ()
11301178 : options_->getSinkClusteringSize ();
1131- bool use_max_diameter = (type_ == TreeType::MacroTree)
1132- ? options_->isMacroMaxDiameterSet ()
1133- : options_->isMaxDiameterSet ();
1134- bool use_max_size = (type_ == TreeType::MacroTree)
1135- ? options_->isMacroSinkClusteringSizeSet ()
1136- : options_->isSinkClusteringSizeSet ();
11371179 bool useMaxCap = (type_ == TreeType::MacroTree)
11381180 ? false
1139- : !(use_max_size && use_max_diameter );
1181+ : options_-> getSinkClusteringUseMaxCap ( );
11401182
11411183 logger_->info (
11421184 CTS, 27 , " Generating H-Tree topology for net {}." , clock_.getName ());
11431185 logger_->info (CTS, 28 , " Total number of sinks: {}." , clock_.getNumSinks ());
11441186 if (options_->getSinkClustering ()) {
1145- if (!useMaxCap) {
1187+ if (useMaxCap) {
1188+ logger_->info (
1189+ CTS, 90 , " Sinks will be clustered based on buffer max cap." );
1190+ } else {
11461191 logger_->info (
11471192 CTS,
11481193 29 ,
@@ -1151,23 +1196,6 @@ void HTreeBuilder::run()
11511196 type_ == TreeType::MacroTree ? " Macro " : " Register" ,
11521197 clusterSize,
11531198 clusterDiameter);
1154- } else if (use_max_diameter && !use_max_size) {
1155- logger_->info (CTS,
1156- 59 ,
1157- " {} sinks will be clustered with maximum cluster diameter "
1158- " of {:.1f} um and based on buffer max cap." ,
1159- type_ == TreeType::MacroTree ? " Macro " : " Register" ,
1160- clusterDiameter);
1161- } else if (!use_max_diameter && use_max_size) {
1162- logger_->info (CTS,
1163- 60 ,
1164- " {} sinks will be clustered in groups of up to {} and "
1165- " based on buffer max cap." ,
1166- type_ == TreeType::MacroTree ? " Macro " : " Register" ,
1167- clusterSize);
1168- } else {
1169- logger_->info (
1170- CTS, 90 , " Sinks will be clustered based on buffer max cap." );
11711199 }
11721200 }
11731201 logger_->info (
0 commit comments