Merge pull request #461 from mcmasterg/print_unknown_bits

segprint: fix -b flag, working on tilegrid directly
This commit is contained in:
John Mcmaster 2019-01-08 23:50:15 +01:00 committed by GitHub
commit 6062c7ea56
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 33 additions and 20 deletions

View File

@ -7,6 +7,7 @@ Ex: BRAM_L_X6Y100:CLB_IO_CLK
''' '''
import sys, os, json, re import sys, os, json, re
import copy
from prjxray import bitstream from prjxray import bitstream
from prjxray import db as prjxraydb from prjxray import db as prjxraydb
from prjxray import util from prjxray import util
@ -93,31 +94,42 @@ def mk_segbits(seginfo, bitdata):
return segbits return segbits
def print_unknown_bits(segments, bitdata): def gen_tilegrid_masks(tiles):
"""yield (addr_min, addr_max + 1, word_min, word_max + 1)"""
for tilek, tilev in tiles.items():
for block_type, blockj in tilev["bits"].items():
baseaddr = int(blockj["baseaddr"], 0)
frames = blockj["frames"]
offset = blockj["offset"]
words = blockj["words"]
yield (baseaddr, baseaddr + frames, offset, offset + words)
def print_unknown_bits(tiles, bitdata):
''' '''
Print bits not covered by known tiles Print bits not covered by known tiles
'''
# Index all known locations tiles: tilegrid json
# seggrames[address] = set() bitdata[addr][word] = set of bit indices (0 to 31)
# where set contains word numbers '''
segframes = dict() # Start with an open set and remove elements as we find them
for segname, segment in segments.items(): tocheck = copy.deepcopy(bitdata)
block = segment["block"]
framebase = int(block["baseaddr"][0], 16) for addr_min, addr_max_p1, word_min, word_max_p1 in gen_tilegrid_masks(
for i in range(block["frames"]): tiles):
words = segframes.setdefault(framebase + i, set()) for addr in range(addr_min, addr_max_p1):
for j in range(int(block["baseaddr"], 16), if addr not in tocheck:
int(block["baseaddr"], 16) + block["words"]): continue
words.add(j) for word in range(word_min, word_max_p1):
if word not in tocheck[addr]:
continue
del tocheck[addr][word]
# print uncovered locations # print uncovered locations
print('Non-database bits:') print('Non-database bits:')
for frame in sorted(bitdata.keys()): for frame in sorted(tocheck.keys()):
for wordidx in sorted(bitdata[frame].keys()): for wordidx in sorted(tocheck[frame].keys()):
if frame in segframes and wordidx in segframes[frame]: for bitidx in sorted(tocheck[frame][wordidx]):
continue
for bitidx in sorted(bitdata[frame][wordidx]):
print("bit_%08x_%03d_%02d" % (frame, wordidx, bitidx)) print("bit_%08x_%03d_%02d" % (frame, wordidx, bitidx))
@ -409,7 +421,8 @@ def run(
bitdata = bitstream.load_bitdata2(open(bits_file, "r")) bitdata = bitstream.load_bitdata2(open(bits_file, "r"))
if flag_unknown_bits: if flag_unknown_bits:
print_unknown_bits(segments, bitdata) print_unknown_bits(tiles, bitdata)
print("")
# Default: print all # Default: print all
if segnames: if segnames: