[engine] now repack can find a routing trace from the port in the same type at top-level pb_graph_node

This commit is contained in:
tangxifan 2022-10-13 15:10:25 -07:00
parent 1c36ac28f1
commit 31da9bf6ea
1 changed files with 19 additions and 3 deletions

View File

@ -258,7 +258,8 @@ static std::vector<t_pb_graph_pin*> find_routed_pb_graph_pins_atom_net(
* This function will find the actual routing traces of the demanded net * This function will find the actual routing traces of the demanded net
* There is a specific search space applied when searching the routing traces: * There is a specific search space applied when searching the routing traces:
* - ONLY applicable to the pb_pin of top-level pb_graph_node * - ONLY applicable to the pb_pin of top-level pb_graph_node
* - candidate can be limited to a set of pb pins * - First-tier candidates are in the same port of the source pin
* - If nothing is found in first-tier, we find expand the range by considering all the pins in the same type that are available at the top-level pb_graph_node
***************************************************************************************/ ***************************************************************************************/
static std::vector<int> find_pb_route_by_atom_net( static std::vector<int> find_pb_route_by_atom_net(
const t_pb* pb, const t_pb_graph_pin* source_pb_pin, const t_pb* pb, const t_pb_graph_pin* source_pb_pin,
@ -267,6 +268,7 @@ static std::vector<int> find_pb_route_by_atom_net(
std::vector<int> pb_route_indices; std::vector<int> pb_route_indices;
std::vector<int> candidate_pool;
for (int pin = 0; pin < pb->pb_graph_node->total_pb_pins; ++pin) { for (int pin = 0; pin < pb->pb_graph_node->total_pb_pins; ++pin) {
/* Bypass unused pins */ /* Bypass unused pins */
if ((0 == pb->pb_route.count(pin)) || if ((0 == pb->pb_route.count(pin)) ||
@ -277,12 +279,23 @@ static std::vector<int> find_pb_route_by_atom_net(
if (atom_net_id != pb->pb_route.at(pin).atom_net_id) { if (atom_net_id != pb->pb_route.at(pin).atom_net_id) {
continue; continue;
} }
candidate_pool.push_back(pin);
}
for (int pin : candidate_pool) {
if (source_pb_pin->port == pb->pb_route.at(pin).pb_graph_pin->port) { if (source_pb_pin->port == pb->pb_route.at(pin).pb_graph_pin->port) {
pb_route_indices.push_back(pin); pb_route_indices.push_back(pin);
} }
} }
if (pb_route_indices.empty()) {
for (int pin : candidate_pool) {
if (pb->pb_route.at(pin).pb_graph_pin->parent_node->is_root() && source_pb_pin->port->type == pb->pb_route.at(pin).pb_graph_pin->port->type) {
pb_route_indices.push_back(pin);
}
}
}
return pb_route_indices; return pb_route_indices;
} }
@ -662,9 +675,12 @@ static void add_lb_router_nets(
if (0 == pb_route_indices.size()) { if (0 == pb_route_indices.size()) {
VTR_LOGV(verbose, "Bypass routing due to no routing traces found\n"); VTR_LOGV(verbose, "Bypass routing due to no routing traces found\n");
continue; continue;
} else { } else if (1 == pb_route_indices.size()) {
VTR_ASSERT(1 == pb_route_indices.size());
pb_route_index = pb_route_indices[0]; pb_route_index = pb_route_indices[0];
} else {
VTR_LOG_ERROR("Found %d routing traces for net \'%s\' in clustered block \'%s\'. Expect only 1.\n",
pb_route_indices.size(), atom_ctx.nlist.net_name(atom_net_id_to_route).c_str(), clustering_ctx.clb_nlist.block_name(block_id).c_str());
VTR_ASSERT(1 == pb_route_indices.size());
} }
t_pb_graph_pin* packing_source_pb_pin = t_pb_graph_pin* packing_source_pb_pin =
get_pb_graph_node_pin_from_block_pin(block_id, pb_route_index); get_pb_graph_node_pin_from_block_pin(block_id, pb_route_index);