fixed bug in the fast look-up for tileable rr_graph
This commit is contained in:
parent
c0e8d98c6f
commit
63c4669dbb
|
@ -159,7 +159,7 @@
|
||||||
</tiles>
|
</tiles>
|
||||||
<!-- ODIN II specific config ends -->
|
<!-- ODIN II specific config ends -->
|
||||||
<!-- Physical descriptions begin -->
|
<!-- Physical descriptions begin -->
|
||||||
<layout tileable="false">
|
<layout tileable="true">
|
||||||
<!--auto_layout aspect_ratio="1.0"-->
|
<!--auto_layout aspect_ratio="1.0"-->
|
||||||
<fixed_layout name="2x2" width="4" height="4">
|
<fixed_layout name="2x2" width="4" height="4">
|
||||||
<!--Perimeter of 'io' blocks with 'EMPTY' blocks at corners-->
|
<!--Perimeter of 'io' blocks with 'EMPTY' blocks at corners-->
|
||||||
|
|
|
@ -145,7 +145,7 @@ short RRGraph::node_capacity(const RRNodeId& node) const {
|
||||||
|
|
||||||
short RRGraph::node_ptc_num(const RRNodeId& node) const {
|
short RRGraph::node_ptc_num(const RRNodeId& node) const {
|
||||||
VTR_ASSERT_SAFE(valid_node_id(node));
|
VTR_ASSERT_SAFE(valid_node_id(node));
|
||||||
return node_ptc_nums_[node];
|
return node_ptc_nums_[node][0];
|
||||||
}
|
}
|
||||||
|
|
||||||
short RRGraph::node_pin_num(const RRNodeId& node) const {
|
short RRGraph::node_pin_num(const RRNodeId& node) const {
|
||||||
|
@ -165,6 +165,13 @@ short RRGraph::node_class_num(const RRNodeId& node) const {
|
||||||
return node_ptc_num(node);
|
return node_ptc_num(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<short> RRGraph::node_track_ids(const RRNodeId& node) const {
|
||||||
|
VTR_ASSERT_MSG(node_type(node) == CHANX || node_type(node) == CHANY,
|
||||||
|
"Track number valid only for CHANX/CHANY RR nodes");
|
||||||
|
VTR_ASSERT_SAFE(valid_node_id(node));
|
||||||
|
return node_ptc_nums_[node];
|
||||||
|
}
|
||||||
|
|
||||||
short RRGraph::node_cost_index(const RRNodeId& node) const {
|
short RRGraph::node_cost_index(const RRNodeId& node) const {
|
||||||
VTR_ASSERT_SAFE(valid_node_id(node));
|
VTR_ASSERT_SAFE(valid_node_id(node));
|
||||||
return node_cost_indices_[node];
|
return node_cost_indices_[node];
|
||||||
|
@ -823,7 +830,7 @@ RRNodeId RRGraph::create_node(const t_rr_type& type) {
|
||||||
node_bounding_boxes_.emplace_back(-1, -1, -1, -1);
|
node_bounding_boxes_.emplace_back(-1, -1, -1, -1);
|
||||||
|
|
||||||
node_capacities_.push_back(-1);
|
node_capacities_.push_back(-1);
|
||||||
node_ptc_nums_.push_back(-1);
|
node_ptc_nums_.push_back(std::vector<short>(1, -1));
|
||||||
node_cost_indices_.push_back(-1);
|
node_cost_indices_.push_back(-1);
|
||||||
node_directions_.push_back(NO_DIRECTION);
|
node_directions_.push_back(NO_DIRECTION);
|
||||||
node_sides_.push_back(NUM_SIDES);
|
node_sides_.push_back(NUM_SIDES);
|
||||||
|
@ -999,7 +1006,18 @@ void RRGraph::set_node_capacity(const RRNodeId& node, const short& capacity) {
|
||||||
void RRGraph::set_node_ptc_num(const RRNodeId& node, const short& ptc) {
|
void RRGraph::set_node_ptc_num(const RRNodeId& node, const short& ptc) {
|
||||||
VTR_ASSERT(valid_node_id(node));
|
VTR_ASSERT(valid_node_id(node));
|
||||||
|
|
||||||
node_ptc_nums_[node] = ptc;
|
/* For CHANX and CHANY, we will resize the ptc num to length of the node
|
||||||
|
* For other nodes, we will always assign the first element
|
||||||
|
*/
|
||||||
|
if ((CHANX == node_type(node)) || (CHANY == node_type(node))) {
|
||||||
|
if ((size_t)node_length(node) + 1 != node_ptc_nums_[node].size()) {
|
||||||
|
node_ptc_nums_[node].resize(node_length(node) + 1);
|
||||||
|
}
|
||||||
|
std::fill(node_ptc_nums_[node].begin(), node_ptc_nums_[node].end(), ptc);
|
||||||
|
} else {
|
||||||
|
VTR_ASSERT(1 == node_ptc_nums_[node].size());
|
||||||
|
node_ptc_nums_[node][0] = ptc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RRGraph::set_node_pin_num(const RRNodeId& node, const short& pin_id) {
|
void RRGraph::set_node_pin_num(const RRNodeId& node, const short& pin_id) {
|
||||||
|
@ -1023,6 +1041,22 @@ void RRGraph::set_node_class_num(const RRNodeId& node, const short& class_id) {
|
||||||
set_node_ptc_num(node, class_id);
|
set_node_ptc_num(node, class_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RRGraph::add_node_track_num(const RRNodeId& node,
|
||||||
|
const vtr::Point<size_t>& node_offset,
|
||||||
|
const short& track_id) {
|
||||||
|
VTR_ASSERT(valid_node_id(node));
|
||||||
|
VTR_ASSERT_MSG(node_type(node) == CHANX || node_type(node) == CHANY, "Track number valid only for CHANX/CHANY RR nodes");
|
||||||
|
|
||||||
|
if ((size_t)node_length(node) + 1 != node_ptc_nums_[node].size()) {
|
||||||
|
node_ptc_nums_[node].resize(node_length(node) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t offset = node_offset.x() - node_xlow(node) + node_offset.y() - node_ylow(node);
|
||||||
|
VTR_ASSERT(offset < node_ptc_nums_[node].size());
|
||||||
|
|
||||||
|
node_ptc_nums_[node][offset] = track_id;
|
||||||
|
}
|
||||||
|
|
||||||
void RRGraph::set_node_cost_index(const RRNodeId& node, const short& cost_index) {
|
void RRGraph::set_node_cost_index(const RRNodeId& node, const short& cost_index) {
|
||||||
VTR_ASSERT(valid_node_id(node));
|
VTR_ASSERT(valid_node_id(node));
|
||||||
node_cost_indices_[node] = cost_index;
|
node_cost_indices_[node] = cost_index;
|
||||||
|
@ -1235,10 +1269,18 @@ void RRGraph::build_fast_node_lookup() const {
|
||||||
|
|
||||||
size_t itype = node_type(node);
|
size_t itype = node_type(node);
|
||||||
|
|
||||||
size_t ptc = node_ptc_num(node);
|
|
||||||
|
|
||||||
for (const size_t& x : node_x) {
|
for (const size_t& x : node_x) {
|
||||||
for (const size_t& y : node_y) {
|
for (const size_t& y : node_y) {
|
||||||
|
size_t ptc = node_ptc_num(node);
|
||||||
|
/* Routing channel nodes may have different ptc num
|
||||||
|
* Find the track ids using the x/y offset
|
||||||
|
*/
|
||||||
|
if (CHANX == node_type(node)) {
|
||||||
|
ptc = node_track_ids(node)[x - node_xlow(node)];
|
||||||
|
} else if (CHANY == node_type(node)) {
|
||||||
|
ptc = node_track_ids(node)[y - node_ylow(node)];
|
||||||
|
}
|
||||||
|
|
||||||
if (ptc >= node_lookup_[x][y][itype].size()) {
|
if (ptc >= node_lookup_[x][y][itype].size()) {
|
||||||
node_lookup_[x][y][itype].resize(ptc + 1);
|
node_lookup_[x][y][itype].resize(ptc + 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -413,11 +413,24 @@ class RRGraph {
|
||||||
* node_class_num() is designed for routing source and sinks, which are SOURCE and SINK nodes
|
* node_class_num() is designed for routing source and sinks, which are SOURCE and SINK nodes
|
||||||
*
|
*
|
||||||
* Due to a useful identifier, ptc_num is used in building fast look-up
|
* Due to a useful identifier, ptc_num is used in building fast look-up
|
||||||
|
*
|
||||||
|
* Note: routing channels CHANX and CHANY may have multiple ptc_num due to
|
||||||
|
* tileable routing architecture, where a routing track may bend
|
||||||
|
* when passing each SB
|
||||||
|
* By default, we always return the first ptc_num and track_num for
|
||||||
|
* these nodee, while the other ptc num is accessible through fast look-up
|
||||||
|
* when searching for a routing track in a channel
|
||||||
|
*
|
||||||
|
* For CHANX, the track id vector is the same as yhigh - ylow + 1
|
||||||
|
* For CHANY, the track id vector is the same as xhigh - xlow + 1
|
||||||
|
* The first track id is always the track id at (xlow, ylow)
|
||||||
|
* The last track id is always the track id at (xhigh, yhigh)
|
||||||
*/
|
*/
|
||||||
short node_ptc_num(const RRNodeId& node) const;
|
short node_ptc_num(const RRNodeId& node) const;
|
||||||
short node_pin_num(const RRNodeId& node) const;
|
short node_pin_num(const RRNodeId& node) const;
|
||||||
short node_track_num(const RRNodeId& node) const;
|
short node_track_num(const RRNodeId& node) const;
|
||||||
short node_class_num(const RRNodeId& node) const;
|
short node_class_num(const RRNodeId& node) const;
|
||||||
|
std::vector<short> node_track_ids(const RRNodeId& node) const;
|
||||||
|
|
||||||
/* Get the index of cost data in the list of cost_indexed_data data structure
|
/* Get the index of cost data in the list of cost_indexed_data data structure
|
||||||
* It contains the routing cost for different nodes in the RRGraph
|
* It contains the routing cost for different nodes in the RRGraph
|
||||||
|
@ -696,6 +709,14 @@ class RRGraph {
|
||||||
*/
|
*/
|
||||||
void set_node_class_num(const RRNodeId& node, const short& class_id);
|
void set_node_class_num(const RRNodeId& node, const short& class_id);
|
||||||
|
|
||||||
|
/* Add track id for a CHANX or a CHANY node.
|
||||||
|
* This is mainly used by tileable rr_graph where rr_node may
|
||||||
|
* have different track id in different channels
|
||||||
|
*/
|
||||||
|
void add_node_track_num(const RRNodeId& node,
|
||||||
|
const vtr::Point<size_t>& node_offset,
|
||||||
|
const short& track_id);
|
||||||
|
|
||||||
/* Set the routing cost index for node, see node_cost_index() for details */
|
/* Set the routing cost index for node, see node_cost_index() for details */
|
||||||
/* TODO: the cost index should be changed to a StrongId!!! */
|
/* TODO: the cost index should be changed to a StrongId!!! */
|
||||||
void set_node_cost_index(const RRNodeId& node, const short& cost_index);
|
void set_node_cost_index(const RRNodeId& node, const short& cost_index);
|
||||||
|
@ -851,7 +872,8 @@ class RRGraph {
|
||||||
vtr::vector<RRNodeId, vtr::Rect<short>> node_bounding_boxes_;
|
vtr::vector<RRNodeId, vtr::Rect<short>> node_bounding_boxes_;
|
||||||
|
|
||||||
vtr::vector<RRNodeId, short> node_capacities_;
|
vtr::vector<RRNodeId, short> node_capacities_;
|
||||||
vtr::vector<RRNodeId, short> node_ptc_nums_;
|
|
||||||
|
vtr::vector<RRNodeId, std::vector<short>> node_ptc_nums_;
|
||||||
vtr::vector<RRNodeId, short> node_cost_indices_;
|
vtr::vector<RRNodeId, short> node_cost_indices_;
|
||||||
vtr::vector<RRNodeId, e_direction> node_directions_;
|
vtr::vector<RRNodeId, e_direction> node_directions_;
|
||||||
vtr::vector<RRNodeId, e_side> node_sides_;
|
vtr::vector<RRNodeId, e_side> node_sides_;
|
||||||
|
|
|
@ -667,6 +667,12 @@ void load_one_chan_rr_nodes_basic_info(RRGraph& rr_graph,
|
||||||
rr_graph.set_node_xlow(node, chan_coordinate.x());
|
rr_graph.set_node_xlow(node, chan_coordinate.x());
|
||||||
rr_graph.set_node_ylow(node, chan_coordinate.y());
|
rr_graph.set_node_ylow(node, chan_coordinate.y());
|
||||||
|
|
||||||
|
/* Deposit xhigh and yhigh as the same value as xlow and ylow
|
||||||
|
* We will update when this track ends
|
||||||
|
*/
|
||||||
|
rr_graph.set_node_xhigh(node, chan_coordinate.x());
|
||||||
|
rr_graph.set_node_yhigh(node, chan_coordinate.y());
|
||||||
|
|
||||||
rr_graph.set_node_direction(node, chan_details.get_track_direction(itrack));
|
rr_graph.set_node_direction(node, chan_details.get_track_direction(itrack));
|
||||||
rr_graph.set_node_track_num(node, itrack);
|
rr_graph.set_node_track_num(node, itrack);
|
||||||
rr_node_track_ids[node].push_back(itrack);
|
rr_node_track_ids[node].push_back(itrack);
|
||||||
|
@ -709,6 +715,7 @@ void load_one_chan_rr_nodes_basic_info(RRGraph& rr_graph,
|
||||||
if ( (rr_graph.node_xhigh(rr_node_id) > rr_graph.node_xlow(rr_node_id))
|
if ( (rr_graph.node_xhigh(rr_node_id) > rr_graph.node_xlow(rr_node_id))
|
||||||
|| (rr_graph.node_yhigh(rr_node_id) > rr_graph.node_ylow(rr_node_id)) ) {
|
|| (rr_graph.node_yhigh(rr_node_id) > rr_graph.node_ylow(rr_node_id)) ) {
|
||||||
rr_node_track_ids[rr_node_id].push_back(itrack);
|
rr_node_track_ids[rr_node_id].push_back(itrack);
|
||||||
|
rr_graph.add_node_track_num(rr_node_id, chan_coordinate, itrack);
|
||||||
}
|
}
|
||||||
/* Finish here, go to next */
|
/* Finish here, go to next */
|
||||||
}
|
}
|
||||||
|
@ -734,6 +741,7 @@ void load_one_chan_rr_nodes_basic_info(RRGraph& rr_graph,
|
||||||
|
|
||||||
/* Update track_ids */
|
/* Update track_ids */
|
||||||
rr_node_track_ids[rr_node_id].push_back(itrack);
|
rr_node_track_ids[rr_node_id].push_back(itrack);
|
||||||
|
rr_graph.add_node_track_num(rr_node_id, chan_coordinate, itrack);
|
||||||
/* Finish here, go to next */
|
/* Finish here, go to next */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue