diff --git a/gowin/arch.cc b/gowin/arch.cc index 9efd7a11..d5ae23ef 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -534,9 +534,22 @@ Arch::Arch(ArchArgs args) : args(args) if (speed == nullptr) { log_error("Unsuported speed grade '%s'.\n", args.speed.c_str()); } + const VariantPOD* variant = nullptr; + for (unsigned int i = 0; i < db->num_variants; i++) { + auto var = &db->variants[i]; + std::cout << IdString(var->name_id).str(this) << std::endl; + if (IdString(var->name_id) == id(args.device)) { + variant = var; + break; + } + } + if (variant == nullptr) { + log_error("Unsuported device grade '%s'.\n", args.device.c_str()); + } + package = nullptr; - for (unsigned int i = 0; i < db->num_packages; i++) { - auto pkg = &db->packages[i]; + for (unsigned int i = 0; i < variant->num_packages; i++) { + auto pkg = &variant->packages[i]; // std::cout << IdString(pkg->name_id).str(this) << std::endl; if (IdString(pkg->name_id) == id(args.package)) { package = pkg; diff --git a/gowin/arch.h b/gowin/arch.h index 55a1f6f5..1a4670c2 100644 --- a/gowin/arch.h +++ b/gowin/arch.h @@ -124,6 +124,12 @@ NPNR_PACKED_STRUCT(struct PackagePOD { RelPtr pins; }); +NPNR_PACKED_STRUCT(struct VariantPOD { + uint32_t name_id; + uint32_t num_packages; + RelPtr packages; +}); + NPNR_PACKED_STRUCT(struct DatabasePOD { RelPtr family; uint32_t version; @@ -134,8 +140,8 @@ NPNR_PACKED_STRUCT(struct DatabasePOD { RelPtr aliases; uint32_t num_speeds; RelPtr speeds; - uint32_t num_packages; - RelPtr packages; + uint32_t num_variants; + RelPtr variants; uint16_t num_constids; uint16_t num_ids; RelPtr> id_strs;