aboutsummaryrefslogtreecommitdiffstats
path: root/gowin/arch.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gowin/arch.cc')
-rw-r--r--gowin/arch.cc40
1 files changed, 33 insertions, 7 deletions
diff --git a/gowin/arch.cc b/gowin/arch.cc
index 3b91b817..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,37 +684,58 @@ 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 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) <<
+ // std::endl;
+ 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) == id(args.speed)) {
+ if (IdString(tc->name_id) == speed_id) {
speed = tc->groups.get();
break;
}
}
if (speed == nullptr) {
- log_error("Unsuported speed grade '%s'.\n", args.speed.c_str());
+ 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++) {
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,9 +744,15 @@ 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));
}
+
+ //
+ 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