From 2b780fab999d286ff069cf86faf0da3c47970e7e Mon Sep 17 00:00:00 2001 From: Ethan Rogers Date: Thu, 1 Jul 2021 15:03:16 -0600 Subject: [PATCH 1/8] Additions to RRGraphView::node_C() and RRGraphView::node_R() functions Signed-off-by: Ethan Rogers --- vpr/src/device/rr_graph_obj.cpp | 12 ------- vpr/src/device/rr_graph_obj.h | 5 --- vpr/src/device/rr_graph_view.h | 10 ++++++ vpr/src/route/check_rr_graph.cpp | 4 +-- vpr/src/route/overuse_report.cpp | 4 +-- vpr/src/route/route_tree_timing.cpp | 33 +++++++++++--------- vpr/src/route/router_lookahead_map.cpp | 2 +- vpr/src/route/router_lookahead_map_utils.cpp | 10 +++--- vpr/src/route/rr_graph_indexed_data.cpp | 4 +-- vpr/src/route/rr_graph_timing_params.cpp | 4 +-- vpr/src/route/rr_graph_uxsdcxx_serializer.h | 6 ++-- vpr/src/route/rr_node.h | 3 -- 12 files changed, 48 insertions(+), 49 deletions(-) diff --git a/vpr/src/device/rr_graph_obj.cpp b/vpr/src/device/rr_graph_obj.cpp index 939005c8eb5..a656f29a003 100644 --- a/vpr/src/device/rr_graph_obj.cpp +++ b/vpr/src/device/rr_graph_obj.cpp @@ -168,18 +168,6 @@ e_side RRGraph::node_side(const RRNodeId& node) const { return node_sides_[node]; } -/* Get the resistance of a node */ -float RRGraph::node_R(const RRNodeId& node) const { - VTR_ASSERT_SAFE(valid_node_id(node)); - return node_Rs_[node]; -} - -/* Get the capacitance of a node */ -float RRGraph::node_C(const RRNodeId& node) const { - VTR_ASSERT_SAFE(valid_node_id(node)); - return node_Cs_[node]; -} - /* * Get a segment id of a node in rr_graph */ diff --git a/vpr/src/device/rr_graph_obj.h b/vpr/src/device/rr_graph_obj.h index f34b1116205..0d167cdce45 100644 --- a/vpr/src/device/rr_graph_obj.h +++ b/vpr/src/device/rr_graph_obj.h @@ -434,11 +434,6 @@ class RRGraph { */ e_side node_side(const RRNodeId& node) const; - /* Get resistance of a node, used to built RC tree for timing analysis */ - float node_R(const RRNodeId& node) const; - - /* Get capacitance of a node, used to built RC tree for timing analysis */ - float node_C(const RRNodeId& node) const; /* Get segment id of a node, containing the information of the routing * segment that the node represents. See more details in the data structure t_segment_inf diff --git a/vpr/src/device/rr_graph_view.h b/vpr/src/device/rr_graph_view.h index fce60685b0c..76bb4d01496 100644 --- a/vpr/src/device/rr_graph_view.h +++ b/vpr/src/device/rr_graph_view.h @@ -77,6 +77,16 @@ class RRGraphView { return node_storage_.node_direction_string(node); } + /* Get the capacitance of a routing resource node. This function is inlined for runtime optimization. */ + inline float node_C(RRNodeId node) const { + return node_storage_.node_C(node); + } + + /* Get the resistance of a routing resource node. This function is inlined for runtime optimization. */ + inline float node_R(RRNodeId node) const { + return node_storage_.node_R(node); + } + /* Return the fast look-up data structure for queries from client functions */ const RRSpatialLookup& node_lookup() const { return node_lookup_; diff --git a/vpr/src/route/check_rr_graph.cpp b/vpr/src/route/check_rr_graph.cpp index e3acb0e3e8e..45fba59d102 100644 --- a/vpr/src/route/check_rr_graph.cpp +++ b/vpr/src/route/check_rr_graph.cpp @@ -510,8 +510,8 @@ void check_rr_node(int inode, enum e_route_type route_type, const DeviceContext& } /* Check that the capacitance and resistance are reasonable. */ - C = device_ctx.rr_nodes[inode].C(); - R = device_ctx.rr_nodes[inode].R(); + C = rr_graph.node_C(RRNodeId(inode)); + R = rr_graph.node_R(RRNodeId(inode)); if (rr_type == CHANX || rr_type == CHANY) { if (C < 0. || R < 0.) { diff --git a/vpr/src/route/overuse_report.cpp b/vpr/src/route/overuse_report.cpp index 95176f92279..0a620de72da 100644 --- a/vpr/src/route/overuse_report.cpp +++ b/vpr/src/route/overuse_report.cpp @@ -203,8 +203,8 @@ static void report_overused_chanx_chany(std::ostream& os, RRNodeId node_id) { os << "Yhigh = " << device_ctx.rr_nodes.node_yhigh(node_id) << '\n'; //Print out associated RC characteristics as they will be non-zero - os << "Resistance = " << device_ctx.rr_nodes.node_R(node_id) << '\n'; - os << "Capacitance = " << device_ctx.rr_nodes.node_C(node_id) << '\n'; + os << "Resistance = " << rr_graph.node_R(RRNodeId(node_id)) << '\n'; + os << "Capacitance = " << rr_graph.node_C(RRNodeId(node_id)) << '\n'; } ///@brief Print out information specific to SOURCE/SINK type rr nodes diff --git a/vpr/src/route/route_tree_timing.cpp b/vpr/src/route/route_tree_timing.cpp index 16f03469b4e..ee2493bf1b4 100644 --- a/vpr/src/route/route_tree_timing.cpp +++ b/vpr/src/route/route_tree_timing.cpp @@ -184,6 +184,7 @@ t_rt_node* init_route_tree_to_source(ClusterNetId inet) { auto& route_ctx = g_vpr_ctx.routing(); auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; rt_root = alloc_rt_node(); rt_root->u.child_list = nullptr; @@ -195,9 +196,9 @@ t_rt_node* init_route_tree_to_source(ClusterNetId inet) { rt_root->inode = inode; rt_root->net_pin_index = OPEN; - rt_root->C_downstream = device_ctx.rr_nodes[inode].C(); - rt_root->R_upstream = device_ctx.rr_nodes[inode].R(); - rt_root->Tdel = 0.5 * device_ctx.rr_nodes[inode].R() * device_ctx.rr_nodes[inode].C(); + rt_root->C_downstream = rr_graph.node_C(RRNodeId(inode)); + rt_root->R_upstream = rr_graph.node_R(RRNodeId(inode)); + rt_root->Tdel = 0.5 * rr_graph.node_R(RRNodeId(inode)) * rr_graph.node_C(RRNodeId(inode)); rr_node_to_rt_node[inode] = rt_root; return (rt_root); @@ -457,6 +458,7 @@ void load_new_subtree_R_upstream(t_rt_node* rt_node) { } auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; t_rt_node* parent_rt_node = rt_node->parent_node; int inode = rt_node->inode; @@ -472,7 +474,7 @@ void load_new_subtree_R_upstream(t_rt_node* rt_node) { } R_upstream += device_ctx.rr_switch_inf[iswitch].R; //Parent switch R } - R_upstream += device_ctx.rr_nodes[inode].R(); //Current node R + R_upstream += rr_graph.node_R(RRNodeId(inode)); //Current node R rt_node->R_upstream = R_upstream; @@ -487,7 +489,8 @@ float load_new_subtree_C_downstream(t_rt_node* rt_node) { if (rt_node) { auto& device_ctx = g_vpr_ctx.device(); - C_downstream += device_ctx.rr_nodes[rt_node->inode].C(); + const auto& rr_graph = device_ctx.rr_graph; + C_downstream += rr_graph.node_C(RRNodeId(rt_node->inode)); for (t_linked_rt_edge* edge = rt_node->u.child_list; edge != nullptr; edge = edge->next) { /*Similar to net_delay.cpp, this for loop traverses a rc subtree, whose edges represent enabled switches. * When switches such as multiplexers and tristate buffers are enabled, their fanout @@ -573,13 +576,14 @@ void load_route_tree_Tdel(t_rt_node* subtree_rt_root, float Tarrival) { float Tdel, Tchild; auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; inode = subtree_rt_root->inode; /* Assuming the downstream connections are, on average, connected halfway * along a wire segment's length. See discussion in net_delay.c if you want * to change this. */ - Tdel = Tarrival + 0.5 * subtree_rt_root->C_downstream * device_ctx.rr_nodes[inode].R(); + Tdel = Tarrival + 0.5 * subtree_rt_root->C_downstream * rr_graph.node_R(RRNodeId(inode)); subtree_rt_root->Tdel = Tdel; /* Now expand the children of this node to load their Tdel values (depth- @@ -1373,20 +1377,20 @@ bool is_valid_route_tree(const t_rt_node* root) { short iswitch = root->parent_switch; if (root->parent_node) { if (device_ctx.rr_switch_inf[iswitch].buffered()) { - float R_upstream_check = device_ctx.rr_nodes[inode].R() + device_ctx.rr_switch_inf[iswitch].R; + float R_upstream_check = rr_graph.node_R(RRNodeId(inode)) + device_ctx.rr_switch_inf[iswitch].R; if (!vtr::isclose(root->R_upstream, R_upstream_check, RES_REL_TOL, RES_ABS_TOL)) { VTR_LOG("%d mismatch R upstream %e supposed %e\n", inode, root->R_upstream, R_upstream_check); return false; } } else { - float R_upstream_check = device_ctx.rr_nodes[inode].R() + root->parent_node->R_upstream + device_ctx.rr_switch_inf[iswitch].R; + float R_upstream_check = rr_graph.node_R(RRNodeId(inode)) + root->parent_node->R_upstream + device_ctx.rr_switch_inf[iswitch].R; if (!vtr::isclose(root->R_upstream, R_upstream_check, RES_REL_TOL, RES_ABS_TOL)) { VTR_LOG("%d mismatch R upstream %e supposed %e\n", inode, root->R_upstream, R_upstream_check); return false; } } - } else if (root->R_upstream != device_ctx.rr_nodes[inode].R()) { - VTR_LOG("%d mismatch R upstream %e supposed %e\n", inode, root->R_upstream, device_ctx.rr_nodes[inode].R()); + } else if (root->R_upstream != rr_graph.node_R(RRNodeId(inode))) { + VTR_LOG("%d mismatch R upstream %e supposed %e\n", inode, root->R_upstream, rr_graph.node_R(RRNodeId(inode))); return false; } @@ -1427,7 +1431,7 @@ bool is_valid_route_tree(const t_rt_node* root) { } edge = edge->next; } - float C_downstream_check = C_downstream_children + device_ctx.rr_nodes[inode].C(); + float C_downstream_check = C_downstream_children + rr_graph.node_C(RRNodeId(inode)); if (!vtr::isclose(root->C_downstream, C_downstream_check, CAP_REL_TOL, CAP_ABS_TOL)) { VTR_LOG("%d mismatch C downstream %e supposed %e\n", inode, root->C_downstream, C_downstream_check); return false; @@ -1467,6 +1471,7 @@ init_route_tree_to_source_no_net(int inode) { t_rt_node* rt_root; auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; rt_root = alloc_rt_node(); rt_root->u.child_list = nullptr; @@ -1475,9 +1480,9 @@ init_route_tree_to_source_no_net(int inode) { rt_root->re_expand = true; rt_root->inode = inode; rt_root->net_pin_index = OPEN; - rt_root->C_downstream = device_ctx.rr_nodes[inode].C(); - rt_root->R_upstream = device_ctx.rr_nodes[inode].R(); - rt_root->Tdel = 0.5 * device_ctx.rr_nodes[inode].R() * device_ctx.rr_nodes[inode].C(); + rt_root->C_downstream = rr_graph.node_C(RRNodeId(inode)); + rt_root->R_upstream = rr_graph.node_R(RRNodeId(inode)); + rt_root->Tdel = 0.5 * rr_graph.node_R(RRNodeId(inode)) *rr_graph.node_C(RRNodeId(inode)); rr_node_to_rt_node[inode] = rt_root; return (rt_root); diff --git a/vpr/src/route/router_lookahead_map.cpp b/vpr/src/route/router_lookahead_map.cpp index 2a3b35370cb..eab1e2c6e1d 100644 --- a/vpr/src/route/router_lookahead_map.cpp +++ b/vpr/src/route/router_lookahead_map.cpp @@ -151,7 +151,7 @@ class PQ_Entry { this->R_upstream = parent_R_upstream; if (!starting_node) { int cost_index = device_ctx.rr_nodes.node_cost_index(RRNodeId(set_rr_node)); - //this->delay += g_rr_nodes[set_rr_node].C() * (g_rr_switch_inf[switch_ind].R + 0.5*g_rr_nodes[set_rr_node].R()) + + //this->delay += rr_graph.node_C(RRNodeId(set_rr_node)) * (g_rr_switch_inf[switch_ind].R + 0.5*rr_graph.node_R(RRNodeId(set_rr_node))) + // g_rr_switch_inf[switch_ind].Tdel; //FIXME going to use the delay data that the VPR7 lookahead uses. For some reason the delay calculation above calculates diff --git a/vpr/src/route/router_lookahead_map_utils.cpp b/vpr/src/route/router_lookahead_map_utils.cpp index bc395e7ba74..370ac65beb3 100644 --- a/vpr/src/route/router_lookahead_map_utils.cpp +++ b/vpr/src/route/router_lookahead_map_utils.cpp @@ -70,6 +70,7 @@ PQ_Entry::PQ_Entry( this->rr_node = set_rr_node; auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; this->delay = parent_delay; this->congestion_upstream = parent_congestion_upstream; this->R_upstream = parent_R_upstream; @@ -78,8 +79,8 @@ PQ_Entry::PQ_Entry( Tsw += Tsw_adjust; VTR_ASSERT(Tsw >= 0.f); float Rsw = device_ctx.rr_switch_inf[switch_ind].R; - float Cnode = device_ctx.rr_nodes[size_t(set_rr_node)].C(); - float Rnode = device_ctx.rr_nodes[size_t(set_rr_node)].R(); + float Cnode = rr_graph.node_C(set_rr_node); + float Rnode = rr_graph.node_R(set_rr_node); float T_linear = 0.f; if (device_ctx.rr_switch_inf[switch_ind].buffered()) { @@ -112,10 +113,11 @@ util::PQ_Entry_Delay::PQ_Entry_Delay( if (parent != nullptr) { auto& device_ctx = g_vpr_ctx.device(); + const auto& rr_graph = device_ctx.rr_graph; float Tsw = device_ctx.rr_switch_inf[switch_ind].Tdel; float Rsw = device_ctx.rr_switch_inf[switch_ind].R; - float Cnode = device_ctx.rr_nodes[size_t(set_rr_node)].C(); - float Rnode = device_ctx.rr_nodes[size_t(set_rr_node)].R(); + float Cnode = rr_graph.node_C(set_rr_node); + float Rnode = rr_graph.node_R(set_rr_node); float T_linear = 0.f; if (device_ctx.rr_switch_inf[switch_ind].buffered()) { diff --git a/vpr/src/route/rr_graph_indexed_data.cpp b/vpr/src/route/rr_graph_indexed_data.cpp index a7df89da0dc..2f87b6dfabb 100644 --- a/vpr/src/route/rr_graph_indexed_data.cpp +++ b/vpr/src/route/rr_graph_indexed_data.cpp @@ -367,8 +367,8 @@ static void load_rr_indexed_data_T_values() { VTR_ASSERT(num_switches > 0); num_nodes_of_index[cost_index]++; - C_total[cost_index].push_back(rr_nodes[inode].C()); - R_total[cost_index].push_back(rr_nodes[inode].R()); + C_total[cost_index].push_back(rr_graph.node_C(RRNodeId(inode))); + R_total[cost_index].push_back(rr_graph.node_R(RRNodeId(inode))); switch_R_total[cost_index].push_back(avg_switch_R); switch_T_total[cost_index].push_back(avg_switch_T); diff --git a/vpr/src/route/rr_graph_timing_params.cpp b/vpr/src/route/rr_graph_timing_params.cpp index 13a3939dcd1..ebb9a465746 100644 --- a/vpr/src/route/rr_graph_timing_params.cpp +++ b/vpr/src/route/rr_graph_timing_params.cpp @@ -49,7 +49,7 @@ void add_rr_graph_C_from_switches(float C_ipin_cblock) { for (size_t inode = 0; inode < device_ctx.rr_nodes.size(); inode++) { //The C may have already been partly initialized (e.g. with metal capacitance) - rr_node_C[inode] += device_ctx.rr_nodes[inode].C(); + rr_node_C[inode] += rr_graph.node_C(RRNodeId(inode)); from_rr_type = rr_graph.node_type(RRNodeId(inode)); @@ -191,7 +191,7 @@ void add_rr_graph_C_from_switches(float C_ipin_cblock) { //Create the final flywieghted t_rr_rc_data for (size_t inode = 0; inode < device_ctx.rr_nodes.size(); inode++) { - mutable_device_ctx.rr_nodes[inode].set_rc_index(find_create_rr_rc_data(device_ctx.rr_nodes[inode].R(), rr_node_C[inode])); + mutable_device_ctx.rr_nodes[inode].set_rc_index(find_create_rr_rc_data(rr_graph.node_R(RRNodeId(inode)), rr_node_C[inode])); } free(Couts_to_add); diff --git a/vpr/src/route/rr_graph_uxsdcxx_serializer.h b/vpr/src/route/rr_graph_uxsdcxx_serializer.h index 3fb319b6db2..66a038c4d26 100644 --- a/vpr/src/route/rr_graph_uxsdcxx_serializer.h +++ b/vpr/src/route/rr_graph_uxsdcxx_serializer.h @@ -682,10 +682,12 @@ class RrGraphSerializer final : public uxsd::RrGraphBase { } inline float get_node_timing_C(const t_rr_node& node) final { - return node.C(); + const auto& rr_graph = (*rr_graph_); + return rr_graph.node_C(node.id()); } inline float get_node_timing_R(const t_rr_node& node) final { - return node.R(); + const auto& rr_graph = (*rr_graph_); + return rr_graph.node_R(node.id()); } /** Generated for complex type "node_segment": diff --git a/vpr/src/route/rr_node.h b/vpr/src/route/rr_node.h index f42a8878264..545000e3fb9 100644 --- a/vpr/src/route/rr_node.h +++ b/vpr/src/route/rr_node.h @@ -110,9 +110,6 @@ class t_rr_node { bool is_node_on_specific_side(e_side side) const; - float R() const; - float C() const; - bool validate() const; public: //Mutators From 5982b77e624f9baecd4da6891d3a89a0d92fe65e Mon Sep 17 00:00:00 2001 From: Ethan Rogers Date: Thu, 1 Jul 2021 17:00:39 -0600 Subject: [PATCH 2/8] Removed C() and R() functions from rr_node.cpp Signed-off-by: Ethan Rogers --- vpr/src/route/rr_node.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/vpr/src/route/rr_node.cpp b/vpr/src/route/rr_node.cpp index 8510c2c0d9d..b6aed012d3c 100644 --- a/vpr/src/route/rr_node.cpp +++ b/vpr/src/route/rr_node.cpp @@ -28,17 +28,6 @@ bool t_rr_node::edge_is_configurable(t_edge_size iedge) const { return device_ctx.rr_switch_inf[iswitch].configurable(); } -float t_rr_node::R() const { - auto& device_ctx = g_vpr_ctx.device(); - return device_ctx.rr_rc_data[rc_index()].R; -} - -float t_rr_node::C() const { - auto& device_ctx = g_vpr_ctx.device(); - VTR_ASSERT(rc_index() < (short)device_ctx.rr_rc_data.size()); - return device_ctx.rr_rc_data[rc_index()].C; -} - bool t_rr_node::validate() const { //Check internal assumptions about RR node are valid t_edge_size iedge = 0; From b8593171fb3d8d79043228b42544bc3cefa9ee8a Mon Sep 17 00:00:00 2001 From: Ethan Rogers Date: Fri, 30 Jul 2021 13:50:10 -0600 Subject: [PATCH 3/8] Added node_rc_index() to RRGraphView Signed-off-by: Ethan Rogers --- vpr/src/device/rr_graph_view.h | 5 +++++ vpr/src/route/connection_router.cpp | 7 +++++-- vpr/src/route/rr_node.cpp | 4 ---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/vpr/src/device/rr_graph_view.h b/vpr/src/device/rr_graph_view.h index d18de26c99b..ad845905526 100644 --- a/vpr/src/device/rr_graph_view.h +++ b/vpr/src/device/rr_graph_view.h @@ -85,6 +85,11 @@ class RRGraphView { /* Get the resistance of a routing resource node. This function is inlined for runtime optimization. */ inline float node_R(RRNodeId node) const { return node_storage_.node_R(node); + + /* Get the rc_index of a routing resource node. This function is inlined for runtime optimization. */ + inline int16_t node_rc_index(RRNodeId node) const { + return node_storage_[id].rc_index_; + } /* Get the fan in of a routing resource node. This function is inlined for runtime optimization. */ inline t_edge_size node_fan_in(RRNodeId node) const { diff --git a/vpr/src/route/connection_router.cpp b/vpr/src/route/connection_router.cpp index ac8dc06a2f9..13a6cd8e149 100644 --- a/vpr/src/route/connection_router.cpp +++ b/vpr/src/route/connection_router.cpp @@ -685,13 +685,16 @@ void ConnectionRouter::evaluate_timing_driven_node_costs(t_heap* to, float switch_Tdel = rr_switch_inf_[iswitch].Tdel; float switch_Cinternal = rr_switch_inf_[iswitch].Cinternal; + const auto& device_ctx = g_vpr_ctx.device(); + const auto$ rr_graph = device_ctx.rr_graph; + //To node info - auto rc_index = rr_nodes_.node_rc_index(RRNodeId(to_node)); + auto rc_index = rr_graph.node_rc_index(RRNodeId(to_node)); float node_C = rr_rc_data_[rc_index].C; float node_R = rr_rc_data_[rc_index].R; //From node info - float from_node_R = rr_rc_data_[rr_nodes_.node_rc_index(RRNodeId(from_node))].R; + float from_node_R = rr_rc_data_[rr_graph.node_rc_index(RRNodeId(from_node))].R; //Update R_upstream if (switch_buffered) { diff --git a/vpr/src/route/rr_node.cpp b/vpr/src/route/rr_node.cpp index b13ad34e3fe..c7dd9733df7 100644 --- a/vpr/src/route/rr_node.cpp +++ b/vpr/src/route/rr_node.cpp @@ -83,10 +83,6 @@ void t_rr_node::set_cost_index(size_t new_cost_index) { storage_->set_node_cost_index(id_, new_cost_index); } -void t_rr_node::set_rc_index(short new_rc_index) { - storage_->set_node_rc_index(id_, new_rc_index); -} - void t_rr_node::set_capacity(short new_capacity) { storage_->set_node_capacity(id_, new_capacity); } From 65f0483d990c8d93d0ca0346108f6ac57a807e26 Mon Sep 17 00:00:00 2001 From: Ethan Rogers Date: Fri, 30 Jul 2021 16:09:01 -0600 Subject: [PATCH 4/8] A few fixes for node_rc_index() Signed-off-by: Ethan Rogers --- vpr/src/device/rr_graph_view.h | 3 ++- vpr/src/route/connection_router.cpp | 2 +- vpr/src/route/rr_node.cpp | 4 ++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/vpr/src/device/rr_graph_view.h b/vpr/src/device/rr_graph_view.h index ad845905526..769e8e0bfe2 100644 --- a/vpr/src/device/rr_graph_view.h +++ b/vpr/src/device/rr_graph_view.h @@ -85,10 +85,11 @@ class RRGraphView { /* Get the resistance of a routing resource node. This function is inlined for runtime optimization. */ inline float node_R(RRNodeId node) const { return node_storage_.node_R(node); + } /* Get the rc_index of a routing resource node. This function is inlined for runtime optimization. */ inline int16_t node_rc_index(RRNodeId node) const { - return node_storage_[id].rc_index_; + return node_storage_.node_rc_index(node); } /* Get the fan in of a routing resource node. This function is inlined for runtime optimization. */ diff --git a/vpr/src/route/connection_router.cpp b/vpr/src/route/connection_router.cpp index 13a6cd8e149..36c1a8b8d68 100644 --- a/vpr/src/route/connection_router.cpp +++ b/vpr/src/route/connection_router.cpp @@ -686,7 +686,7 @@ void ConnectionRouter::evaluate_timing_driven_node_costs(t_heap* to, float switch_Cinternal = rr_switch_inf_[iswitch].Cinternal; const auto& device_ctx = g_vpr_ctx.device(); - const auto$ rr_graph = device_ctx.rr_graph; + const auto& rr_graph = device_ctx.rr_graph; //To node info auto rc_index = rr_graph.node_rc_index(RRNodeId(to_node)); diff --git a/vpr/src/route/rr_node.cpp b/vpr/src/route/rr_node.cpp index c7dd9733df7..b13ad34e3fe 100644 --- a/vpr/src/route/rr_node.cpp +++ b/vpr/src/route/rr_node.cpp @@ -83,6 +83,10 @@ void t_rr_node::set_cost_index(size_t new_cost_index) { storage_->set_node_cost_index(id_, new_cost_index); } +void t_rr_node::set_rc_index(short new_rc_index) { + storage_->set_node_rc_index(id_, new_rc_index); +} + void t_rr_node::set_capacity(short new_capacity) { storage_->set_node_capacity(id_, new_capacity); } From a9e963bc125abf85ce00f0bd36671f573d78ed23 Mon Sep 17 00:00:00 2001 From: Ethan Rogers Date: Mon, 2 Aug 2021 08:01:04 -0600 Subject: [PATCH 5/8] Formatting fixes Signed-off-by: Ethan Rogers --- vpr/src/device/rr_graph_obj.h | 1 - vpr/src/device/rr_graph_view.h | 2 +- vpr/src/route/route_tree_timing.cpp | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/vpr/src/device/rr_graph_obj.h b/vpr/src/device/rr_graph_obj.h index 302d9e7f092..2bff93c8d20 100644 --- a/vpr/src/device/rr_graph_obj.h +++ b/vpr/src/device/rr_graph_obj.h @@ -434,7 +434,6 @@ class RRGraph { */ e_side node_side(const RRNodeId& node) const; - /* Get segment id of a node, containing the information of the routing * segment that the node represents. See more details in the data structure t_segment_inf */ diff --git a/vpr/src/device/rr_graph_view.h b/vpr/src/device/rr_graph_view.h index 769e8e0bfe2..58950b02118 100644 --- a/vpr/src/device/rr_graph_view.h +++ b/vpr/src/device/rr_graph_view.h @@ -91,7 +91,7 @@ class RRGraphView { inline int16_t node_rc_index(RRNodeId node) const { return node_storage_.node_rc_index(node); } - + /* Get the fan in of a routing resource node. This function is inlined for runtime optimization. */ inline t_edge_size node_fan_in(RRNodeId node) const { return node_storage_.fan_in(node); diff --git a/vpr/src/route/route_tree_timing.cpp b/vpr/src/route/route_tree_timing.cpp index ee2493bf1b4..77657ea4da9 100644 --- a/vpr/src/route/route_tree_timing.cpp +++ b/vpr/src/route/route_tree_timing.cpp @@ -1482,7 +1482,7 @@ init_route_tree_to_source_no_net(int inode) { rt_root->net_pin_index = OPEN; rt_root->C_downstream = rr_graph.node_C(RRNodeId(inode)); rt_root->R_upstream = rr_graph.node_R(RRNodeId(inode)); - rt_root->Tdel = 0.5 * rr_graph.node_R(RRNodeId(inode)) *rr_graph.node_C(RRNodeId(inode)); + rt_root->Tdel = 0.5 * rr_graph.node_R(RRNodeId(inode)) * rr_graph.node_C(RRNodeId(inode)); rr_node_to_rt_node[inode] = rt_root; return (rt_root); From df80776eb1b8162bad772985eb3560f648c09d6b Mon Sep 17 00:00:00 2001 From: Ethan Rogers Date: Tue, 10 Aug 2021 11:17:06 -0600 Subject: [PATCH 6/8] Removed global refernce to rr_graph in rr_graph_uxsdcxx_serializer.h Signed-off-by: Ethan Rogers --- utils/route_diag/src/main.cpp | 1 + vpr/src/route/connection_router.cpp | 10 +++++----- vpr/src/route/connection_router.h | 4 ++++ vpr/src/route/overuse_report.cpp | 4 ++-- vpr/src/route/route_timing.cpp | 1 + vpr/src/route/router_delay_profiling.cpp | 2 ++ vpr/src/route/rr_graph_uxsdcxx_serializer.h | 6 ++---- vpr/test/test_connection_router.cpp | 1 + 8 files changed, 18 insertions(+), 11 deletions(-) diff --git a/utils/route_diag/src/main.cpp b/utils/route_diag/src/main.cpp index bc26c92ec31..9f538f6c1b7 100644 --- a/utils/route_diag/src/main.cpp +++ b/utils/route_diag/src/main.cpp @@ -102,6 +102,7 @@ static void do_one_route(int source_node, int sink_node, device_ctx.grid, *router_lookahead, device_ctx.rr_nodes, + &g_vpr_ctx.mutable_device().rr_graph, device_ctx.rr_rc_data, device_ctx.rr_switch_inf, g_vpr_ctx.mutable_routing().rr_node_route_inf); diff --git a/vpr/src/route/connection_router.cpp b/vpr/src/route/connection_router.cpp index 36c1a8b8d68..22c836fc503 100644 --- a/vpr/src/route/connection_router.cpp +++ b/vpr/src/route/connection_router.cpp @@ -685,16 +685,13 @@ void ConnectionRouter::evaluate_timing_driven_node_costs(t_heap* to, float switch_Tdel = rr_switch_inf_[iswitch].Tdel; float switch_Cinternal = rr_switch_inf_[iswitch].Cinternal; - const auto& device_ctx = g_vpr_ctx.device(); - const auto& rr_graph = device_ctx.rr_graph; - //To node info - auto rc_index = rr_graph.node_rc_index(RRNodeId(to_node)); + auto rc_index = rr_graph_->node_rc_index(RRNodeId(to_node)); float node_C = rr_rc_data_[rc_index].C; float node_R = rr_rc_data_[rc_index].R; //From node info - float from_node_R = rr_rc_data_[rr_graph.node_rc_index(RRNodeId(from_node))].R; + float from_node_R = rr_rc_data_[rr_graph_->node_rc_index(RRNodeId(from_node))].R; //Update R_upstream if (switch_buffered) { @@ -970,6 +967,7 @@ std::unique_ptr make_connection_router( const DeviceGrid& grid, const RouterLookahead& router_lookahead, const t_rr_graph_storage& rr_nodes, + RRGraphView* rr_graph, const std::vector& rr_rc_data, const std::vector& rr_switch_inf, std::vector& rr_node_route_inf) { @@ -979,6 +977,7 @@ std::unique_ptr make_connection_router( grid, router_lookahead, rr_nodes, + rr_graph, rr_rc_data, rr_switch_inf, rr_node_route_inf); @@ -987,6 +986,7 @@ std::unique_ptr make_connection_router( grid, router_lookahead, rr_nodes, + rr_graph, rr_rc_data, rr_switch_inf, rr_node_route_inf); diff --git a/vpr/src/route/connection_router.h b/vpr/src/route/connection_router.h index 1db3bff58b1..ae68ba56ca5 100644 --- a/vpr/src/route/connection_router.h +++ b/vpr/src/route/connection_router.h @@ -28,12 +28,14 @@ class ConnectionRouter : public ConnectionRouterInterface { const DeviceGrid& grid, const RouterLookahead& router_lookahead, const t_rr_graph_storage& rr_nodes, + RRGraphView* rr_graph, const std::vector& rr_rc_data, const std::vector& rr_switch_inf, std::vector& rr_node_route_inf) : grid_(grid) , router_lookahead_(router_lookahead) , rr_nodes_(rr_nodes.view()) + , rr_graph_(rr_graph) , rr_rc_data_(rr_rc_data.data(), rr_rc_data.size()) , rr_switch_inf_(rr_switch_inf.data(), rr_switch_inf.size()) , rr_node_route_inf_(rr_node_route_inf.data(), rr_node_route_inf.size()) @@ -246,6 +248,7 @@ class ConnectionRouter : public ConnectionRouterInterface { const DeviceGrid& grid_; const RouterLookahead& router_lookahead_; const t_rr_graph_view rr_nodes_; + RRGraphView* rr_graph_; vtr::array_view rr_rc_data_; vtr::array_view rr_switch_inf_; vtr::array_view rr_node_route_inf_; @@ -264,6 +267,7 @@ std::unique_ptr make_connection_router( const DeviceGrid& grid, const RouterLookahead& router_lookahead, const t_rr_graph_storage& rr_nodes, + RRGraphView* rr_graph, const std::vector& rr_rc_data, const std::vector& rr_switch_inf, std::vector& rr_node_route_inf); diff --git a/vpr/src/route/overuse_report.cpp b/vpr/src/route/overuse_report.cpp index 0a620de72da..600cbb4f051 100644 --- a/vpr/src/route/overuse_report.cpp +++ b/vpr/src/route/overuse_report.cpp @@ -203,8 +203,8 @@ static void report_overused_chanx_chany(std::ostream& os, RRNodeId node_id) { os << "Yhigh = " << device_ctx.rr_nodes.node_yhigh(node_id) << '\n'; //Print out associated RC characteristics as they will be non-zero - os << "Resistance = " << rr_graph.node_R(RRNodeId(node_id)) << '\n'; - os << "Capacitance = " << rr_graph.node_C(RRNodeId(node_id)) << '\n'; + os << "Resistance = " << rr_graph.node_R(node_id) << '\n'; + os << "Capacitance = " << rr_graph.node_C(node_id) << '\n'; } ///@brief Print out information specific to SOURCE/SINK type rr nodes diff --git a/vpr/src/route/route_timing.cpp b/vpr/src/route/route_timing.cpp index e443b3cdb76..fd7c5b9552e 100644 --- a/vpr/src/route/route_timing.cpp +++ b/vpr/src/route/route_timing.cpp @@ -340,6 +340,7 @@ bool try_timing_driven_route_tmpl(const t_router_opts& router_opts, device_ctx.grid, *router_lookahead, device_ctx.rr_nodes, + &g_vpr_ctx.mutable_device().rr_graph, device_ctx.rr_rc_data, device_ctx.rr_switch_inf, route_ctx.rr_node_route_inf); diff --git a/vpr/src/route/router_delay_profiling.cpp b/vpr/src/route/router_delay_profiling.cpp index 4390b589b62..87476cc2789 100644 --- a/vpr/src/route/router_delay_profiling.cpp +++ b/vpr/src/route/router_delay_profiling.cpp @@ -17,6 +17,7 @@ RouterDelayProfiler::RouterDelayProfiler( g_vpr_ctx.device().grid, *lookahead, g_vpr_ctx.device().rr_nodes, + &g_vpr_ctx.mutable_device().rr_graph, g_vpr_ctx.device().rr_rc_data, g_vpr_ctx.device().rr_switch_inf, g_vpr_ctx.mutable_routing().rr_node_route_inf) {} @@ -121,6 +122,7 @@ std::vector calculate_all_path_delays_from_rr_node(int src_rr_node, const device_ctx.grid, *router_lookahead, device_ctx.rr_nodes, + &g_vpr_ctx.mutable_device().rr_graph, device_ctx.rr_rc_data, device_ctx.rr_switch_inf, routing_ctx.rr_node_route_inf); diff --git a/vpr/src/route/rr_graph_uxsdcxx_serializer.h b/vpr/src/route/rr_graph_uxsdcxx_serializer.h index cf7437325e3..f8aa4c099c1 100644 --- a/vpr/src/route/rr_graph_uxsdcxx_serializer.h +++ b/vpr/src/route/rr_graph_uxsdcxx_serializer.h @@ -682,12 +682,10 @@ class RrGraphSerializer final : public uxsd::RrGraphBase { } inline float get_node_timing_C(const t_rr_node& node) final { - const auto& rr_graph = (*rr_graph_); - return rr_graph.node_C(node.id()); + return rr_graph_->node_C(node.id()); } inline float get_node_timing_R(const t_rr_node& node) final { - const auto& rr_graph = (*rr_graph_); - return rr_graph.node_R(node.id()); + return rr_graph_->node_R(node.id()); } /** Generated for complex type "node_segment": diff --git a/vpr/test/test_connection_router.cpp b/vpr/test/test_connection_router.cpp index 67e2182dcfd..225ddad6229 100644 --- a/vpr/test/test_connection_router.cpp +++ b/vpr/test/test_connection_router.cpp @@ -48,6 +48,7 @@ static float do_one_route(int source_node, int sink_node, const t_router_opts& r device_ctx.grid, *router_lookahead, device_ctx.rr_nodes, + &g_vpr_ctx.mutable_device().rr_graph, device_ctx.rr_rc_data, device_ctx.rr_switch_inf, g_vpr_ctx.mutable_routing().rr_node_route_inf); From 609450d52f8603c6484be4a304b631e69b67e68d Mon Sep 17 00:00:00 2001 From: Ethan Rogers Date: Wed, 11 Aug 2021 10:32:56 -0600 Subject: [PATCH 7/8] Removed node_rc_index() from rr_node_impl.h Signed-off-by: Ethan Rogers --- 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 5174379a0c8..eb80588f074 100644 --- a/vpr/src/route/rr_node_impl.h +++ b/vpr/src/route/rr_node_impl.h @@ -135,10 +135,6 @@ inline short t_rr_node::cost_index() const { return storage_->node_cost_index(id_); } -inline short t_rr_node::rc_index() const { - return storage_->node_rc_index(id_); -} - inline bool t_rr_node::is_node_on_specific_side(e_side side) const { return storage_->is_node_on_specific_side(id_, side); } From 849b61851bfc8420def34ba7c4c96acccb8e0000 Mon Sep 17 00:00:00 2001 From: Ethan Rogers Date: Mon, 16 Aug 2021 09:02:48 -0600 Subject: [PATCH 8/8] Adjustments to make the RRGraphView* const in the ConnectionRouter Signed-off-by: Ethan Rogers --- utils/route_diag/src/main.cpp | 2 +- vpr/src/route/connection_router.cpp | 2 +- vpr/src/route/connection_router.h | 6 +++--- vpr/src/route/route_timing.cpp | 2 +- vpr/src/route/router_delay_profiling.cpp | 4 ++-- vpr/test/test_connection_router.cpp | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/utils/route_diag/src/main.cpp b/utils/route_diag/src/main.cpp index 9f538f6c1b7..19e342ec032 100644 --- a/utils/route_diag/src/main.cpp +++ b/utils/route_diag/src/main.cpp @@ -102,7 +102,7 @@ static void do_one_route(int source_node, int sink_node, device_ctx.grid, *router_lookahead, device_ctx.rr_nodes, - &g_vpr_ctx.mutable_device().rr_graph, + &device_ctx.rr_graph, device_ctx.rr_rc_data, device_ctx.rr_switch_inf, g_vpr_ctx.mutable_routing().rr_node_route_inf); diff --git a/vpr/src/route/connection_router.cpp b/vpr/src/route/connection_router.cpp index 22c836fc503..9952c2bc657 100644 --- a/vpr/src/route/connection_router.cpp +++ b/vpr/src/route/connection_router.cpp @@ -967,7 +967,7 @@ std::unique_ptr make_connection_router( const DeviceGrid& grid, const RouterLookahead& router_lookahead, const t_rr_graph_storage& rr_nodes, - RRGraphView* rr_graph, + const RRGraphView* rr_graph, const std::vector& rr_rc_data, const std::vector& rr_switch_inf, std::vector& rr_node_route_inf) { diff --git a/vpr/src/route/connection_router.h b/vpr/src/route/connection_router.h index ae68ba56ca5..52e15bdc37e 100644 --- a/vpr/src/route/connection_router.h +++ b/vpr/src/route/connection_router.h @@ -28,7 +28,7 @@ class ConnectionRouter : public ConnectionRouterInterface { const DeviceGrid& grid, const RouterLookahead& router_lookahead, const t_rr_graph_storage& rr_nodes, - RRGraphView* rr_graph, + const RRGraphView* rr_graph, const std::vector& rr_rc_data, const std::vector& rr_switch_inf, std::vector& rr_node_route_inf) @@ -248,7 +248,7 @@ class ConnectionRouter : public ConnectionRouterInterface { const DeviceGrid& grid_; const RouterLookahead& router_lookahead_; const t_rr_graph_view rr_nodes_; - RRGraphView* rr_graph_; + const RRGraphView* rr_graph_; vtr::array_view rr_rc_data_; vtr::array_view rr_switch_inf_; vtr::array_view rr_node_route_inf_; @@ -267,7 +267,7 @@ std::unique_ptr make_connection_router( const DeviceGrid& grid, const RouterLookahead& router_lookahead, const t_rr_graph_storage& rr_nodes, - RRGraphView* rr_graph, + const RRGraphView* rr_graph, const std::vector& rr_rc_data, const std::vector& rr_switch_inf, std::vector& rr_node_route_inf); diff --git a/vpr/src/route/route_timing.cpp b/vpr/src/route/route_timing.cpp index fd7c5b9552e..85eba9068d3 100644 --- a/vpr/src/route/route_timing.cpp +++ b/vpr/src/route/route_timing.cpp @@ -340,7 +340,7 @@ bool try_timing_driven_route_tmpl(const t_router_opts& router_opts, device_ctx.grid, *router_lookahead, device_ctx.rr_nodes, - &g_vpr_ctx.mutable_device().rr_graph, + &device_ctx.rr_graph, device_ctx.rr_rc_data, device_ctx.rr_switch_inf, route_ctx.rr_node_route_inf); diff --git a/vpr/src/route/router_delay_profiling.cpp b/vpr/src/route/router_delay_profiling.cpp index 87476cc2789..4e9eecc8612 100644 --- a/vpr/src/route/router_delay_profiling.cpp +++ b/vpr/src/route/router_delay_profiling.cpp @@ -17,7 +17,7 @@ RouterDelayProfiler::RouterDelayProfiler( g_vpr_ctx.device().grid, *lookahead, g_vpr_ctx.device().rr_nodes, - &g_vpr_ctx.mutable_device().rr_graph, + &g_vpr_ctx.device().rr_graph, g_vpr_ctx.device().rr_rc_data, g_vpr_ctx.device().rr_switch_inf, g_vpr_ctx.mutable_routing().rr_node_route_inf) {} @@ -122,7 +122,7 @@ std::vector calculate_all_path_delays_from_rr_node(int src_rr_node, const device_ctx.grid, *router_lookahead, device_ctx.rr_nodes, - &g_vpr_ctx.mutable_device().rr_graph, + &g_vpr_ctx.device().rr_graph, device_ctx.rr_rc_data, device_ctx.rr_switch_inf, routing_ctx.rr_node_route_inf); diff --git a/vpr/test/test_connection_router.cpp b/vpr/test/test_connection_router.cpp index 225ddad6229..553f3f16d0c 100644 --- a/vpr/test/test_connection_router.cpp +++ b/vpr/test/test_connection_router.cpp @@ -48,7 +48,7 @@ static float do_one_route(int source_node, int sink_node, const t_router_opts& r device_ctx.grid, *router_lookahead, device_ctx.rr_nodes, - &g_vpr_ctx.mutable_device().rr_graph, + &device_ctx.rr_graph, device_ctx.rr_rc_data, device_ctx.rr_switch_inf, g_vpr_ctx.mutable_routing().rr_node_route_inf);