Clock Modeling: Removing seg index from rr_nodes
diff --git a/vpr/src/route/check_rr_graph.cpp b/vpr/src/route/check_rr_graph.cpp
index 70b73d1..7d491c7 100755
--- a/vpr/src/route/check_rr_graph.cpp
+++ b/vpr/src/route/check_rr_graph.cpp
@@ -235,7 +235,7 @@
int xlow, ylow, xhigh, yhigh, ptc_num, capacity;
t_rr_type rr_type;
t_type_ptr type;
- int nodes_per_chan, tracks_per_node, num_edges;
+ int nodes_per_chan, tracks_per_node, num_edges, cost_index;
float C, R;
@@ -246,7 +246,7 @@
yhigh = device_ctx.rr_nodes[inode].yhigh();
ptc_num = device_ctx.rr_nodes[inode].ptc_num();
capacity = device_ctx.rr_nodes[inode].capacity();
- auto cost_index = device_ctx.rr_nodes[inode].cost_index();
+ cost_index = device_ctx.rr_nodes[inode].cost_index();
type = nullptr;
const auto& grid = device_ctx.grid;
@@ -265,7 +265,7 @@
"in check_rr_node: inode %d (type %d) had a ptc_num of %d.\n", inode, rr_type, ptc_num);
}
- if (cost_index >= device_ctx.rr_indexed_data.size()) {
+ if (cost_index < 0 || cost_index >= (int) device_ctx.rr_indexed_data.size()) {
vpr_throw(VPR_ERROR_ROUTE, __FILE__, __LINE__,
"in check_rr_node: node %d cost index (%d) is out of range.\n", inode, cost_index);
}
diff --git a/vpr/src/route/clock_network_builders.cpp b/vpr/src/route/clock_network_builders.cpp
index ded97ed..79ad7e9 100644
--- a/vpr/src/route/clock_network_builders.cpp
+++ b/vpr/src/route/clock_network_builders.cpp
@@ -63,10 +63,12 @@
* ClockNetwork (Member functions)
*/
-void ClockNetwork::create_rr_nodes_for_clock_network_wires(ClockRRGraphBuilder& clock_graph) {
-
+void ClockNetwork::create_rr_nodes_for_clock_network_wires(
+ ClockRRGraphBuilder& clock_graph,
+ int num_segments)
+{
for(int inst_num = 0; inst_num < get_num_inst(); inst_num++){
- create_rr_nodes_and_internal_edges_for_one_instance(clock_graph);
+ create_rr_nodes_and_internal_edges_for_one_instance(clock_graph, num_segments);
}
}
@@ -181,9 +183,14 @@
}
void ClockRib::create_rr_nodes_and_internal_edges_for_one_instance(
- ClockRRGraphBuilder& clock_graph)
+ ClockRRGraphBuilder& clock_graph,
+ int num_segments)
{
-
+
+ // Only chany wires need to know the number of segments inorder
+ // to calculate the cost_index
+ (void) num_segments;
+
auto& device_ctx = g_vpr_ctx.mutable_device();
auto& rr_nodes = device_ctx.rr_nodes;
auto& grid = device_ctx.grid;
@@ -283,25 +290,26 @@
rr_nodes[node_index].set_type(CHANX);
rr_nodes[node_index].set_capacity(1);
rr_nodes[node_index].set_track_num(ptc_num);
- rr_nodes[node_index].set_cost_index(CHANX_COST_INDEX_START); // Actual value set later
auto rc_index = find_create_rr_rc_data(x_chan_wire.layer.r_metal, x_chan_wire.layer.c_metal);
rr_nodes[node_index].set_rc_index(rc_index);
rr_nodes[node_index].set_direction(direction);
+ short seg_index = 0;
switch(direction) {
case BI_DIRECTION:
- rr_nodes[node_index].set_seg_index(drive_seg_idx);
+ seg_index = drive_seg_idx;
break;
case DEC_DIRECTION:
- rr_nodes[node_index].set_seg_index(left_seg_idx);
+ seg_index = left_seg_idx;
break;
case INC_DIRECTION:
- rr_nodes[node_index].set_seg_index(right_seg_idx);
+ seg_index = right_seg_idx;
break;
default:
VTR_ASSERT_MSG(false, "Unidentified direction type for clock rib");
break;
}
+ rr_nodes[node_index].set_cost_index(CHANX_COST_INDEX_START+seg_index); // Actual value set later
return node_index;
}
@@ -434,7 +442,8 @@
}
void ClockSpine::create_rr_nodes_and_internal_edges_for_one_instance(
- ClockRRGraphBuilder& clock_graph)
+ ClockRRGraphBuilder& clock_graph,
+ int num_segments)
{
auto& device_ctx = g_vpr_ctx.mutable_device();
@@ -488,7 +497,8 @@
x,
ptc_num,
BI_DIRECTION,
- rr_nodes);
+ rr_nodes,
+ num_segments);
clock_graph.add_switch_location(get_name(), drive.name, x, drive_y, drive_node_idx);
// create spine wire above and below the drive point
@@ -498,14 +508,16 @@
x,
ptc_num,
DEC_DIRECTION,
- rr_nodes);
+ rr_nodes,
+ num_segments);
auto right_node_idx = create_chany_wire(
drive_y+1,
y_end,
x,
ptc_num,
INC_DIRECTION,
- rr_nodes);
+ rr_nodes,
+ num_segments);
// Keep a record of the rr_node idx that we will use to connects switches to at
// the tap point
@@ -531,7 +543,8 @@
int x,
int ptc_num,
e_direction direction,
- std::vector<t_rr_node>& rr_nodes)
+ std::vector<t_rr_node>& rr_nodes,
+ int num_segments)
{
rr_nodes.emplace_back();
auto node_index = rr_nodes.size() - 1;
@@ -542,23 +555,24 @@
rr_nodes[node_index].set_track_num(ptc_num);
auto rc_index = find_create_rr_rc_data(y_chan_wire.layer.r_metal, y_chan_wire.layer.c_metal);
rr_nodes[node_index].set_rc_index(rc_index);
- rr_nodes[node_index].set_cost_index(CHANX_COST_INDEX_START); // Actual value set later
rr_nodes[node_index].set_direction(direction);
+ short seg_index = 0;
switch(direction) {
case BI_DIRECTION:
- rr_nodes[node_index].set_seg_index(drive_seg_idx);
+ seg_index = drive_seg_idx;
break;
case DEC_DIRECTION:
- rr_nodes[node_index].set_seg_index(left_seg_idx);
+ seg_index = left_seg_idx;
break;
case INC_DIRECTION:
- rr_nodes[node_index].set_seg_index(right_seg_idx);
+ seg_index = right_seg_idx;
break;
default:
VTR_ASSERT_MSG(false, "Unidentified direction type for clock rib");
break;
}
+ rr_nodes[node_index].set_cost_index(CHANX_COST_INDEX_START + num_segments + seg_index);
return node_index;
}
@@ -596,11 +610,13 @@
vpr_throw(VPR_ERROR_ROUTE, __FILE__, __LINE__, "HTrees are not yet supported.\n");
}
void ClockHTree::create_rr_nodes_and_internal_edges_for_one_instance(
- ClockRRGraphBuilder& clock_graph)
+ ClockRRGraphBuilder& clock_graph,
+ int num_segments)
{
//Remove unused parameter warning
- (void)clock_graph;
+ (void)clock_graph;
+ (void)num_segments;
vpr_throw(VPR_ERROR_ROUTE, __FILE__, __LINE__, "HTrees are not yet supported.\n");
}
diff --git a/vpr/src/route/clock_network_builders.h b/vpr/src/route/clock_network_builders.h
index a7dfb50..f02a6aa 100644
--- a/vpr/src/route/clock_network_builders.h
+++ b/vpr/src/route/clock_network_builders.h
@@ -99,10 +99,13 @@
*/
/* Creates the RR nodes for the clock network wires and adds them to the reverse lookup
in ClockRRGraphBuilder. The reverse lookup maps the nodes to their switch point locations */
- void create_rr_nodes_for_clock_network_wires(ClockRRGraphBuilder& clock_graph);
+ void create_rr_nodes_for_clock_network_wires(
+ ClockRRGraphBuilder& clock_graph,
+ int num_segments);
virtual void create_segments(std::vector<t_segment_inf>& segment_inf) = 0;
virtual void create_rr_nodes_and_internal_edges_for_one_instance(
- ClockRRGraphBuilder& clock_graph) = 0;
+ ClockRRGraphBuilder& clock_graph,
+ int num_segments) = 0;
};
class ClockRib : public ClockNetwork {
@@ -151,7 +154,8 @@
*/
void create_segments(std::vector<t_segment_inf>& segment_inf);
void create_rr_nodes_and_internal_edges_for_one_instance(
- ClockRRGraphBuilder& clock_graph);
+ ClockRRGraphBuilder& clock_graph,
+ int num_segments);
int create_chanx_wire(
int x_start,
int x_end,
@@ -210,14 +214,16 @@
*/
void create_segments(std::vector<t_segment_inf>& segment_inf);
void create_rr_nodes_and_internal_edges_for_one_instance(
- ClockRRGraphBuilder& clock_graph);
+ ClockRRGraphBuilder& clock_graph,
+ int num_segments);
int create_chany_wire(
int y_start,
int y_end,
int x,
int ptc_num,
e_direction direction,
- std::vector<t_rr_node>& rr_nodes);
+ std::vector<t_rr_node>& rr_nodes,
+ int num_segments);
void record_tap_locations(
unsigned y_start,
unsigned y_end,
@@ -245,7 +251,8 @@
// TODO: Unimplemented member function
void create_segments(std::vector<t_segment_inf>& segment_inf);
void create_rr_nodes_and_internal_edges_for_one_instance(
- ClockRRGraphBuilder& clock_graph);
+ ClockRRGraphBuilder& clock_graph,
+ int num_segments);
};
#endif
diff --git a/vpr/src/route/rr_graph.cpp b/vpr/src/route/rr_graph.cpp
index 66f6d02..4b9adfc 100644
--- a/vpr/src/route/rr_graph.cpp
+++ b/vpr/src/route/rr_graph.cpp
@@ -1658,7 +1658,6 @@
/* Edge arrays have now been built up. Do everything else. */
L_rr_node[node].set_cost_index(cost_index_offset + seg_details[track].index());
- L_rr_node[node].set_seg_index(seg_details[track].index());
L_rr_node[node].set_capacity(1); /* GLOBAL routing handled elsewhere */
if (chan_type == CHANX) {
@@ -2370,7 +2369,7 @@
fprintf(fp, "Capacity: %d\n", L_rr_node[inode].capacity());
fprintf(fp, "R: %g C: %g\n", L_rr_node[inode].R(), L_rr_node[inode].C());
- fprintf(fp, "Cost_index: %zd\n", L_rr_node[inode].cost_index());
+ fprintf(fp, "Cost_index: %d\n", L_rr_node[inode].cost_index());
}
/* Prints all the device_ctx.rr_indexed_data of index to file fp. */
diff --git a/vpr/src/route/rr_graph_clock.cpp b/vpr/src/route/rr_graph_clock.cpp
index 1b39f9e..f29496c 100644
--- a/vpr/src/route/rr_graph_clock.cpp
+++ b/vpr/src/route/rr_graph_clock.cpp
@@ -29,7 +29,7 @@
size_t clock_nodes_start_idx = device_ctx.rr_nodes.size();
ClockRRGraphBuilder clock_graph = ClockRRGraphBuilder();
- clock_graph.create_clock_networks_wires(clock_networks);
+ clock_graph.create_clock_networks_wires(clock_networks, segment_inf.size());
clock_graph.create_clock_networks_switches(clock_routing);
// Reset fanin to account for newly added clock rr_nodes
@@ -43,7 +43,6 @@
alloc_and_load_rr_indexed_data(segment_inf, device_ctx.rr_node_indices,
chan_width->max, wire_to_rr_ipin_switch, base_cost_type);
- set_rr_node_cost_idx_based_on_seg_idx(segment_inf.size());
float elapsed_time = (float) (clock() - begin) / CLOCKS_PER_SEC;
vtr::printf_info("Building clock network resource graph took %g seconds\n", elapsed_time);
@@ -51,11 +50,12 @@
// Clock network information comes from the arch file
void ClockRRGraphBuilder::create_clock_networks_wires(
- std::vector<std::unique_ptr<ClockNetwork>>& clock_networks)
+ std::vector<std::unique_ptr<ClockNetwork>>& clock_networks,
+ int num_segments)
{
// Add rr_nodes for each clock network wire
for (auto& clock_network : clock_networks) {
- clock_network->create_rr_nodes_for_clock_network_wires(*this);
+ clock_network->create_rr_nodes_for_clock_network_wires(*this, num_segments);
}
// Reduce the capacity of rr_nodes for performance
diff --git a/vpr/src/route/rr_graph_clock.h b/vpr/src/route/rr_graph_clock.h
index 061c2c2..7cd7be3 100644
--- a/vpr/src/route/rr_graph_clock.h
+++ b/vpr/src/route/rr_graph_clock.h
@@ -107,7 +107,9 @@
private:
/* loop over all of the clock networks and create their wires */
- void create_clock_networks_wires(std::vector<std::unique_ptr<ClockNetwork>>& clock_networks);
+ void create_clock_networks_wires(
+ std::vector<std::unique_ptr<ClockNetwork>>& clock_networks,
+ int num_segments);
/* loop over all clock routing connections and create the switches and connections */
void create_clock_networks_switches(
diff --git a/vpr/src/route/rr_graph_util.cpp b/vpr/src/route/rr_graph_util.cpp
index 52e5ee2..edc5893 100755
--- a/vpr/src/route/rr_graph_util.cpp
+++ b/vpr/src/route/rr_graph_util.cpp
@@ -78,23 +78,3 @@
}
}
-void set_rr_node_cost_idx_based_on_seg_idx(int num_segments) {
-
- auto& device_ctx = g_vpr_ctx.mutable_device();
- auto& rr_nodes = device_ctx.rr_nodes;
-
- for(size_t node_idx = 0; node_idx < rr_nodes.size(); node_idx++) {
- t_rr_type rr_type = rr_nodes[node_idx].type();
- size_t seg_idx = rr_nodes[node_idx].seg_index();
- // TODO: Add check to make sure that seg_idx was set. Can be done by chaning
- // seg_index to be a short and then Asserting that its value is not -1
- // since that is the value that rr_node initializes it with. However,
- // seg_index() function currently returns a size_t type value
- if(rr_type == CHANX) {
- rr_nodes[node_idx].set_cost_index(CHANX_COST_INDEX_START + seg_idx);
- } else if (rr_type == CHANY) {
- rr_nodes[node_idx].set_cost_index(CHANX_COST_INDEX_START + num_segments + seg_idx);
- }
- }
-
-}
diff --git a/vpr/src/route/rr_graph_util.h b/vpr/src/route/rr_graph_util.h
index 574ebe9..c065500 100755
--- a/vpr/src/route/rr_graph_util.h
+++ b/vpr/src/route/rr_graph_util.h
@@ -5,6 +5,4 @@
int seg_index_of_sblock(int from_node, int to_node);
-void set_rr_node_cost_idx_based_on_seg_idx(int num_segments);
-
#endif
diff --git a/vpr/src/route/rr_node.cpp b/vpr/src/route/rr_node.cpp
index 57399d5..5b0a1b3 100644
--- a/vpr/src/route/rr_node.cpp
+++ b/vpr/src/route/rr_node.cpp
@@ -51,14 +51,10 @@
return ptc_.class_num;
}
-size_t t_rr_node::cost_index() const {
+short t_rr_node::cost_index() const {
return cost_index_;
}
-size_t t_rr_node::seg_index() const {
- return seg_index_;
-}
-
short t_rr_node::rc_index() const {
return rc_index_;
}
@@ -209,10 +205,6 @@
cost_index_ = new_cost_index;
}
-void t_rr_node::set_seg_index(size_t new_seg_index) {
- seg_index_ = new_seg_index;
-}
-
void t_rr_node::set_rc_index(short new_rc_index) {
rc_index_ = new_rc_index;
}
diff --git a/vpr/src/route/rr_node.h b/vpr/src/route/rr_node.h
index 4c08d96..fb30784 100644
--- a/vpr/src/route/rr_node.h
+++ b/vpr/src/route/rr_node.h
@@ -94,8 +94,7 @@
short track_num() const; //Same as ptc_num() but checks that type() is consistent
short class_num() const; //Same as ptc_num() but checks that type() is consistent
- size_t cost_index() const;
- size_t seg_index() const;
+ short cost_index() const;
short rc_index() const;
e_direction direction() const;
const char *direction_string() const;
@@ -140,7 +139,6 @@
void set_cost_index(size_t);
- void set_seg_index(size_t);
void set_rc_index(short);
void set_direction(e_direction);
@@ -164,7 +162,6 @@
int8_t cost_index_ = -1;
int16_t rc_index_ = -1;
- short seg_index_ = -1;
int16_t xlow_ = -1;
int16_t ylow_ = -1;