#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Copyright (C) 2017-2020 The Project X-Ray Authors. # # Use of this source code is governed by a ISC-style # license that can be found in the LICENSE file or at # https://opensource.org/licenses/ISC # # SPDX-License-Identifier: ISC import sys import json import re def main(): db_tiles = set() db_tile_prop = dict() db_tile_sites = dict() db_sites = set() db_site_prop = dict() db_site_tile = dict() db_site_bit = dict() def add_tile(tile): if tile not in db_tiles: db_tiles.add(tile) db_tile_prop[tile] = dict() db_tile_sites[tile] = list() def add_site(site): if site not in db_sites: db_sites.add(site) db_site_prop[site] = dict() with open("%s.txt" % sys.argv[1]) as f: for line in f: line = line.split() if line[0] == "TILEPROP": add_tile(line[1]) db_tile_prop[line[1]][line[2]] = " ".join(line[3:]) continue if line[0] == "TILESITE": add_tile(line[1]) add_site(line[2]) db_tile_sites[line[1]].append(line[2]) db_site_tile[line[2]] = line[1] continue if line[0] == "SITEPROP": add_site(line[1]) db_site_prop[line[1]][line[2]] = " ".join(line[3:]) continue if line[0] == "SLICEBIT": db_site_bit[line[1]] = line[2] continue assert False print("Number of tiles: %d" % len(db_tiles)) print("Number of sites: %d" % len(db_sites)) print("Number of sites with bit: %d" % len(db_site_bit)) database = dict() loc_to_tile = dict() database["device"] = sys.argv[2] database["tiles"] = dict() for tile in db_tiles: entry = dict() entry["props"] = db_tile_prop[tile] entry["sites"] = db_tile_sites[tile] database["tiles"][tile] = entry col = int(db_tile_prop[tile]["COLUMN"]) row = int(db_tile_prop[tile]["ROW"]) loc_to_tile[(col, row)] = tile database["sites"] = dict() for site in db_sites: entry = dict() entry["props"] = db_site_prop[site] entry["tile"] = db_site_tile[site] database["sites"][site] = entry for site, bit in db_site_bit.items(): bit = bit.split("_") bit_type = int(bit[4][1:]) bit_half = int(bit[5][1:]) bit_row = int(bit[6][1:]) bit_col = int(bit[7][1:]) bit_word = int(bit[9][1:]) assert len(bit) == 11 for i in range(50): m = re.match("(.*)Y([0-9]+)", site) this_site = "%sY%d" % (m.group(1), int(m.group(2)) + i) tile = db_site_tile[this_site] word = bit_word + 2 * i if word >= 50: word += 1 entry = dict() entry["BASE_FRAMEID"] = "0x%08x" % ( (bit_type << 23) | (bit_half << 22) | (bit_row << 17) | (bit_col << 7)) entry["FRAME_TYPE"] = bit_type entry["FRAME_HALF"] = bit_half entry["FRAME_ROW"] = bit_row entry["FRAME_COLUMN"] = bit_col entry["WORDS"] = [word, word + 1] database["tiles"][tile]["cfgcol"] = entry if database["tiles"][tile]["props"]["TILE_TYPE"] in ("CLBLL_L", "CLBLM_L"): col = int(db_tile_prop[tile]["COLUMN"]) row = int(db_tile_prop[tile]["ROW"]) right_tile = loc_to_tile[(col + 1, row)] database["tiles"][right_tile]["cfgcol"] = entry if database["tiles"][tile]["props"]["TILE_TYPE"] in ("CLBLL_R", "CLBLM_R"): col = int(db_tile_prop[tile]["COLUMN"]) row = int(db_tile_prop[tile]["ROW"]) left_tile = loc_to_tile[(col - 1, row)] database["tiles"][left_tile]["cfgcol"] = entry tile_cfgcol_count = 0 cfgcols = set() for tile in db_tiles: if "cfgcol" in database["tiles"][tile]: cfgcols.add(database["tiles"][tile]["cfgcol"]["BASE_FRAMEID"]) tile_cfgcol_count += 1 print("Number of assigned columns: %d" % len(cfgcols)) print("Number of tiles with assigned column: %d" % tile_cfgcol_count) with open("%s.json" % sys.argv[1], "w") as f: print(json.dumps(database, sort_keys=True, indent="\t"), file=f) if __name__ == "__main__": main()