mirror of https://github.com/openXC7/prjxray.git
Merge pull request #13 from SymbiFlow/next-clifford
Mostly BRAM, DSP, and Kintex stuff
This commit is contained in:
commit
f953c3ddbe
|
|
@ -8,6 +8,7 @@ import os, sys, json, re
|
||||||
|
|
||||||
tiles = list()
|
tiles = list()
|
||||||
site_baseaddr = dict()
|
site_baseaddr = dict()
|
||||||
|
tile_baseaddr = dict()
|
||||||
|
|
||||||
with open("tiles.txt") as f:
|
with open("tiles.txt") as f:
|
||||||
for line in f:
|
for line in f:
|
||||||
|
|
@ -49,31 +50,119 @@ for record in tiles:
|
||||||
framebaseaddr = site_baseaddr[site_name]
|
framebaseaddr = site_baseaddr[site_name]
|
||||||
database["tiles"][tile_name]["sites"][site_name] = site_type
|
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", "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
|
segment_name = "SEG_" + tile_name
|
||||||
segtype = tile_type.lower()
|
segtype = tile_type.lower()
|
||||||
|
|
||||||
database["segments"][segment_name] = dict()
|
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]["type"] = segtype
|
||||||
database["segments"][segment_name]["frames"] = 36
|
database["segments"][segment_name]["frames"] = 36
|
||||||
database["segments"][segment_name]["words"] = 2
|
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"][tile_name]["segment"] = segment_name
|
||||||
|
database["tiles"][int_tile_name]["segment"] = segment_name
|
||||||
|
|
||||||
if tile_type in ["HCLK_L", "HCLK_R"]:
|
if tile_type in ["HCLK_L", "HCLK_R"]:
|
||||||
segment_name = "SEG_" + tile_name
|
segment_name = "SEG_" + tile_name
|
||||||
segtype = tile_type.lower()
|
segtype = tile_type.lower()
|
||||||
|
|
||||||
database["segments"][segment_name] = dict()
|
database["segments"][segment_name] = dict()
|
||||||
database["segments"][segment_name]["tiles"] = [tile_name]
|
database["segments"][segment_name]["tiles"] = [tile_name]
|
||||||
database["segments"][segment_name]["type"] = segtype
|
database["segments"][segment_name]["type"] = segtype
|
||||||
database["segments"][segment_name]["frames"] = 36
|
database["segments"][segment_name]["frames"] = 26
|
||||||
database["segments"][segment_name]["words"] = 1
|
database["segments"][segment_name]["words"] = 1
|
||||||
database["tiles"][tile_name]["segment"] = segment_name
|
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()
|
start_segments = list()
|
||||||
|
|
||||||
|
|
@ -83,52 +172,20 @@ for segment_name in database["segments"].keys():
|
||||||
|
|
||||||
for segment_name in start_segments:
|
for segment_name in start_segments:
|
||||||
framebase, wordbase = database["segments"][segment_name]["baseaddr"]
|
framebase, wordbase = database["segments"][segment_name]["baseaddr"]
|
||||||
clbtile = [tile for tile in database["segments"][segment_name]["tiles"] if tile.startswith("CLBL")][0]
|
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"][clbtile]["grid_x"]
|
grid_x = database["tiles"][inttile]["grid_x"]
|
||||||
grid_y = database["tiles"][clbtile]["grid_y"]
|
grid_y = database["tiles"][inttile]["grid_y"]
|
||||||
|
|
||||||
for i in range(49):
|
for i in range(50):
|
||||||
while True:
|
grid_y -= 1
|
||||||
grid_y -= 1
|
|
||||||
clbtile = tiles_by_grid[(grid_x, grid_y)]
|
|
||||||
if clbtile.startswith("CLBL"): break
|
|
||||||
|
|
||||||
wordbase += 2
|
if wordbase == 50:
|
||||||
if wordbase == 50: wordbase += 1
|
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
|
|
||||||
else:
|
else:
|
||||||
grid_x -= 1
|
wordbase += 2
|
||||||
|
|
||||||
inttile = tiles_by_grid[(grid_x, grid_y)]
|
segname = database["tiles"][tiles_by_grid[(grid_x, grid_y)]]["segment"]
|
||||||
assert inttile.startswith("INT_")
|
database["segments"][segname]["baseaddr"] = [framebase, wordbase]
|
||||||
|
|
||||||
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]
|
|
||||||
|
|
||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ set_property CONFIG_VOLTAGE 3.3 [current_design]
|
||||||
set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]
|
set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]
|
||||||
|
|
||||||
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF]
|
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF]
|
||||||
|
set_param tcl.collectionResultDisplayLimit 0
|
||||||
|
|
||||||
source ../../../utils/utils.tcl
|
source ../../../utils/utils.tcl
|
||||||
randplace_pblock 100 roi
|
randplace_pblock 100 roi
|
||||||
|
|
|
||||||
|
|
@ -258,6 +258,12 @@ with out_open("index.html") as f:
|
||||||
if tiledata["type"] in ["CLBLM_L", "CLBLM_R"]: bgcolor="#ffaaaa"
|
if tiledata["type"] in ["CLBLM_L", "CLBLM_R"]: bgcolor="#ffaaaa"
|
||||||
if tiledata["type"] in ["HCLK_L", "HCLK_R"]: bgcolor="#aaffaa"
|
if tiledata["type"] in ["HCLK_L", "HCLK_R"]: bgcolor="#aaffaa"
|
||||||
|
|
||||||
|
if tiledata["type"] in ["BRAM_INT_INTERFACE_L", "BRAM_L"]: bgcolor="#aaffff"
|
||||||
|
if tiledata["type"] in ["BRAM_INT_INTERFACE_R", "BRAM_R"]: bgcolor="#aaffff"
|
||||||
|
|
||||||
|
if tiledata["type"] in ["INT_INTERFACE_L", "DSP_L"]: bgcolor="#ffaaff"
|
||||||
|
if tiledata["type"] in ["INT_INTERFACE_R", "DSP_R"]: bgcolor="#ffaaff"
|
||||||
|
|
||||||
title = [tilename]
|
title = [tilename]
|
||||||
|
|
||||||
if "segment" in tiledata:
|
if "segment" in tiledata:
|
||||||
|
|
@ -276,6 +282,10 @@ with out_open("index.html") as f:
|
||||||
else:
|
else:
|
||||||
print("Warning: no baseaddr in segment %s (via tile %s)." % (tiledata["segment"], tilename))
|
print("Warning: no baseaddr in segment %s (via tile %s)." % (tiledata["segment"], tilename))
|
||||||
|
|
||||||
|
tilename = tilename.replace("INT_INTERFACE_", "INTF_")
|
||||||
|
tilename = tilename.replace("_X", "<br/>X")
|
||||||
|
tilename = tilename.replace("B_TERM", "B<br/>TERM")
|
||||||
|
|
||||||
print("<td bgcolor=\"%s\" align=\"center\" title=\"%s\"><span style=\"font-size:10px\">" % (bgcolor, "\n".join(title)), file=f)
|
print("<td bgcolor=\"%s\" align=\"center\" title=\"%s\"><span style=\"font-size:10px\">" % (bgcolor, "\n".join(title)), file=f)
|
||||||
if "segment" in tiledata:
|
if "segment" in tiledata:
|
||||||
segtype = segdata["type"].lower()
|
segtype = segdata["type"].lower()
|
||||||
|
|
|
||||||
|
|
@ -32,10 +32,14 @@ zero_db = [
|
||||||
]
|
]
|
||||||
|
|
||||||
def add_zero_bits(tile_type):
|
def add_zero_bits(tile_type):
|
||||||
assert os.getenv("XRAY_DATABASE") == "artix7"
|
assert os.getenv("XRAY_DATABASE") in ["artix7", "kintex7"]
|
||||||
dbfile = "%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), tile_type)
|
dbfile = "%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), tile_type)
|
||||||
new_lines = set()
|
new_lines = set()
|
||||||
llast = None
|
llast = None
|
||||||
|
|
||||||
|
if not os.path.exists(dbfile):
|
||||||
|
return
|
||||||
|
|
||||||
with open(dbfile, "r") as f:
|
with open(dbfile, "r") as f:
|
||||||
for line in f:
|
for line in f:
|
||||||
# Hack: skip duplicate lines
|
# Hack: skip duplicate lines
|
||||||
|
|
@ -75,26 +79,39 @@ def add_zero_bits(tile_type):
|
||||||
bits.add("!" + bit)
|
bits.add("!" + bit)
|
||||||
new_lines.add(" ".join([tag] + sorted(bits)))
|
new_lines.add(" ".join([tag] + sorted(bits)))
|
||||||
llast = line
|
llast = line
|
||||||
|
|
||||||
with open(dbfile, "w") as f:
|
with open(dbfile, "w") as f:
|
||||||
for line in sorted(new_lines):
|
for line in sorted(new_lines):
|
||||||
print(line, file=f)
|
print(line, file=f)
|
||||||
|
|
||||||
def update_mask(mask_db, *src_dbs):
|
def update_mask(mask_db, *src_dbs):
|
||||||
bits = set()
|
bits = set()
|
||||||
with open("%s/%s/mask_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), mask_db), "r") as f:
|
mask_db_file = "%s/%s/mask_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), mask_db)
|
||||||
|
|
||||||
|
if not os.path.exists(mask_db_file):
|
||||||
|
return
|
||||||
|
|
||||||
|
with open(mask_db_file, "r") as f:
|
||||||
for line in f:
|
for line in f:
|
||||||
line = line.split()
|
line = line.split()
|
||||||
assert len(line) == 2
|
assert len(line) == 2
|
||||||
assert line[0] == "bit"
|
assert line[0] == "bit"
|
||||||
bits.add(line[1])
|
bits.add(line[1])
|
||||||
|
|
||||||
for src_db in src_dbs:
|
for src_db in src_dbs:
|
||||||
with open("%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), src_db), "r") as f:
|
seg_db_file = "%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), src_db)
|
||||||
|
|
||||||
|
if not os.path.exists(seg_db_file):
|
||||||
|
continue
|
||||||
|
|
||||||
|
with open(seg_db_file, "r") as f:
|
||||||
for line in f:
|
for line in f:
|
||||||
line = line.split()
|
line = line.split()
|
||||||
for bit in line[1:]:
|
for bit in line[1:]:
|
||||||
if bit[0] != "!":
|
if bit[0] != "!":
|
||||||
bits.add(bit)
|
bits.add(bit)
|
||||||
with open("%s/%s/mask_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), mask_db), "w") as f:
|
|
||||||
|
with open(mask_db_file, "w") as f:
|
||||||
for bit in sorted(bits):
|
for bit in sorted(bits):
|
||||||
print("bit %s" % bit, file=f)
|
print("bit %s" % bit, file=f)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ case "$1" in
|
||||||
esac
|
esac
|
||||||
|
|
||||||
touch "$db"
|
touch "$db"
|
||||||
sort -u "$tmp1" "$db" | grep -v '<.*>' > "$tmp2"
|
sort -u "$tmp1" "$db" | grep -v '<.*>' > "$tmp2" || true
|
||||||
mv "$tmp2" "$db"
|
mv "$tmp2" "$db"
|
||||||
rm -f "$tmp1"
|
rm -f "$tmp1"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue