#!/usr/bin/env python3 import os, sys, json, re class UnionFind: def __init__(self): self.parents = dict() def make(self, value): if value not in self.parents: self.parents[value] = value def find(self, value): self.make(value) if self.parents[value] != value: retval = self.find(self.parents[value]) self.parents[value] = retval return self.parents[value] def union(self, v1, v2): a = self.find(v1) b = self.find(v2) if a != b: self.parents[a] = b ################################################# # Loading Raw Source Data grid = None segbits = dict() segbits_r = dict() segframes = dict() routebits = dict() routezbits = dict() piptypes = dict() maskbits = dict() print("Loading tilegrid.") with open("../database/%s/tilegrid.json" % os.getenv("XRAY_DATABASE"), "r") as f: grid = json.load(f) for segname, segdata in grid["segments"].items(): segtype = segdata["type"].lower() if segtype not in segbits: segbits[segtype] = dict() segbits_r[segtype] = dict() routebits[segtype] = dict() routezbits[segtype] = dict() maskbits[segtype] = set() segframes[segtype] = segdata["frames"] print("Loading %s segbits." % segtype) with open("../database/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE"), segtype)) as f: for line in f: bit_name, bit_pos = line.split() assert bit_pos[0] != "!" segbits[segtype][bit_name] = bit_pos segbits_r[segtype][bit_pos] = bit_name print("Loading %s segbits." % re.sub("clbl[lm]", "int", segtype)) with open("../database/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE"), re.sub("clbl[lm]", "int", segtype))) as f: for line in f: 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) print("Loading %s maskbits." % segtype) with open("../database/%s/mask_%s.db" % (os.getenv("XRAY_DATABASE"), segtype)) as f: for line in f: _, bit = line.split() maskbits[segtype].add(bit) ################################################# # Create Tilegrid Page grid_range = None grid_map = dict() print("Writing %s/index.html." % os.getenv("XRAY_DATABASE")) os.makedirs(os.getenv("XRAY_DATABASE"), exist_ok=True) with open("%s/index.html" % os.getenv("XRAY_DATABASE"), "w") as f: print("X-Ray %s Database" % os.getenv("XRAY_DATABASE").upper(), file=f) print("

X-Ray %s Database

" % os.getenv("XRAY_DATABASE").upper(), file=f) print("

Part: %s
ROI: %s
ROI Frames: %s

" % (os.getenv("XRAY_PART"), os.getenv("XRAY_ROI"), os.getenv("XRAY_ROI_FRAMES")), file=f) for tilename, tiledata in grid["tiles"].items(): grid_x = tiledata["grid_x"] grid_y = tiledata["grid_y"] grid_map[(grid_x, grid_y)] = tilename if grid_range is None: grid_range = [grid_x, grid_y, grid_x, grid_y] else: grid_range[0] = min(grid_range[0], grid_x) grid_range[1] = min(grid_range[1], grid_y) grid_range[2] = max(grid_range[2], grid_x) grid_range[3] = max(grid_range[3], grid_y) print("", file=f) for grid_y in range(grid_range[1], grid_range[3]+1): print("", file=f) for grid_x in range(grid_range[0], grid_range[2]+1): tilename = grid_map[(grid_x, grid_y)] tiledata = grid["tiles"][tilename] bgcolor = "#aaaaaa" if tiledata["type"] in ["INT_L", "INT_R"]: bgcolor="#aaaaff" if tiledata["type"] in ["CLBLL_L", "CLBLL_R"]: bgcolor="#ffffaa" if tiledata["type"] in ["CLBLM_L", "CLBLM_R"]: bgcolor="#ffaaaa" title = [tilename] if "segment" in tiledata: segdata = grid["segments"][tiledata["segment"]] title.append(tiledata["segment"]) title.append("GRID_POSITION: %d %d" % (grid_x, grid_y)) if "sites" in tiledata: for sitename, sitetype in tiledata["sites"].items(): title.append("%s site: %s" % (sitetype, sitename)) if "segment" in tiledata: title.append("Baseaddr: %s %d" % tuple(segdata["baseaddr"])) print("" % (segtype, tilename.replace("_X", "
X")), file=f) else: print("%s" % tilename.replace("_X", "
X"), file=f) print("", file=f) print("
" % (bgcolor, "\n".join(title)), file=f) if "segment" in tiledata: segtype = segdata["type"].lower() print("%s
", file=f) print("", file=f) ################################################# # Create Segment Pages for segtype in segbits.keys(): print("Writing %s/seg_%s.html." % (os.getenv("XRAY_DATABASE"), segtype)) with open("%s/seg_%s.html" % (os.getenv("XRAY_DATABASE"), segtype), "w") as f: print("X-Ray %s Database: %s" % (os.getenv("XRAY_DATABASE").upper(), segtype.upper()), file=f) print("

