mirror of https://github.com/openXC7/prjxray.git
Add tilegrid BRAM and DSP segment support
Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
parent
c04f33ff3a
commit
206364020c
|
|
@ -8,6 +8,7 @@ import os, sys, json, re
|
|||
|
||||
tiles = list()
|
||||
site_baseaddr = dict()
|
||||
tile_baseaddr = dict()
|
||||
|
||||
with open("tiles.txt") as f:
|
||||
for line in f:
|
||||
|
|
@ -49,21 +50,43 @@ for record in tiles:
|
|||
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]
|
||||
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 framebaseaddr is not None:
|
||||
database["segments"][segment_name]["baseaddr"] = [framebaseaddr, 0]
|
||||
|
||||
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
|
||||
|
|
@ -71,9 +94,75 @@ for record in tiles:
|
|||
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"] = 1
|
||||
|
||||
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
|
||||
|
||||
|
||||
#######################################
|
||||
# Pupulate segment base addresses
|
||||
# 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()
|
||||
|
||||
|
|
@ -83,52 +172,20 @@ for segment_name in database["segments"].keys():
|
|||
|
||||
for segment_name in start_segments:
|
||||
framebase, wordbase = database["segments"][segment_name]["baseaddr"]
|
||||
clbtile = [tile for tile in database["segments"][segment_name]["tiles"] if tile.startswith("CLBL")][0]
|
||||
grid_x = database["tiles"][clbtile]["grid_x"]
|
||||
grid_y = database["tiles"][clbtile]["grid_y"]
|
||||
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(49):
|
||||
while True:
|
||||
grid_y -= 1
|
||||
clbtile = tiles_by_grid[(grid_x, grid_y)]
|
||||
if clbtile.startswith("CLBL"): break
|
||||
for i in range(50):
|
||||
grid_y -= 1
|
||||
|
||||
wordbase += 2
|
||||
if wordbase == 50: wordbase += 1
|
||||
|
||||
segname = database["tiles"][clbtile]["segment"]
|
||||
database["segments"][segname]["baseaddr"] = [framebase, wordbase]
|
||||
|
||||
|
||||
#######################################
|
||||
# Add INT tiles to segments
|
||||
|
||||
for segment_name in database["segments"].keys():
|
||||
for clbtile in database["segments"][segment_name]["tiles"]:
|
||||
if not clbtile.startswith("CLBL"):
|
||||
continue
|
||||
|
||||
grid_x = database["tiles"][clbtile]["grid_x"]
|
||||
grid_y = database["tiles"][clbtile]["grid_y"]
|
||||
|
||||
if database["tiles"][clbtile]["type"] in ["CLBLL_L", "CLBLM_L"]:
|
||||
grid_x += 1
|
||||
if wordbase == 50:
|
||||
wordbase += 1
|
||||
else:
|
||||
grid_x -= 1
|
||||
wordbase += 2
|
||||
|
||||
inttile = tiles_by_grid[(grid_x, grid_y)]
|
||||
assert inttile.startswith("INT_")
|
||||
|
||||
database["tiles"][inttile]["segment"] = segment_name
|
||||
s = set(database["segments"][segment_name]["tiles"] + [inttile])
|
||||
database["segments"][segment_name]["tiles"] = list(sorted(s))
|
||||
|
||||
if inttile.endswith("25") or inttile.endswith("75"):
|
||||
clktile = tiles_by_grid[(grid_x, grid_y+1)]
|
||||
assert clktile.startswith("HCLK_")
|
||||
clkseg = database["tiles"][clktile]["segment"]
|
||||
framebase, wordbase = database["segments"][segment_name]["baseaddr"]
|
||||
database["segments"][clkseg]["baseaddr"] = [framebase, wordbase-1]
|
||||
segname = database["tiles"][tiles_by_grid[(grid_x, grid_y)]]["segment"]
|
||||
database["segments"][segname]["baseaddr"] = [framebase, wordbase]
|
||||
|
||||
|
||||
#######################################
|
||||
|
|
|
|||
Loading…
Reference in New Issue