From eb7c1cc5899dd9b476c3503f1b1a6402c4ac25c2 Mon Sep 17 00:00:00 2001 From: John McMaster Date: Tue, 13 Nov 2018 14:38:26 -0800 Subject: [PATCH 1/6] parsedb: more verbose duplicate tag message Signed-off-by: John McMaster --- utils/parsedb.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/utils/parsedb.py b/utils/parsedb.py index e3837798..50019426 100755 --- a/utils/parsedb.py +++ b/utils/parsedb.py @@ -5,7 +5,7 @@ from prjxray import util def run(fnin, fnout=None, strict=False, verbose=False): lines = open(fnin, 'r').read().split('\n') - tags = set() + tags = dict() bitss = set() for line in lines: line = line.strip() @@ -14,11 +14,13 @@ def run(fnin, fnout=None, strict=False, verbose=False): tag, bits, mode = util.parse_db_line(line) if strict: assert not mode, "strict: got ill defined line: %s" % (line, ) - assert tag not in tags, "strict: got duplicate tag %s (ex: %s)" % ( - tag, line) + if tag in tags: + print("Original line: %s" % tags[tag]) + print("New line: %s" % line) + assert 0, "strict: got duplicate tag %s" % (tag, ) assert bits not in bitss, "strict: got duplicate bits %s (ex: %s)" % ( bits, line) - tags.add(tag) + tags[tag] = line bitss.add(bits) if fnout: From 8753ac3b67b7b189d4e41a9421618f19051a22e9 Mon Sep 17 00:00:00 2001 From: John McMaster Date: Tue, 13 Nov 2018 15:15:34 -0800 Subject: [PATCH 2/6] mergedb: more aggressively delete temp files Signed-off-by: John McMaster --- utils/mergedb.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/utils/mergedb.sh b/utils/mergedb.sh index 848d50f3..90aca2b0 100755 --- a/utils/mergedb.sh +++ b/utils/mergedb.sh @@ -10,6 +10,13 @@ test -e "$2" tmp1=`mktemp -p .` tmp2=`mktemp -p .` +function finish { + echo "Cleaning up temp files" + rm -f "$tmp1" + rm -f "$tmp2" +} +trap finish EXIT + db=$XRAY_DATABASE_DIR/$XRAY_DATABASE/segbits_$1.db # Fuzzers verify L/R data is equivilent @@ -72,5 +79,4 @@ esac touch "$db" sort -u "$tmp1" "$db" | grep -v '<.*>' > "$tmp2" || true ${XRAY_PARSEDB} --strict "$tmp2" "$db" -rm -f "$tmp1" From 1707c01306b0aeb42da95fd6d60305d24fa9096f Mon Sep 17 00:00:00 2001 From: John McMaster Date: Tue, 13 Nov 2018 19:47:13 -0800 Subject: [PATCH 3/6] parse_db_line: verbose error on mask input Signed-off-by: John McMaster --- prjxray/util.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/prjxray/util.py b/prjxray/util.py index 35603fc9..60f1c46f 100644 --- a/prjxray/util.py +++ b/prjxray/util.py @@ -78,6 +78,8 @@ def parse_db_line(line): # Ex: CLBLL_L.SLICEL_X0.AMUX.A5Q assert len(parts), "Empty line" tag = parts[0] + if tag == 'bit': + raise ValueError("Wanted bits db but got mask db") assert re.match(r'[A-Z0-9_.]+', tag), "Invalid tag name: %s, line: %s" % (tag, line) orig_bits = line.replace(tag + " ", "") From 5ecf3a3f4500da86ddfd65aafd2e4622ce4c65e3 Mon Sep 17 00:00:00 2001 From: John McMaster Date: Tue, 13 Nov 2018 19:47:53 -0800 Subject: [PATCH 4/6] parsedb: ignore mask lines Signed-off-by: John McMaster --- utils/parsedb.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/utils/parsedb.py b/utils/parsedb.py index 50019426..011a5ab2 100755 --- a/utils/parsedb.py +++ b/utils/parsedb.py @@ -11,6 +11,9 @@ def run(fnin, fnout=None, strict=False, verbose=False): line = line.strip() if line == '': continue + # TODO: figure out what to do with masks + if line.startswith("bit "): + continue tag, bits, mode = util.parse_db_line(line) if strict: assert not mode, "strict: got ill defined line: %s" % (line, ) From c1069aa1c0ea88366eb1a6a814a3447add6d741b Mon Sep 17 00:00:00 2001 From: John McMaster Date: Wed, 14 Nov 2018 11:33:30 -0800 Subject: [PATCH 5/6] parsedb: support "always" mode Signed-off-by: John McMaster --- prjxray/util.py | 8 +++++--- utils/parsedb.py | 6 ++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/prjxray/util.py b/prjxray/util.py index 60f1c46f..09377c83 100644 --- a/prjxray/util.py +++ b/prjxray/util.py @@ -74,6 +74,7 @@ def db_root_arg(parser): def parse_db_line(line): + '''Return tag name, bit values (if any), mode (if any)''' parts = line.split() # Ex: CLBLL_L.SLICEL_X0.AMUX.A5Q assert len(parts), "Empty line" @@ -84,11 +85,12 @@ def parse_db_line(line): tag), "Invalid tag name: %s, line: %s" % (tag, line) orig_bits = line.replace(tag + " ", "") # <0 candidates> etc - if "<" in orig_bits: - return tag, set(), orig_bits + # Ex: INT_L.BYP_BOUNCE5.BYP_ALT5 always + if "<" in orig_bits or "always" == orig_bits: + return tag, None, orig_bits - # Ex: !30_06 !30_08 !30_11 30_07 bits = frozenset(parts[1:]) + # Ex: CLBLL_L.SLICEL_X0.AOUTMUX.A5Q !30_06 !30_08 !30_11 30_07 for bit in bits: # 19_39 # 100_319 diff --git a/utils/parsedb.py b/utils/parsedb.py index 011a5ab2..b24ad42f 100755 --- a/utils/parsedb.py +++ b/utils/parsedb.py @@ -16,7 +16,8 @@ def run(fnin, fnout=None, strict=False, verbose=False): continue tag, bits, mode = util.parse_db_line(line) if strict: - assert not mode, "strict: got ill defined line: %s" % (line, ) + if mode != "always": + assert not mode, "strict: got ill defined line: %s" % (line, ) if tag in tags: print("Original line: %s" % tags[tag]) print("New line: %s" % line) @@ -24,7 +25,8 @@ def run(fnin, fnout=None, strict=False, verbose=False): assert bits not in bitss, "strict: got duplicate bits %s (ex: %s)" % ( bits, line) tags[tag] = line - bitss.add(bits) + if bits != None: + bitss.add(bits) if fnout: with open(fnout, "w") as fout: From a3980ff73892d847b0b7abda34b99cd5b8718a6a Mon Sep 17 00:00:00 2001 From: John McMaster Date: Wed, 14 Nov 2018 12:00:51 -0800 Subject: [PATCH 6/6] dbfixup: handle always mode Signed-off-by: John McMaster --- utils/dbfixup.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/utils/dbfixup.py b/utils/dbfixup.py index 758d5592..094629aa 100755 --- a/utils/dbfixup.py +++ b/utils/dbfixup.py @@ -124,19 +124,24 @@ def add_zero_bits(fn_in, fn_out, zero_db, clb_int=False, verbose=False): assert mode not in ( "", ""), "Entries must be resolved. line: %s" % (line, ) - if mode: - assert mode == "<0 candidates>" - """ - This appears to be a large range of one hot interconnect bits - They are immediately before the first CLB real bits - """ - if clb_int: - zero_range(bits, 22, 25) - bits = set(bits) - zero_groups( - tag, bits, zero_db, strict=not clb_int, verbose=verbose) - new_line = " ".join([tag] + sorted(bits)) + if mode == "always": + new_line = line + elif mode == "<0 candidates>": + """ + This appears to be a large range of one hot interconnect bits + They are immediately before the first CLB real bits + """ + if clb_int: + zero_range(bits, 22, 25) + bits = set(bits) + zero_groups( + tag, bits, zero_db, strict=not clb_int, verbose=verbose) + + new_line = " ".join([tag] + sorted(bits)) + else: + assert 0, line + if new_line != line: changes += 1 new_lines.add(new_line)