Merge pull request #695 from acomodi/fix-illegal-site-thru

interchange: fix site-thru pip legality
This commit is contained in:
gatecat 2021-05-10 16:05:34 +01:00 committed by GitHub
commit 466de95312
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 2 deletions

View File

@ -157,6 +157,7 @@ struct SiteExpansionLoop
NPNR_ASSERT((*parent)->wire.type == SiteWire::SITE_WIRE);
NPNR_ASSERT(node->can_leave_site());
node->mark_left_site();
node->mark_left_site_after_entering();
} else if (wire.type == SiteWire::SITE_PORT_SOURCE) {
// This is a backward walk, so this is considered entering
// the site.
@ -171,6 +172,7 @@ struct SiteExpansionLoop
// the site.
NPNR_ASSERT(node->can_leave_site());
node->mark_left_site();
node->mark_left_site_after_entering();
} else {
NPNR_ASSERT((*parent)->wire.type == SiteWire::SITE_PORT_SOURCE);
NPNR_ASSERT(node->can_enter_site());
@ -243,7 +245,7 @@ struct SiteExpansionLoop
if (!parent_node->can_leave_site()) {
// This path has already left the site once, don't leave it again!
if (verbose_site_router(ctx)) {
log_info("Pip %s is not a valid for this path because it has already left the site\n",
log_info("%s is not a valid PIP for this path because it has already left the site\n",
ctx->nameOfPip(pip));
}
continue;
@ -256,7 +258,7 @@ struct SiteExpansionLoop
// don't enter it again!
if (verbose_site_router(ctx)) {
log_info(
"Pip %s is not a valid for this path because it has already entered the site\n",
"%s is not a valid PIP for this path because it has already entered the site\n",
ctx->nameOfPip(pip));
}
continue;
@ -274,6 +276,16 @@ struct SiteExpansionLoop
}
auto node = new_node(wire, pip, &parent_node);
if (!node->is_valid_node()) {
if (verbose_site_router(ctx)) {
log_info(
"%s is not a valid PIP for this path because it has left the site after entering it.\n",
ctx->nameOfPip(pip));
}
continue;
}
if (targets.count(wire)) {
completed_routes.push_back(node.get_index());
max_depth = std::max(max_depth, node->depth);

View File

@ -45,14 +45,25 @@ struct RouteNode
LEFT_SITE = 0,
// Has this path entered the site?
ENTERED_SITE = 1,
// Has this path left the site after entering it?
// This node should be discarded as being part of an illegal path
// which allows entering and exiting a site, situation that needs
// to be handled with a tile PIP.
LEFT_SITE_AFTER_ENTERING = 2,
};
bool has_left_site() const { return (flags & (1 << LEFT_SITE)) != 0; }
bool has_left_site_after_entering() const { return (flags & (1 << LEFT_SITE_AFTER_ENTERING)) != 0; }
bool can_leave_site() const { return !has_left_site(); }
bool is_valid_node() const { return !has_left_site_after_entering(); }
void mark_left_site() { flags |= (1 << LEFT_SITE); }
void mark_left_site_after_entering() { flags |= (has_entered_site() << LEFT_SITE_AFTER_ENTERING); }
bool has_entered_site() const { return (flags & (1 << ENTERED_SITE)) != 0; }
bool can_enter_site() const { return !has_entered_site(); }