vpr: added new set containing all of the route tree nodes, accessible within the scope of a routing iteration.
diff --git a/vpr/src/route/route_timing.cpp b/vpr/src/route/route_timing.cpp
index 083f08b..6a74148 100644
--- a/vpr/src/route/route_timing.cpp
+++ b/vpr/src/route/route_timing.cpp
@@ -146,7 +146,8 @@
                                      const RouterLookahead& router_lookahead,
                                      SpatialRouteTreeLookup& spatial_rt_lookup,
                                      RouterStats& router_stats,
-                                     route_budgets &budgeting_inf);
+                                     route_budgets &budgeting_inf,
+                                     std::set<int>& route_tree_nodes);
 
 static t_heap* timing_driven_route_connection_from_route_tree_high_fanout(t_rt_node* rt_root,
                                                                           int sink_node,
@@ -954,6 +955,8 @@
     t_rt_node* rt_root = setup_routing_resources(itry, net_id, num_sinks, pres_fac, router_opts.min_incremental_reroute_fanout, connections_inf, rt_node_of_sink, check_hold(router_opts,timing_info));
 
     bool high_fanout = is_high_fanout(num_sinks, router_opts.high_fanout_threshold);
+    
+    std::set<int> route_tree_nodes;
 
     SpatialRouteTreeLookup spatial_route_tree_lookup;
     if (high_fanout) {
@@ -1035,7 +1038,8 @@
                                       router_lookahead,
                                       spatial_route_tree_lookup,
                                       router_stats,
-                                      budgeting_inf))
+                                      budgeting_inf,
+                                      route_tree_nodes))
             return false;
 
         ++router_stats.connections_routed;
@@ -1076,7 +1080,8 @@
                                      const RouterLookahead& router_lookahead,
                                      SpatialRouteTreeLookup& spatial_rt_lookup,
                                      RouterStats& router_stats,
-                                     route_budgets &budgeting_inf) {
+                                     route_budgets &budgeting_inf,
+                                     std::set<int>& route_tree_nodes) {
     /* Build a path from the existing route tree rooted at rt_root to the target_node
      * add this branch to the existing route tree and update pathfinder costs and rr_node_route_inf to reflect this */
     auto& route_ctx = g_vpr_ctx.mutable_routing();
@@ -1156,7 +1161,7 @@
     t_trace* new_route_start_tptr = update_traceback(cheapest, net_id);
     VTR_ASSERT_DEBUG(validate_traceback(route_ctx.trace[net_id].head));
 
-    rt_node_of_sink[target_pin] = update_route_tree(cheapest, ((high_fanout) ? &spatial_rt_lookup : nullptr));
+    rt_node_of_sink[target_pin] = update_route_tree(cheapest, ((high_fanout) ? &spatial_rt_lookup : nullptr), route_tree_nodes);
     VTR_ASSERT_DEBUG(verify_route_tree(rt_root));
     VTR_ASSERT_DEBUG(verify_traceback_route_tree_equivalent(route_ctx.trace[net_id].head, rt_root));
     VTR_ASSERT_DEBUG(!high_fanout || validate_route_tree_spatial_lookup(rt_root, spatial_rt_lookup));
diff --git a/vpr/src/route/route_tree_timing.cpp b/vpr/src/route/route_tree_timing.cpp
index b535b64..5074631 100644
--- a/vpr/src/route/route_tree_timing.cpp
+++ b/vpr/src/route/route_tree_timing.cpp
@@ -3,6 +3,7 @@
 #include <vector>
 using namespace std;
 
+
 #include "vtr_assert.h"
 #include "vtr_log.h"
 #include "vtr_memory.h"
@@ -50,9 +51,9 @@
 static void free_linked_rt_edge(t_linked_rt_edge* rt_edge);
 
 static t_rt_node* add_subtree_to_route_tree(t_heap* hptr,
-                                            t_rt_node** sink_rt_node_ptr);
+                                            t_rt_node** sink_rt_node_ptr,std::set<int>& route_tree_nodes);
 
-static t_rt_node* add_non_configurable_to_route_tree(const int rr_node, const bool reached_by_non_configurable_edge, std::unordered_set<int>& visited);
+static t_rt_node* add_non_configurable_to_route_tree(const int rr_node, const bool reached_by_non_configurable_edge, std::unordered_set<int>& visited, std::set<int>& route_tree_nodes);
 
 static t_rt_node* update_unbuffered_ancestors_C_downstream(t_rt_node* start_of_new_subtree_rt_node);
 
@@ -203,7 +204,7 @@
  * updates the Tdel, etc. numbers for the rest of the routing tree.  hptr
  * is the heap pointer of the SINK that was reached.  This routine returns
  * a pointer to the rt_node of the SINK that it adds to the routing.        */
