blob: 6394f35944f02f4590ae0ab670be342f5871d570 [file] [log] [blame]
#!/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()