X-Ray %s Database: %s

" % (os.getenv("XRAY_DATABASE").upper(), segtype.upper()), file=f) print("", file=f) print("", file=f) print("", file=f) for frameidx in range(segframes[segtype]): print("" % frameidx, file=f) print("", file=f) for bitidx in range(63, -1, -1): print("", file=f) print("" % bitidx, 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 label = None title = [bit_pos] bgcolor = "#aaaaaa" if bit_pos not in maskbits[segtype]: label = " " bgcolor = "#444444" title.append("UNUSED ?") 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) if re.search(r"\.[ABCD]5?FF\.", bit_name): bgcolor = "#aaffaa" m = re.search(r"\.([ABCD]5?)FF\.([A-Z]+)", bit_name) if m.group(2) == "ZINI": label = m.group(1) + "Z" else: label = m.group(1) + "?" if re.search(r"\.[ABCD]5?FF\.", bit_name): bgcolor = "#aaffaa" m = re.search(r"\.([ABCD]5?)FF\.([A-Z]+)", bit_name) if m.group(2) == "ZINI": label = m.group(1) + "Z" else: label = m.group(1) + "?" 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" elif bit_pos in routebits[segtype]: bgcolor = "#6666cc" label = "R" for bn in sorted(routebits[segtype][bit_pos]): if re.match("^INT_[LR].[SNWE][SNWE]", bn): bgcolor = "#aa88ff" label = "SNWE" if re.match("^INT_[LR].IMUX", bn): bgcolor = "#88aaff" label = "IMUX" if re.match("^INT_[LR].BYP_ALT", bn): bgcolor = "#7755ff" label = "BALT" if re.match("^INT_[LR].FAN_ALT", bn): bgcolor = "#4466bb" label = "FALT" if re.match("^INT_[LR].[SNWE][RL]", bn): label = "RL" 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 print("" % (bgcolor, "\n".join(title), onclick, label), file=f) print("", file=f) print("
%d
%d%s
", file=f) bits_by_prefix = dict() for bit_name, bit_pos in segbits[segtype].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 prefix, bits in sorted(bits_by_prefix.items()): for bit_name, bit_pos in sorted(bits): print("" % bit_pos, file=f) print("

", file=f) print("

%s

" % prefix, file=f) print("", file=f) print("", file=f) trstyle = "" for bit_name, bit_pos in sorted(bits): trstyle = " bgcolor=\"#dddddd\"" if trstyle == "" else "" print("" % (trstyle, bit_name, bit_pos), file=f) print("
Bit NamePosition
%s%s
", file=f) ruf = UnionFind() routebits_routezbits = list(routebits[segtype].items()) routebits_routezbits += list(routezbits[segtype].items()) for bit, pips in routebits_routezbits: for pip in pips: grp = pip.split('.')[1] ruf.union(grp, bit) rgroups = dict() rgroup_names = dict() for bit, pips in routebits_routezbits: for pip in pips: grp_name = pip.split('.')[1] grp = ruf.find(grp_name) if grp not in rgroup_names: rgroup_names[grp] = set() rgroup_names[grp].add(grp_name) if grp not in rgroups: rgroups[grp] = dict() if pip not in rgroups[grp]: rgroups[grp][pip] = set() rgroups[grp][pip].add(bit) shared_bits = dict() for bit, pips in routebits_routezbits: for pip in pips: grp_name = pip.split('.')[1] if bit not in shared_bits: shared_bits[bit] = set() shared_bits[bit].add(grp_name) 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])) rgroups_with_title.append((title, grp, gdata)) for title, grp, gdata in sorted(rgroups_with_title): grp_bits = set() for pip, bits in gdata.items(): grp_bits |= bits grp_bits = sorted(grp_bits) for bit in grp_bits: print("
" % bit, file=f) print("

", file=f) print("

%s

" % title, file=f) print("", file=f) print("", file=f) for bit in grp_bits: print("" % bit, file=f) print("", file=f) lines = list() for pip, bits in sorted(gdata.items()): line = " -->" % (pip) for bit in grp_bits: c = "-" if bit in routebits[segtype] and pip in routebits[segtype][bit]: c = "1" if bit in routezbits[segtype] and pip in routezbits[segtype][bit]: c = "0" line = "%s%s" % (c, line, c) lines.append(line) trstyle = "" for line in sorted(lines): trstyle = " bgcolor=\"#dddddd\"" if trstyle == "" else "" print("
PIP %s 
%s%s