Skip to content

Commit e5a0f13

Browse files
committed
[lib][rr_graph][storage] fix bugs with remove_nodes
1 parent ec9b088 commit e5a0f13

File tree

2 files changed

+11
-14
lines changed

2 files changed

+11
-14
lines changed

libs/librrgraph/src/base/rr_graph_storage.cpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ void t_rr_graph_storage::alloc_and_load_edges(const t_rr_edge_info_set* rr_edges
6363
void t_rr_graph_storage::remove_edges(std::vector<RREdgeId>& rr_edges_to_remove) {
6464
VTR_ASSERT(!edges_read_);
6565

66+
if (rr_edges_to_remove.empty()) {
67+
return;
68+
}
69+
6670
size_t starting_edge_count = edge_dest_node_.size();
6771

6872
// Sort and make sure all edge indices are unique
@@ -178,7 +182,7 @@ bool t_rr_graph_storage::verify_first_edges() const {
178182

179183
void t_rr_graph_storage::init_fan_in() {
180184
//Reset all fan-ins to zero
181-
edges_read_ = true;
185+
node_fan_in_.clear();
182186
node_fan_in_.resize(node_storage_.size(), 0);
183187
node_fan_in_.shrink_to_fit();
184188
//Walk the graph and increment fanin on all downstream nodes
@@ -700,6 +704,7 @@ void t_rr_graph_storage::set_virtual_clock_network_root_idx(RRNodeId virtual_clo
700704
}
701705

702706
void t_rr_graph_storage::remove_nodes(const std::vector<RRNodeId>& nodes) {
707+
VTR_ASSERT(!edges_read_);
703708
// To remove the nodes, we first sort them in ascending order. This makes it easy
704709
// to calculate the offset by which other node IDs need to be adjusted.
705710
// For example, after sorting the nodes to be removed, if a node ID falls between
@@ -713,15 +718,13 @@ void t_rr_graph_storage::remove_nodes(const std::vector<RRNodeId>& nodes) {
713718
// that fall between them.
714719
for (size_t i = 0; i < sorted_nodes.size(); ++i) {
715720
size_t start_rr_node_index = size_t(sorted_nodes[i]) + 1;
716-
size_t end_rr_node_index = (i == sorted_nodes.size() - 1) ? sorted_nodes.size() : size_t(sorted_nodes[i + 1]);
721+
size_t end_rr_node_index = (i == sorted_nodes.size() - 1) ? node_storage_.size() : size_t(sorted_nodes[i + 1]);
717722
for (size_t j = start_rr_node_index; j < end_rr_node_index; ++j) {
718723
RRNodeId old_node = RRNodeId(j);
719724
// New node index is equal to the old nodex index minus the number of nodes being removed before it.
720725
RRNodeId new_node = RRNodeId(j-(i+1));
721726
node_storage_[new_node] = node_storage_[old_node];
722727
node_ptc_[new_node] = node_ptc_[old_node];
723-
node_first_edge_[new_node] = node_first_edge_[old_node];
724-
node_fan_in_[new_node] = node_fan_in_[old_node];
725728
node_layer_[new_node] = node_layer_[old_node];
726729
node_name_[new_node] = node_name_[old_node];
727730
if (is_tileable_) {
@@ -737,8 +740,6 @@ void t_rr_graph_storage::remove_nodes(const std::vector<RRNodeId>& nodes) {
737740
VTR_ASSERT(num_nodes_to_remove <= node_storage_.size());
738741
node_storage_.erase(node_storage_.end()-num_nodes_to_remove, node_storage_.end());
739742
node_ptc_.erase(node_ptc_.end()-num_nodes_to_remove, node_ptc_.end());
740-
node_first_edge_.erase(node_first_edge_.end()-num_nodes_to_remove, node_first_edge_.end());
741-
node_fan_in_.erase(node_fan_in_.end()-num_nodes_to_remove, node_fan_in_.end());
742743
node_layer_.erase(node_layer_.end()-num_nodes_to_remove, node_layer_.end());
743744
for (size_t node_index = node_name_.size()-num_nodes_to_remove; node_index < node_name_.size(); ++node_index) {
744745
RRNodeId node = RRNodeId(node_index);
@@ -763,12 +764,7 @@ void t_rr_graph_storage::remove_nodes(const std::vector<RRNodeId>& nodes) {
763764
// Node exists in sorted_nodes, mark edge for removal
764765
removed_edges.push_back(edge_id);
765766
} else {
766-
size_t node_offset;
767-
if (node_it == sorted_nodes.end()) {
768-
node_offset = sorted_nodes.size();
769-
} else {
770-
node_offset = std::distance(sorted_nodes.begin(), node_it) + 1;
771-
}
767+
size_t node_offset = std::distance(sorted_nodes.begin(), node_it);
772768
size_t new_node_index = size_t(node) - node_offset;
773769
edge_nodes[edge_id] = RRNodeId(new_node_index);
774770
}

libs/librrgraph/src/base/rr_graph_storage.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,8 @@ class t_rr_graph_storage {
739739

740740
/**
741741
* @brief Removes a given list of RRNodes from the RR Graph
742-
* This method should be called after partition_edges has been called.
742+
* This method should be called before partition_edges has been called.
743+
* If init_fan_in has been called, you need to call it again after removing the nodes.
743744
* @note This a very expensive method, so should be called only when necessary. It is better
744745
* to not add nodes in the first place, instead of relying on this method to remove nodes.
745746
*
@@ -1018,7 +1019,7 @@ class t_rr_graph_storage {
10181019
* | |
10191020
* starting point ending point
10201021
*/
1021-
vtr::vector<RRNodeId, std::vector<short>> node_tilable_track_nums_;
1022+
vtr::vector<RRNodeId, std::vector<short>> node_tilable_track_nums_;
10221023

10231024
/** @brief
10241025
* This array stores the first edge of each RRNodeId. Not that the length

0 commit comments

Comments
 (0)