From 91eb4b57da21d9570b85b5ded4efe66c5c56b443 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Thu, 18 Nov 2021 16:42:55 +0500 Subject: [PATCH 01/21] Added API for num_configurable_edges --- vpr/src/device/rr_graph_view.h | 4 ++++ vpr/src/route/rr_node.cpp | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/vpr/src/device/rr_graph_view.h b/vpr/src/device/rr_graph_view.h index 7267f1c394f..e4708877483 100644 --- a/vpr/src/device/rr_graph_view.h +++ b/vpr/src/device/rr_graph_view.h @@ -249,6 +249,10 @@ class RRGraphView { return node_storage_.node_side_string(node); } + inline t_edge_size num_configurable_edges(RRNodeId node) const { + return node_storage_.num_configurable_edges(node); + } + /** @brief Get the cost index of a routing resource node. This function is inlined for runtime optimization. */ RRIndexedDataId node_cost_index(RRNodeId node) const { return node_storage_.node_cost_index(node); diff --git a/vpr/src/route/rr_node.cpp b/vpr/src/route/rr_node.cpp index 8d3e3b6dbae..ed93afd522f 100644 --- a/vpr/src/route/rr_node.cpp +++ b/vpr/src/route/rr_node.cpp @@ -2,6 +2,7 @@ #include "rr_graph_storage.h" #include "globals.h" #include "vpr_error.h" +#include "rr_graph.h" //Returns the max 'length' over the x or y direction short t_rr_node::length() const { @@ -20,9 +21,12 @@ bool t_rr_node::edge_is_configurable(t_edge_size iedge) const { bool t_rr_node::validate() const { //Check internal assumptions about RR node are valid + auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; + t_edge_size iedge = 0; for (auto edge : edges()) { - if (edge < num_configurable_edges()) { + if (edge < rr_graph.num_configurable_edges(RRNodeId(id_))) { if (!edge_is_configurable(edge)) { VPR_FATAL_ERROR(VPR_ERROR_ROUTE, "RR Node non-configurable edge found in configurable edge list"); } From f0210f17cdfb479ccee99c45158b6e02a0a425eb Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Fri, 19 Nov 2021 09:14:55 +0500 Subject: [PATCH 02/21] Updated formatting for rr_node.cpp --- vpr/src/route/rr_node.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vpr/src/route/rr_node.cpp b/vpr/src/route/rr_node.cpp index ed93afd522f..a2e6e20fabb 100644 --- a/vpr/src/route/rr_node.cpp +++ b/vpr/src/route/rr_node.cpp @@ -21,8 +21,9 @@ bool t_rr_node::edge_is_configurable(t_edge_size iedge) const { bool t_rr_node::validate() const { //Check internal assumptions about RR node are valid - auto& device_ctx = g_vpr_ctx.device(); - const auto& rr_graph = device_ctx.rr_graph; + auto& device_ctx = g_vpr_ctx.device(); + + const auto& rr_graph = device_ctx.rr_graph; t_edge_size iedge = 0; for (auto edge : edges()) { From 0ae63684f6ee17d163884a408a0cce7ebe132cd1 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Fri, 19 Nov 2021 11:01:49 +0500 Subject: [PATCH 03/21] Removed num_configurable_edges function from rr_node_impl.h --- vpr/src/route/rr_node_impl.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/vpr/src/route/rr_node_impl.h b/vpr/src/route/rr_node_impl.h index dd698f8b293..5061a63b3ad 100644 --- a/vpr/src/route/rr_node_impl.h +++ b/vpr/src/route/rr_node_impl.h @@ -90,10 +90,6 @@ inline t_edge_size t_rr_node::num_non_configurable_edges() const { return storage_->num_non_configurable_edges(id_); } -inline t_edge_size t_rr_node::num_configurable_edges() const { - return storage_->num_configurable_edges(id_); -} - inline int t_rr_node::edge_sink_node(t_edge_size iedge) const { size_t inode = (size_t)storage_->edge_sink_node(id_, iedge); return inode; From 1f22e38252793c8d1f479824b318fc0fe49faf9d Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Fri, 19 Nov 2021 11:27:48 +0500 Subject: [PATCH 04/21] Added comment for num_configurable_edges --- vpr/src/device/rr_graph_view.h | 1 + 1 file changed, 1 insertion(+) diff --git a/vpr/src/device/rr_graph_view.h b/vpr/src/device/rr_graph_view.h index e4708877483..8cb8a18c11b 100644 --- a/vpr/src/device/rr_graph_view.h +++ b/vpr/src/device/rr_graph_view.h @@ -249,6 +249,7 @@ class RRGraphView { return node_storage_.node_side_string(node); } + /** @brief Get the number of configurable edges. This function is inlined for runtime optimization. */ inline t_edge_size num_configurable_edges(RRNodeId node) const { return node_storage_.num_configurable_edges(node); } From cad8da68ea8291bbe282ae7b5a29f76ab06e54f1 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Mon, 22 Nov 2021 12:55:57 +0500 Subject: [PATCH 05/21] API added for edges() --- vpr/src/device/rr_graph_view.h | 5 +++++ vpr/src/route/rr_graph.cpp | 6 ++++-- vpr/src/route/rr_node.cpp | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/vpr/src/device/rr_graph_view.h b/vpr/src/device/rr_graph_view.h index 8cb8a18c11b..46610294aff 100644 --- a/vpr/src/device/rr_graph_view.h +++ b/vpr/src/device/rr_graph_view.h @@ -254,6 +254,11 @@ class RRGraphView { return node_storage_.num_configurable_edges(node); } + /** @brief Get the number of configurable edges. This function is inlined for runtime optimization. */ + inline edge_idx_range edges(RRNodeId node) const { + return node_storage_.edges(node); + } + /** @brief Get the cost index of a routing resource node. This function is inlined for runtime optimization. */ RRIndexedDataId node_cost_index(RRNodeId node) const { return node_storage_.node_cost_index(node); diff --git a/vpr/src/route/rr_graph.cpp b/vpr/src/route/rr_graph.cpp index f842eb3db7a..2f5d3635ceb 100644 --- a/vpr/src/route/rr_graph.cpp +++ b/vpr/src/route/rr_graph.cpp @@ -376,9 +376,11 @@ void create_rr_graph(const t_graph_type graph_type, void print_rr_graph_stats() { auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; + size_t num_rr_edges = 0; for (auto& rr_node : device_ctx.rr_nodes) { - num_rr_edges += rr_node.edges().size(); + num_rr_edges += rr_graph.edges(rr_node.id()).size(); } VTR_LOG(" RR Graph Nodes: %zu\n", device_ctx.rr_nodes.size()); @@ -723,7 +725,7 @@ static void build_rr_graph(const t_graph_type graph_type, * based on their fanin in the rr graph. This routine also adjusts the rr nodes to point to these new rr switches */ alloc_and_load_rr_switch_inf(num_arch_switches, R_minW_nmos, R_minW_pmos, wire_to_arch_ipin_switch, wire_to_rr_ipin_switch); - //Partition the rr graph edges for efficient access to configurable/non-configurable + //Partition the rr graph edges for efficient access to configurable/non-configurab/home/users/behzad.mahmood/eclipse-workspacele //edge subsets. Must be done after RR switches have been allocated device_ctx.rr_graph_builder.partition_edges(); diff --git a/vpr/src/route/rr_node.cpp b/vpr/src/route/rr_node.cpp index a2e6e20fabb..b69422da1a0 100644 --- a/vpr/src/route/rr_node.cpp +++ b/vpr/src/route/rr_node.cpp @@ -26,7 +26,7 @@ bool t_rr_node::validate() const { const auto& rr_graph = device_ctx.rr_graph; t_edge_size iedge = 0; - for (auto edge : edges()) { + for (auto edge : rr_graph.edges(RRNodeId(id_))) { if (edge < rr_graph.num_configurable_edges(RRNodeId(id_))) { if (!edge_is_configurable(edge)) { VPR_FATAL_ERROR(VPR_ERROR_ROUTE, "RR Node non-configurable edge found in configurable edge list"); From cac443485bb24d5c7f5b42cc7a1c9c0aa950fb62 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Mon, 22 Nov 2021 14:42:06 +0500 Subject: [PATCH 06/21] Added comment for edges() API --- vpr/src/device/rr_graph_view.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vpr/src/device/rr_graph_view.h b/vpr/src/device/rr_graph_view.h index 46610294aff..f62792a512e 100644 --- a/vpr/src/device/rr_graph_view.h +++ b/vpr/src/device/rr_graph_view.h @@ -254,7 +254,7 @@ class RRGraphView { return node_storage_.num_configurable_edges(node); } - /** @brief Get the number of configurable edges. This function is inlined for runtime optimization. */ + /** @brief Get ID range for edges. This function is inlined for runtime optimization. */ inline edge_idx_range edges(RRNodeId node) const { return node_storage_.edges(node); } From 6164123480c8fea6aebdc7cff5ef3311b01649d4 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Mon, 22 Nov 2021 15:09:36 +0500 Subject: [PATCH 07/21] Removed edges() from rr_node_impl.h --- vpr/src/route/rr_node_impl.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/vpr/src/route/rr_node_impl.h b/vpr/src/route/rr_node_impl.h index 5061a63b3ad..08b8dbb62c3 100644 --- a/vpr/src/route/rr_node_impl.h +++ b/vpr/src/route/rr_node_impl.h @@ -75,10 +75,6 @@ inline t_edge_size t_rr_node::num_edges() const { return storage_->num_edges(id_); } -inline edge_idx_range t_rr_node::edges() const { - return storage_->edges(id_); -} - inline edge_idx_range t_rr_node::configurable_edges() const { return storage_->configurable_edges(id_); } From 25ec80ca83702b02807ca92ea5895a343eaa7830 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Wed, 24 Nov 2021 12:07:41 +0500 Subject: [PATCH 08/21] Adding num_edges() API --- utils/fasm/test/test_fasm.cpp | 2 +- vpr/src/device/rr_graph_view.h | 5 +++++ vpr/src/draw/draw.cpp | 13 ++++++++----- vpr/src/place/timing_place_lookup.cpp | 6 +++--- vpr/src/power/power.cpp | 13 ++++++------- vpr/src/route/check_route.cpp | 2 +- vpr/src/route/check_rr_graph.cpp | 8 ++++---- vpr/src/route/route_common.cpp | 5 +++-- vpr/src/route/router_lookahead_map_utils.cpp | 4 +++- vpr/src/route/router_lookahead_sampling.cpp | 4 ++-- vpr/src/route/rr_graph.cpp | 2 +- vpr/src/route/rr_graph_area.cpp | 6 +++--- vpr/src/route/rr_graph_timing_params.cpp | 6 +++--- vpr/src/route/rr_node.cpp | 2 +- vpr/src/util/vpr_utils.cpp | 3 ++- vpr/test/test_vpr.cpp | 2 +- 16 files changed, 47 insertions(+), 36 deletions(-) diff --git a/utils/fasm/test/test_fasm.cpp b/utils/fasm/test/test_fasm.cpp index f0208b918cf..bbcd2c8acee 100644 --- a/utils/fasm/test/test_fasm.cpp +++ b/utils/fasm/test/test_fasm.cpp @@ -254,7 +254,7 @@ TEST_CASE("fasm_integration_test", "[fasm]") { auto &device_ctx = g_vpr_ctx.mutable_device(); const auto& rr_graph = device_ctx.rr_graph; for(size_t inode = 0; inode < device_ctx.rr_nodes.size(); ++inode) { - for(t_edge_size iedge = 0; iedge < device_ctx.rr_nodes[inode].num_edges(); ++iedge) { + for(t_edge_size iedge = 0; iedge < rr_graph.num_edges(RRNodeId(inode)); ++iedge) { auto sink_inode = device_ctx.rr_nodes[inode].edge_sink_node(iedge); auto switch_id = device_ctx.rr_nodes[inode].edge_switch(iedge); auto value = vtr::string_fmt("%d_%d_%zu", diff --git a/vpr/src/device/rr_graph_view.h b/vpr/src/device/rr_graph_view.h index f62792a512e..0f8b9ca3215 100644 --- a/vpr/src/device/rr_graph_view.h +++ b/vpr/src/device/rr_graph_view.h @@ -259,6 +259,11 @@ class RRGraphView { return node_storage_.edges(node); } + /** @brief Get the number of edges. This function is inlined for runtime optimization. */ + inline t_edge_size num_edges(RRNodeId node) const { + return node_storage_.num_edges(node); + } + /** @brief Get the cost index of a routing resource node. This function is inlined for runtime optimization. */ RRIndexedDataId node_cost_index(RRNodeId node) const { return node_storage_.node_cost_index(node); diff --git a/vpr/src/draw/draw.cpp b/vpr/src/draw/draw.cpp index baa79b455e3..fc868f938ff 100644 --- a/vpr/src/draw/draw.cpp +++ b/vpr/src/draw/draw.cpp @@ -1688,7 +1688,7 @@ static void draw_rr_edges(int inode, ezgl::renderer* g) { from_ptc_num = device_ctx.rr_nodes[inode].ptc_num(); - for (t_edge_size iedge = 0, l = device_ctx.rr_nodes[inode].num_edges(); iedge < l; iedge++) { + for (t_edge_size iedge = 0, l = rr_graph.num_edges(RRNodeId(inode)); iedge < l; iedge++) { to_node = device_ctx.rr_nodes[inode].edge_sink_node(iedge); to_type = rr_graph.node_type(RRNodeId(to_node)); to_ptc_num = device_ctx.rr_nodes[to_node].ptc_num(); @@ -2696,10 +2696,11 @@ void highlight_nets(char* message, int hit_node) { void draw_highlight_fan_in_fan_out(const std::set& nodes) { t_draw_state* draw_state = get_draw_state_vars(); auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; for (auto node : nodes) { /* Highlight the fanout nodes in red. */ - for (t_edge_size iedge = 0, l = device_ctx.rr_nodes[node].num_edges(); + for (t_edge_size iedge = 0, l = rr_graph.num_edges(RRNodeId(node)); iedge < l; iedge++) { int fanout_node = device_ctx.rr_nodes[node].edge_sink_node(iedge); @@ -2718,7 +2719,7 @@ void draw_highlight_fan_in_fan_out(const std::set& nodes) { /* Highlight the nodes that can fanin to this node in blue. */ for (size_t inode = 0; inode < device_ctx.rr_nodes.size(); inode++) { - for (t_edge_size iedge = 0, l = device_ctx.rr_nodes[inode].num_edges(); iedge < l; + for (t_edge_size iedge = 0, l = rr_graph.num_edges(RRNodeId(inode)); iedge < l; iedge++) { int fanout_node = device_ctx.rr_nodes[inode].edge_sink_node( iedge); @@ -2822,11 +2823,12 @@ std::set draw_expand_non_configurable_rr_nodes(int from_node) { void draw_expand_non_configurable_rr_nodes_recurr(int from_node, std::set& expanded_nodes) { auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; expanded_nodes.insert(from_node); for (t_edge_size iedge = 0; - iedge < device_ctx.rr_nodes[from_node].num_edges(); ++iedge) { + iedge < rr_graph.num_edges(RRNodeId(from_node)); ++iedge) { bool edge_configurable = device_ctx.rr_nodes[from_node].edge_is_configurable(iedge); int to_node = device_ctx.rr_nodes[from_node].edge_sink_node(iedge); @@ -3781,8 +3783,9 @@ bool trace_routed_connection_rr_nodes_recurr(const t_rt_node* rt_node, //Find the edge between two rr nodes static t_edge_size find_edge(int prev_inode, int inode) { auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; for (t_edge_size iedge = 0; - iedge < device_ctx.rr_nodes[prev_inode].num_edges(); ++iedge) { + iedge < rr_graph.num_edges(RRNodeId(prev_inode)); ++iedge) { if (device_ctx.rr_nodes[prev_inode].edge_sink_node(iedge) == inode) { return iedge; } diff --git a/vpr/src/place/timing_place_lookup.cpp b/vpr/src/place/timing_place_lookup.cpp index 7dfbed7d686..28b818b3d3d 100644 --- a/vpr/src/place/timing_place_lookup.cpp +++ b/vpr/src/place/timing_place_lookup.cpp @@ -1166,16 +1166,16 @@ bool directconnect_exists(int src_rr_node, int sink_rr_node) { VTR_ASSERT(rr_graph.node_type(RRNodeId(src_rr_node)) == SOURCE && rr_graph.node_type(RRNodeId(sink_rr_node)) == SINK); //TODO: This is a constant depth search, but still may be too slow - for (t_edge_size i_src_edge = 0; i_src_edge < rr_nodes[src_rr_node].num_edges(); ++i_src_edge) { + for (t_edge_size i_src_edge = 0; i_src_edge < rr_graph.num_edges(RRNodeId(src_rr_node)); ++i_src_edge) { int opin_rr_node = rr_nodes[src_rr_node].edge_sink_node(i_src_edge); if (rr_graph.node_type(RRNodeId(opin_rr_node)) != OPIN) continue; - for (t_edge_size i_opin_edge = 0; i_opin_edge < rr_nodes[opin_rr_node].num_edges(); ++i_opin_edge) { + for (t_edge_size i_opin_edge = 0; i_opin_edge < rr_graph.num_edges(RRNodeId(opin_rr_node)); ++i_opin_edge) { int ipin_rr_node = rr_nodes[opin_rr_node].edge_sink_node(i_opin_edge); if (rr_graph.node_type(RRNodeId(ipin_rr_node)) != IPIN) continue; - for (t_edge_size i_ipin_edge = 0; i_ipin_edge < rr_nodes[ipin_rr_node].num_edges(); ++i_ipin_edge) { + for (t_edge_size i_ipin_edge = 0; i_ipin_edge < rr_graph.num_edges(RRNodeId(ipin_rr_node)); ++i_ipin_edge) { if (sink_rr_node == rr_nodes[ipin_rr_node].edge_sink_node(i_ipin_edge)) { return true; } diff --git a/vpr/src/power/power.cpp b/vpr/src/power/power.cpp index 3fce2e3c391..04cd278b8d8 100644 --- a/vpr/src/power/power.cpp +++ b/vpr/src/power/power.cpp @@ -821,7 +821,7 @@ static void power_usage_routing(t_power_usage* power_usage, continue; } - for (t_edge_size edge_idx = 0; edge_idx < node.num_edges(); edge_idx++) { + for (t_edge_size edge_idx = 0; edge_idx < rr_graph.num_edges(RRNodeId(trace->index)); edge_idx++) { const auto& next_node_id = node.edge_sink_node(edge_idx); if (next_node_id != OPEN) { t_rr_node_power* next_node_power = &rr_node_power[next_node_id]; @@ -981,7 +981,7 @@ static void power_usage_routing(t_power_usage* power_usage, /* Determine types of switches that this wire drives */ connectionbox_fanout = 0; switchbox_fanout = 0; - for (t_edge_size iedge = 0; iedge < node.num_edges(); iedge++) { + for (t_edge_size iedge = 0; iedge < rr_graph.num_edges(rr_node); iedge++) { if (node.edge_switch(iedge) == routing_arch->wire_to_rr_ipin_switch) { connectionbox_fanout++; } else if (node.edge_switch(iedge) == routing_arch->delayless_switch) { @@ -1225,7 +1225,7 @@ void power_routing_init(const t_det_routing_arch* routing_arch) { break; case CHANX: case CHANY: - for (t_edge_size iedge = 0; iedge < node.num_edges(); iedge++) { + for (t_edge_size iedge = 0; iedge < rr_graph.num_edges(RRNodeId(rr_node_idx)); iedge++) { if (node.edge_switch(iedge) == routing_arch->wire_to_rr_ipin_switch) { fanout_to_IPIN++; } else if (node.edge_switch(iedge) != routing_arch->delayless_switch) { @@ -1260,7 +1260,7 @@ void power_routing_init(const t_det_routing_arch* routing_arch) { for (size_t rr_node_idx = 0; rr_node_idx < device_ctx.rr_nodes.size(); rr_node_idx++) { auto node = device_ctx.rr_nodes[rr_node_idx]; - for (t_edge_size edge_idx = 0; edge_idx < node.num_edges(); edge_idx++) { + for (t_edge_size edge_idx = 0; edge_idx < rr_graph.num_edges(RRNodeId(rr_node_idx)); edge_idx++) { if (node.edge_sink_node(edge_idx) != OPEN) { if (rr_node_power[node.edge_sink_node(edge_idx)].driver_switch_type == OPEN) { rr_node_power[node.edge_sink_node(edge_idx)].driver_switch_type = node.edge_switch(edge_idx); @@ -1274,13 +1274,12 @@ void power_routing_init(const t_det_routing_arch* routing_arch) { /* Find Max Fanout of Routing Buffer */ t_edge_size max_seg_fanout = 0; for (size_t rr_node_idx = 0; rr_node_idx < device_ctx.rr_nodes.size(); rr_node_idx++) { - auto node = device_ctx.rr_nodes[rr_node_idx]; switch (rr_graph.node_type(RRNodeId(rr_node_idx))) { case CHANX: case CHANY: - if (node.num_edges() > max_seg_fanout) { - max_seg_fanout = node.num_edges(); + if (rr_graph.num_edges(RRNodeId(rr_node_idx)) > max_seg_fanout) { + max_seg_fanout = rr_graph.num_edges(RRNodeId(rr_node_idx)); } break; default: diff --git a/vpr/src/route/check_route.cpp b/vpr/src/route/check_route.cpp index 7e82397a7bc..cf35e4b247a 100644 --- a/vpr/src/route/check_route.cpp +++ b/vpr/src/route/check_route.cpp @@ -309,7 +309,7 @@ static bool check_adjacent(int from_node, int to_node) { reached = false; - for (t_edge_size iconn = 0; iconn < device_ctx.rr_nodes[from_node].num_edges(); iconn++) { + for (t_edge_size iconn = 0; iconn < rr_graph.num_edges(RRNodeId(from_node)); iconn++) { if (device_ctx.rr_nodes[from_node].edge_sink_node(iconn) == to_node) { reached = true; break; diff --git a/vpr/src/route/check_rr_graph.cpp b/vpr/src/route/check_rr_graph.cpp index 7d71ec917aa..fc178cd221e 100644 --- a/vpr/src/route/check_rr_graph.cpp +++ b/vpr/src/route/check_rr_graph.cpp @@ -71,7 +71,7 @@ void check_rr_graph(const t_graph_type graph_type, } t_rr_type rr_type = rr_graph.node_type(rr_node); - int num_edges = device_ctx.rr_nodes[inode].num_edges(); + int num_edges = rr_graph.num_edges(RRNodeId(inode)); check_rr_node(inode, route_type, device_ctx); @@ -483,7 +483,7 @@ void check_rr_node(int inode, enum e_route_type route_type, const DeviceContext& } /* Check that the number of (out) edges is reasonable. */ - num_edges = device_ctx.rr_nodes[inode].num_edges(); + num_edges = rr_graph.num_edges(RRNodeId(inode)); if (rr_type != SINK && rr_type != IPIN) { if (num_edges <= 0) { @@ -544,7 +544,7 @@ static void check_unbuffered_edges(int from_node) { if (from_rr_type != CHANX && from_rr_type != CHANY) return; - from_num_edges = device_ctx.rr_nodes[from_node].num_edges(); + from_num_edges = rr_graph.num_edges(RRNodeId(from_node)); for (from_edge = 0; from_edge < from_num_edges; from_edge++) { to_node = device_ctx.rr_nodes[from_node].edge_sink_node(from_edge); @@ -562,7 +562,7 @@ static void check_unbuffered_edges(int from_node) { * check that there is a corresponding edge from to_node back to * * from_node. */ - to_num_edges = device_ctx.rr_nodes[to_node].num_edges(); + to_num_edges = rr_graph.num_edges(RRNodeId(to_node)); trans_matched = false; for (to_edge = 0; to_edge < to_num_edges; to_edge++) { diff --git a/vpr/src/route/route_common.cpp b/vpr/src/route/route_common.cpp index 5dac97ce0f2..2cfba923128 100644 --- a/vpr/src/route/route_common.cpp +++ b/vpr/src/route/route_common.cpp @@ -1424,7 +1424,7 @@ void reserve_locally_used_opins(HeapInterface* heap, float pres_fac, float acc_f //the reserved OPINs to move out of the way of congestion, by preferring //to reserve OPINs with lower congestion costs). from_node = route_ctx.rr_blk_source[blk_id][iclass]; - num_edges = device_ctx.rr_nodes[from_node].num_edges(); + num_edges = rr_graph.num_edges(RRNodeId(from_node)); for (iconn = 0; iconn < num_edges; iconn++) { to_node = device_ctx.rr_nodes[from_node].edge_sink_node(iconn); @@ -1561,9 +1561,10 @@ bool validate_traceback_recurr(t_trace* trace, std::set& seen_rr_nodes) { //Check there is an edge connecting trace and next auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; bool found = false; - for (t_edge_size iedge = 0; iedge < device_ctx.rr_nodes[trace->index].num_edges(); ++iedge) { + for (t_edge_size iedge = 0; iedge < rr_graph.num_edges(RRNodeId(trace->index)); ++iedge) { int to_node = device_ctx.rr_nodes[trace->index].edge_sink_node(iedge); if (to_node == next->index) { diff --git a/vpr/src/route/router_lookahead_map_utils.cpp b/vpr/src/route/router_lookahead_map_utils.cpp index a535fa129af..08f4ebfb070 100644 --- a/vpr/src/route/router_lookahead_map_utils.cpp +++ b/vpr/src/route/router_lookahead_map_utils.cpp @@ -259,11 +259,13 @@ void expand_dijkstra_neighbours(const t_rr_graph_storage& rr_nodes, std::priority_queue, std::greater>* pq) { + auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; RRNodeId parent = parent_entry.rr_node; auto& parent_node = rr_nodes[size_t(parent)]; - for (int iedge = 0; iedge < parent_node.num_edges(); iedge++) { + for (int iedge = 0; iedge < rr_graph.num_edges(RRNodeId(parent)); iedge++) { int child_node_ind = parent_node.edge_sink_node(iedge); int switch_ind = parent_node.edge_switch(iedge); diff --git a/vpr/src/route/router_lookahead_sampling.cpp b/vpr/src/route/router_lookahead_sampling.cpp index a1101b834b3..1cafebacfae 100644 --- a/vpr/src/route/router_lookahead_sampling.cpp +++ b/vpr/src/route/router_lookahead_sampling.cpp @@ -134,7 +134,7 @@ static std::tuple get_node_info(const t_rr_node& node, int num_se return std::tuple(OPEN, OPEN, OPEN); } - if (rr_graph.node_capacity(rr_node) == 0 || node.num_edges() == 0) { + if (rr_graph.node_capacity(rr_node) == 0 || rr_graph.num_edges(rr_node) == 0) { return std::tuple(OPEN, OPEN, OPEN); } @@ -205,7 +205,7 @@ std::vector find_sample_regions(int num_segments) { std::vector> bounding_box_for_segment(num_segments, vtr::Rect()); for (auto& node : rr_nodes) { if (rr_graph.node_type(node.id()) != CHANX && rr_graph.node_type(node.id()) != CHANY) continue; - if (rr_graph.node_capacity(node.id()) == 0 || node.num_edges() == 0) continue; + if (rr_graph.node_capacity(node.id()) == 0 || rr_graph.num_edges(node.id()) == 0) continue; int seg_index = device_ctx.rr_indexed_data[rr_graph.node_cost_index(node.id())].seg_index; VTR_ASSERT(seg_index != OPEN); diff --git a/vpr/src/route/rr_graph.cpp b/vpr/src/route/rr_graph.cpp index 2f5d3635ceb..84590101c98 100644 --- a/vpr/src/route/rr_graph.cpp +++ b/vpr/src/route/rr_graph.cpp @@ -2464,7 +2464,7 @@ std::string describe_rr_node(int inode) { msg += vtr::string_fmt(" capacity: %d", rr_graph.node_capacity(RRNodeId(inode))); msg += vtr::string_fmt(" fan-in: %d", rr_graph.node_fan_in(RRNodeId(inode))); - msg += vtr::string_fmt(" fan-out: %d", rr_node.num_edges()); + msg += vtr::string_fmt(" fan-out: %d", rr_graph.num_edges(RRNodeId(inode))); msg += rr_graph.node_coordinate_to_string(RRNodeId(inode)); diff --git a/vpr/src/route/rr_graph_area.cpp b/vpr/src/route/rr_graph_area.cpp index 1a1919d1b6a..4afbb05eafc 100644 --- a/vpr/src/route/rr_graph_area.cpp +++ b/vpr/src/route/rr_graph_area.cpp @@ -164,7 +164,7 @@ void count_bidir_routing_transistors(int num_switch, int wire_to_ipin_switch, fl switch (from_rr_type) { case CHANX: case CHANY: - num_edges = device_ctx.rr_nodes[from_node].num_edges(); + num_edges = rr_graph.num_edges(RRNodeId(from_node)); for (iedge = 0; iedge < num_edges; iedge++) { RRNodeId to_node = RRNodeId(device_ctx.rr_nodes[from_node].edge_sink_node(iedge)); @@ -249,7 +249,7 @@ void count_bidir_routing_transistors(int num_switch, int wire_to_ipin_switch, fl break; case OPIN: - num_edges = device_ctx.rr_nodes[from_node].num_edges(); + num_edges = rr_graph.num_edges(RRNodeId(from_node)); shared_opin_buffer_trans = 0.; for (iedge = 0; iedge < num_edges; iedge++) { @@ -361,7 +361,7 @@ void count_unidir_routing_transistors(std::vector& /*segment_inf* switch (from_rr_type) { case CHANX: case CHANY: - num_edges = device_ctx.rr_nodes[from_node].num_edges(); + num_edges = rr_graph.num_edges(RRNodeId(from_node)); /* Increment number of inputs per cblock if IPIN */ for (iedge = 0; iedge < num_edges; iedge++) { diff --git a/vpr/src/route/rr_graph_timing_params.cpp b/vpr/src/route/rr_graph_timing_params.cpp index 9b383e32378..15bf7cdf997 100644 --- a/vpr/src/route/rr_graph_timing_params.cpp +++ b/vpr/src/route/rr_graph_timing_params.cpp @@ -54,7 +54,7 @@ void add_rr_graph_C_from_switches(float C_ipin_cblock) { from_rr_type = rr_graph.node_type(RRNodeId(inode)); if (from_rr_type == CHANX || from_rr_type == CHANY) { - for (t_edge_size iedge = 0; iedge < device_ctx.rr_nodes[inode].num_edges(); iedge++) { + for (t_edge_size iedge = 0; iedge < rr_graph.num_edges(RRNodeId(inode)); iedge++) { to_node = device_ctx.rr_nodes[inode].edge_sink_node(iedge); to_rr_type = rr_graph.node_type(RRNodeId(to_node)); @@ -149,7 +149,7 @@ void add_rr_graph_C_from_switches(float C_ipin_cblock) { } /* End node is CHANX or CHANY */ else if (from_rr_type == OPIN) { - for (t_edge_size iedge = 0; iedge < device_ctx.rr_nodes[inode].num_edges(); iedge++) { + for (t_edge_size iedge = 0; iedge < rr_graph.num_edges(RRNodeId(inode)); iedge++) { switch_index = device_ctx.rr_nodes[inode].edge_switch(iedge); to_node = device_ctx.rr_nodes[inode].edge_sink_node(iedge); to_rr_type = rr_graph.node_type(RRNodeId(to_node)); @@ -173,7 +173,7 @@ void add_rr_graph_C_from_switches(float C_ipin_cblock) { * out what the Cout's should be */ Couts_to_add = (float*)vtr::calloc(device_ctx.rr_nodes.size(), sizeof(float)); for (size_t inode = 0; inode < device_ctx.rr_nodes.size(); inode++) { - for (t_edge_size iedge = 0; iedge < device_ctx.rr_nodes[inode].num_edges(); iedge++) { + for (t_edge_size iedge = 0; iedge < rr_graph.num_edges(RRNodeId(inode)); iedge++) { switch_index = device_ctx.rr_nodes[inode].edge_switch(iedge); to_node = device_ctx.rr_nodes[inode].edge_sink_node(iedge); to_rr_type = rr_graph.node_type(RRNodeId(to_node)); diff --git a/vpr/src/route/rr_node.cpp b/vpr/src/route/rr_node.cpp index b69422da1a0..b57c004319a 100644 --- a/vpr/src/route/rr_node.cpp +++ b/vpr/src/route/rr_node.cpp @@ -39,7 +39,7 @@ bool t_rr_node::validate() const { ++iedge; } - if (iedge != num_edges()) { + if (iedge != rr_graph.num_edges(RRNodeId(id_))) { VPR_FATAL_ERROR(VPR_ERROR_ROUTE, "RR Node Edge iteration does not match edge size"); } diff --git a/vpr/src/util/vpr_utils.cpp b/vpr/src/util/vpr_utils.cpp index 36077bd7e2d..fcb05939d86 100644 --- a/vpr/src/util/vpr_utils.cpp +++ b/vpr/src/util/vpr_utils.cpp @@ -1788,6 +1788,7 @@ static int convert_switch_index(int* switch_index, int* fanin) { */ void print_switch_usage() { auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; if (device_ctx.switch_fanin_remap.empty()) { VTR_LOG_WARN("Cannot print switch usage stats: device_ctx.switch_fanin_remap is empty\n"); @@ -1802,7 +1803,7 @@ void print_switch_usage() { std::map* inward_switch_inf = new std::map[device_ctx.rr_nodes.size()]; for (size_t inode = 0; inode < device_ctx.rr_nodes.size(); inode++) { const t_rr_node& from_node = device_ctx.rr_nodes[inode]; - int num_edges = from_node.num_edges(); + int num_edges = rr_graph.num_edges(RRNodeId(inode)); for (int iedge = 0; iedge < num_edges; iedge++) { int switch_index = from_node.edge_switch(iedge); int to_node_index = from_node.edge_sink_node(iedge); diff --git a/vpr/test/test_vpr.cpp b/vpr/test/test_vpr.cpp index ccc6cde603c..85bf7459a49 100644 --- a/vpr/test/test_vpr.cpp +++ b/vpr/test/test_vpr.cpp @@ -135,7 +135,7 @@ TEST_CASE("read_rr_graph_metadata", "[vpr]") { const auto& rr_graph = device_ctx.rr_graph; for (int inode = 0; inode < (int)device_ctx.rr_nodes.size(); ++inode) { - if ((rr_graph.node_type(RRNodeId(inode)) == CHANX || rr_graph.node_type(RRNodeId(inode)) == CHANY) && device_ctx.rr_nodes[inode].num_edges() > 0) { + if ((rr_graph.node_type(RRNodeId(inode)) == CHANX || rr_graph.node_type(RRNodeId(inode)) == CHANY) && rr_graph.num_edges(RRNodeId(inode)) > 0) { src_inode = inode; break; } From 83fbf86e88539d4700408e405396762b8f7769e9 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Wed, 24 Nov 2021 13:01:09 +0500 Subject: [PATCH 09/21] Added num_edges() API --- vpr/src/power/power.cpp | 1 - vpr/src/route/rr_graph_uxsdcxx_serializer.h | 11 ++++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/vpr/src/power/power.cpp b/vpr/src/power/power.cpp index 04cd278b8d8..92900115c1a 100644 --- a/vpr/src/power/power.cpp +++ b/vpr/src/power/power.cpp @@ -1274,7 +1274,6 @@ void power_routing_init(const t_det_routing_arch* routing_arch) { /* Find Max Fanout of Routing Buffer */ t_edge_size max_seg_fanout = 0; for (size_t rr_node_idx = 0; rr_node_idx < device_ctx.rr_nodes.size(); rr_node_idx++) { - switch (rr_graph.node_type(RRNodeId(rr_node_idx))) { case CHANX: case CHANY: diff --git a/vpr/src/route/rr_graph_uxsdcxx_serializer.h b/vpr/src/route/rr_graph_uxsdcxx_serializer.h index 1a4eaee8801..94b6d6cca96 100644 --- a/vpr/src/route/rr_graph_uxsdcxx_serializer.h +++ b/vpr/src/route/rr_graph_uxsdcxx_serializer.h @@ -5,6 +5,7 @@ #include #include "rr_graph.h" +#include "globals.h" #include "rr_graph_uxsdcxx_interface.h" #include "rr_node.h" #include "vpr_error.h" @@ -152,8 +153,10 @@ class EdgeWalker { current_edge_ = 0; current_idx_ = 0; + auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; for (const auto& node : *nodes) { - num_edges_ += node.num_edges(); + num_edges_ += rr_graph.num_edges(node.id()); } } @@ -181,7 +184,9 @@ class EdgeWalker { current_edge_ += 1; } - if (current_edge_ >= (*nodes_)[current_src_inode_].num_edges()) { + auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; + if (current_edge_ >= rr_graph.num_edges(RRNodeId(current_src_inode_))) { // Done with current_src_inode_, advance to the end of the // node list, or the next node with at least 1 edge. current_edge_ = 0; @@ -194,7 +199,7 @@ class EdgeWalker { VTR_ASSERT(current_idx_ + 1 == num_edges_); return current_idx_++; } - } while ((*nodes_)[current_src_inode_].num_edges() < 1); + } while (rr_graph.num_edges(RRNodeId(current_src_inode_)) < 1); } VTR_ASSERT(current_src_inode_ < nodes_->size()); From 8d772568a67cb157668266981c836e4437d29865 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Wed, 24 Nov 2021 13:13:57 +0500 Subject: [PATCH 10/21] removed num_edges() from rr_node_impl.h --- vpr/src/route/rr_node_impl.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/vpr/src/route/rr_node_impl.h b/vpr/src/route/rr_node_impl.h index 08b8dbb62c3..3568e13ba58 100644 --- a/vpr/src/route/rr_node_impl.h +++ b/vpr/src/route/rr_node_impl.h @@ -71,10 +71,6 @@ inline t_rr_node t_rr_graph_storage::back() { return t_rr_node(this, RRNodeId(size() - 1)); } -inline t_edge_size t_rr_node::num_edges() const { - return storage_->num_edges(id_); -} - inline edge_idx_range t_rr_node::configurable_edges() const { return storage_->configurable_edges(id_); } From dc4a62f06196c0cf9f2051cb34b8edf138cd7424 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Fri, 26 Nov 2021 11:21:00 +0500 Subject: [PATCH 11/21] num_non_configurable_edges() API added --- vpr/src/device/rr_graph_view.h | 5 +++++ vpr/src/route/rr_node_impl.h | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/vpr/src/device/rr_graph_view.h b/vpr/src/device/rr_graph_view.h index 2fe9fd030da..df52f8bfdf2 100644 --- a/vpr/src/device/rr_graph_view.h +++ b/vpr/src/device/rr_graph_view.h @@ -254,6 +254,11 @@ class RRGraphView { return node_storage_.num_configurable_edges(node); } + /** @brief Get the number of non-configurable edges. This function is inlined for runtime optimization. */ + inline t_edge_size num_non_configurable_edges(RRNodeId node) const { + return node_storage_.num_non_configurable_edges(node); + } + /** @brief Get ID range for edges. This function is inlined for runtime optimization. */ inline edge_idx_range edges(RRNodeId node) const { return node_storage_.edges(node); diff --git a/vpr/src/route/rr_node_impl.h b/vpr/src/route/rr_node_impl.h index 3bdae895937..5a51d8b47c3 100644 --- a/vpr/src/route/rr_node_impl.h +++ b/vpr/src/route/rr_node_impl.h @@ -78,10 +78,6 @@ inline edge_idx_range t_rr_node::non_configurable_edges() const { return storage_->non_configurable_edges(id_); } -inline t_edge_size t_rr_node::num_non_configurable_edges() const { - return storage_->num_non_configurable_edges(id_); -} - inline int t_rr_node::edge_sink_node(t_edge_size iedge) const { size_t inode = (size_t)storage_->edge_sink_node(id_, iedge); return inode; From 57952526e93eead246b7920e95f887a014b454e8 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Fri, 26 Nov 2021 17:24:19 +0500 Subject: [PATCH 12/21] configurable_edges() API added --- vpr/src/device/rr_graph_view.h | 5 +++++ vpr/src/route/check_rr_graph.cpp | 2 +- vpr/src/route/rr_node_impl.h | 3 --- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/vpr/src/device/rr_graph_view.h b/vpr/src/device/rr_graph_view.h index df52f8bfdf2..9e7e2ea6511 100644 --- a/vpr/src/device/rr_graph_view.h +++ b/vpr/src/device/rr_graph_view.h @@ -259,6 +259,11 @@ class RRGraphView { return node_storage_.num_non_configurable_edges(node); } + /** @brief Get ID range for edges. This function is inlined for runtime optimization. */ + inline edge_idx_range configurable_edges(RRNodeId node) const { + return node_storage_.configurable_edges(node); + } + /** @brief Get ID range for edges. This function is inlined for runtime optimization. */ inline edge_idx_range edges(RRNodeId node) const { return node_storage_.edges(node); diff --git a/vpr/src/route/check_rr_graph.cpp b/vpr/src/route/check_rr_graph.cpp index 12f372bac07..62b96a6a429 100644 --- a/vpr/src/route/check_rr_graph.cpp +++ b/vpr/src/route/check_rr_graph.cpp @@ -184,7 +184,7 @@ void check_rr_graph(const t_graph_type graph_type, check_unbuffered_edges(inode); //Check that all config/non-config edges are appropriately organized - for (auto edge : device_ctx.rr_nodes[inode].configurable_edges()) { + for (auto edge : rr_graph.configurable_edges(RRNodeId(inode))) { if (!device_ctx.rr_nodes[inode].edge_is_configurable(edge)) { VPR_FATAL_ERROR(VPR_ERROR_ROUTE, "in check_rr_graph: node %d edge %d is non-configurable, but in configurable edges", inode, edge); diff --git a/vpr/src/route/rr_node_impl.h b/vpr/src/route/rr_node_impl.h index 5a51d8b47c3..03c2c0f8471 100644 --- a/vpr/src/route/rr_node_impl.h +++ b/vpr/src/route/rr_node_impl.h @@ -71,9 +71,6 @@ inline t_rr_node t_rr_graph_storage::back() { return t_rr_node(this, RRNodeId(size() - 1)); } -inline edge_idx_range t_rr_node::configurable_edges() const { - return storage_->configurable_edges(id_); -} inline edge_idx_range t_rr_node::non_configurable_edges() const { return storage_->non_configurable_edges(id_); } From 46ac27e4f2571b1eadb4d6290a7801d23f06a6e8 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Mon, 29 Nov 2021 11:38:25 +0500 Subject: [PATCH 13/21] Added non_configurable_edges() API --- vpr/src/device/rr_graph_view.h | 7 ++++++- vpr/src/route/check_rr_graph.cpp | 2 +- vpr/src/route/route_common.cpp | 3 ++- vpr/src/route/route_tree_timing.cpp | 2 +- vpr/src/route/rr_node_impl.h | 4 ---- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/vpr/src/device/rr_graph_view.h b/vpr/src/device/rr_graph_view.h index 9e7e2ea6511..c5647c06c90 100644 --- a/vpr/src/device/rr_graph_view.h +++ b/vpr/src/device/rr_graph_view.h @@ -259,11 +259,16 @@ class RRGraphView { return node_storage_.num_non_configurable_edges(node); } - /** @brief Get ID range for edges. This function is inlined for runtime optimization. */ + /** @brief Get ID range for configurable edges. This function is inlined for runtime optimization. */ inline edge_idx_range configurable_edges(RRNodeId node) const { return node_storage_.configurable_edges(node); } + /** @brief Get ID range for non-configurable edges. This function is inlined for runtime optimization. */ + inline edge_idx_range non_configurable_edges(RRNodeId node) const { + return node_storage_.non_configurable_edges(node); + } + /** @brief Get ID range for edges. This function is inlined for runtime optimization. */ inline edge_idx_range edges(RRNodeId node) const { return node_storage_.edges(node); diff --git a/vpr/src/route/check_rr_graph.cpp b/vpr/src/route/check_rr_graph.cpp index 62b96a6a429..c778741f22d 100644 --- a/vpr/src/route/check_rr_graph.cpp +++ b/vpr/src/route/check_rr_graph.cpp @@ -191,7 +191,7 @@ void check_rr_graph(const t_graph_type graph_type, } } - for (auto edge : device_ctx.rr_nodes[inode].non_configurable_edges()) { + for (auto edge : rr_graph.non_configurable_edges(RRNodeId(inode))) { if (device_ctx.rr_nodes[inode].edge_is_configurable(edge)) { VPR_FATAL_ERROR(VPR_ERROR_ROUTE, "in check_rr_graph: node %d edge %d is configurable, but in non-configurable edges", inode, edge); diff --git a/vpr/src/route/route_common.cpp b/vpr/src/route/route_common.cpp index b9cdf05a6ea..e8f9622a6c3 100644 --- a/vpr/src/route/route_common.cpp +++ b/vpr/src/route/route_common.cpp @@ -627,7 +627,8 @@ static std::pair add_trace_non_configurable_recurr(int node, //Record the non-configurable out-going edges std::vector unvisited_non_configurable_edges; auto& device_ctx = g_vpr_ctx.device(); - for (auto iedge : device_ctx.rr_nodes[node].non_configurable_edges()) { + const auto& rr_graph = device_ctx.rr_graph; + for (auto iedge : rr_graph.non_configurable_edges(RRNodeId(node))) { VTR_ASSERT_SAFE(!device_ctx.rr_nodes[node].edge_is_configurable(iedge)); int to_node = device_ctx.rr_nodes[node].edge_sink_node(iedge); diff --git a/vpr/src/route/route_tree_timing.cpp b/vpr/src/route/route_tree_timing.cpp index 7cb35ca7aea..fb510f7de8c 100644 --- a/vpr/src/route/route_tree_timing.cpp +++ b/vpr/src/route/route_tree_timing.cpp @@ -418,7 +418,7 @@ static t_rt_node* add_non_configurable_to_route_tree(const int rr_node, const bo VTR_ASSERT(rt_node->inode == rr_node); } } - for (int iedge : device_ctx.rr_nodes[rr_node].non_configurable_edges()) { + for (int iedge : rr_graph.non_configurable_edges(RRNodeId(rr_node))) { //Recursive case: expand children VTR_ASSERT(!device_ctx.rr_nodes[rr_node].edge_is_configurable(iedge)); diff --git a/vpr/src/route/rr_node_impl.h b/vpr/src/route/rr_node_impl.h index 03c2c0f8471..5da08bafc85 100644 --- a/vpr/src/route/rr_node_impl.h +++ b/vpr/src/route/rr_node_impl.h @@ -71,10 +71,6 @@ inline t_rr_node t_rr_graph_storage::back() { return t_rr_node(this, RRNodeId(size() - 1)); } -inline edge_idx_range t_rr_node::non_configurable_edges() const { - return storage_->non_configurable_edges(id_); -} - inline int t_rr_node::edge_sink_node(t_edge_size iedge) const { size_t inode = (size_t)storage_->edge_sink_node(id_, iedge); return inode; From 6d14f832dc4e4b5aa8e4181e94266e13dec1b869 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Thu, 2 Dec 2021 11:26:09 +0500 Subject: [PATCH 14/21] Removed globals from rr_graph_uxsdcxx_serializer.h --- vpr/src/route/rr_graph_uxsdcxx_serializer.h | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/vpr/src/route/rr_graph_uxsdcxx_serializer.h b/vpr/src/route/rr_graph_uxsdcxx_serializer.h index 88e7e7b4a1a..afe26e4f318 100644 --- a/vpr/src/route/rr_graph_uxsdcxx_serializer.h +++ b/vpr/src/route/rr_graph_uxsdcxx_serializer.h @@ -5,7 +5,6 @@ #include #include "rr_graph.h" -#include "globals.h" #include "rr_graph_uxsdcxx_interface.h" #include "rr_node.h" #include "vpr_error.h" @@ -153,10 +152,8 @@ class EdgeWalker { current_edge_ = 0; current_idx_ = 0; - auto& device_ctx = g_vpr_ctx.device(); - const auto& rr_graph = device_ctx.rr_graph; for (const auto& node : *nodes) { - num_edges_ += rr_graph.num_edges(node.id()); + num_edges_ += nodes_-> num_edges(node.id()); } } @@ -184,9 +181,7 @@ class EdgeWalker { current_edge_ += 1; } - auto& device_ctx = g_vpr_ctx.device(); - const auto& rr_graph = device_ctx.rr_graph; - if (current_edge_ >= rr_graph.num_edges(RRNodeId(current_src_inode_))) { + if (current_edge_ >= nodes_-> num_edges(RRNodeId(current_src_inode_))) { // Done with current_src_inode_, advance to the end of the // node list, or the next node with at least 1 edge. current_edge_ = 0; @@ -199,7 +194,7 @@ class EdgeWalker { VTR_ASSERT(current_idx_ + 1 == num_edges_); return current_idx_++; } - } while (rr_graph.num_edges(RRNodeId(current_src_inode_)) < 1); + } while (nodes_-> num_edges(RRNodeId(current_src_inode_)) < 1); } VTR_ASSERT(current_src_inode_ < nodes_->size()); From 8efc26194ab328c6df8f5df02add9180463e08cb Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Thu, 2 Dec 2021 11:37:17 +0500 Subject: [PATCH 15/21] Updated formatting for rr_graph_uxsdcxx_serializer.h --- vpr/src/route/rr_graph_uxsdcxx_serializer.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vpr/src/route/rr_graph_uxsdcxx_serializer.h b/vpr/src/route/rr_graph_uxsdcxx_serializer.h index afe26e4f318..bd8679872b0 100644 --- a/vpr/src/route/rr_graph_uxsdcxx_serializer.h +++ b/vpr/src/route/rr_graph_uxsdcxx_serializer.h @@ -153,7 +153,7 @@ class EdgeWalker { current_idx_ = 0; for (const auto& node : *nodes) { - num_edges_ += nodes_-> num_edges(node.id()); + num_edges_ += nodes_->num_edges(node.id()); } } @@ -181,7 +181,7 @@ class EdgeWalker { current_edge_ += 1; } - if (current_edge_ >= nodes_-> num_edges(RRNodeId(current_src_inode_))) { + if (current_edge_ >= nodes_->num_edges(RRNodeId(current_src_inode_))) { // Done with current_src_inode_, advance to the end of the // node list, or the next node with at least 1 edge. current_edge_ = 0; @@ -194,7 +194,7 @@ class EdgeWalker { VTR_ASSERT(current_idx_ + 1 == num_edges_); return current_idx_++; } - } while (nodes_-> num_edges(RRNodeId(current_src_inode_)) < 1); + } while (nodes_->num_edges(RRNodeId(current_src_inode_)) < 1); } VTR_ASSERT(current_src_inode_ < nodes_->size()); From 88c5785a8587166443a47c27f38a421df3181bb5 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Tue, 7 Dec 2021 10:02:40 +0500 Subject: [PATCH 16/21] Typo fixed in rr_graph.cpp --- vpr/src/route/rr_graph.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vpr/src/route/rr_graph.cpp b/vpr/src/route/rr_graph.cpp index 789f84e5586..74bffebf50d 100644 --- a/vpr/src/route/rr_graph.cpp +++ b/vpr/src/route/rr_graph.cpp @@ -724,7 +724,7 @@ static void build_rr_graph(const t_graph_type graph_type, * based on their fanin in the rr graph. This routine also adjusts the rr nodes to point to these new rr switches */ alloc_and_load_rr_switch_inf(num_arch_switches, R_minW_nmos, R_minW_pmos, wire_to_arch_ipin_switch, wire_to_rr_ipin_switch); - //Partition the rr graph edges for efficient access to configurable/non-configurab/home/users/behzad.mahmood/eclipse-workspacele + //Partition the rr graph edges for efficient access to configurable/non-configurable //edge subsets. Must be done after RR switches have been allocated device_ctx.rr_graph_builder.partition_edges(); From 09bbfabf87dea618d207ffd3ba263a94e30ae61d Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Tue, 7 Dec 2021 15:15:31 +0500 Subject: [PATCH 17/21] A cached version of RRGraphView added in rr_graph_uxsdcxx_serializer.h. --- vpr/src/route/rr_graph_uxsdcxx_serializer.h | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/vpr/src/route/rr_graph_uxsdcxx_serializer.h b/vpr/src/route/rr_graph_uxsdcxx_serializer.h index bd8679872b0..8612b9a7e9f 100644 --- a/vpr/src/route/rr_graph_uxsdcxx_serializer.h +++ b/vpr/src/route/rr_graph_uxsdcxx_serializer.h @@ -145,15 +145,17 @@ class t_metadata_dict_iterator { class EdgeWalker { public: - void initialize(const t_rr_graph_storage* nodes) { + void initialize(const t_rr_graph_storage* nodes, RRGraphView* rr_graph) { nodes_ = nodes; + rr_graph_ = rr_graph; num_edges_ = 0; current_src_inode_ = 0; current_edge_ = 0; current_idx_ = 0; + // TODO: Once rr_graph_storage is fully shadowed by RRGraphView, the cached nodes_ will be removed. for (const auto& node : *nodes) { - num_edges_ += nodes_->num_edges(node.id()); + num_edges_ += rr_graph_->num_edges(node.id()); } } @@ -181,7 +183,7 @@ class EdgeWalker { current_edge_ += 1; } - if (current_edge_ >= nodes_->num_edges(RRNodeId(current_src_inode_))) { + if (current_edge_ >= rr_graph_->num_edges(RRNodeId(current_src_inode_))) { // Done with current_src_inode_, advance to the end of the // node list, or the next node with at least 1 edge. current_edge_ = 0; @@ -194,7 +196,7 @@ class EdgeWalker { VTR_ASSERT(current_idx_ + 1 == num_edges_); return current_idx_++; } - } while (nodes_->num_edges(RRNodeId(current_src_inode_)) < 1); + } while (rr_graph_->num_edges(RRNodeId(current_src_inode_)) < 1); } VTR_ASSERT(current_src_inode_ < nodes_->size()); @@ -204,6 +206,7 @@ class EdgeWalker { private: const t_rr_graph_storage* nodes_; + RRGraphView* rr_graph_; size_t num_edges_; size_t current_src_inode_; size_t current_edge_; @@ -999,7 +1002,7 @@ class RrGraphSerializer final : public uxsd::RrGraphBase { inline EdgeWalker get_rr_graph_rr_edges(void*& /*ctx*/) final { EdgeWalker walker; - walker.initialize(rr_nodes_); + walker.initialize(rr_nodes_,rr_graph_); return walker; } From 95ca4bd8af5abee75ae6a786d9a2c9cae41a0a4c Mon Sep 17 00:00:00 2001 From: umariqbal-rs Date: Tue, 7 Dec 2021 15:49:29 +0500 Subject: [PATCH 18/21] formatting has been set --- vpr/src/route/rr_graph_uxsdcxx_serializer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vpr/src/route/rr_graph_uxsdcxx_serializer.h b/vpr/src/route/rr_graph_uxsdcxx_serializer.h index 8612b9a7e9f..6743251b4e6 100644 --- a/vpr/src/route/rr_graph_uxsdcxx_serializer.h +++ b/vpr/src/route/rr_graph_uxsdcxx_serializer.h @@ -153,7 +153,7 @@ class EdgeWalker { current_edge_ = 0; current_idx_ = 0; - // TODO: Once rr_graph_storage is fully shadowed by RRGraphView, the cached nodes_ will be removed. + // TODO: Once rr_graph_storage is fully shadowed by RRGraphView, the cached nodes_ will be removed. for (const auto& node : *nodes) { num_edges_ += rr_graph_->num_edges(node.id()); } @@ -1002,7 +1002,7 @@ class RrGraphSerializer final : public uxsd::RrGraphBase { inline EdgeWalker get_rr_graph_rr_edges(void*& /*ctx*/) final { EdgeWalker walker; - walker.initialize(rr_nodes_,rr_graph_); + walker.initialize(rr_nodes_, rr_graph_); return walker; } From 0e8ff516a6f0ce1c3ba4b30b73295795d86711e7 Mon Sep 17 00:00:00 2001 From: behzadmehmood-rs Date: Wed, 8 Dec 2021 10:04:11 +0500 Subject: [PATCH 19/21] rr_graph made constant in EdgeWalker() --- vpr/src/route/rr_graph_uxsdcxx_serializer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vpr/src/route/rr_graph_uxsdcxx_serializer.h b/vpr/src/route/rr_graph_uxsdcxx_serializer.h index 6743251b4e6..7454d24a5a7 100644 --- a/vpr/src/route/rr_graph_uxsdcxx_serializer.h +++ b/vpr/src/route/rr_graph_uxsdcxx_serializer.h @@ -145,7 +145,7 @@ class t_metadata_dict_iterator { class EdgeWalker { public: - void initialize(const t_rr_graph_storage* nodes, RRGraphView* rr_graph) { + void initialize(const t_rr_graph_storage* nodes, const RRGraphView* rr_graph) { nodes_ = nodes; rr_graph_ = rr_graph; num_edges_ = 0; @@ -206,7 +206,7 @@ class EdgeWalker { private: const t_rr_graph_storage* nodes_; - RRGraphView* rr_graph_; + const RRGraphView* rr_graph_; size_t num_edges_; size_t current_src_inode_; size_t current_edge_; From 6b834d87bfd4db5f001b13d346eb8ec78c58cd85 Mon Sep 17 00:00:00 2001 From: "behzad.mehmood" Date: Tue, 14 Dec 2021 09:28:13 +0500 Subject: [PATCH 20/21] Changes reverted for validate() --- vpr/src/route/rr_node.cpp | 9 +++------ vpr/src/route/rr_node_impl.h | 12 ++++++++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/vpr/src/route/rr_node.cpp b/vpr/src/route/rr_node.cpp index b57c004319a..33154dc6d00 100644 --- a/vpr/src/route/rr_node.cpp +++ b/vpr/src/route/rr_node.cpp @@ -21,13 +21,10 @@ bool t_rr_node::edge_is_configurable(t_edge_size iedge) const { bool t_rr_node::validate() const { //Check internal assumptions about RR node are valid - auto& device_ctx = g_vpr_ctx.device(); - - const auto& rr_graph = device_ctx.rr_graph; t_edge_size iedge = 0; - for (auto edge : rr_graph.edges(RRNodeId(id_))) { - if (edge < rr_graph.num_configurable_edges(RRNodeId(id_))) { + for (auto edge : edges()) { + if (edge < num_configurable_edges()) { if (!edge_is_configurable(edge)) { VPR_FATAL_ERROR(VPR_ERROR_ROUTE, "RR Node non-configurable edge found in configurable edge list"); } @@ -39,7 +36,7 @@ bool t_rr_node::validate() const { ++iedge; } - if (iedge != rr_graph.num_edges(RRNodeId(id_))) { + if (iedge != num_edges()) { VPR_FATAL_ERROR(VPR_ERROR_ROUTE, "RR Node Edge iteration does not match edge size"); } diff --git a/vpr/src/route/rr_node_impl.h b/vpr/src/route/rr_node_impl.h index 5da08bafc85..11eab7c9f42 100644 --- a/vpr/src/route/rr_node_impl.h +++ b/vpr/src/route/rr_node_impl.h @@ -71,6 +71,18 @@ inline t_rr_node t_rr_graph_storage::back() { return t_rr_node(this, RRNodeId(size() - 1)); } +inline t_edge_size t_rr_node::num_edges() const { + return storage_->num_edges(id_); +} + +inline edge_idx_range t_rr_node::edges() const { + return storage_->edges(id_); +} + +inline t_edge_size t_rr_node::num_configurable_edges() const { + return storage_->num_configurable_edges(id_); +} + inline int t_rr_node::edge_sink_node(t_edge_size iedge) const { size_t inode = (size_t)storage_->edge_sink_node(id_, iedge); return inode; From a4a5abf269eaa52656342785c80a877a61d9a41c Mon Sep 17 00:00:00 2001 From: "behzad.mehmood" Date: Tue, 14 Dec 2021 10:09:41 +0500 Subject: [PATCH 21/21] Formatting updated --- vpr/src/route/rr_node_impl.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vpr/src/route/rr_node_impl.h b/vpr/src/route/rr_node_impl.h index 11eab7c9f42..85482f878c8 100644 --- a/vpr/src/route/rr_node_impl.h +++ b/vpr/src/route/rr_node_impl.h @@ -72,15 +72,15 @@ inline t_rr_node t_rr_graph_storage::back() { } inline t_edge_size t_rr_node::num_edges() const { - return storage_->num_edges(id_); + return storage_->num_edges(id_); } inline edge_idx_range t_rr_node::edges() const { - return storage_->edges(id_); + return storage_->edges(id_); } inline t_edge_size t_rr_node::num_configurable_edges() const { - return storage_->num_configurable_edges(id_); + return storage_->num_configurable_edges(id_); } inline int t_rr_node::edge_sink_node(t_edge_size iedge) const {