diff --git a/fuzzers/050-intpips/Makefile b/fuzzers/050-intpips/Makefile index fb400b07..7f64c73f 100644 --- a/fuzzers/050-intpips/Makefile +++ b/fuzzers/050-intpips/Makefile @@ -26,13 +26,14 @@ database: $(SPECIMENS_OK) ${XRAY_MASKMERGE} build/mask_clbll_r.db $(shell find build -name segdata_int_r.txt) ${XRAY_MASKMERGE} build/mask_clblm_l.db $(shell find build -name segdata_int_l.txt) ${XRAY_MASKMERGE} build/mask_clblm_r.db $(shell find build -name segdata_int_r.txt) + # Keep a copy to track iter progress + # Also is pre-fixup, which drops and converts + cp build/segbits_int_l.db build/$(ITER)/segbits_int_l.db + cp build/segbits_int_r.db build/$(ITER)/segbits_int_r.db # May be undersolved ifneq ($(QUICK),Y) ${XRAY_DBFIXUP} --db-root build --clb-int endif - # Keep a copy to track iter progress - cp build/segbits_int_l.db build/$(ITER)/segbits_int_l.db - cp build/segbits_int_r.db build/$(ITER)/segbits_int_r.db pushdb: ${XRAY_MERGEDB} int_l build/segbits_int_l.db diff --git a/fuzzers/int_loop.mk b/fuzzers/int_loop.mk index 2f2f53b7..ef1988b2 100644 --- a/fuzzers/int_loop.mk +++ b/fuzzers/int_loop.mk @@ -27,13 +27,14 @@ export FUZDIR=$(shell pwd) database: $(SPECIMENS_OK) ${XRAY_SEGMATCH} $(SEGMATCH_FLAGS) -o build/segbits_int_l.db $(shell find build -name segdata_int_l.txt) ${XRAY_SEGMATCH} $(SEGMATCH_FLAGS) -o build/segbits_int_r.db $(shell find build -name segdata_int_r.txt) + # Keep a copy to track iter progress + # Also is pre-fixup, which drops and converts + cp build/segbits_int_l.db build/$(ITER)/segbits_int_l.db + cp build/segbits_int_r.db build/$(ITER)/segbits_int_r.db # May be undersolved ifneq ($(QUICK),Y) ${XRAY_DBFIXUP} --db-root build --clb-int endif - # Keep a copy to track iter progress - cp build/segbits_int_l.db build/$(ITER)/segbits_int_l.db - cp build/segbits_int_r.db build/$(ITER)/segbits_int_r.db pushdb: ${XRAY_MERGEDB} int_l build/segbits_int_l.db diff --git a/prjxray/util.py b/prjxray/util.py index 6fa10329..6fbe2bd8 100644 --- a/prjxray/util.py +++ b/prjxray/util.py @@ -234,3 +234,12 @@ def gen_fuzz_states(nvals): for i in range(nvals): mask = (1 << i) yield int(bool(bits & mask)) + + +def add_bool_arg(parser, yes_arg, default=False, **kwargs): + dashed = yes_arg.replace('--', '') + dest = dashed.replace('-', '_') + parser.add_argument( + yes_arg, dest=dest, action='store_true', default=default, **kwargs) + parser.add_argument( + '--no-' + dashed, dest=dest, action='store_false', **kwargs) diff --git a/utils/dbfixup.py b/utils/dbfixup.py index 93d8379d..37509fa0 100755 --- a/utils/dbfixup.py +++ b/utils/dbfixup.py @@ -104,7 +104,8 @@ def zero_groups(tag, bits, zero_db, strict=True, verbose=False): len(a), len(bits), bits_str(bits)) -def add_zero_bits(fn_in, fn_out, zero_db, clb_int=False, verbose=False): +def add_zero_bits( + fn_in, fn_out, zero_db, clb_int=False, strict=True, verbose=False): ''' Add multibit entries This requires adding some zero bits (ex: !31_09) @@ -115,6 +116,7 @@ def add_zero_bits(fn_in, fn_out, zero_db, clb_int=False, verbose=False): changes = 0 llast = None + drops = 0 with open(fn_in, "r") as f: for line in f: # Hack: skip duplicate lines @@ -124,6 +126,14 @@ def add_zero_bits(fn_in, fn_out, zero_db, clb_int=False, verbose=False): continue tag, bits, mode = util.parse_db_line(line) + # an enum that needs masking + # check below asserts that a mask was actually applied + if mode and mode != "<0 candidates>" and not strict: + verbose and print( + "WARNING: dropping unresolved line: %s" % line) + drops += 1 + continue + assert mode not in ( "", ""), "Entries must be resolved. line: %s" % (line, ) @@ -142,8 +152,7 @@ def add_zero_bits(fn_in, fn_out, zero_db, clb_int=False, verbose=False): """ if clb_int: zero_range(tag, bits, 22, 25) - zero_groups( - tag, bits, zero_db, strict=not clb_int, verbose=verbose) + zero_groups(tag, bits, zero_db, strict=strict, verbose=verbose) new_line = " ".join([tag] + sorted(bits)) @@ -156,6 +165,9 @@ def add_zero_bits(fn_in, fn_out, zero_db, clb_int=False, verbose=False): new_lines.add(new_line) llast = line + if drops: + print("WARNING: %s dropped %s unresolved lines" % (fn_in, drops)) + with open(fn_out, "w") as f: for line in sorted(new_lines): print(line, file=f) @@ -213,7 +225,8 @@ def load_zero_db(fn): return ret -def update_seg_fns(fn_inouts, zero_db, clb_int, lazy=False, verbose=False): +def update_seg_fns( + fn_inouts, zero_db, clb_int, lazy=False, strict=True, verbose=False): seg_files = 0 seg_lines = 0 for fn_in, fn_out in fn_inouts: @@ -222,7 +235,12 @@ def update_seg_fns(fn_inouts, zero_db, clb_int, lazy=False, verbose=False): continue changes = add_zero_bits( - fn_in, fn_out, zero_db, clb_int=clb_int, verbose=verbose) + fn_in, + fn_out, + zero_db, + clb_int=clb_int, + strict=strict, + verbose=verbose) if changes is not None: seg_files += 1 seg_lines += changes @@ -259,7 +277,13 @@ def update_masks(db_root): def update_segs( - db_root, clb_int, seg_fn_in, seg_fn_out, zero_db_fn, verbose=False): + db_root, + clb_int, + seg_fn_in, + seg_fn_out, + zero_db_fn, + strict=True, + verbose=False): if clb_int: zero_db = clb_int_zero_db lazy = True @@ -283,7 +307,8 @@ def update_segs( zero_db = load_zero_db(zero_db_fn) print("CLB INT mode: %s" % clb_int) print("Segbit groups: %s" % len(zero_db)) - update_seg_fns(fn_inouts, zero_db, clb_int, lazy=lazy, verbose=verbose) + update_seg_fns( + fn_inouts, zero_db, clb_int, lazy=lazy, strict=strict, verbose=verbose) def run( @@ -292,8 +317,12 @@ def run( zero_db_fn=None, seg_fn_in=None, seg_fn_out=None, + strict=None, verbose=False): + if strict is None: + strict = not clb_int + # Probably should split this into two programs update_segs( db_root, @@ -301,6 +330,7 @@ def run( seg_fn_in=seg_fn_in, seg_fn_out=seg_fn_out, zero_db_fn=zero_db_fn, + strict=strict, verbose=verbose) if clb_int: update_masks(db_root) @@ -318,11 +348,17 @@ def main(): parser.add_argument('--zero-db', help='Apply custom patches') parser.add_argument('--seg-fn-in', help='') parser.add_argument('--seg-fn-out', help='') + util.add_bool_arg(parser, "--strict", default=None) args = parser.parse_args() run( - args.db_root, args.clb_int, args.zero_db, args.seg_fn_in, - args.seg_fn_out, args.verbose) + args.db_root, + args.clb_int, + args.zero_db, + args.seg_fn_in, + args.seg_fn_out, + strict=args.strict, + verbose=args.verbose) if __name__ == '__main__':