diff --git a/gowin/arch.cc b/gowin/arch.cc index 3b91b817..fe2cfde2 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -698,24 +698,38 @@ Arch::Arch(ArchArgs args) : args(args) if (speed == nullptr) { log_error("Unsuported speed grade '%s'.\n", args.speed.c_str()); } + + IdString package_name; + IdString device_id; + for (unsigned int i = 0; i < db->num_partnumbers; i++) { + auto partnumber = &db->partnumber_packages[i]; + // std::cout << IdString(partnumber->name_id).str(this) << IdString(partnumber->package_id).str(this) << + // std::endl; + if (IdString(partnumber->name_id) == id(args.partnumber)) { + package_name = IdString(partnumber->package_id); + device_id = IdString(partnumber->device_id); + break; + } + } + 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)) { + if (IdString(var->name_id) == device_id) { variant = var; break; } } if (variant == nullptr) { - log_error("Unsuported device grade '%s'.\n", args.device.c_str()); + log_error("Unsuported device grade '%s'.\n", device_id.c_str(this)); } package = nullptr; 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)) { + if (IdString(pkg->name_id) == package_name) { package = pkg; break; } @@ -724,8 +738,9 @@ Arch::Arch(ArchArgs args) : args(args) // std::cout << IdString(pin.src_id).str(this) << " " << IdString(pin.dest_id).str(this) << std::endl; // } } + if (package == nullptr) { - log_error("Unsuported package '%s'.\n", args.package.c_str()); + log_error("Unsuported package '%s'.\n", package_name.c_str(this)); } // setup db char buf[32]; diff --git a/gowin/arch.h b/gowin/arch.h index 602c3db5..7513b93d 100644 --- a/gowin/arch.h +++ b/gowin/arch.h @@ -131,6 +131,12 @@ NPNR_PACKED_STRUCT(struct TimingClassPOD { RelPtr groups; }); +NPNR_PACKED_STRUCT(struct PartnumberPOD { + uint32_t name_id; + uint32_t package_id; + uint32_t device_id; +}); + NPNR_PACKED_STRUCT(struct PackagePOD { uint32_t name_id; uint32_t num_pins; @@ -153,6 +159,8 @@ NPNR_PACKED_STRUCT(struct DatabasePOD { RelPtr aliases; uint32_t num_speeds; RelPtr speeds; + uint32_t num_partnumbers; + RelPtr partnumber_packages; uint32_t num_variants; RelPtr variants; uint16_t num_constids; @@ -165,7 +173,7 @@ struct ArchArgs std::string device; std::string family; std::string speed; - std::string package; + std::string partnumber; // y = mx + c relationship between distance and delay for interconnect // delay estimates double delayScale = 0.4, delayOffset = 0.4; diff --git a/gowin/main.cc b/gowin/main.cc index a56cc8e8..51e65dfe 100644 --- a/gowin/main.cc +++ b/gowin/main.cc @@ -73,7 +73,7 @@ std::unique_ptr GowinCommandHandler::createContext(dict(new Context(chipArgs)); }