@@ -693,22 +693,22 @@ void t_rr_graph_storage::set_virtual_clock_network_root_idx(RRNodeId virtual_clo
693693 }
694694}
695695
696- void t_rr_graph_storage::remove_nodes (const std::vector<RRNodeId>& nodes ) {
696+ void t_rr_graph_storage::remove_nodes (std::vector<RRNodeId> nodes_to_remove ) {
697697 VTR_ASSERT (!edges_read_);
698+ VTR_ASSERT (!partitioned_);
698699 // To remove the nodes, we first sort them in ascending order. This makes it easy
699700 // to calculate the offset by which other node IDs need to be adjusted.
700701 // For example, after sorting the nodes to be removed, if a node ID falls between
701702 // the first and second element, its ID should be reduced by 1.
702703 // If a node ID is larger than the last element, its ID should be reduced by
703704 // the total number of nodes being removed.
704- std::vector<RRNodeId> sorted_nodes = nodes;
705- std::sort (sorted_nodes.begin (), sorted_nodes.end ());
705+ std::sort (nodes_to_remove.begin (), nodes_to_remove.end ());
706706
707707 // Iterate over the nodes to be removed and adjust the IDs of nodes
708708 // that fall between them.
709- for (size_t i = 0 ; i < sorted_nodes .size (); ++i) {
710- size_t start_rr_node_index = size_t (sorted_nodes [i]) + 1 ;
711- size_t end_rr_node_index = (i == sorted_nodes .size () - 1 ) ? node_storage_.size () : size_t (sorted_nodes [i + 1 ]);
709+ for (size_t i = 0 ; i < nodes_to_remove .size (); ++i) {
710+ size_t start_rr_node_index = size_t (nodes_to_remove [i]) + 1 ;
711+ size_t end_rr_node_index = (i == nodes_to_remove .size () - 1 ) ? node_storage_.size () : size_t (nodes_to_remove [i + 1 ]);
712712 for (size_t j = start_rr_node_index; j < end_rr_node_index; ++j) {
713713 RRNodeId old_node = RRNodeId (j);
714714 // New node index is equal to the old nodex index minus the number of nodes being removed before it.
@@ -726,11 +726,15 @@ void t_rr_graph_storage::remove_nodes(const std::vector<RRNodeId>& nodes) {
726726 }
727727
728728 // Now that the data structures are adjusted, we can shrink the size of them
729- size_t num_nodes_to_remove = sorted_nodes .size ();
729+ size_t num_nodes_to_remove = nodes_to_remove .size ();
730730 VTR_ASSERT (num_nodes_to_remove <= node_storage_.size ());
731731 node_storage_.erase (node_storage_.end ()-num_nodes_to_remove, node_storage_.end ());
732732 node_ptc_.erase (node_ptc_.end ()-num_nodes_to_remove, node_ptc_.end ());
733733 node_layer_.erase (node_layer_.end ()-num_nodes_to_remove, node_layer_.end ());
734+ // After shifting the IDs of nodes that are not removed to the left, the last
735+ // `num_nodes_to_remove` node IDs become invalid (their names have already been
736+ // updated for other nodes). Therefore, the corresponding entries in `node_name_`
737+ // must be removed.
734738 for (size_t node_index = node_name_.size ()-num_nodes_to_remove; node_index < node_name_.size (); ++node_index) {
735739 RRNodeId node = RRNodeId (node_index);
736740 node_name_.erase (node);
@@ -742,19 +746,25 @@ void t_rr_graph_storage::remove_nodes(const std::vector<RRNodeId>& nodes) {
742746 }
743747
744748 std::vector<RREdgeId> removed_edges;
749+ // This function iterates over edge_src_node_ and edge_dest_node_ to remove
750+ // entries where either endpoint of an edge is in the nodes_to_remove list.
751+ // It also updates the node IDs of the remaining edges, since node IDs have
752+ // been shifted.
745753 auto adjust_edges = [&](vtr::vector<RREdgeId, RRNodeId>& edge_nodes) {
746754 for (size_t edge_index = 0 ; edge_index < edge_nodes.size (); ++edge_index) {
747755 RREdgeId edge_id = RREdgeId (edge_index);
748756 RRNodeId node = edge_nodes[edge_id];
749757
750758 // Find insertion point in the sorted vector
751- auto node_it = std::lower_bound (sorted_nodes .begin (), sorted_nodes .end (), node);
759+ auto node_it = std::lower_bound (nodes_to_remove .begin (), nodes_to_remove .end (), node);
752760
753- if (node_it != sorted_nodes .end () && *node_it == node) {
754- // Node exists in sorted_nodes , mark edge for removal
761+ if (node_it != nodes_to_remove .end () && *node_it == node) {
762+ // Node exists in nodes_to_remove , mark edge for removal
755763 removed_edges.push_back (edge_id);
756764 } else {
757- size_t node_offset = std::distance (sorted_nodes.begin (), node_it);
765+ // If the node is not in the nodes_to_remove list, update the node ID of the edge
766+ // by finding how many nodes are there in nodes_to_remove before the node.
767+ size_t node_offset = std::distance (nodes_to_remove.begin (), node_it);
758768 size_t new_node_index = size_t (node) - node_offset;
759769 edge_nodes[edge_id] = RRNodeId (new_node_index);
760770 }
0 commit comments