diff --git a/htmlgen/htmlgen.py b/htmlgen/htmlgen.py index ced07634..78acaaba 100644 --- a/htmlgen/htmlgen.py +++ b/htmlgen/htmlgen.py @@ -3,6 +3,28 @@ 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 @@ -70,7 +92,7 @@ with open("%s/index.html" % os.getenv("XRAY_DATABASE"), "w") as f: grid_range[2] = max(grid_range[2], grid_x) grid_range[3] = max(grid_range[3], grid_y) - print("", file =f) + print("
", file=f) for grid_y in range(grid_range[1], grid_range[3]+1): print("", file=f) @@ -110,7 +132,7 @@ with open("%s/index.html" % os.getenv("XRAY_DATABASE"), "w") as f: print("", file=f) - print("
", file =f) + print("", file=f) print("", file=f) @@ -122,17 +144,17 @@ for segtype in segbits.keys(): 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) - print("", file =f) + print("", file=f) + print("", file=f) for frameidx in range(segframes[segtype]): - print("" % frameidx, file =f) - print("", file =f) + print("" % frameidx, file=f) + print("", file=f) for bitidx in range(63, -1, -1): - print("", file =f) - print("" % bitidx, file =f) + 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 @@ -176,8 +198,8 @@ for segtype in segbits.keys(): label = "R" print("" % (bgcolor, "\n".join(title), label), file=f) - print("", file =f) - print("
%d
%d
%d
%d%s
", file =f) + print("", file=f) + print("", file=f) bits_by_prefix = dict() @@ -191,17 +213,70 @@ for segtype in segbits.keys(): bits_by_prefix[prefix].add((bit_name, bit_pos)) for prefix, bits in sorted(bits_by_prefix.items()): - print("

", file =f) - print("

%s

" % prefix, file =f) - print("", file =f) - print("", file=f) + print("

", file=f) + print("

%s

" % prefix, file=f) + print("
Bit NamePosition
", 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) + print("", file=f) + + ruf = UnionFind() + + for bit, pips in routebits[segtype].items(): + for pip in pips: + grp = pip.split('.')[1] + ruf.union(grp, bit) + + rgroups = dict() + rgroup_names = dict() + + for bit, pips in routebits[segtype].items(): + 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) + + for grp, gdata in sorted(rgroups.items()): + print("

", file=f) + print("

%s

" % ", ".join(sorted(rgroup_names[grp])), file=f) + print("", file=f) + print("", file=f) + + 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) + + lines = list() + for pip, bits in sorted(gdata.items()): + line = " -->" % (pip) + for bit in grp_bits: + c = "1" if bit in bits else "-" + 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