| #!/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() |