ecp5: Make fabric routed ECLK an error

Signed-off-by: gatecat <gatecat@ds0.me>
This commit is contained in:
gatecat 2026-07-16 12:10:35 +02:00
parent 261152be8a
commit 1a23277c63
2 changed files with 12 additions and 1 deletions

View File

@ -671,7 +671,14 @@ class Ecp5GlobalRouter
cursor = ctx->getPipDstWire(pip);
}
} else {
log_info(" no route found, general routing will be used.\n");
if (bool_or_default(ctx->settings, ctx->id("arch.fabric_eclk"))) {
log_info(" no route found, general routing will be used.\n");
} else {
log_error("Unable to route edge clock source '%s' to pin '%s.%s' using dedicated routing.\n"
"Use --allow-fabric-eclk to use fabric routing with indeterminate skew, or "
"consider using an ECLKBRIDGECS to cross the device.\n",
ctx->nameOf(ni), ctx->nameOf(ci), ctx->nameOf(pin));
}
}
}
}

View File

@ -86,6 +86,8 @@ po::options_description ECP5CommandHandler::getArchOptions()
"disable IO buffer insertion and global promotion/routing, for building pre-routed blocks (experimental)");
specific.add_options()("disable-router-lutperm", "don't allow the router to permute LUT inputs");
specific.add_options()("allow-fabric-eclk", "allow fabric routing of ECLKs");
return specific;
}
void ECP5CommandHandler::validate()
@ -258,6 +260,8 @@ std::unique_ptr<Context> ECP5CommandHandler::createContext(dict<std::string, Pro
ctx->settings[ctx->id("arch.ooc")] = 1;
if (vm.count("disable-router-lutperm"))
ctx->settings[ctx->id("arch.disable_router_lutperm")] = 1;
if (vm.count("allow-fabric-eclk"))
ctx->settings[ctx->id("arch.fabric_eclk")] = 1;
return ctx;
}