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);