ecp5: Add an error for mixed constrained/unconstrained IO

Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
David Shah 2019-02-25 14:45:43 +00:00
parent 81b176e150
commit ba4150aecc

View File

@ -25,6 +25,7 @@
#include "design_utils.h"
#include "log.h"
#include "timing.h"
#include "util.h"
USING_NEXTPNR_NAMESPACE
@ -68,6 +69,7 @@ po::options_description ECP5CommandHandler::getArchOptions()
specific.add_options()("textcfg", po::value<std::string>(), "textual configuration in Trellis format to write");
specific.add_options()("lpf", po::value<std::vector<std::string>>(), "LPF pin constraint file(s)");
specific.add_options()("lpf-allow-unconstrained", "don't require LPF file(s) to constrain all IO");
return specific;
}
@ -162,6 +164,22 @@ void ECP5CommandHandler::customAfterLoad(Context *ctx)
if (!ctx->applyLPF(filename, in))
log_error("failed to parse LPF file '%s'\n", filename.c_str());
}
for (auto cell : sorted(ctx->cells)) {
CellInfo *ci = cell.second;
if (ci->type == ctx->id("$nextpnr_ibuf") || ci->type == ctx->id("$nextpnr_obuf") ||
ci->type == ctx->id("$nextpnr_iobuf")) {
if (!ci->attrs.count(ctx->id("LOC"))) {
if (vm.count("lpf-allow-unconstrained"))
log_warning("IO '%s' is unconstrained in LPF and will be automatically placed\n",
cell.first.c_str(ctx));
else
log_error("IO '%s' is unconstrained in LPF (override this error with "
"--lpf-allow-unconstrained)\n",
cell.first.c_str(ctx));
}
}
}
}
}