blob: 76d6b39cd0df69203ec1e1143f77d35adc1c9eb2 [file] [log] [blame]
#!/usr/bin/env python3
import os, sys, json, re
#######################################
# Read
tiles = list()
site_baseaddr = dict()
tile_baseaddr = dict()
with open("tiles.txt") as f:
for line in f:
tiles.append(line.split())
for arg in sys.argv[1:]:
with open(arg) as f:
line = f.read().strip()
site = arg[7:-6]
frame = int(line[5:5 + 8], 16)
site_baseaddr[site] = "0x%08x" % (frame & ~0x7f)
#######################################
# Create initial database
database = dict()
database["tiles"] = dict()
database["segments"] = dict()
tiles_by_grid = dict()
for record in tiles:
tile_type, tile_name, grid_x, grid_y = record[0:4]
grid_x, grid_y = int(grid_x), int(grid_y)
tiles_by_grid[(grid_x, grid_y)] = tile_name
framebaseaddr = None
database["tiles"][tile_name] = {
"type": tile_type,
"sites": dict(),
"grid_x": grid_x,
"grid_y": grid_y
}
if len(record) > 4:
for i in range(4, len(record), 2):
site_type, site_name = record[i:i + 2]
if site_name in site_baseaddr:
framebaseaddr = site_baseaddr[site_name]
database["tiles"][tile_name]["sites"][site_name] = site_type
if framebaseaddr is not None:
tile_baseaddr[tile_name] = [framebaseaddr, 0]
#######################################
# Add Segments
for tile_name, tile_data in database["tiles"].items():
tile_type = tile_data["type"]
grid_x = tile_data["grid_x"]
grid_y = tile_data["grid_y"]
if tile_type in ["CLBLL_L", "CLBLL_R", "CLBLM_L", "CLBLM_R"]:
if tile_type in ["CLBLL_L", "CLBLM_L"]:
int_tile_name = tiles_by_grid[(grid_x + 1, grid_y)]
else:
int_tile_name = tiles_by_grid[(grid_x - 1, grid_y)]
segment_name = "SEG_" + tile_name
segtype = tile_type.lower()
database["segments"][segment_name] = dict()
database["segments"][segment_name]["tiles"] = [
tile_name, int_tile_name
]
database["segments"][segment_name]["type"] = segtype
database["segments"][segment_name]["frames"] = 36
database["segments"][segment_name]["words"] = 2
if tile_name in tile_baseaddr:
database["segments"][segment_name]["baseaddr"] = tile_baseaddr[
tile_name]
database["tiles"][tile_name]["segment"] = segment_name
database["tiles"][int_tile_name]["segment"] = segment_name
if tile_type in ["HCLK_L", "HCLK_R"]:
segment_name = "SEG_" + tile_name
segtype = tile_type.lower()
database["segments"][segment_name] = dict()
database["segments"][segment_name]["tiles"] = [tile_name]
database["segments"][segment_name]["type"] = segtype
database["segments"][segment_name]["frames"] = 26
database["segments"][segment_name]["words"] = 1
database["tiles"][tile_name]["segment"] = segment_name
if tile_type in ["BRAM_L", "DSP_L", "BRAM_R", "DSP_R"]:
for k in range(5):
if tile_type in ["BRAM_L", "DSP_L"]:
interface_tile_name = tiles_by_grid[(grid_x + 1, grid_y - k)]
int_tile_name = tiles_by_grid[(grid_x + 2, grid_y - k)]
else:
interface_tile_name = tiles_by_grid[(grid_x - 1, grid_y - k)]
int_tile_name = tiles_by_grid[(grid_x - 2, grid_y - k)]
segment_name = "SEG_" + tile_name.replace("_", "%d_" % k, 1)
segtype = tile_type.lower().replace("_", "%d_" % k, 1)
database["segments"][segment_name] = dict()
database["segments"][segment_name]["type"] = segtype
database["segments"][segment_name]["frames"] = 28
database["segments"][segment_name]["words"] = 2
if k == 0:
database["segments"][segment_name]["tiles"] = [
tile_name, interface_tile_name, int_tile_name
]
database["tiles"][tile_name]["segment"] = segment_name
database["tiles"][interface_tile_name][
"segment"] = segment_name
database["tiles"][int_tile_name]["segment"] = segment_name
else:
database["segments"][segment_name]["tiles"] = [
interface_tile_name, int_tile_name
]
database["tiles"][interface_tile_name][
"segment"] = segment_name
database["tiles"][int_tile_name]["segment"] = segment_name
#######################################
# Populate segment base addresses: L/R along INT column
for segment_name in database["segments"].keys():
if "baseaddr" in database["segments"][segment_name]:
framebase, wordbase = database["segments"][segment_name]["baseaddr"]
inttile = [
tile for tile in database["segments"][segment_name]["tiles"]
if database["tiles"][tile]["type"] in ["INT_L", "INT_R"]
][0]
grid_x = database["tiles"][inttile]["grid_x"]
grid_y = database["tiles"][inttile]["grid_y"]
if database["tiles"][inttile]["type"] == "INT_L":
grid_x += 1
framebase = "0x%08x" % (int(framebase, 16) + 0x80)
else:
grid_x -= 1
framebase = "0x%08x" % (int(framebase, 16) - 0x80)
if (grid_x, grid_y) not in tiles_by_grid:
continue
tile = tiles_by_grid[(grid_x, grid_y)]
if database["tiles"][inttile]["type"] == "INT_L":
assert database["tiles"][tile]["type"] == "INT_R"
elif database["tiles"][inttile]["type"] == "INT_R":
assert database["tiles"][tile]["type"] == "INT_L"
else:
assert 0
assert "segment" in database["tiles"][tile]
seg = database["tiles"][tile]["segment"]
if "baseaddr" in database["segments"][seg]:
assert database["segments"][seg]["baseaddr"] == [
framebase, wordbase
]
else:
database["segments"][seg]["baseaddr"] = [framebase, wordbase]
#######################################
# Populate segment base addresses: Up along INT/HCLK columns
start_segments = list()
for segment_name in database["segments"].keys():
if "baseaddr" in database["segments"][segment_name]:
start_segments.append(segment_name)
for segment_name in start_segments:
framebase, wordbase = database["segments"][segment_name]["baseaddr"]
inttile = [
tile for tile in database["segments"][segment_name]["tiles"]
if database["tiles"][tile]["type"] in ["INT_L", "INT_R"]
][0]
grid_x = database["tiles"][inttile]["grid_x"]
grid_y = database["tiles"][inttile]["grid_y"]
for i in range(50):
grid_y -= 1
if wordbase == 50:
wordbase += 1
else:
wordbase += 2
segname = database["tiles"][tiles_by_grid[(grid_x, grid_y)]]["segment"]
database["segments"][segname]["baseaddr"] = [framebase, wordbase]
#######################################
# Transfer segment data into tiles
for segment_name in database["segments"].keys():
baseaddr, offset = database["segments"][segment_name]["baseaddr"]
for tile_name in database["segments"][segment_name]["tiles"]:
tile_type = database["tiles"][tile_name]["type"]
if tile_type in ["CLBLL_L", "CLBLL_R", "CLBLM_L", "CLBLM_R", "INT_L",
"INT_R"]:
database["tiles"][tile_name]["baseaddr"] = baseaddr
database["tiles"][tile_name]["offset"] = offset
database["tiles"][tile_name]["height"] = 2
elif tile_type in ["HCLK_L", "HCLK_R"]:
database["tiles"][tile_name]["baseaddr"] = baseaddr
database["tiles"][tile_name]["offset"] = offset
database["tiles"][tile_name]["height"] = 1
elif tile_type in ["BRAM_L", "BRAM_R", "DSP_L", "DSP_R"]:
database["tiles"][tile_name]["baseaddr"] = baseaddr
database["tiles"][tile_name]["offset"] = offset
database["tiles"][tile_name]["height"] = 10
elif tile_type in ["INT_INTERFACE_L", "INT_INTERFACE_R",
"BRAM_INT_INTERFACE_L", "BRAM_INT_INTERFACE_R"]:
continue
else:
# print(tile_type, offset)
assert False
database = database["tiles"]
for tiledata in database.values():
if "segment" in tiledata:
del tiledata["segment"]
#######################################
# Write
print(json.dumps(database, sort_keys=True, indent="\t"))