aboutsummaryrefslogtreecommitdiffstats
path: root/machxo2/facade_import.py
diff options
context:
space:
mode:
Diffstat (limited to 'machxo2/facade_import.py')
-rw-r--r--machxo2/facade_import.py83
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")