diff --git a/fuzzers/056-rempips/.gitignore b/fuzzers/056-rempips/.gitignore index 145bd747..a747a2b4 100644 --- a/fuzzers/056-rempips/.gitignore +++ b/fuzzers/056-rempips/.gitignore @@ -1,14 +1,3 @@ -/filtered_seg_int_l.segbits -/filtered_seg_int_r.segbits -/pattern_l.txt -/pattern_r.txt -/piplist.dcp -/piplist/ -/pips_int_l.txt -/pips_int_r.txt -/seg_int_l.segbits -/seg_int_r.segbits -/specimen_[0-9][0-9][0-9]/ -/todo.txt -/vivado* -/run.ok +build +run.ok +todo diff --git a/fuzzers/056-rempips/Makefile b/fuzzers/056-rempips/Makefile index 7795944a..f24f5df5 100644 --- a/fuzzers/056-rempips/Makefile +++ b/fuzzers/056-rempips/Makefile @@ -1,33 +1,61 @@ - +# WARNING: N cannot be reduced or -m will always fail N := 10 -SPECIMENS := $(addprefix specimen_,$(shell seq -f '%03.0f' $(N))) +SPECIMENS := $(addprefix build/specimen_,$(shell seq -f '%03.0f' $(N))) SPECIMENS_OK := $(addsuffix /OK,$(SPECIMENS)) database: $(SPECIMENS_OK) - ${XRAY_SEGMATCH} -m 5 -M 15 -o seg_int_l.db $(addsuffix /segdata_int_l.txt,$(SPECIMENS)) - ${XRAY_SEGMATCH} -m 5 -M 15 -o seg_int_r.db $(addsuffix /segdata_int_r.txt,$(SPECIMENS)) + ${XRAY_SEGMATCH} -m 5 -M 15 -o build/segbits_int_l.db $(addsuffix /segdata_int_l.txt,$(SPECIMENS)) + ${XRAY_SEGMATCH} -m 5 -M 15 -o build/segbits_int_r.db $(addsuffix /segdata_int_r.txt,$(SPECIMENS)) pushdb: ${XRAY_DBFIXUP} --db-root . --clb-int - ${XRAY_MERGEDB} int_l seg_int_l.db - ${XRAY_MERGEDB} int_r seg_int_r.db + ${XRAY_MERGEDB} int_l build/segbits_int_l.db + ${XRAY_MERGEDB} int_r build/segbits_int_r.db -$(SPECIMENS_OK): todo.txt - bash generate.sh $(subst /OK,,$@) +$(SPECIMENS_OK): build/todo.txt + mkdir -p build + bash ${XRAY_DIR}/utils/top_generate.sh $(subst /OK,,$@) touch $@ -todo.txt: - vivado -mode batch -source piplist.tcl - python3 maketodo.py | sort -R | head -n10 > todo.txt +build/pips_int_l.txt: piplist.tcl + mkdir -p build + cd build && vivado -mode batch -source ../piplist.tcl +# Used 1) to see if we are done 2) pips to try in generate.tcl +build/todo.txt: build/pips_int_l.txt + #python3 maketodo.py --no-strict | sort -R | head -n10 > build/todo.txt.tmp + python3 maketodo.py >build/todo_all.txt + cat build/todo_all.txt | sort -R | head -n10 > build/todo.txt.tmp + mv build/todo.txt.tmp build/todo.txt + + +# XXX: conider moving to script run: - +set -ex; while make clean; make todo.txt; test -s todo.txt; do if make database; then make pushdb; fi; done; true + \ + set -ex; \ + make clean; \ + mkdir -p todo; \ + while \ + make cleanprj; \ + make build/todo.txt || exit 1; \ + test -s build/todo.txt; \ + do \ + i=$$((i+1)); \ + cp build/todo.txt todo/$${i}.txt; \ + cp build/todo_all.txt todo/$${i}_all.txt; \ + if make database; then \ + make pushdb; \ + fi; \ + done; \ + true touch run.ok clean: - rm -rf .Xil/ .cache/ filtered_seg_int_[lr].db run.ok - rm -rf todo.txt vivado* piplist/ piplist.dcp pattern_[lr].txt pips_int_[lr].txt - rm -rf specimen_[0-9][0-9][0-9]/ seg_int_[lr].db + rm -rf build run.ok todo -.PHONY: database pushdb run clean +# Remove iteration specific files, but keep piplist.tcl output +cleanprj: + rm -rf build/specimen_* build/todo.txt build/*.db + +.PHONY: database pushdb run clean cleanprj diff --git a/fuzzers/056-rempips/generate.sh b/fuzzers/056-rempips/generate.sh index 9f904105..ec525cf8 100644 --- a/fuzzers/056-rempips/generate.sh +++ b/fuzzers/056-rempips/generate.sh @@ -1,9 +1,10 @@ #!/bin/bash +FUZDIR=$PWD source ${XRAY_GENHEADER} -vivado -mode batch -source ../generate.tcl +vivado -mode batch -source $FUZDIR/generate.tcl ${XRAY_BITREAD} -F $XRAY_ROI_FRAMES -o design.bits -z -y design.bit -python3 ../generate.py +python3 $FUZDIR/generate.py diff --git a/fuzzers/056-rempips/generate.tcl b/fuzzers/056-rempips/generate.tcl index 5f160173..286a3afd 100644 --- a/fuzzers/056-rempips/generate.tcl +++ b/fuzzers/056-rempips/generate.tcl @@ -1,6 +1,6 @@ create_project -force -part $::env(XRAY_PART) design design -read_verilog ../top.v +read_verilog ../../top.v synth_design -top top set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_00) IOSTANDARD LVCMOS33" [get_ports i] @@ -19,7 +19,7 @@ route_design # write_checkpoint -force design.dcp -source ../../../utils/utils.tcl +source "$::env(XRAY_DIR)/utils/utils.tcl" set fp [open "../todo.txt" r] set todo_lines {} @@ -77,6 +77,10 @@ proc write_txtdata {filename} { } route_design + +# Ex: ERROR: [DRC RTSTAT-5] Partial antennas: 1 net(s) have a partial antenna. The problem bus(es) and/or net(s) are mynet_2. +# set_property IS_ENABLED 0 [get_drc_checks {RTSTAT-5}] + write_checkpoint -force design.dcp write_bitstream -force design.bit write_txtdata design.txt diff --git a/fuzzers/056-rempips/maketodo.py b/fuzzers/056-rempips/maketodo.py index de136587..59391a8a 100644 --- a/fuzzers/056-rempips/maketodo.py +++ b/fuzzers/056-rempips/maketodo.py @@ -1,26 +1,70 @@ #!/usr/bin/env python3 -import os, re +import os, re, sys +from prjxray import util -def maketodo(pipfile, dbfile): +def maketodo(pipfile, dbfile, strict=True): + '''Print name of all pips in pipfile but not dbfile''' todos = set() with open(pipfile, "r") as f: for line in f: line = line.split() todos.add(line[0]) - with open(dbfile, "r") as f: - for line in f: - line = line.split() - todos.remove(line[0]) + print('%s: %u entries' % (pipfile, len(todos)), file=sys.stderr) + # Support generate without existing DB + if os.path.exists(dbfile) or strict: + with open(dbfile, "r") as f: + for line in f: + line = line.split() + pip = line[0] + try: + todos.remove(pip) + except KeyError: + # DB (incorrectly) had multiple entries + # Workaround for testing on old DB revision + if strict: + raise + print( + 'WARNING: failed to remove pip %s' % pip, + file=sys.stderr) + print('Remove %s: %u entries' % (dbfile, len(todos)), file=sys.stderr) + drops = 0 + lines = 0 for line in todos: - if not line.endswith(".VCC_WIRE"): - print(line) + if line.endswith(".VCC_WIRE"): + drops += 1 + continue + print(line) + lines += 1 + print('Print %u entries w/ %u drops' % (lines, drops), file=sys.stderr) -maketodo( - "pips_int_l.txt", "%s/%s/segbits_int_l.db" % - (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"))) -maketodo( - "pips_int_r.txt", "%s/%s/segbits_int_r.db" % - (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"))) +def run(strict=True): + maketodo( + "build/pips_int_l.txt", + "%s/%s/segbits_int_l.db" % + (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")), + strict=strict) + maketodo( + "build/pips_int_r.txt", + "%s/%s/segbits_int_r.db" % + (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE")), + strict=strict) + + +def main(): + import argparse + + parser = argparse.ArgumentParser( + description="Print list of known but unsolved PIPs") + + # util.db_root_arg(parser) + parser.add_argument('--no-strict', action='store_true', help='') + args = parser.parse_args() + + run(strict=not args.no_strict) + + +if __name__ == '__main__': + main() diff --git a/fuzzers/056-rempips/piplist.tcl b/fuzzers/056-rempips/piplist.tcl index 4b2c87cc..0086ab9b 100644 --- a/fuzzers/056-rempips/piplist.tcl +++ b/fuzzers/056-rempips/piplist.tcl @@ -1,6 +1,6 @@ create_project -force -part $::env(XRAY_PART) piplist piplist -read_verilog top.v +read_verilog ../top.v synth_design -top top set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_00) IOSTANDARD LVCMOS33" [get_ports i] @@ -18,7 +18,7 @@ route_design write_checkpoint -force piplist.dcp -source ../../utils/utils.tcl +source "$::env(XRAY_DIR)/utils/utils.tcl" proc print_tile_pips {tile_type filename} { set tile [lindex [get_tiles -filter "TYPE == $tile_type"] 0] diff --git a/utils/top_generate.sh b/utils/top_generate.sh index f07384aa..41056b6b 100644 --- a/utils/top_generate.sh +++ b/utils/top_generate.sh @@ -7,7 +7,11 @@ set -ex FUZDIR=$PWD source ${XRAY_GENHEADER} -python3 $FUZDIR/top.py >top.v +# Some projects have hard coded top.v, others are generated +if [ -f $FUZDIR/top.py ] ; then + python3 $FUZDIR/top.py >top.v +fi + vivado -mode batch -source $FUZDIR/generate.tcl test -z "$(fgrep CRITICAL vivado.log)"