diff --git a/prjxray/util.py b/prjxray/util.py index 0e8ba60d..1c5621be 100644 --- a/prjxray/util.py +++ b/prjxray/util.py @@ -111,6 +111,19 @@ def parse_tagbit(x): return (isset, (int(frame, 10), int(word, 10))) +def addr_bit2word(bitaddr): + word = bitaddr // 32 + bit = bitaddr % 32 + return word, bit + + +def addr2str(addr, word, bit): + # Make like .bits file: bit_00020b14_073_05 + # also similar to .db file: CLBLL_L.SLICEL_X0.CEUSEDMUX 01_39 + assert 0 <= bit <= 31 + return "%08x_%03u_%02u" % (addr, word, bit) + + def gen_tile_bits(db_root, tilej, strict=False, verbose=False): ''' For given tile yield diff --git a/utils/checkdb.py b/utils/checkdb.py index 4a586957..425cf4d6 100644 --- a/utils/checkdb.py +++ b/utils/checkdb.py @@ -66,8 +66,14 @@ def check_tile_overlap(db, db_root, strict=False, verbose=False): mall = dict() tiles_checked = 0 + + def subtiles(tile_names): + for tile_name in tile_names: + yield tile_name, db.tilegrid[tile_name] + for tile_name, tilej in db.tilegrid.items(): - #for tile_name, tilej in [("CLBLL_L_X12Y138", db.tilegrid["CLBLL_L_X12Y138"])]: + # for tile_name, tilej in subtiles(["CLBLL_L_X14Y112", "INT_L_X14Y112"]): + mtile = make_tile_mask( db_root, tile_name, tilej, strict=strict, verbose=verbose) verbose and print( @@ -81,9 +87,10 @@ def check_tile_overlap(db, db_root, strict=False, verbose=False): print("ERROR: %s collisions" % len(collisions)) for ck in sorted(collisions): addr, bitaddr = ck + word, bit = util.addr_bit2word(bitaddr) print( - " %08X_%04X: had %s, got %s" % - (addr, bitaddr, mall[ck], mtile[ck])) + " %s: had %s, got %s" % + (util.addr2str(addr, word, bit), mall[ck], mtile[ck])) raise ValueError("%s collisions" % len(collisions)) mall.update(mtile) tiles_checked += 1