@@ -63,6 +63,10 @@ void t_rr_graph_storage::alloc_and_load_edges(const t_rr_edge_info_set* rr_edges
6363void 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
179183void 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
702706void 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 }
0 commit comments