From 0e8a2999bda012175c1734abbf4efb76b515746c Mon Sep 17 00:00:00 2001 From: YRabbit Date: Thu, 4 Nov 2021 18:55:00 +1000 Subject: gowin: Add partnumbers and packages to the chipdb Instead of parsing the partnumber with a regular expression, a simple table is used. This is done because the structure of the partnumber changes as new features appear (e.g., ES instead of C6/I5) This commit does not yet disable the very first regular expression check. Signed-off-by: YRabbit --- gowin/arch.cc | 23 +++++++++++++++++++---- gowin/arch.h | 10 +++++++++- gowin/main.cc | 2 +- 3 files changed, 29 insertions(+), 6 deletions(-) (limited to 'gowin') 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)); } -- cgit v1.2.3 From 74b4f6972878d90c6d5c22450dae535559edbea2 Mon Sep 17 00:00:00 2001 From: YRabbit Date: Fri, 5 Nov 2021 17:02:45 +1000 Subject: gowin: Use speed from chip base. Another simplification of the input regular expression, now the speed is taken from the base. Signed-off-by: YRabbit --- gowin/arch.cc | 39 +++++++++++++++++++++++++-------------- gowin/arch.h | 3 +-- gowin/main.cc | 5 +---- 3 files changed, 27 insertions(+), 20 deletions(-) (limited to 'gowin') diff --git a/gowin/arch.cc b/gowin/arch.cc index fe2cfde2..ca93c3ba 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -670,7 +670,6 @@ void Arch::addMuxBels(const DatabasePOD *db, int row, int col) Arch::Arch(ArchArgs args) : args(args) { family = args.family; - device = args.device; // Load database std::string chipdb = stringf("gowin/chipdb-%s.bin", family.c_str()); @@ -685,22 +684,11 @@ Arch::Arch(ArchArgs args) : args(args) for (size_t i = 0; i < db->num_ids; i++) { IdString::initialize_add(this, db->id_strs[i].get(), uint32_t(i) + db->num_constids); } - // setup timing info - speed = nullptr; - for (unsigned int i = 0; i < db->num_speeds; i++) { - const TimingClassPOD *tc = &db->speeds[i]; - // std::cout << IdString(tc->name_id).str(this) << std::endl; - if (IdString(tc->name_id) == id(args.speed)) { - speed = tc->groups.get(); - break; - } - } - if (speed == nullptr) { - log_error("Unsuported speed grade '%s'.\n", args.speed.c_str()); - } + // setup package IdString package_name; IdString device_id; + IdString speed_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) << @@ -708,9 +696,27 @@ Arch::Arch(ArchArgs args) : args(args) if (IdString(partnumber->name_id) == id(args.partnumber)) { package_name = IdString(partnumber->package_id); device_id = IdString(partnumber->device_id); + speed_id = IdString(partnumber->speed_id); + break; + } + } + if (package_name == IdString()) { + log_error("Unsuported partnumber '%s'.\n", args.partnumber.c_str()); + } + + // setup timing info + speed = nullptr; + for (unsigned int i = 0; i < db->num_speeds; i++) { + const TimingClassPOD *tc = &db->speeds[i]; + // std::cout << IdString(tc->name_id).str(this) << std::endl; + if (IdString(tc->name_id) == speed_id) { + speed = tc->groups.get(); break; } } + if (speed == nullptr) { + log_error("Unsuported speed grade '%s'.\n", speed_id.c_str(this)); + } const VariantPOD *variant = nullptr; for (unsigned int i = 0; i < db->num_variants; i++) { @@ -742,6 +748,11 @@ Arch::Arch(ArchArgs args) : args(args) if (package == nullptr) { log_error("Unsuported package '%s'.\n", package_name.c_str(this)); } + + // + log_info("Series:%s Device:%s Package:%s Speed:%s\n", family.c_str(), device_id.c_str(this), + package_name.c_str(this), speed_id.c_str(this)); + // setup db char buf[32]; // The reverse order of the enumeration simplifies the creation diff --git a/gowin/arch.h b/gowin/arch.h index 7513b93d..bf69ebe9 100644 --- a/gowin/arch.h +++ b/gowin/arch.h @@ -135,6 +135,7 @@ NPNR_PACKED_STRUCT(struct PartnumberPOD { uint32_t name_id; uint32_t package_id; uint32_t device_id; + uint32_t speed_id; }); NPNR_PACKED_STRUCT(struct PackagePOD { @@ -170,9 +171,7 @@ NPNR_PACKED_STRUCT(struct DatabasePOD { struct ArchArgs { - std::string device; std::string family; - std::string speed; std::string partnumber; // y = mx + c relationship between distance and delay for interconnect // delay estimates diff --git a/gowin/main.cc b/gowin/main.cc index 51e65dfe..c6697ecc 100644 --- a/gowin/main.cc +++ b/gowin/main.cc @@ -54,7 +54,7 @@ po::options_description GowinCommandHandler::getArchOptions() std::unique_ptr GowinCommandHandler::createContext(dict &values) { - std::regex devicere = std::regex("GW1N([A-Z]*)-(LV|UV|UX)([0-9])(C?)([A-Z]{2}[0-9]+)(C[0-9]/I[0-9])"); + std::regex devicere = std::regex("GW1N([A-Z]*)-(LV|UV|UX)([0-9])(C?).*"); std::smatch match; std::string device = vm["device"].as(); if (!std::regex_match(device, match, devicere)) { @@ -62,8 +62,6 @@ std::unique_ptr GowinCommandHandler::createContext(dict GowinCommandHandler::createContext(dict(new Context(chipArgs)); } -- cgit v1.2.3 From deb14762aadc9eda0610215849829f5957d7c71d Mon Sep 17 00:00:00 2001 From: YRabbit Date: Sun, 7 Nov 2021 09:05:34 +1000 Subject: gowin: Check the chipdb version Signed-off-by: YRabbit --- gowin/arch.cc | 6 +++++- gowin/arch.h | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'gowin') diff --git a/gowin/arch.cc b/gowin/arch.cc index ca93c3ba..6641df72 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -674,8 +674,12 @@ Arch::Arch(ArchArgs args) : args(args) // Load database std::string chipdb = stringf("gowin/chipdb-%s.bin", family.c_str()); auto db = reinterpret_cast(get_chipdb(chipdb)); - if (db == nullptr) + if (db == nullptr) { log_error("Failed to load chipdb '%s'\n", chipdb.c_str()); + } + if (db->version != chipdb_version) { + log_error("Incorrect chipdb version %u is used. Version %u is required\n", db->version, chipdb_version); + } if (db->family.get() != family) { log_error("Database is for family '%s' but provided device is family '%s'.\n", db->family.get(), family.c_str()); diff --git a/gowin/arch.h b/gowin/arch.h index bf69ebe9..aa751a4f 100644 --- a/gowin/arch.h +++ b/gowin/arch.h @@ -454,6 +454,8 @@ struct Arch : BaseArch bool cellsCompatible(const CellInfo **cells, int count) const; // start Z for the MUX2LUT5 bels int const mux_0_z = 10; + // chip db version + unsigned int const chipdb_version = 1; std::vector cell_types; -- cgit v1.2.3