aboutsummaryrefslogtreecommitdiffstats
path: root/machxo2/arch.cc
diff options
context:
space:
mode:
Diffstat (limited to 'machxo2/arch.cc')
-rw-r--r--machxo2/arch.cc156
1 files changed, 54 insertions, 102 deletions
diff --git a/machxo2/arch.cc b/machxo2/arch.cc
index 350b08cb..481d15ee 100644
--- a/machxo2/arch.cc
+++ b/machxo2/arch.cc
@@ -28,6 +28,7 @@
#include "router1.h"
#include "router2.h"
#include "util.h"
+#include "chipdb/available.h"
NEXTPNR_NAMESPACE_BEGIN
@@ -44,51 +45,53 @@ void IdString::initialize_arch(const BaseCtx *ctx)
// ---------------------------------------------------------------
-static const ChipInfoPOD *get_chip_info(ArchArgs::ArchArgsTypes chip)
+static void get_chip_info(std::string device, const ChipInfoPOD **chip_info, const PackageInfoPOD **package_info, const char **device_name, const char **package_name)
{
- std::string chipdb;
- if (chip == ArchArgs::LCMXO2_256HC) {
- chipdb = "machxo2/chipdb-256.bin";
- } else if (chip == ArchArgs::LCMXO2_640HC) {
- chipdb = "machxo2/chipdb-640.bin";
- } else if (chip == ArchArgs::LCMXO2_1200HC) {
- chipdb = "machxo2/chipdb-1200.bin";
- } else if (chip == ArchArgs::LCMXO2_2000HC) {
- chipdb = "machxo2/chipdb-2000.bin";
- } else if (chip == ArchArgs::LCMXO2_4000HC) {
- chipdb = "machxo2/chipdb-4000.bin";
- } else if (chip == ArchArgs::LCMXO2_7000HC) {
- chipdb = "machxo2/chipdb-7000.bin";
- } else {
- log_error("Unknown chip\n");
+ std::stringstream ss(available_devices);
+ std::string name;
+ while(getline(ss, name, ';')){
+ std::string chipdb = stringf("machxo2/chipdb-%s.bin", name.c_str());
+ auto db_ptr = reinterpret_cast<const RelPtr<ChipInfoPOD> *>(get_chipdb(chipdb));
+ if (!db_ptr)
+ continue; // chipdb not available
+ for (auto &chip : db_ptr->get()->variants) {
+ for (auto &pkg : chip.packages) {
+ for (auto &speedgrade : chip.speed_grades) {
+ for (auto &rating : chip.suffixes) {
+ std::string name = stringf("%s-%d%s%s", chip.name.get(), speedgrade.speed, pkg.short_name.get(), rating.suffix.get());
+ if (device == name) {
+ *chip_info = db_ptr->get();
+ *package_info = nullptr;
+ *package_name = pkg.name.get();
+ *device_name = chip.name.get();
+ for (int i = 0; i < (*chip_info)->num_packages; i++) {
+ if (pkg.name.get() == (*chip_info)->package_info[i].name.get()) {
+ *package_info = &((*chip_info)->package_info[i]);
+ break;
+ }
+ }
+ return;
+ }
+ }
+ }
+ }
+ }
}
-
- auto ptr = reinterpret_cast<const RelPtr<ChipInfoPOD> *>(get_chipdb(chipdb));
- if (ptr == nullptr)
- return nullptr;
- return ptr->get();
}
// ---------------------------------------------------------------
Arch::Arch(ArchArgs args) : args(args)
{
- chip_info = get_chip_info(args.type);
+ get_chip_info(args.device, &chip_info, &package_info, &device_name, &package_name);
if (chip_info == nullptr)
log_error("Unsupported MachXO2 chip type.\n");
if (chip_info->const_id_count != DB_CONST_ID_COUNT)
log_error("Chip database 'bba' and nextpnr code are out of sync; please rebuild (or contact distribution "
"maintainer)!\n");
- package_info = nullptr;
- for (int i = 0; i < chip_info->num_packages; i++) {
- if (args.package == chip_info->package_info[i].name.get()) {
- package_info = &(chip_info->package_info[i]);
- break;
- }
- }
if (!package_info)
- log_error("Unsupported package '%s' for '%s'.\n", args.package.c_str(), getChipName().c_str());
+ log_error("Unsupported package '%s' for '%s'.\n", package_name, getChipName().c_str());
BaseArch::init_cell_types();
BaseArch::init_bel_buckets();
@@ -110,83 +113,32 @@ Arch::Arch(ArchArgs args) : args(args)
}
}
-bool Arch::is_available(ArchArgs::ArchArgsTypes chip) { return get_chip_info(chip) != nullptr; }
-
-std::vector<std::string> Arch::get_supported_packages(ArchArgs::ArchArgsTypes chip)
-{
- const ChipInfoPOD *chip_info = get_chip_info(chip);
- std::vector<std::string> pkgs;
- for (int i = 0; i < chip_info->num_packages; i++) {
- pkgs.push_back(chip_info->package_info[i].name.get());
- }
- return pkgs;
-}
-
-std::string Arch::getChipName() const
+void Arch::list_devices()
{
- if (args.type == ArchArgs::LCMXO2_256HC) {
- return "LCMXO2-256HC";
- } else if (args.type == ArchArgs::LCMXO2_640HC) {
- return "LCMXO2-640HC";
- } else if (args.type == ArchArgs::LCMXO2_1200HC) {
- return "LCMXO2-1200HC";
- } else if (args.type == ArchArgs::LCMXO2_2000HC) {
- return "LCMXO2-2000HC";
- } else if (args.type == ArchArgs::LCMXO2_4000HC) {
- return "LCMXO2-4000HC";
- } else if (args.type == ArchArgs::LCMXO2_7000HC) {
- return "LCMXO2-7000HC";
- } else {
- log_error("Unknown chip\n");
- }
-}
-
-std::string Arch::get_full_chip_name() const
-{
- std::string name = getChipName();
- name += "-";
- switch (args.speed) {
- case ArchArgs::SPEED_1:
- name += "1";
- break;
- case ArchArgs::SPEED_2:
- name += "2";
- break;
- case ArchArgs::SPEED_3:
- name += "3";
- break;
- case ArchArgs::SPEED_4:
- name += "4";
- break;
- case ArchArgs::SPEED_5:
- name += "5";
- break;
- case ArchArgs::SPEED_6:
- name += "6";
- break;
+ log("Supported devices: \n");
+ std::stringstream ss(available_devices);
+ std::string name;
+ while(getline(ss, name, ';')){
+ std::string chipdb = stringf("machxo2/chipdb-%s.bin", name.c_str());
+ auto db_ptr = reinterpret_cast<const RelPtr<ChipInfoPOD> *>(get_chipdb(chipdb));
+ if (!db_ptr)
+ continue; // chipdb not available
+ for (auto &chip : db_ptr->get()->variants) {
+ for (auto &pkg : chip.packages) {
+ for (auto &speedgrade : chip.speed_grades) {
+ for (auto &rating : chip.suffixes) {
+ log(" %s-%d%s%s\n", chip.name.get(), speedgrade.speed, pkg.short_name.get(), rating.suffix.get());
+ }
+ }
+ }
+ }
}
- name += args.package;
- return name;
}
-IdString Arch::archArgsToId(ArchArgs args) const
-{
- if (args.type == ArchArgs::LCMXO2_256HC) {
- return id_lcmxo2_256hc;
- } else if (args.type == ArchArgs::LCMXO2_640HC) {
- return id_lcmxo2_640hc;
- } else if (args.type == ArchArgs::LCMXO2_1200HC) {
- return id_lcmxo2_1200hc;
- } else if (args.type == ArchArgs::LCMXO2_2000HC) {
- return id_lcmxo2_2000hc;
- } else if (args.type == ArchArgs::LCMXO2_4000HC) {
- return id_lcmxo2_4000hc;
- } else if (args.type == ArchArgs::LCMXO2_7000HC) {
- return id_lcmxo2_7000hc;
- }
+// -----------------------------------------------------------------------
- return IdString();
-}
+std::string Arch::getChipName() const { return args.device; }
+IdString Arch::archArgsToId(ArchArgs args) const { return id(args.device); }
// ---------------------------------------------------------------