diff options
Diffstat (limited to 'machxo2/facade_import.py')
-rw-r--r-- | machxo2/facade_import.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/machxo2/facade_import.py b/machxo2/facade_import.py index 4a33c210..9a001e4e 100644 --- a/machxo2/facade_import.py +++ b/machxo2/facade_import.py @@ -25,6 +25,49 @@ def get_tiletype_index(name): tiletype_names[name] = idx return idx +def package_shortname(long_name, family): + if long_name.startswith("CABGA"): + if (family == "MachXO"): + return "B" + long_name[5:] + else: + return "BG" + long_name[5:] + elif long_name.startswith("CSBGA"): + if (family == "MachXO"): + return "M" + long_name[5:] + else: + return "MG" + long_name[5:] + elif long_name.startswith("CSFBGA"): + return "MG" + long_name[6:] + elif long_name.startswith("UCBGA"): + return "UMG" + long_name[5:] + elif long_name.startswith("FPBGA"): + return "FG" + long_name[5:] + elif long_name.startswith("FTBGA"): + if (family == "MachXO"): + return "FT" + long_name[5:] + else: + return "FTG" + long_name[5:] + elif long_name.startswith("WLCSP"): + if (family == "MachXO3D"): + return "UTG" + long_name[5:] + else: + return "UWG" + long_name[5:] + elif long_name.startswith("TQFP"): + if (family == "MachXO"): + return "T" + long_name[4:] + else: + return "TG" + long_name[4:] + elif long_name.startswith("QFN"): + if (family == "MachXO3D"): + return "SG" + long_name[3:] + else: + if long_name[3]=="8": + return "QN" + long_name[3:] + else: + return "SG" + long_name[3:] + else: + print("unknown package name " + long_name) + sys.exit(-1) constids = dict() @@ -42,17 +85,27 @@ class BinaryBlobAssembler: else: print("ref %s %s" % (name, comment)) + def r_slice(self, name, length, comment): + if comment is None: + print("ref %s" % (name,)) + else: + print("ref %s %s" % (name, comment)) + print ("u32 %d" % (length, )) + def s(self, s, comment): assert "|" not in s print("str |%s| %s" % (s, comment)) def u8(self, v, comment): + assert -128 <= int(v) <= 127 if comment is None: print("u8 %d" % (v,)) else: print("u8 %d %s" % (v, comment)) def u16(self, v, comment): + # is actually used as signed 16 bit + assert -32768 <= int(v) <= 32767 if comment is None: print("u16 %d" % (v,)) else: @@ -90,6 +143,14 @@ def get_bel_index(rg, loc, name): packages = {} pindata = [] +variants = {} + +def process_devices_db(family, device): + devicefile = path.join(database.get_db_root(), "devices.json") + with open(devicefile, 'r') as f: + devicedb = json.load(f) + for varname, vardata in sorted(devicedb["families"][family]["devices"][device]["variants"].items()): + variants[varname] = vardata def process_pio_db(rg, device): piofile = path.join(database.get_db_root(), dev_family[device], dev_names[device], "iodb.json") @@ -312,8 +373,28 @@ def write_database(dev_name, chip, rg, endianness): for tt, idx in sorted(tiletype_names.items(), key=lambda x: x[1]): bba.s(tt, "name") + for name, var_data in sorted(variants.items()): + bba.l("supported_packages_%s" % name, "PackageSupportedPOD") + for package in var_data["packages"]: + bba.s(package, "name") + bba.s(package_shortname(package, chip.info.family), "short_name") + bba.l("supported_speed_grades_%s" % name, "SpeedSupportedPOD") + for speed in var_data["speeds"]: + bba.u32(speed, "speed") + bba.l("supported_suffixes_%s" % name, "SuffixeSupportedPOD") + for suffix in var_data["suffixes"]: + bba.s(suffix, "suffix") + + bba.l("variant_data", "VariantInfoPOD") + for name, var_data in sorted(variants.items()): + bba.s(name, "variant_name") + bba.r_slice("supported_packages_%s" % name, len(var_data["packages"]), "supported_packages") + bba.r_slice("supported_speed_grades_%s" % name, len(var_data["speeds"]), "supported_speed_grades") + bba.r_slice("supported_suffixes_%s" % name, len(var_data["suffixes"]), "supported_suffixes") bba.l("chip_info") + bba.s(chip.info.family, "family") + bba.s(chip.info.name, "device_name") bba.u32(max_col + 1, "width") bba.u32(max_row + 1, "height") bba.u32((max_col + 1) * (max_row + 1), "num_tiles") @@ -326,6 +407,7 @@ def write_database(dev_name, chip, rg, endianness): bba.r("package_data", "package_info") bba.r("pio_info", "pio_info") bba.r("tiles_info", "tile_info") + bba.r_slice("variant_data", len(variants), "variant_info") bba.pop() @@ -386,6 +468,7 @@ def main(): max_row = chip.get_max_row() max_col = chip.get_max_col() process_pio_db(rg, args.device) + process_devices_db(chip.info.family, chip.info.name) bba = write_database(args.device, chip, rg, "le") |