Merge pull request #1025 from YosysHQ/gatecat/nexus-dev-fixes
nexus: Add ES2 device names and --list-devices
This commit is contained in:
commit
e5da8be4f8
@ -58,7 +58,9 @@ Arch::Arch(ArchArgs args) : args(args)
|
|||||||
log_error("Unknown device string '%s' (expected device name like 'LIFCL-40-8SG72C')\n", args.device.c_str());
|
log_error("Unknown device string '%s' (expected device name like 'LIFCL-40-8SG72C')\n", args.device.c_str());
|
||||||
device = args.device.substr(0, last_sep);
|
device = args.device.substr(0, last_sep);
|
||||||
speed = args.device.substr(last_sep + 1, 1);
|
speed = args.device.substr(last_sep + 1, 1);
|
||||||
auto package_end = args.device.find_last_of("0123456789");
|
auto package_end = args.device.find_last_of("0123456789", args.device.substr(args.device.size() - 3) == "ES2"
|
||||||
|
? args.device.size() - 3
|
||||||
|
: std::string::npos);
|
||||||
if (package_end == std::string::npos || package_end < last_sep)
|
if (package_end == std::string::npos || package_end < last_sep)
|
||||||
log_error("Unknown device string '%s' (expected device name like 'LIFCL-40-8SG72C')\n", args.device.c_str());
|
log_error("Unknown device string '%s' (expected device name like 'LIFCL-40-8SG72C')\n", args.device.c_str());
|
||||||
package = args.device.substr(last_sep + 2, (package_end - (last_sep + 2)) + 1);
|
package = args.device.substr(last_sep + 2, (package_end - (last_sep + 2)) + 1);
|
||||||
@ -67,6 +69,9 @@ Arch::Arch(ArchArgs args) : args(args)
|
|||||||
// Check for 'ES' part
|
// Check for 'ES' part
|
||||||
if (rating.size() > 1 && rating.substr(1) == "ES") {
|
if (rating.size() > 1 && rating.substr(1) == "ES") {
|
||||||
variant = "ES";
|
variant = "ES";
|
||||||
|
} else if (rating.size() > 1 && rating.substr(1) == "ES2") {
|
||||||
|
// ES2 devices are production-equivalent from nextpnr's and bitstream point of view
|
||||||
|
variant = "";
|
||||||
} else {
|
} else {
|
||||||
variant = "";
|
variant = "";
|
||||||
}
|
}
|
||||||
@ -194,6 +199,35 @@ Arch::Arch(ArchArgs args) : args(args)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Arch::list_devices()
|
||||||
|
{
|
||||||
|
std::vector<std::string> families{
|
||||||
|
"LIFCL",
|
||||||
|
};
|
||||||
|
log("Supported devices: \n");
|
||||||
|
for (auto fam : families) {
|
||||||
|
std::string chipdb = stringf("nexus/chipdb-%s.bin", fam.c_str());
|
||||||
|
auto db_ptr = reinterpret_cast<const RelPtr<DatabasePOD> *>(get_chipdb(chipdb));
|
||||||
|
if (!db_ptr)
|
||||||
|
continue; // chipdb not available
|
||||||
|
// enumerate chips
|
||||||
|
for (auto &chip : db_ptr->get()->chips) {
|
||||||
|
// enumerate packages
|
||||||
|
for (auto &pkg : chip.packages) {
|
||||||
|
// enumerate suffices
|
||||||
|
for (auto speedgrade : {"7", "8", "9"}) { // TODO: these might depend on family
|
||||||
|
for (auto rating : {"I", "C"}) {
|
||||||
|
for (auto suffix : {"", "ES", "ES2"}) {
|
||||||
|
log(" %s-%s%s%s%s\n", chip.device_name.get(), speedgrade, pkg.short_name.get(), rating,
|
||||||
|
suffix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
std::string Arch::getChipName() const { return args.device; }
|
std::string Arch::getChipName() const { return args.device; }
|
||||||
|
@ -1522,6 +1522,8 @@ struct Arch : BaseArch<ArchRanges>
|
|||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
void write_fasm(std::ostream &out) const;
|
void write_fasm(std::ostream &out) const;
|
||||||
|
// -------------------------------------------------
|
||||||
|
static void list_devices();
|
||||||
};
|
};
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
@ -48,6 +48,7 @@ po::options_description NexusCommandHandler::getArchOptions()
|
|||||||
{
|
{
|
||||||
po::options_description specific("Architecture specific options");
|
po::options_description specific("Architecture specific options");
|
||||||
specific.add_options()("device", po::value<std::string>(), "device name");
|
specific.add_options()("device", po::value<std::string>(), "device name");
|
||||||
|
specific.add_options()("list-devices", "list all supported device names");
|
||||||
specific.add_options()("fasm", po::value<std::string>(), "fasm file to write");
|
specific.add_options()("fasm", po::value<std::string>(), "fasm file to write");
|
||||||
specific.add_options()("pdc", po::value<std::string>(), "physical constraints file");
|
specific.add_options()("pdc", po::value<std::string>(), "physical constraints file");
|
||||||
specific.add_options()("no-post-place-opt", "disable post-place repacking (debugging use only)");
|
specific.add_options()("no-post-place-opt", "disable post-place repacking (debugging use only)");
|
||||||
@ -73,6 +74,10 @@ void NexusCommandHandler::customBitstream(Context *ctx)
|
|||||||
std::unique_ptr<Context> NexusCommandHandler::createContext(dict<std::string, Property> &values)
|
std::unique_ptr<Context> NexusCommandHandler::createContext(dict<std::string, Property> &values)
|
||||||
{
|
{
|
||||||
ArchArgs chipArgs;
|
ArchArgs chipArgs;
|
||||||
|
if (vm.count("list-devices")) {
|
||||||
|
Arch::list_devices();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
if (!vm.count("device")) {
|
if (!vm.count("device")) {
|
||||||
log_error("device must be specified on the command line (e.g. --device LIFCL-40-9BG400CES)\n");
|
log_error("device must be specified on the command line (e.g. --device LIFCL-40-9BG400CES)\n");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user