Skip to content

Commit 6dfc2c3

Browse files
committed
[lib][rr_graph] add comments
1 parent 79694d3 commit 6dfc2c3

File tree

2 files changed

+26
-13
lines changed

2 files changed

+26
-13
lines changed

libs/librrgraph/src/base/rr_graph_storage.cpp

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

libs/librrgraph/src/base/rr_graph_storage.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -751,10 +751,13 @@ class t_rr_graph_storage {
751751
* If init_fan_in has been called, you need to call it again after removing the nodes.
752752
* @note This a very expensive method, so should be called only when necessary. It is better
753753
* to not add nodes in the first place, instead of relying on this method to remove nodes.
754+
*
755+
* @note This operation is O(|V| + |E|·log k), where k is the number of nodes to remove,
756+
* and should not be called frequently.
754757
*
755-
* @param nodes list of RRNodes to be removed
758+
* @param nodes_to_remove list of RRNodes to be removed
756759
*/
757-
void remove_nodes(const std::vector<RRNodeId>& nodes);
760+
void remove_nodes(std::vector<RRNodeId> nodes_to_remove);
758761

759762
/****************
760763
* Edge methods *

0 commit comments

Comments
 (0)