mirror of https://github.com/openXC7/prjxray.git
Big htmlgen.py rewrite for new tilegrid fromat
Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
parent
78c8f6b4ce
commit
8325eb0aae
|
|
@ -147,13 +147,12 @@ class UnionFind:
|
|||
# Loading Raw Source Data
|
||||
|
||||
grid = None
|
||||
segbits = dict()
|
||||
segbits_r = dict()
|
||||
segframes = dict()
|
||||
segtiles = dict()
|
||||
cfgbits = dict()
|
||||
cfgbits_r = dict()
|
||||
maskbits = dict()
|
||||
ppips = dict()
|
||||
routebits = dict()
|
||||
routezbits = dict()
|
||||
maskbits = dict()
|
||||
|
||||
print("Loading tilegrid.")
|
||||
with db_open("tilegrid.json") as f:
|
||||
|
|
@ -169,66 +168,89 @@ with db_open("tilegrid.json") as f:
|
|||
else:
|
||||
grid = json.loads(data)
|
||||
|
||||
for segname, segdata in grid["segments"].items():
|
||||
segtype = segdata["type"].lower()
|
||||
def db_read(tiletype):
|
||||
cfgbits[tiletype] = dict()
|
||||
cfgbits_r[tiletype] = dict()
|
||||
maskbits[tiletype] = set()
|
||||
ppips[tiletype] = dict()
|
||||
routebits[tiletype] = dict()
|
||||
routezbits[tiletype] = dict()
|
||||
|
||||
if segtype not in segbits:
|
||||
print("Loading data for %s segments:" % segtype)
|
||||
def add_pip_bits(tag, bits):
|
||||
if tag not in routebits[tiletype]:
|
||||
routebits[tiletype][tag] = set()
|
||||
routezbits[tiletype][tag] = set()
|
||||
for bit in bits:
|
||||
if bit[0] == "!":
|
||||
if bit[1:] not in routezbits[tiletype]:
|
||||
routezbits[tiletype][bit[1:]] = set()
|
||||
routezbits[tiletype][bit[1:]].add(tag)
|
||||
else:
|
||||
if bit not in routebits[tiletype]:
|
||||
routebits[tiletype][bit] = set()
|
||||
routebits[tiletype][bit].add(tag)
|
||||
|
||||
segbits[segtype] = dict()
|
||||
segbits_r[segtype] = dict()
|
||||
routebits[segtype] = dict()
|
||||
routezbits[segtype] = dict()
|
||||
maskbits[segtype] = set()
|
||||
segframes[segtype] = segdata["frames"]
|
||||
def add_cfg_bits(tag, bits):
|
||||
if tag not in cfgbits[tiletype]:
|
||||
cfgbits[tiletype][tag] = set()
|
||||
for bit in bits:
|
||||
cfgbits[tiletype][tag].add(bit)
|
||||
if bit not in cfgbits_r[tiletype]:
|
||||
cfgbits_r[tiletype][bit] = set()
|
||||
cfgbits_r[tiletype][bit].add(tag)
|
||||
|
||||
segtiles[segtype] = set()
|
||||
for t in segdata["tiles"]:
|
||||
segtiles[segtype].add(grid["tiles"][t]["type"])
|
||||
with db_open("segbits_%s.db" % tiletype) as f:
|
||||
for line in f:
|
||||
line = line.split()
|
||||
tag, bits = line[0], line[1:]
|
||||
|
||||
def add_pip_bits(line):
|
||||
bit_name, *bit_pos = line.split()
|
||||
for bit in bit_pos:
|
||||
if bit[0] == "!":
|
||||
if bit[1:] not in routezbits[segtype]:
|
||||
routezbits[segtype][bit[1:]] = set()
|
||||
routezbits[segtype][bit[1:]].add(bit_name)
|
||||
else:
|
||||
if bit not in routebits[segtype]:
|
||||
routebits[segtype][bit] = set()
|
||||
routebits[segtype][bit].add(bit_name)
|
||||
if tiletype in ["int_l", "int_r", "hclk_l", "hclk_r"]:
|
||||
add_pip_bits(tag, bits)
|
||||
|
||||
def add_single_bit(line):
|
||||
bit_name, bit_pos = line.split()
|
||||
assert bit_pos[0] != "!"
|
||||
segbits[segtype][bit_name] = bit_pos
|
||||
segbits_r[segtype][bit_pos] = bit_name
|
||||
elif tiletype in ["clbll_l", "clbll_r", "clblm_l", "clblm_r"] and \
|
||||
re.search(r"(\.[ABCD]MUX\.)|(\.PRECYINIT\.)", tag):
|
||||
add_pip_bits(tag, bits)
|
||||
|
||||
if segtype not in ["hclk_l", "hclk_r"]:
|
||||
print(" loading %s segbits." % segtype)
|
||||
with db_open("segbits_%s.db" % segtype) as f:
|
||||
else:
|
||||
add_cfg_bits(tag, bits)
|
||||
|
||||
with db_open("ppips_%s.db" % tiletype) as f:
|
||||
for line in f:
|
||||
tag, typ = line.split()
|
||||
ppips[tiletype][tag] = typ
|
||||
|
||||
if tiletype not in ["int_l", "int_r"]:
|
||||
with db_open("mask_%s.db" % tiletype) as f:
|
||||
for line in f:
|
||||
tag, bit = line.split()
|
||||
assert tag == "bit"
|
||||
maskbits[tiletype].add(bit)
|
||||
else:
|
||||
for t in ["clbll_l", "clbll_r", "clblm_l", "clblm_r", "dsp_l", "dsp_r", "bram_l", "bram_r"]:
|
||||
with db_open("mask_%s.db" % t) as f:
|
||||
for line in f:
|
||||
if re.search(r"(\.[ABCD]MUX\.)|(\.PRECYINIT\.)", line):
|
||||
add_pip_bits(line)
|
||||
else:
|
||||
add_single_bit(line)
|
||||
tag, bit = line.split()
|
||||
assert tag == "bit"
|
||||
frameidx, bitidx = bit.split("_")
|
||||
maskbits[tiletype].add("%02d_%02d" % (int(frameidx), int(bitidx) % 64))
|
||||
|
||||
int_tile_type = re.sub("clbl[lm]|bram[0-4]|dsp[0-4]", "int", segtype)
|
||||
db_read("int_l")
|
||||
db_read("int_r")
|
||||
|
||||
print(" loading %s segbits." % int_tile_type)
|
||||
with db_open("segbits_%s.db" % int_tile_type) as f:
|
||||
for line in f:
|
||||
if segtype in ["hclk_l", "hclk_r"
|
||||
] and ".ENABLE_BUFFER." in line:
|
||||
add_single_bit(line)
|
||||
else:
|
||||
add_pip_bits(line)
|
||||
db_read("hclk_l")
|
||||
db_read("hclk_r")
|
||||
|
||||
print(" loading %s maskbits." % segtype)
|
||||
with db_open("mask_%s.db" % segtype) as f:
|
||||
for line in f:
|
||||
_, bit = line.split()
|
||||
maskbits[segtype].add(bit)
|
||||
db_read("clbll_l")
|
||||
db_read("clbll_r")
|
||||
|
||||
db_read("clblm_l")
|
||||
db_read("clblm_r")
|
||||
|
||||
db_read("dsp_l")
|
||||
db_read("dsp_r")
|
||||
|
||||
db_read("bram_l")
|
||||
db_read("bram_r")
|
||||
|
||||
#################################################
|
||||
# Create Tilegrid Page
|
||||
|
|
@ -251,7 +273,7 @@ with out_open("index.html") as f:
|
|||
get_setting("XRAY_ROI_FRAMES")),
|
||||
file=f)
|
||||
|
||||
for tilename, tiledata in grid["tiles"].items():
|
||||
for tilename, tiledata in grid.items():
|
||||
grid_x = tiledata["grid_x"]
|
||||
grid_y = tiledata["grid_y"]
|
||||
grid_map[(grid_x, grid_y)] = tilename
|
||||
|
|
@ -271,7 +293,7 @@ with out_open("index.html") as f:
|
|||
|
||||
for grid_x in range(grid_range[0], grid_range[2] + 1):
|
||||
tilename = grid_map[(grid_x, grid_y)]
|
||||
tiledata = grid["tiles"][tilename]
|
||||
tiledata = grid[tilename]
|
||||
segdata = None
|
||||
|
||||
bgcolor = "#aaaaaa"
|
||||
|
|
@ -319,11 +341,10 @@ with out_open("index.html") as f:
|
|||
"<td bgcolor=\"%s\" align=\"center\" title=\"%s\"><span style=\"font-size:10px\">"
|
||||
% (bgcolor, "\n".join(title)),
|
||||
file=f)
|
||||
if "segment" in tiledata:
|
||||
segtype = segdata["type"].lower()
|
||||
if tiledata["type"].lower() in cfgbits:
|
||||
print(
|
||||
"<a style=\"text-decoration: none; color: black\" href=\"seg_%s.html\">%s</a></span></td>"
|
||||
% (segtype, tilename.replace("_X", "<br/>X")),
|
||||
"<a style=\"text-decoration: none; color: black\" href=\"tile_%s.html\">%s</a></span></td>"
|
||||
% (tiledata["type"].lower(), tilename.replace("_X", "<br/>X")),
|
||||
file=f)
|
||||
else:
|
||||
print(
|
||||
|
|
@ -339,28 +360,223 @@ with out_open("index.html") as f:
|
|||
#################################################
|
||||
# Create Segment Pages
|
||||
|
||||
for segtype in sorted(segbits.keys()):
|
||||
with out_open("seg_%s.html" % segtype) as f:
|
||||
print(
|
||||
"<html><title>X-Ray %s Database: %s</title><body>" %
|
||||
(get_setting("XRAY_DATABASE").upper(), segtype.upper()),
|
||||
file=f)
|
||||
if segtype in ["hclk_l", "hclk_r"]:
|
||||
print(
|
||||
"<h3>X-Ray %s Database: %s Segment</h3>" %
|
||||
(get_setting("XRAY_DATABASE").upper(), segtype.upper()),
|
||||
file=f)
|
||||
else:
|
||||
print(
|
||||
"<h3>X-Ray %s Database: %s Segment (%s Tile + %s Tile)</h3>" %
|
||||
(
|
||||
get_setting("XRAY_DATABASE").upper(), segtype.upper(),
|
||||
segtype.upper(),
|
||||
re.sub("clbl[lm]|bram[0-4]|dsp[0-4]", "int",
|
||||
segtype).upper()),
|
||||
file=f)
|
||||
def get_bit_info(frameidx, bitidx, tiletype):
|
||||
bit_pos = "%02d_%02d" % (frameidx, bitidx)
|
||||
bit_name = cfgbits_r[tiletype][bit_pos] if bit_pos in cfgbits_r[tiletype] else None
|
||||
|
||||
print(
|
||||
if bit_name is None and bit_pos in routebits[tiletype]:
|
||||
bit_name = routebits[tiletype][bit_pos]
|
||||
|
||||
if bit_name is None and bit_pos in routezbits[tiletype]:
|
||||
bit_name = routezbits[tiletype][bit_pos]
|
||||
|
||||
if bit_name is None and tiletype in ["clbll_l", "clbll_r", "clblm_l", "clblm_r", "dsp_l", "dsp_r", "bram_l", "bram_r"]:
|
||||
int_tile_type = "int_" + tiletype[-1]
|
||||
bit_int_pos = "%02d_%02d" % (frameidx, bitidx % 64)
|
||||
bit_name = cfgbits_r[int_tile_type][bit_int_pos] if bit_int_pos in cfgbits_r[int_tile_type] else None
|
||||
|
||||
if bit_name is None and bit_int_pos in routebits[int_tile_type]:
|
||||
bit_name = routebits[int_tile_type][bit_int_pos]
|
||||
|
||||
if bit_name is None and bit_int_pos in routezbits[int_tile_type]:
|
||||
bit_name = routezbits[int_tile_type][bit_int_pos]
|
||||
|
||||
if bit_name is not None:
|
||||
return bit_pos, "INT", [bit_pos], "#88aaff"
|
||||
|
||||
if bit_name is not None:
|
||||
if len(bit_name) <= 1:
|
||||
bit_name = "".join(bit_name)
|
||||
else:
|
||||
for n in bit_name:
|
||||
bit_name = ".".join(n.split(".")[:-1])
|
||||
|
||||
label = None
|
||||
title = [bit_pos]
|
||||
bgcolor = "#aaaaaa"
|
||||
|
||||
if bit_pos not in maskbits[tiletype]:
|
||||
label = " "
|
||||
bgcolor = "#444444"
|
||||
title.append("UNUSED ?")
|
||||
|
||||
if (tiletype in ["hclk_l", "hclk_r"]) and bitidx < 13:
|
||||
label = "ECC"
|
||||
bgcolor = "#44aa44"
|
||||
|
||||
if bit_name is not None:
|
||||
bgcolor = "#ff0000"
|
||||
title.append(bit_name)
|
||||
|
||||
if "LUT.INIT" in bit_name:
|
||||
bgcolor = "#ffffaa"
|
||||
m = re.search(r"(.)LUT.INIT\[(..)\]", bit_name)
|
||||
label = m.group(1) + m.group(2)
|
||||
|
||||
m = re.search(r"\.([ABCD])LUT\.([A-Z]+)$", bit_name)
|
||||
if m:
|
||||
bgcolor = "#ffffaa"
|
||||
if m.group(2) == "RAM":
|
||||
label = m.group(1) + "LR"
|
||||
elif m.group(2) == "SMALL":
|
||||
label = m.group(1) + "LS"
|
||||
elif m.group(2) == "SRL":
|
||||
label = m.group(1) + "SR"
|
||||
else:
|
||||
bgcolor = "#ff0000"
|
||||
|
||||
m = re.search(r"\.([ABCD])LUT\.([A-Z]+)$", bit_name)
|
||||
if m:
|
||||
bgcolor = "#ffffaa"
|
||||
if m.group(2) == "RAM":
|
||||
label = m.group(1) + "LR"
|
||||
elif m.group(2) == "SMALL":
|
||||
label = m.group(1) + "LS"
|
||||
elif m.group(2) == "SRL":
|
||||
label = m.group(1) + "SR"
|
||||
else:
|
||||
bgcolor = "#ff0000"
|
||||
|
||||
m = re.search(
|
||||
r"\.([ABCD]5?)FF\.([A-Z]+(\.A|\.B)?)$", bit_name)
|
||||
if m:
|
||||
bgcolor = "#aaffaa"
|
||||
if m.group(2) == "ZINI":
|
||||
label = m.group(1) + "ZI"
|
||||
elif m.group(2) == "ZRST":
|
||||
label = m.group(1) + "ZR"
|
||||
elif m.group(2) == "MUX.A":
|
||||
label = m.group(1) + "MA"
|
||||
elif m.group(2) == "MUX.B":
|
||||
label = m.group(1) + "MB"
|
||||
else:
|
||||
bgcolor = "#ff0000"
|
||||
|
||||
m = re.search(r"\.([ABCD])DI1MUX\.", bit_name)
|
||||
if m:
|
||||
bgcolor = "#ffffaa"
|
||||
label = m.group(1) + "DI1"
|
||||
|
||||
m = re.search(r"\.(WA[78])USED$", bit_name)
|
||||
if m:
|
||||
bgcolor = "#ffffaa"
|
||||
label = m.group(1)
|
||||
|
||||
if ".WEMUX." in bit_name:
|
||||
bgcolor = "#ffffaa"
|
||||
label = "WE"
|
||||
|
||||
m = re.search(r"\.CARRY4\.([A-Z0-9]+)$", bit_name)
|
||||
if m:
|
||||
bgcolor = "#88cc00"
|
||||
label = m.group(1)
|
||||
|
||||
if re.search(r"\.LATCH$", bit_name):
|
||||
bgcolor = "#aaffaa"
|
||||
label = "LAT"
|
||||
|
||||
if re.search(r"\.FFSYNC$", bit_name):
|
||||
bgcolor = "#aaffaa"
|
||||
label = "SYN"
|
||||
|
||||
if re.search(r"\.[ABCD]LUT5$", bit_name):
|
||||
bgcolor = "#cccc88"
|
||||
label = bit_name[-5] + "5"
|
||||
|
||||
if re.search(r"\.(CE|SR)USEDMUX$", bit_name):
|
||||
bgcolor = "#ffaa00"
|
||||
label = bit_name[-9:-7] + "M"
|
||||
|
||||
if re.search(r"\.CLKINV$", bit_name):
|
||||
bgcolor = "#ffaa00"
|
||||
label = "CLKI"
|
||||
|
||||
if ".ENABLE_BUFFER." in bit_name:
|
||||
bgcolor = "#ffaa00"
|
||||
label = "BUF"
|
||||
|
||||
if re.match("^INT_[LR].[SNWE][SNWERL]", bit_name):
|
||||
if bit_name[8] == "1":
|
||||
bgcolor = "#4466bb"
|
||||
elif bit_name[8] == "2":
|
||||
bgcolor = "#aa88ff"
|
||||
elif bit_name[6:9] in "SS6 SE6 NN6 NW6".split():
|
||||
bgcolor = "#7755ff"
|
||||
else:
|
||||
bgcolor = "#88aaff"
|
||||
label = bit_name[6:9]
|
||||
|
||||
if re.match("^INT_[LR].IMUX", bit_name):
|
||||
m = re.match("^INT_[LR].IMUX(_L)?(\d+)", bit_name)
|
||||
bgcolor = "#88aaff"
|
||||
label = "IM" + m.group(2)
|
||||
|
||||
if re.match("^INT_[LR].BYP_ALT", bit_name):
|
||||
bgcolor = "#7755ff"
|
||||
label = "BA" + bit_name[13]
|
||||
|
||||
if re.match("^INT_[LR].FAN_ALT", bit_name):
|
||||
bgcolor = "#4466bb"
|
||||
label = "FA" + bit_name[13]
|
||||
|
||||
if re.match("^INT_[LR].CLK", bit_name):
|
||||
bgcolor = "#4466bb"
|
||||
label = "CLK"
|
||||
|
||||
if re.match("^INT_[LR].CTRL", bit_name):
|
||||
bgcolor = "#7755ff"
|
||||
label = "CTRL"
|
||||
|
||||
if re.match("^INT_[LR].GFAN", bit_name):
|
||||
bgcolor = "#7755ff"
|
||||
label = "GFAN"
|
||||
|
||||
if re.match("^INT_[LR].LVB", bit_name):
|
||||
bgcolor = "#88aaff"
|
||||
label = "LVB"
|
||||
|
||||
if re.match("^INT_[LR].LV", bit_name):
|
||||
bgcolor = "#88aaff"
|
||||
label = "LV"
|
||||
|
||||
if re.match("^INT_[LR].LH", bit_name):
|
||||
bgcolor = "#4466bb"
|
||||
label = "LH"
|
||||
|
||||
if re.match(
|
||||
"^CLBL[LM]_[LR].SLICE[LM]_X[01].[ABCD]FF.DMUX",
|
||||
bit_name):
|
||||
bgcolor = "#88aaff"
|
||||
label = "DMX"
|
||||
|
||||
if re.match(
|
||||
"^CLBL[LM]_[LR].SLICE[LM]_X[01].[ABCD]MUX",
|
||||
bit_name):
|
||||
bgcolor = "#aa88ff"
|
||||
label = "OMX"
|
||||
|
||||
if re.match(
|
||||
"^CLBL[LM]_[LR].SLICE[LM]_X[01].PRECYINIT",
|
||||
bit_name):
|
||||
bgcolor = "#88aaff"
|
||||
label = "CYI"
|
||||
|
||||
if re.match("^HCLK_[LR]", bit_name) and "_B_BOT" in bit_name:
|
||||
bgcolor = "#4466bb"
|
||||
label = "BOT"
|
||||
|
||||
if re.match("^HCLK_[LR]", bit_name) and "_B_TOP" in bit_name:
|
||||
bgcolor = "#7755ff"
|
||||
label = "TOP"
|
||||
|
||||
if re.match("^DSP_[LR].DSP_[01].(PATTERN|MASK)", bit_name):
|
||||
bgcolor = "#ffffaa"
|
||||
label = bit_name[12] + bit_name[10]
|
||||
|
||||
return bit_pos, label, title, bgcolor
|
||||
|
||||
def gen_table(tiletype, f):
|
||||
print(
|
||||
"""
|
||||
<script><!--
|
||||
var grp2bits = { };
|
||||
|
|
@ -397,253 +613,127 @@ function oml() {
|
|||
highlight_bits.length = 0;
|
||||
}
|
||||
//--></script>
|
||||
""",
|
||||
file=f)
|
||||
""",
|
||||
file=f)
|
||||
|
||||
num_frames = 36
|
||||
unused_bits = 0
|
||||
unknown_bits = 0
|
||||
known_bits = 0
|
||||
hideframes = set()
|
||||
|
||||
if tiletype in ["int_l", "int_r", "hclk_l", "hclk_r"]:
|
||||
num_frames = 26
|
||||
|
||||
if tiletype in ["bram_l", "bram_r", "dsp_l", "dsp_r"]:
|
||||
for i in range(5, 25):
|
||||
hideframes.add(i)
|
||||
num_frames = 28
|
||||
|
||||
height = 2
|
||||
if tiletype in ["hclk_l", "hclk_r"]:
|
||||
height = 1
|
||||
if tiletype in ["dsp_l", "dsp_r", "bram_l", "bram_r"]:
|
||||
height = 10
|
||||
|
||||
if height > 2:
|
||||
print("<table><tr><td>", file=f)
|
||||
|
||||
def print_table_header():
|
||||
print("<table border>", file=f)
|
||||
|
||||
unused_bits = 0
|
||||
unknown_bits = 0
|
||||
known_bits = 0
|
||||
piptypes = dict()
|
||||
|
||||
print("<tr>", file=f)
|
||||
print("<th width=\"30\"></th>", file=f)
|
||||
for frameidx in range(segframes[segtype]):
|
||||
for frameidx in range(num_frames):
|
||||
if frameidx in hideframes:
|
||||
continue
|
||||
print(
|
||||
"<th width=\"30\"><span style=\"font-size:10px\">%d</span></th>"
|
||||
% frameidx,
|
||||
file=f)
|
||||
print("</tr>", file=f)
|
||||
|
||||
for bitidx in range(31 if (segtype in ["hclk_l", "hclk_r"]) else 63,
|
||||
-1, -1):
|
||||
print("<tr>", file=f)
|
||||
print_table_header()
|
||||
|
||||
for bitidx in range(32*height-1, -1, -1):
|
||||
print("<tr>", file=f)
|
||||
print(
|
||||
"<th align=\"right\"><span style=\"font-size:10px\">%d</span></th>"
|
||||
% bitidx,
|
||||
file=f)
|
||||
for frameidx in range(num_frames):
|
||||
if frameidx in hideframes:
|
||||
continue
|
||||
|
||||
bit_pos, label, title, bgcolor = get_bit_info(frameidx, bitidx, tiletype)
|
||||
|
||||
if label is None:
|
||||
label = " "
|
||||
onclick = ""
|
||||
|
||||
if label == "INT":
|
||||
onclick = " onmousedown=\"location.href = 'tile_int_%s.html#b%s'\"" % (tiletype[-1], bit_pos)
|
||||
else:
|
||||
onclick = " onmousedown=\"location.href = '#b%s'\"" % bit_pos
|
||||
|
||||
if bgcolor == "#aaaaaa":
|
||||
unknown_bits += 1
|
||||
elif bgcolor == "#444444":
|
||||
unused_bits += 1
|
||||
else:
|
||||
known_bits += 1
|
||||
|
||||
print(
|
||||
"<th align=\"right\"><span style=\"font-size:10px\">%d</span></th>"
|
||||
% bitidx,
|
||||
"<td id=\"bit%s\" onmouseenter=\"ome('%s');\" onmouseleave=\"oml();\" bgcolor=\"%s\" align=\"center\" title=\"%s\"%s><span style=\"font-size:10px\">%s</span></td>"
|
||||
% (
|
||||
bit_pos, bit_pos, bgcolor, "\n".join(title), onclick,
|
||||
label),
|
||||
file=f)
|
||||
for frameidx in range(segframes[segtype]):
|
||||
bit_pos = "%02d_%02d" % (frameidx, bitidx)
|
||||
bit_name = segbits_r[segtype][bit_pos] if bit_pos in segbits_r[
|
||||
segtype] else None
|
||||
print("</tr>", file=f)
|
||||
|
||||
label = None
|
||||
title = [bit_pos]
|
||||
bgcolor = "#aaaaaa"
|
||||
if bitidx > 0 and bitidx % 80 == 0:
|
||||
print("</table></td><td>", file=f)
|
||||
print_table_header()
|
||||
|
||||
if bit_pos not in maskbits[segtype]:
|
||||
label = " "
|
||||
bgcolor = "#444444"
|
||||
title.append("UNUSED ?")
|
||||
print("</table>", file=f)
|
||||
|
||||
if (segtype in ["hclk_l", "hclk_r"]) and bitidx < 13:
|
||||
label = "ECC"
|
||||
bgcolor = "#44aa44"
|
||||
if height > 2:
|
||||
print("</td></tr></table>", file=f)
|
||||
|
||||
if bit_name is not None:
|
||||
bgcolor = "#ff0000"
|
||||
title.append(bit_name)
|
||||
print(
|
||||
" unused: %d, unknown: %d, known: %d, total: %d, percentage: %.2f%% (%.2f%%)"
|
||||
% (
|
||||
unused_bits, unknown_bits, known_bits,
|
||||
unused_bits + unknown_bits + known_bits, 100 * known_bits /
|
||||
(unknown_bits + unused_bits + known_bits),
|
||||
100 * (known_bits + unused_bits) /
|
||||
(unknown_bits + unused_bits + known_bits)))
|
||||
|
||||
if "LUT.INIT" in bit_name:
|
||||
bgcolor = "#ffffaa"
|
||||
m = re.search(r"(.)LUT.INIT\[(..)\]", bit_name)
|
||||
label = m.group(1) + m.group(2)
|
||||
|
||||
m = re.search(r"\.([ABCD])LUT\.([A-Z]+)$", bit_name)
|
||||
if m:
|
||||
bgcolor = "#ffffaa"
|
||||
if m.group(2) == "RAM":
|
||||
label = m.group(1) + "LR"
|
||||
elif m.group(2) == "SMALL":
|
||||
label = m.group(1) + "LS"
|
||||
elif m.group(2) == "SRL":
|
||||
label = m.group(1) + "SR"
|
||||
else:
|
||||
bgcolor = "#ff0000"
|
||||
for tiletype in sorted(cfgbits.keys()):
|
||||
with out_open("tile_%s.html" % tiletype) as f:
|
||||
print(
|
||||
"<html><title>X-Ray %s Database: %s</title><body>" %
|
||||
(get_setting("XRAY_DATABASE").upper(), tiletype.upper()),
|
||||
file=f)
|
||||
print(
|
||||
"<h3><a href=\"index.html\">X-Ray %s Database</a>: %s Segment</h3>" %
|
||||
(get_setting("XRAY_DATABASE").upper(), tiletype.upper()),
|
||||
file=f)
|
||||
|
||||
m = re.search(r"\.([ABCD])LUT\.([A-Z]+)$", bit_name)
|
||||
if m:
|
||||
bgcolor = "#ffffaa"
|
||||
if m.group(2) == "RAM":
|
||||
label = m.group(1) + "LR"
|
||||
elif m.group(2) == "SMALL":
|
||||
label = m.group(1) + "LS"
|
||||
elif m.group(2) == "SRL":
|
||||
label = m.group(1) + "SR"
|
||||
else:
|
||||
bgcolor = "#ff0000"
|
||||
|
||||
m = re.search(
|
||||
r"\.([ABCD]5?)FF\.([A-Z]+(\.A|\.B)?)$", bit_name)
|
||||
if m:
|
||||
bgcolor = "#aaffaa"
|
||||
if m.group(2) == "ZINI":
|
||||
label = m.group(1) + "ZI"
|
||||
elif m.group(2) == "ZRST":
|
||||
label = m.group(1) + "ZR"
|
||||
elif m.group(2) == "MUX.A":
|
||||
label = m.group(1) + "MA"
|
||||
elif m.group(2) == "MUX.B":
|
||||
label = m.group(1) + "MB"
|
||||
else:
|
||||
bgcolor = "#ff0000"
|
||||
|
||||
m = re.search(r"\.([ABCD])DI1MUX\.", bit_name)
|
||||
if m:
|
||||
bgcolor = "#ffffaa"
|
||||
label = m.group(1) + "DI1"
|
||||
|
||||
m = re.search(r"\.(WA[78])USED$", bit_name)
|
||||
if m:
|
||||
bgcolor = "#ffffaa"
|
||||
label = m.group(1)
|
||||
|
||||
if ".WEMUX." in bit_name:
|
||||
bgcolor = "#ffffaa"
|
||||
label = "WE"
|
||||
|
||||
m = re.search(r"\.CARRY4\.([A-Z0-9]+)$", bit_name)
|
||||
if m:
|
||||
bgcolor = "#88cc00"
|
||||
label = m.group(1)
|
||||
|
||||
if re.search(r"\.LATCH$", bit_name):
|
||||
bgcolor = "#aaffaa"
|
||||
label = "LAT"
|
||||
|
||||
if re.search(r"\.FFSYNC$", bit_name):
|
||||
bgcolor = "#aaffaa"
|
||||
label = "SYN"
|
||||
|
||||
if re.search(r"\.[ABCD]LUT5$", bit_name):
|
||||
bgcolor = "#cccc88"
|
||||
label = bit_name[-5] + "5"
|
||||
|
||||
if re.search(r"\.(CE|SR)USEDMUX$", bit_name):
|
||||
bgcolor = "#ffaa00"
|
||||
label = bit_name[-9:-7] + "M"
|
||||
|
||||
if re.search(r"\.CLKINV$", bit_name):
|
||||
bgcolor = "#ffaa00"
|
||||
label = "CLKI"
|
||||
|
||||
if ".ENABLE_BUFFER." in bit_name:
|
||||
bgcolor = "#ffaa00"
|
||||
label = "BUF"
|
||||
|
||||
elif bit_pos in routebits[segtype]:
|
||||
bgcolor = "#0000ff"
|
||||
label = "R"
|
||||
for bn in sorted(routebits[segtype][bit_pos]):
|
||||
if re.match("^INT_[LR].[SNWE][SNWERL]", bn):
|
||||
if bn[8] == "1":
|
||||
bgcolor = "#4466bb"
|
||||
elif bn[8] == "2":
|
||||
bgcolor = "#aa88ff"
|
||||
elif bn[6:9] in "SS6 SE6 NN6 NW6".split():
|
||||
bgcolor = "#7755ff"
|
||||
else:
|
||||
bgcolor = "#88aaff"
|
||||
label = bn[6:9]
|
||||
elif re.match("^INT_[LR].IMUX", bn):
|
||||
m = re.match("^INT_[LR].IMUX(_L)?(\d+)", bn)
|
||||
bgcolor = "#88aaff"
|
||||
label = "IM" + m.group(2)
|
||||
elif re.match("^INT_[LR].BYP_ALT", bn):
|
||||
bgcolor = "#7755ff"
|
||||
label = "BA" + bn[13]
|
||||
elif re.match("^INT_[LR].FAN_ALT", bn):
|
||||
bgcolor = "#4466bb"
|
||||
label = "FA" + bn[13]
|
||||
elif re.match("^INT_[LR].CLK", bn):
|
||||
bgcolor = "#4466bb"
|
||||
label = "CLK"
|
||||
elif re.match("^INT_[LR].CTRL", bn):
|
||||
bgcolor = "#7755ff"
|
||||
label = "CTRL"
|
||||
elif re.match("^INT_[LR].GFAN", bn):
|
||||
bgcolor = "#7755ff"
|
||||
label = "GFAN"
|
||||
elif re.match("^INT_[LR].LVB", bn):
|
||||
bgcolor = "#88aaff"
|
||||
label = "LVB"
|
||||
elif re.match("^INT_[LR].LV", bn):
|
||||
bgcolor = "#88aaff"
|
||||
label = "LV"
|
||||
elif re.match("^INT_[LR].LH", bn):
|
||||
bgcolor = "#4466bb"
|
||||
label = "LH"
|
||||
elif re.match(
|
||||
"^CLBL[LM]_[LR].SLICE[LM]_X[01].[ABCD]FF.DMUX",
|
||||
bn):
|
||||
bgcolor = "#88aaff"
|
||||
label = "DMX"
|
||||
elif re.match(
|
||||
"^CLBL[LM]_[LR].SLICE[LM]_X[01].[ABCD]MUX",
|
||||
bn):
|
||||
bgcolor = "#aa88ff"
|
||||
label = "OMX"
|
||||
elif re.match(
|
||||
"^CLBL[LM]_[LR].SLICE[LM]_X[01].PRECYINIT",
|
||||
bn):
|
||||
bgcolor = "#88aaff"
|
||||
label = "CYI"
|
||||
elif re.match("^HCLK_[LR]", bn) and "_B_BOT" in bn:
|
||||
bgcolor = "#4466bb"
|
||||
label = "BOT"
|
||||
elif re.match("^HCLK_[LR]", bn) and "_B_TOP" in bn:
|
||||
bgcolor = "#7755ff"
|
||||
label = "TOP"
|
||||
piptypes[bit_pos] = label
|
||||
title.append(bn)
|
||||
|
||||
if label is None:
|
||||
label = " "
|
||||
title.append("UNKNOWN")
|
||||
onclick = ""
|
||||
else:
|
||||
onclick = " onmousedown=\"location.href = '#b%s'\"" % bit_pos
|
||||
|
||||
if bgcolor == "#aaaaaa":
|
||||
unknown_bits += 1
|
||||
elif bgcolor == "#444444":
|
||||
unused_bits += 1
|
||||
else:
|
||||
known_bits += 1
|
||||
|
||||
print(
|
||||
"<td id=\"bit%s\" onmouseenter=\"ome('%s');\" onmouseleave=\"oml();\" bgcolor=\"%s\" align=\"center\" title=\"%s\"%s><span style=\"font-size:10px\">%s</span></td>"
|
||||
% (
|
||||
bit_pos, bit_pos, bgcolor, "\n".join(title), onclick,
|
||||
label),
|
||||
file=f)
|
||||
print("</tr>", file=f)
|
||||
print("</table>", file=f)
|
||||
gen_table(tiletype, f)
|
||||
|
||||
print("<div>", file=f)
|
||||
|
||||
print("<h3>Segment Configuration Bits</h3>", file=f)
|
||||
|
||||
if True:
|
||||
print(
|
||||
" unused: %d, unknown: %d, known: %d, total: %d, percentage: %.2f%% (%.2f%%)"
|
||||
% (
|
||||
unused_bits, unknown_bits, known_bits,
|
||||
unused_bits + unknown_bits + known_bits, 100 * known_bits /
|
||||
(unknown_bits + unused_bits + known_bits),
|
||||
100 * (known_bits + unused_bits) /
|
||||
(unknown_bits + unused_bits + known_bits)))
|
||||
|
||||
bits_by_prefix = dict()
|
||||
|
||||
for bit_name, bit_pos in segbits[segtype].items():
|
||||
for bit_name, bits_pos in cfgbits[tiletype].items():
|
||||
prefix = ".".join(bit_name.split(".")[0:-1])
|
||||
|
||||
if prefix not in bits_by_prefix:
|
||||
bits_by_prefix[prefix] = set()
|
||||
|
||||
bits_by_prefix[prefix].add((bit_name, bit_pos))
|
||||
for bit_pos in bits_pos:
|
||||
bits_by_prefix[prefix].add((bit_name, bit_pos))
|
||||
|
||||
for prefix, bits in sorted(bits_by_prefix.items()):
|
||||
for bit_name, bit_pos in sorted(bits):
|
||||
|
|
@ -667,8 +757,8 @@ function oml() {
|
|||
print("</table>", file=f)
|
||||
|
||||
ruf = UnionFind()
|
||||
routebits_routezbits = list(routebits[segtype].items())
|
||||
routebits_routezbits += list(routezbits[segtype].items())
|
||||
routebits_routezbits = list(routebits[tiletype].items())
|
||||
routebits_routezbits += list(routezbits[tiletype].items())
|
||||
|
||||
for bit, pips in routebits_routezbits:
|
||||
for pip in pips:
|
||||
|
|
@ -702,15 +792,7 @@ function oml() {
|
|||
rgroups_with_title = list()
|
||||
|
||||
for grp, gdata in sorted(rgroups.items()):
|
||||
title = ""
|
||||
for pip, bits in gdata.items():
|
||||
for bit in bits:
|
||||
if bit in piptypes:
|
||||
# title = piptypes[bit] + "-"
|
||||
pass
|
||||
else:
|
||||
print("Detected DB error in PIP %s %s" % (pip, bits))
|
||||
title += "PIPs driving " + ", ".join(sorted(rgroup_names[grp]))
|
||||
title = "PIPs driving " + ", ".join(sorted(rgroup_names[grp]))
|
||||
rgroups_with_title.append((title, grp, gdata))
|
||||
|
||||
for title, grp, gdata in sorted(rgroups_with_title):
|
||||
|
|
@ -719,12 +801,12 @@ function oml() {
|
|||
grp_bits |= bits
|
||||
|
||||
def bit_key(b):
|
||||
if segtype in ["hclk_l", "hclk_r"]:
|
||||
if tiletype in ["hclk_l", "hclk_r"]:
|
||||
if b in hclk_left_bits:
|
||||
return "a" + b
|
||||
if b in hclk_right_bits:
|
||||
return "c" + b
|
||||
if segtype in ["clblm_l", "clblm_r", "clbll_l", "clbll_r"]:
|
||||
if tiletype in ["clblm_l", "clblm_r", "clbll_l", "clbll_r", "int_l", "int_r"]:
|
||||
if b in clb_left_bits:
|
||||
return "a" + b
|
||||
if b in clb_right_bits:
|
||||
|
|
@ -759,9 +841,9 @@ function oml() {
|
|||
line = " --><td>%s</td>" % (pip)
|
||||
for bit in grp_bits:
|
||||
c = "-"
|
||||
if bit in routebits[segtype] and pip in routebits[segtype][bit]:
|
||||
if bit in routebits[tiletype] and pip in routebits[tiletype][bit]:
|
||||
c = "1"
|
||||
if bit in routezbits[segtype] and pip in routezbits[segtype][bit]:
|
||||
if bit in routezbits[tiletype] and pip in routezbits[tiletype][bit]:
|
||||
c = "0"
|
||||
line = "%s%s<td align=\"center\">%s</td>" % (c, line, c)
|
||||
lines.append(line)
|
||||
|
|
@ -789,21 +871,16 @@ function oml() {
|
|||
if not first_note:
|
||||
print("</p>", file=f)
|
||||
|
||||
for tile_type in segtiles[segtype]:
|
||||
print("<h3>Tile %s Pseudo PIPs</h3>" % tile_type, file=f)
|
||||
if len(ppips[tiletype]) > 0:
|
||||
print("<h4>Pseudo PIPs</h4>", file=f)
|
||||
print("<table cellspacing=0>", file=f)
|
||||
print(
|
||||
"<tr><th width=\"500\" align=\"left\">PIP</th><th>Type</th></tr>",
|
||||
file=f)
|
||||
trstyle = ""
|
||||
with db_open("ppips_%s.db" % tile_type.lower()) as fi:
|
||||
for line in fi:
|
||||
pip_name, pip_type = line.split()
|
||||
trstyle = " bgcolor=\"#dddddd\"" if trstyle == "" else ""
|
||||
print(
|
||||
"<tr%s><td>%s</td><td>%s</td></tr>" %
|
||||
(trstyle, pip_name, pip_type),
|
||||
file=f)
|
||||
for typ, tag in sorted([(b, a) for a, b in ppips[tiletype].items()]):
|
||||
trstyle = " bgcolor=\"#dddddd\"" if trstyle == "" else ""
|
||||
print("<tr%s><td>%s</td><td>%s</td></tr>" % (trstyle, tag, typ), file=f)
|
||||
print("</table>", file=f)
|
||||
|
||||
print("</div>", file=f)
|
||||
|
|
|
|||
Loading…
Reference in New Issue