-t_rt_node* update_route_tree(t_heap* hptr, SpatialRouteTreeLookup* spatial_rt_lookup) {
+t_rt_node* update_route_tree(t_heap* hptr, SpatialRouteTreeLookup* spatial_rt_lookup, std::set<int>& route_tree_nodes) {
     t_rt_node *start_of_new_subtree_rt_node, *sink_rt_node;
     t_rt_node *unbuffered_subtree_rt_root, *subtree_parent_rt_node;
     float Tdel_start;
@@ -212,7 +213,7 @@
     auto& device_ctx = g_vpr_ctx.device();
 
     //Create a new subtree from the target in hptr to existing routing
-    start_of_new_subtree_rt_node = add_subtree_to_route_tree(hptr, &sink_rt_node);
+    start_of_new_subtree_rt_node = add_subtree_to_route_tree(hptr, &sink_rt_node,route_tree_nodes);
 
     //Propagate R_upstream down into the new subtree
     load_new_subtree_R_upstream(start_of_new_subtree_rt_node);
@@ -256,7 +257,7 @@
 }
 
 static t_rt_node*
-add_subtree_to_route_tree(t_heap* hptr, t_rt_node** sink_rt_node_ptr) {
+add_subtree_to_route_tree(t_heap* hptr, t_rt_node** sink_rt_node_ptr, std::set<int>& route_tree_nodes) {
     /* Adds the most recent wire segment, ending at the SINK indicated by hptr,
      * to the routing tree.  It returns the first (most upstream) new rt_node,
      * and (via a pointer) the rt_node of the new SINK. Traverses up from SINK  */
@@ -303,6 +304,7 @@
 
     while (rr_node_to_rt_node[inode] == nullptr) { //Not connected to existing routing
         main_branch_visited.insert(inode);
+        route_tree_nodes.insert(inode);
 
         linked_rt_edge = alloc_linked_rt_edge();
         linked_rt_edge->child = downstream_rt_node;
@@ -348,18 +350,19 @@
     //non-configurably connected nodes
     std::unordered_set<int> all_visited = main_branch_visited;
     for (int rr_node : main_branch_visited) {
-        add_non_configurable_to_route_tree(rr_node, false, all_visited);
+        add_non_configurable_to_route_tree(rr_node, false, all_visited, route_tree_nodes);
     }
 
     *sink_rt_node_ptr = sink_rt_node;
     return (downstream_rt_node);
 }
 
-static t_rt_node* add_non_configurable_to_route_tree(const int rr_node, const bool reached_by_non_configurable_edge, std::unordered_set<int>& visited) {
+static t_rt_node* add_non_configurable_to_route_tree(const int rr_node, const bool reached_by_non_configurable_edge, std::unordered_set<int>& visited, std::set<int>& route_tree_nodes) {
     t_rt_node* rt_node = nullptr;
 
     if (!visited.count(rr_node) || !reached_by_non_configurable_edge) {
         visited.insert(rr_node);
+        route_tree_nodes.insert(rr_node);
 
         auto& device_ctx = g_vpr_ctx.device();
 
@@ -392,7 +395,7 @@
             int to_rr_node = device_ctx.rr_nodes[rr_node].edge_sink_node(iedge);
 
             //Recurse
-            t_rt_node* child_rt_node = add_non_configurable_to_route_tree(to_rr_node, true, visited);
+            t_rt_node* child_rt_node = add_non_configurable_to_route_tree(to_rr_node, true, visited, route_tree_nodes);
 
             if (!child_rt_node) continue;
 
diff --git a/vpr/src/route/route_tree_timing.h b/vpr/src/route/route_tree_timing.h
index 8c8c12f..a4d446f 100644
--- a/vpr/src/route/route_tree_timing.h
+++ b/vpr/src/route/route_tree_timing.h
@@ -17,7 +17,7 @@
 void free_route_tree(t_rt_node* rt_node);
 void print_route_tree(const t_rt_node* rt_node, int depth = 0);
 
-t_rt_node* update_route_tree(t_heap* hptr, SpatialRouteTreeLookup* spatial_rt_lookup);
+t_rt_node* update_route_tree(t_heap* hptr, SpatialRouteTreeLookup* spatial_rt_lookup, std::set<int>& route_tree_nodes);
 
 void update_net_delays_from_route_tree(float* net_delay,
                                        const t_rt_node* const* rt_node_of_sink,
diff --git a/vpr/src/route/router_delay_profiling.cpp b/vpr/src/route/router_delay_profiling.cpp
index 7ed4657..6f7770a 100644
--- a/vpr/src/route/router_delay_profiling.cpp
+++ b/vpr/src/route/router_delay_profiling.cpp
@@ -19,6 +19,8 @@
 
     t_rt_node* rt_root = setup_routing_resources_no_net(source_node);
 
+    std::set<int> dummy_route_tree_nodes; // dummy set that will not be used for any purpose.
+
     /* Update base costs according to fanout and criticality rules */
     update_rr_base_costs(1);
 
@@ -47,7 +49,7 @@
     if (found_path) {
         VTR_ASSERT(cheapest->index == sink_node);
 
-        t_rt_node* rt_node_of_sink = update_route_tree(cheapest, nullptr);
+        t_rt_node* rt_node_of_sink = update_route_tree(cheapest, nullptr, dummy_route_tree_nodes);
         free_heap_data(cheapest);
 
         //find delay
@@ -71,6 +73,8 @@
     std::vector<float> path_delays_to(device_ctx.rr_nodes.size(), std::numeric_limits<float>::quiet_NaN());
 
     t_rt_node* rt_root = setup_routing_resources_no_net(src_rr_node);
+    
+    std::set<int> dummy_route_tree_nodes; // dummy set that will not be used for any purpose.
 
     t_bb bounding_box;
     bounding_box.xmin = 0;
@@ -107,7 +111,7 @@
 
             //Build the routing tree to get the delay
             rt_root = setup_routing_resources_no_net(src_rr_node);
-            t_rt_node* rt_node_of_sink = update_route_tree(&shortest_paths[sink_rr_node], nullptr);
+            t_rt_node* rt_node_of_sink = update_route_tree(&shortest_paths[sink_rr_node], nullptr, dummy_route_tree_nodes);
 
             VTR_ASSERT(rt_node_of_sink->inode == sink_rr_node);