diff options
author | William D. Jones <thor0505@comcast.net> | 2020-12-04 00:55:38 -0500 |
---|---|---|
committer | gatecat <gatecat@ds0.me> | 2021-02-12 10:36:59 +0000 |
commit | 3d287adbcfb4f96a2cff1db06cff0057faf66f53 (patch) | |
tree | b0d01bcb079effd8858e205bc0f90544a3c6befd | |
parent | b739513894cedbc13c73150220f0ee8b09826464 (diff) | |
download | nextpnr-3d287adbcfb4f96a2cff1db06cff0057faf66f53.tar.gz nextpnr-3d287adbcfb4f96a2cff1db06cff0057faf66f53.tar.bz2 nextpnr-3d287adbcfb4f96a2cff1db06cff0057faf66f53.zip |
machxo2: Add package/IO info to facade_import.
-rw-r--r-- | machxo2/facade_import.py | 101 |
1 files changed, 99 insertions, 2 deletions
diff --git a/machxo2/facade_import.py b/machxo2/facade_import.py index 82c4963d..0f983013 100644 --- a/machxo2/facade_import.py +++ b/machxo2/facade_import.py @@ -2,6 +2,7 @@ import argparse import json import sys +from os import path tiletype_names = dict() @@ -75,6 +76,72 @@ class BinaryBlobAssembler: def pop(self): print("pop") +def get_bel_index(rg, loc, name): + tile = rg.tiles[loc] + idx = 0 + for bel in tile.bels: + if rg.to_str(bel.name) == name: + return idx + idx += 1 + # FIXME: I/O pins can be missing in various rows. Is there a nice way to + # assert on each device size? + return None + + +packages = {} +pindata = [] + +def process_pio_db(rg, device): + piofile = path.join(database.get_db_root(), "MachXO2", dev_names[device], "iodb.json") + with open(piofile, 'r') as f: + piodb = json.load(f) + for pkgname, pkgdata in sorted(piodb["packages"].items()): + pins = [] + for name, pinloc in sorted(pkgdata.items()): + x = pinloc["col"] + y = pinloc["row"] + if x == 0 or x == max_col: + # FIXME: Oversight in read_pinout.py. We use 0-based + # columns for 0 and max row, but we otherwise extract + # the names from the CSV, and... + loc = pytrellis.Location(x, y) + else: + # Lattice uses 1-based columns! + loc = pytrellis.Location(x - 1, y) + pio = "PIO" + pinloc["pio"] + bel_idx = get_bel_index(rg, loc, pio) + if bel_idx is not None: + pins.append((name, loc, bel_idx)) + packages[pkgname] = pins + for metaitem in piodb["pio_metadata"]: + x = metaitem["col"] + y = metaitem["row"] + if x == 0 or x == max_col: + loc = pytrellis.Location(x, y) + else: + loc = pytrellis.Location(x - 1, y) + pio = "PIO" + metaitem["pio"] + bank = metaitem["bank"] + if "function" in metaitem: + pinfunc = metaitem["function"] + else: + pinfunc = None + dqs = -1 + if "dqs" in metaitem: + pass + # tdqs = metaitem["dqs"] + # if tdqs[0] == "L": + # dqs = 0 + # elif tdqs[0] == "R": + # dqs = 2048 + # suffix_size = 0 + # while tdqs[-(suffix_size+1)].isdigit(): + # suffix_size += 1 + # dqs |= int(tdqs[-suffix_size:]) + bel_idx = get_bel_index(rg, loc, pio) + if bel_idx is not None: + pindata.append((loc, bel_idx, bank, pinfunc, dqs)) + def write_database(dev_name, chip, rg, endianness): def write_loc(loc, sym_name): bba.u16(loc.x, "%s.x" % sym_name) @@ -213,6 +280,33 @@ def write_database(dev_name, chip, rg, endianness): bba.u32(len(chip.get_tiles_by_position(y, x)), "num_tiles") bba.r("tile_info_%d_%d" % (x, y), "tile_names") + for package, pkgdata in sorted(packages.items()): + bba.l("package_data_%s" % package, "PackagePinPOD") + for pin in pkgdata: + name, loc, bel_idx = pin + bba.s(name, "name") + write_loc(loc, "abs_loc") + bba.u32(bel_idx, "bel_index") + + bba.l("package_data", "PackageInfoPOD") + for package, pkgdata in sorted(packages.items()): + bba.s(package, "name") + bba.u32(len(pkgdata), "num_pins") + bba.r("package_data_%s" % package, "pin_data") + + bba.l("pio_info", "PIOInfoPOD") + for pin in pindata: + loc, bel_idx, bank, func, dqs = pin + write_loc(loc, "abs_loc") + bba.u32(bel_idx, "bel_index") + if func is not None and func != "WRITEN": + bba.s(func, "function_name") + else: + bba.r(None, "function_name") + # TODO: io_grouping? + bba.u16(bank, "bank") + bba.u16(dqs, "dqsgroup") + bba.l("tiletype_names", "RelPtr<char>") for tt, idx in sorted(tiletype_names.items(), key=lambda x: x[1]): bba.s(tt, "name") @@ -222,12 +316,14 @@ def write_database(dev_name, chip, rg, endianness): bba.u32(max_col + 1, "width") bba.u32(max_row + 1, "height") bba.u32((max_col + 1) * (max_row + 1), "num_tiles") - bba.u32(0, "num_packages") # len(packages) - bba.u32(0, "num_pios") # len(pindata) + bba.u32(len(packages), "num_packages") + bba.u32(len(pindata), "num_pios") bba.u32(const_id_count, "const_id_count") bba.r("tiles", "tiles") bba.r("tiletype_names", "tiletype_names") + bba.r("package_data", "package_info") + bba.r("pio_info", "pio_info") bba.r("tiles_info", "tile_info") bba.pop() @@ -262,6 +358,7 @@ def main(): rg = pytrellis.make_optimized_chipdb(chip) max_row = chip.get_max_row() max_col = chip.get_max_col() + process_pio_db(rg, args.device) bba = write_database(args.device, chip, rg, "le") |