@@ -2018,49 +2018,60 @@ void ClusteringEngine::clearConnections()
20182018
20192019void ClusteringEngine::buildNetListConnections ()
20202020{
2021- const float connection_weight = 1.0 ;
2022-
2023- for (odb::dbNet* net : block_->getNets ()) {
2024- if (!isValidNet (net)) {
2021+ for (odb::dbNet* db_net : block_->getNets ()) {
2022+ if (!isValidNet (db_net)) {
20252023 continue ;
20262024 }
20272025
2028- int driver_cluster_id = -1 ;
2029- std::vector<int > load_clusters_ids;
2026+ Net net = buildNet (db_net);
2027+ connectClusters (net);
2028+ }
2029+ }
20302030
2031- for (odb::dbITerm* iterm : net-> getITerms ()) {
2032- odb::dbInst* inst = iterm-> getInst ();
2033- const int cluster_id = tree_-> maps . inst_to_cluster_id . at (inst) ;
2031+ ClusteringEngine::Net ClusteringEngine::buildNet (odb::dbNet* db_net) const
2032+ {
2033+ Net net ;
20342034
2035- if (iterm->getIoType () == odb::dbIoType::OUTPUT) {
2036- driver_cluster_id = cluster_id;
2037- } else {
2038- load_clusters_ids.push_back (cluster_id);
2039- }
2035+ for (odb::dbITerm* iterm : db_net->getITerms ()) {
2036+ odb::dbInst* inst = iterm->getInst ();
2037+ const int cluster_id = tree_->maps .inst_to_cluster_id .at (inst);
2038+
2039+ if (iterm->getIoType () == odb::dbIoType::OUTPUT) {
2040+ net.driver_id = cluster_id;
2041+ } else {
2042+ net.loads_ids .push_back (cluster_id);
20402043 }
2044+ }
20412045
2042- if (tree_->io_pads .empty ()) {
2043- for (odb::dbBTerm* bterm : net ->getBTerms ()) {
2044- const int cluster_id = tree_->maps .bterm_to_cluster_id .at (bterm);
2046+ if (tree_->io_pads .empty ()) {
2047+ for (odb::dbBTerm* bterm : db_net ->getBTerms ()) {
2048+ const int cluster_id = tree_->maps .bterm_to_cluster_id .at (bterm);
20452049
2046- if (bterm->getIoType () == odb::dbIoType::INPUT) {
2047- driver_cluster_id = cluster_id;
2048- } else {
2049- load_clusters_ids.push_back (cluster_id);
2050- }
2050+ if (bterm->getIoType () == odb::dbIoType::INPUT) {
2051+ net.driver_id = cluster_id;
2052+ } else {
2053+ net.loads_ids .push_back (cluster_id);
20512054 }
20522055 }
2056+ }
2057+
2058+ return net;
2059+ }
2060+
2061+ void ClusteringEngine::connectClusters (const Net& net)
2062+ {
2063+ if (net.driver_id == -1 || net.loads_ids .empty ()
2064+ || net.loads_ids .size () >= tree_->large_net_threshold ) {
2065+ return ;
2066+ }
20532067
2054- if (driver_cluster_id != -1 && !load_clusters_ids.empty ()
2055- && load_clusters_ids.size () < tree_->large_net_threshold ) {
2056- Cluster* driver_cluster = tree_->maps .id_to_cluster .at (driver_cluster_id);
2068+ const float connection_weight = 1.0 ;
2069+ Cluster* driver = tree_->maps .id_to_cluster .at (net.driver_id );
20572070
2058- for (const int load_cluster_id : load_clusters_ids) {
2059- if (load_cluster_id != driver_cluster_id) {
2060- Cluster* load_cluster = tree_->maps .id_to_cluster .at (load_cluster_id);
2061- connect (driver_cluster, load_cluster, connection_weight);
2062- }
2063- }
2071+ for (const int load_cluster_id : net.loads_ids ) {
2072+ if (load_cluster_id != net.driver_id ) {
2073+ Cluster* load = tree_->maps .id_to_cluster .at (load_cluster_id);
2074+ connect (driver, load, connection_weight);
20642075 }
20652076 }
20662077}
0 commit comments