Reworked dbgrbyd.py's tree renderer to make more sense
While the previous renderer was "technically correct", the attempt to map rotated alts to their nearest neighbor just made the resulting tree an unreadable mess. Now the renderer prunes alts with unreachable edges (like they would be during lfsr_rbyd_append). And aligns all alts with their destination trunk. This results in a much more readable, if slightly less accurate, rendering of the tree. Example: $ ./scripts/dbgrbyd.py -B4096 disk 0 -t rbyd 0x0, rev 1, size 1508, weight 40 off ids tag data (truncated) 0000032a: .-+-> 0 reg w1 1 73 s 00000026: | '-> 1-5 reg w5 1 62 b 00000259: .-------+---> 6-11 reg w6 1 6f o 00000224: | .-+-+-> 12-17 reg w6 1 6e n 0000028e: | | | '-> 18 reg w1 1 70 p 00000076: | | '---> 19-20 reg w2 1 64 d 0000038f: | | .-> 21-22 reg w2 1 75 u 0000041d: | .---+---+-> 23 reg w1 1 78 x 000001f3: | | .-> 24-27 reg w4 1 6d m 00000486: | | .-----+-> 28-29 reg w2 1 7a z 000004f3: | | | .-----> 30-31 reg w2 1 62 b 000004ba: | | | | .---> 32-35 reg w4 1 61 a 0000058d: | | | | | .-> 36-37 reg w2 1 65 e 000005c6: +-+-+-+-+-+-> 38-39 reg w2 1 66 f
This commit is contained in:
+5
-4
@@ -373,7 +373,7 @@ def main(disk, block_size=None, trunk=0, limit=None, *,
|
||||
t_width = 2*t_depth+2 if t_depth > 0 else 0
|
||||
t_branches = [(0, trunk.weight)]
|
||||
|
||||
def t_repr(id, w, leaf=True, depth=None):
|
||||
def treerepr(id, w, leaf=True, depth=None):
|
||||
branches_ = []
|
||||
for i in range(len(t_branches)):
|
||||
if depth is not None and depth == i-1:
|
||||
@@ -425,6 +425,7 @@ def main(disk, block_size=None, trunk=0, limit=None, *,
|
||||
t_width, ''.join(branches_),
|
||||
'\x1b[m' if color else '')
|
||||
|
||||
|
||||
# print header
|
||||
w_width = 2*m.ceil(m.log10(max(1, trunk.weight)+1))+1
|
||||
print('%-9s %*s%-*s %-22s %s' % (
|
||||
@@ -450,7 +451,7 @@ def main(disk, block_size=None, trunk=0, limit=None, *,
|
||||
'%04x.%04x:' % (rbyd.block, rbyd.limit)
|
||||
if prbyd is None or rbyd != prbyd
|
||||
else '',
|
||||
t_repr(id, w, True, depth) if args.get('tree') else '',
|
||||
treerepr(id, w, True, depth) if args.get('tree') else '',
|
||||
w_width, '%d-%d' % (id-(w-1), id) if w > 1
|
||||
else id if w > 0
|
||||
else '',
|
||||
@@ -463,7 +464,7 @@ def main(disk, block_size=None, trunk=0, limit=None, *,
|
||||
'%04x.%04x:' % (rbyd.block, rbyd.limit)
|
||||
if prbyd is None or rbyd != prbyd
|
||||
else '',
|
||||
t_repr(id, w, not name_tag, depth) if args.get('tree') else '',
|
||||
treerepr(id, w, not name_tag, depth) if args.get('tree') else '',
|
||||
w_width, '' if name_tag
|
||||
else '%d-%d' % (id-(w-1), id) if w > 1
|
||||
else id if w > 0
|
||||
@@ -576,7 +577,7 @@ def main(disk, block_size=None, trunk=0, limit=None, *,
|
||||
if not rbyd:
|
||||
print('%04x.%04x: %s%s%s%s' % (
|
||||
rbyd.block, rbyd.limit,
|
||||
t_repr(id, w) if args.get('tree') else '',
|
||||
treerepr(id, w) if args.get('tree') else '',
|
||||
'\x1b[31m' if color else '',
|
||||
'(corrupted rbyd 0x%x.%x)' % (rbyd.block, rbyd.limit),
|
||||
'\x1b[m' if color else ''))
|
||||
|
||||
Reference in New Issue
Block a user