Merge branch 'tileable_routing' into dev

This commit is contained in:
tangxifan 2019-07-05 21:15:59 -06:00
commit fb064daded
1 changed files with 35 additions and 25 deletions

View File

@ -1062,52 +1062,53 @@ void build_gsb_one_ipin_track2pin_map(const t_rr_graph* rr_graph,
assert (0 == actual_track_list.size() % 2); assert (0 == actual_track_list.size() % 2);
/* Scale Fc */ /* Scale Fc */
int actual_Fc = Fc * actual_track_list.size() / chan_width; int actual_Fc = std::ceil((float)Fc * (float)actual_track_list.size() / (float)chan_width);
/* Minimum Fc should be 2 : ensure we will connect to a pair of routing tracks */ /* Minimum Fc should be 2 : ensure we will connect to a pair of routing tracks */
actual_Fc = std::max(2, actual_Fc); actual_Fc = std::max(1, actual_Fc);
/* Compute the step between two connection from this IPIN to tracks: /* Compute the step between two connection from this IPIN to tracks:
* step = W' / Fc', W' and Fc' are the adapted W and Fc from actual_track_list and Fc_in * step = W' / Fc', W' and Fc' are the adapted W and Fc from actual_track_list and Fc_in
*/ */
size_t track_step = actual_track_list.size() / actual_Fc; size_t track_step = std::floor((float)actual_track_list.size() / (float)actual_Fc);
/* Track step mush be a multiple of 2!!!*/
if (0 != track_step % 2) {
track_step--; /* minus 1 to increase connectivity */
}
/* Make sure step should be at least 2 */ /* Make sure step should be at least 2 */
track_step = std::max(2, (int)track_step); track_step = std::max(1, (int)track_step);
/* Adapt offset to the range of actual_track_list */ /* Adapt offset to the range of actual_track_list */
size_t actual_offset = offset % actual_track_list.size(); size_t actual_offset = offset % actual_track_list.size();
/* rotate the track list by an offset */ /* rotate the track list by an offset */
std::rotate(actual_track_list.begin(), actual_track_list.begin() + actual_offset, actual_track_list.end()); if (0 < actual_offset) {
std::rotate(actual_track_list.begin(), actual_track_list.begin() + actual_offset, actual_track_list.end());
}
/* Assign tracks: since we assign 2 track per round, we increment itrack by 2* step */ /* Assign tracks: since we assign 2 track per round, we increment itrack by 2* step */
int track_cnt = 0; int track_cnt = 0;
/* Keep assigning until we meet the Fc requirement */
for (size_t itrack = 0; itrack < actual_track_list.size(); itrack = itrack + 2 * track_step) { for (size_t itrack = 0; itrack < actual_track_list.size(); itrack = itrack + 2 * track_step) {
/* Update pin2track map */ /* Update pin2track map */
size_t chan_side_index = chan_side_manager.to_size_t(); size_t chan_side_index = chan_side_manager.to_size_t();
size_t ipin_index = ipin_node - rr_graph->rr_node; size_t ipin_index = ipin_node - rr_graph->rr_node;
/* itrack may exceed the size of actual_track_list, adapt it */
size_t actual_itrack = itrack % actual_track_list.size();
/* track_index may exceed the chan_width(), adapt it */ /* track_index may exceed the chan_width(), adapt it */
size_t track_index = actual_track_list[itrack] % chan_width; size_t track_index = actual_track_list[actual_itrack] % chan_width;
(*track2ipin_map)[chan_side_index][track_index].push_back(ipin_index); (*track2ipin_map)[chan_side_index][track_index].push_back(ipin_index);
/* track_index may exceed the chan_width(), adapt it */ /* track_index may exceed the chan_width(), adapt it */
track_index = (actual_track_list[itrack] + 1) % chan_width; track_index = (actual_track_list[actual_itrack] + 1) % chan_width;
(*track2ipin_map)[chan_side_index][track_index].push_back(ipin_index); (*track2ipin_map)[chan_side_index][track_index].push_back(ipin_index);
track_cnt += 2; track_cnt += 2;
/* Stop when we have enough Fc: this may lead to some tracks have zero drivers.
* So I comment it. And we just make sure its track_cnt >= actual_Fc
if (actual_Fc == track_cnt) {
break;
}
*/
} }
/* Ensure the number of tracks is similar to Fc */ /* Ensure the number of tracks is similar to Fc */
//printf("Fc_in=%d, track_cnt=%d\n", actual_Fc, track_cnt); /* Give a warning if Fc is < track_cnt */
assert (actual_Fc <= track_cnt); /*
if (actual_Fc != track_cnt) {
vpr_printf(TIO_MESSAGE_INFO,
"IPIN Node(%lu) will have a different Fc(=%lu) than specified(=%lu)!\n",
ipin_node - rr_graph->rr_node, track_cnt, actual_Fc);
}
*/
} }
return; return;
@ -1163,13 +1164,13 @@ void build_gsb_one_opin_pin2track_map(const t_rr_graph* rr_graph,
} }
/* Scale Fc */ /* Scale Fc */
int actual_Fc = Fc * actual_track_list.size() / chan_width; int actual_Fc = std::ceil((float)Fc * (float)actual_track_list.size() / (float)chan_width);
/* Minimum Fc should be 1 : ensure we will drive 1 routing track */ /* Minimum Fc should be 1 : ensure we will drive 1 routing track */
actual_Fc = std::max(1, actual_Fc); actual_Fc = std::max(1, actual_Fc);
/* Compute the step between two connection from this IPIN to tracks: /* Compute the step between two connection from this IPIN to tracks:
* step = W' / Fc', W' and Fc' are the adapted W and Fc from actual_track_list and Fc_in * step = W' / Fc', W' and Fc' are the adapted W and Fc from actual_track_list and Fc_in
*/ */
size_t track_step = actual_track_list.size() / actual_Fc; size_t track_step = std::floor((float)actual_track_list.size() / (float)actual_Fc);
/* Track step mush be a multiple of 2!!!*/ /* Track step mush be a multiple of 2!!!*/
/* Make sure step should be at least 1 */ /* Make sure step should be at least 1 */
track_step = std::max(1, (int)track_step); track_step = std::max(1, (int)track_step);
@ -1184,10 +1185,13 @@ void build_gsb_one_opin_pin2track_map(const t_rr_graph* rr_graph,
/* Assign tracks */ /* Assign tracks */
int track_cnt = 0; int track_cnt = 0;
/* Keep assigning until we meet the Fc requirement */
for (size_t itrack = 0; itrack < actual_track_list.size(); itrack = itrack + track_step) { for (size_t itrack = 0; itrack < actual_track_list.size(); itrack = itrack + track_step) {
/* Update pin2track map */ /* Update pin2track map */
size_t opin_side_index = opin_side_manager.to_size_t(); size_t opin_side_index = opin_side_manager.to_size_t();
size_t track_index = actual_track_list[itrack]; /* itrack may exceed the size of actual_track_list, adapt it */
size_t actual_itrack = itrack % actual_track_list.size();
size_t track_index = actual_track_list[actual_itrack];
size_t track_rr_node_index = rr_gsb.get_chan_node(chan_side, track_index) - rr_graph->rr_node; size_t track_rr_node_index = rr_gsb.get_chan_node(chan_side, track_index) - rr_graph->rr_node;
(*opin2track_map)[opin_side_index][opin_node_id].push_back(track_rr_node_index); (*opin2track_map)[opin_side_index][opin_node_id].push_back(track_rr_node_index);
/* update track counter */ /* update track counter */
@ -1201,8 +1205,14 @@ void build_gsb_one_opin_pin2track_map(const t_rr_graph* rr_graph,
} }
/* Ensure the number of tracks is similar to Fc */ /* Ensure the number of tracks is similar to Fc */
//printf("Fc_out=%lu, scaled_Fc_out=%d, track_cnt=%d, actual_track_cnt=%lu/%lu\n", Fc, actual_Fc, track_cnt, actual_track_list.size(), chan_width); /* Give a warning if Fc is < track_cnt */
assert (actual_Fc <= track_cnt); /*
if (actual_Fc != track_cnt) {
vpr_printf(TIO_MESSAGE_INFO,
"OPIN Node(%lu) will have a different Fc(=%lu) than specified(=%lu)!\n",
opin_node_id, track_cnt, actual_Fc);
}
*/
} }
return; return;