From 9ecee64d4e4d923491f5a6144b16553b8e48143d Mon Sep 17 00:00:00 2001 From: Keith Rothman <537074+litghost@users.noreply.github.com> Date: Mon, 5 Oct 2020 13:03:35 -0700 Subject: [PATCH 1/2] Add IFF.IN_USE feature. This addresses missing features in https://github.com/SymbiFlow/symbiflow-arch-defs/issues/1536 . Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com> --- fuzzers/035b-iob-iserdes/Makefile | 1 + fuzzers/035b-iob-iserdes/generate.py | 11 +++----- fuzzers/035b-iob-iserdes/top.py | 40 +++++++++++++++++++--------- utils/dbfixup.py | 25 ++++++++++------- 4 files changed, 48 insertions(+), 29 deletions(-) diff --git a/fuzzers/035b-iob-iserdes/Makefile b/fuzzers/035b-iob-iserdes/Makefile index 443b22be..446482e3 100644 --- a/fuzzers/035b-iob-iserdes/Makefile +++ b/fuzzers/035b-iob-iserdes/Makefile @@ -16,6 +16,7 @@ build/segbits_xioi3.rdb2: $(SPECIMENS_OK) build/segbits_xioi3.rdb: build/segbits_xioi3.rdb2 # Keep only solution for ISERDES related features. grep -e ".ISERDES." $^ >$@ + grep -e ".IDDR.IN_USE." $^ >>$@ build/segbits_xioi3.db: build/segbits_xioi3.rdb ${XRAY_DBFIXUP} --db-root build --zero-db bits.dbf --groups tag_groups.txt --seg-fn-in $^ --seg-fn-out $@ diff --git a/fuzzers/035b-iob-iserdes/generate.py b/fuzzers/035b-iob-iserdes/generate.py index 63784373..c6e5621b 100644 --- a/fuzzers/035b-iob-iserdes/generate.py +++ b/fuzzers/035b-iob-iserdes/generate.py @@ -9,7 +9,6 @@ # # SPDX-License-Identifier: ISC import json -import re from prjxray.segmaker import Segmaker from prjxray import util @@ -55,7 +54,7 @@ def run(): segmk.add_site_tag(loc, "IDDR_OR_ISERDES.IN_USE", 0) segmk.add_site_tag(loc, "ISERDES.IN_USE", 0) - segmk.add_site_tag(loc, "IFF.IN_USE", 0) + segmk.add_site_tag(loc, "IDDR.IN_USE", 0) segmk.add_site_tag(loc, "ISERDES.MODE.MASTER", 0) segmk.add_site_tag(loc, "ISERDES.MODE.SLAVE", 0) @@ -95,7 +94,6 @@ def run(): elif verilog.unquote(params["BEL_TYPE"]) == "ISERDESE2": segmk.add_site_tag(loc, "IDDR_OR_ISERDES.IN_USE", 1) - segmk.add_site_tag(loc, "IFF.IN_USE", 0) segmk.add_site_tag(loc, "ISERDES.IN_USE", 1) if "SHIFTOUT_USED" in params: @@ -121,7 +119,6 @@ def run(): for j in data_rates: for k in data_widths[j]: tag = "ISERDES.%s.%s.W%s" % (i, j, k) - val = 0 if i == iface_type: if j == data_rate: @@ -202,10 +199,10 @@ def run(): loc, "ISERDES.OFB_USED", int(value == "TRUE")) # Site used as IDDR - elif verilog.unquote(params["BEL_TYPE"]) == "IDDR": - + elif verilog.unquote(params["BEL_TYPE"]) in ["IDDR", + "IDDR_NO_CLK"]: segmk.add_site_tag(loc, "IDDR_OR_ISERDES.IN_USE", 1) - segmk.add_site_tag(loc, "IFF.IN_USE", 1) + segmk.add_site_tag(loc, "IDDR.IN_USE", 1) segmk.add_site_tag(loc, "ISERDES.IN_USE", 0) if "DDR_CLK_EDGE" in params: diff --git a/fuzzers/035b-iob-iserdes/top.py b/fuzzers/035b-iob-iserdes/top.py index 3e216ba7..2c9363bb 100644 --- a/fuzzers/035b-iob-iserdes/top.py +++ b/fuzzers/035b-iob-iserdes/top.py @@ -11,7 +11,6 @@ import os, random random.seed(int(os.getenv("SEED"), 16)) -import re import json from prjxray import util @@ -38,16 +37,6 @@ def gen_sites(): iob_gridinfo = grid.gridinfo_at_loc( grid.loc_of_tilename(iob_tile_name)) - # Find IOI tile adjacent to IOB - for suffix in ["IOI3", "IOI3_TBYTESRC", "IOI3_TBYTETERM"]: - try: - ioi_tile_name = iob_tile_name.replace("IOB33", suffix) - ioi_gridinfo = grid.gridinfo_at_loc( - grid.loc_of_tilename(ioi_tile_name)) - break - except KeyError: - pass - iob33s = [k for k, v in iob_gridinfo.sites.items() if v == "IOB33S"][0] iob33m = [k for k, v in iob_gridinfo.sites.items() if v == "IOB33M"][0] @@ -137,7 +126,7 @@ def gen_iddr(loc): "USE_IDELAY": random.randint(0, 1), "BEL_TYPE": - verilog.quote("IDDR"), + verilog.quote(random.choice(["IDDR", "IDDR_NO_CLK"])), "INIT_Q1": random.randint(0, 1), "INIT_Q2": @@ -455,6 +444,33 @@ end else if (IS_USED && BEL_TYPE == "IDDR") begin assign x[8] = (IDELMUX) ? ddly : I; assign x[7:2] = 0; +end else if (IS_USED && BEL_TYPE == "IDDR_NO_CLK") begin + + // IDDR + (* LOC=SITE_LOC, KEEP, DONT_TOUCH *) + IDDR # + ( + .IS_C_INVERTED(IS_C_INVERTED), + .IS_D_INVERTED(IS_D_INVERTED), + .DDR_CLK_EDGE(DDR_CLK_EDGE), + .INIT_Q1(INIT_Q1), + .INIT_Q2(INIT_Q2), + .SRTYPE(SRTYPE) + ) + iddr + ( + .C(), + .CE( (CE1USED) ? ce : 1'hx ), + .D( (IFFDELMUX) ? ddly : I ), + .S( (SR_MODE == "SET") ? rst : 1'd0 ), + .R( (SR_MODE == "RST") ? rst : 1'd0 ), + .Q1(x[0]), + .Q2(x[1]) + ); + + assign x[8] = (IDELMUX) ? ddly : I; + assign x[7:2] = 0; + end else begin assign x[0] = I; diff --git a/utils/dbfixup.py b/utils/dbfixup.py index 1d3bc2cd..a08bf5ae 100755 --- a/utils/dbfixup.py +++ b/utils/dbfixup.py @@ -421,6 +421,17 @@ def remove_ambiguous_solutions(fn_in, db_lines, strict=True, verbose=True): return drops, output_lines +def format_bits(tag, bits): + """ Format tag and bits into line. """ + bit_strs = [] + for bit in sorted(list(bits), key=lambda b: b[1]): + s = "!" if not bit[0] else "" + s += "{:02d}_{:02d}".format(bit[1][0], bit[1][1]) + bit_strs.append(s) + + return " ".join([tag] + bit_strs) + + def group_tags(lines, tag_groups, bit_groups): """ Implements tag grouping. If a tag belongs to a group then the common bits @@ -430,13 +441,13 @@ def group_tags(lines, tag_groups, bit_groups): >>> bg = [{(1, 2), (3, 4)}] >>> res = group_tags({"A 1_2", "B 3_4"}, tg, bg) >>> (res[0], sorted(list(res[1]))) - (2, ['A 1_2 !3_4', 'B !1_2 3_4']) + (2, ['A 01_02 !03_04', 'B !01_02 03_04']) >>> tg = [{"A", "B"}] >>> bg = [{(1, 2), (3, 4)}] >>> res = group_tags({"A 1_2", "B 3_4", "C 1_2"}, tg, bg) >>> (res[0], sorted(list(res[1]))) - (2, ['A 1_2 !3_4', 'B !1_2 3_4', 'C 1_2']) + (2, ['A 01_02 !03_04', 'B !01_02 03_04', 'C 01_02']) """ changes = 0 @@ -467,13 +478,7 @@ def group_tags(lines, tag_groups, bit_groups): bits.add((False, zero_bit)) # Format the line - bit_strs = [] - for bit in sorted(list(bits), key=lambda b: b[1]): - s = "!" if not bit[0] else "" - s += "{}_{}".format(bit[1][0], bit[1][1]) - bit_strs.append(s) - - new_line = " ".join([tag] + bit_strs) + new_line = format_bits(tag, bits) # Add the line new_lines.add(new_line) @@ -482,7 +487,7 @@ def group_tags(lines, tag_groups, bit_groups): # It does not, pass it through unchanged else: - new_lines.add(line) + new_lines.add(format_bits(tag, bits)) return changes, new_lines From b741467366ece78f342ce16260fa0d8f496974c5 Mon Sep 17 00:00:00 2001 From: Keith Rothman <537074+litghost@users.noreply.github.com> Date: Thu, 8 Oct 2020 11:18:27 -0700 Subject: [PATCH 2/2] Increase 044 filters and reverse order of mergedb for better errors. Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com> --- fuzzers/044-clk-bufg-pips/Makefile | 3 +-- utils/mergedb.sh | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/fuzzers/044-clk-bufg-pips/Makefile b/fuzzers/044-clk-bufg-pips/Makefile index 0a62756a..ce02a361 100644 --- a/fuzzers/044-clk-bufg-pips/Makefile +++ b/fuzzers/044-clk-bufg-pips/Makefile @@ -13,8 +13,7 @@ TODO_RE=".*" MAKETODO_FLAGS=--sides "bot_r,top_r" --pip-type ${PIP_TYPE} --seg-type clk_bufg --re $(TODO_RE) --exclude-re ".*\.CLK_BUFG_(BOT|TOP)_R_CK_MUXED[0-9]+" N = 50 -# These PIPs all appear to be either a 1 bit solutions. -SEGMATCH_FLAGS=-c 2 +SEGMATCH_FLAGS=-c 2 -m 6 -M 45 SPECIMENS_DEPS=build/cmt_regions.csv A_PIPLIST=clk_bufg_bot_r.txt diff --git a/utils/mergedb.sh b/utils/mergedb.sh index 2237e3e0..36032d97 100755 --- a/utils/mergedb.sh +++ b/utils/mergedb.sh @@ -167,7 +167,6 @@ if $ismask ; then sort -u "$tmp1" "$db" | grep -v '<.*>' > "$tmp2" || true else # tmp1 must be placed second to take precedence over old bad entries - python3 ${XRAY_DIR}/utils/mergedb.py --out "$tmp2" "$db" "$tmp1" if ! $ismask ; then db_origin=$XRAY_DATABASE_DIR/$XRAY_DATABASE/segbits_$1.origin_info.db if [ ! -f $db_origin ] ; then @@ -175,6 +174,7 @@ else fi python3 ${XRAY_DIR}/utils/mergedb.py --out "$db_origin" "$db_origin" "$tmp1" --track_origin fi + python3 ${XRAY_DIR}/utils/mergedb.py --out "$tmp2" "$db" "$tmp1" fi # Check aggregate db for consistency and make canonical ${XRAY_PARSEDB} --strict "$tmp2" "$db"