From 2c150c6f85600eb1634aa7031e9edc940cc02dc5 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Thu, 21 Dec 2017 19:12:07 +0100 Subject: [PATCH 1/7] Rename 019_ndi1mux to 019-ndi1mux Signed-off-by: Clifford Wolf --- fuzzers/{019_ndi1mux => 019-ndi1mux}/.gitignore | 0 fuzzers/{019_ndi1mux => 019-ndi1mux}/Makefile | 0 fuzzers/{019_ndi1mux => 019-ndi1mux}/README.txt | 0 fuzzers/{019_ndi1mux => 019-ndi1mux}/generate.py | 0 fuzzers/{019_ndi1mux => 019-ndi1mux}/generate.sh | 0 fuzzers/{019_ndi1mux => 019-ndi1mux}/generate.tcl | 0 fuzzers/{019_ndi1mux => 019-ndi1mux}/top.py | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename fuzzers/{019_ndi1mux => 019-ndi1mux}/.gitignore (100%) rename fuzzers/{019_ndi1mux => 019-ndi1mux}/Makefile (100%) rename fuzzers/{019_ndi1mux => 019-ndi1mux}/README.txt (100%) rename fuzzers/{019_ndi1mux => 019-ndi1mux}/generate.py (100%) rename fuzzers/{019_ndi1mux => 019-ndi1mux}/generate.sh (100%) rename fuzzers/{019_ndi1mux => 019-ndi1mux}/generate.tcl (100%) rename fuzzers/{019_ndi1mux => 019-ndi1mux}/top.py (100%) diff --git a/fuzzers/019_ndi1mux/.gitignore b/fuzzers/019-ndi1mux/.gitignore similarity index 100% rename from fuzzers/019_ndi1mux/.gitignore rename to fuzzers/019-ndi1mux/.gitignore diff --git a/fuzzers/019_ndi1mux/Makefile b/fuzzers/019-ndi1mux/Makefile similarity index 100% rename from fuzzers/019_ndi1mux/Makefile rename to fuzzers/019-ndi1mux/Makefile diff --git a/fuzzers/019_ndi1mux/README.txt b/fuzzers/019-ndi1mux/README.txt similarity index 100% rename from fuzzers/019_ndi1mux/README.txt rename to fuzzers/019-ndi1mux/README.txt diff --git a/fuzzers/019_ndi1mux/generate.py b/fuzzers/019-ndi1mux/generate.py similarity index 100% rename from fuzzers/019_ndi1mux/generate.py rename to fuzzers/019-ndi1mux/generate.py diff --git a/fuzzers/019_ndi1mux/generate.sh b/fuzzers/019-ndi1mux/generate.sh similarity index 100% rename from fuzzers/019_ndi1mux/generate.sh rename to fuzzers/019-ndi1mux/generate.sh diff --git a/fuzzers/019_ndi1mux/generate.tcl b/fuzzers/019-ndi1mux/generate.tcl similarity index 100% rename from fuzzers/019_ndi1mux/generate.tcl rename to fuzzers/019-ndi1mux/generate.tcl diff --git a/fuzzers/019_ndi1mux/top.py b/fuzzers/019-ndi1mux/top.py similarity index 100% rename from fuzzers/019_ndi1mux/top.py rename to fuzzers/019-ndi1mux/top.py From 48719fdd94fea004f6e4cd7653666998936bb1e5 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Thu, 21 Dec 2017 19:41:59 +0100 Subject: [PATCH 2/7] Improve htmlgen output for BRAM and DSP tiles Signed-off-by: Clifford Wolf --- htmlgen/htmlgen.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/htmlgen/htmlgen.py b/htmlgen/htmlgen.py index cea4f588..010bb6ef 100755 --- a/htmlgen/htmlgen.py +++ b/htmlgen/htmlgen.py @@ -258,6 +258,12 @@ with out_open("index.html") as f: if tiledata["type"] in ["CLBLM_L", "CLBLM_R"]: bgcolor="#ffaaaa" if tiledata["type"] in ["HCLK_L", "HCLK_R"]: bgcolor="#aaffaa" + if tiledata["type"] in ["BRAM_INT_INTERFACE_L", "BRAM_L"]: bgcolor="#aaffff" + if tiledata["type"] in ["BRAM_INT_INTERFACE_R", "BRAM_R"]: bgcolor="#aaffff" + + if tiledata["type"] in ["INT_INTERFACE_L", "DSP_L"]: bgcolor="#ffaaff" + if tiledata["type"] in ["INT_INTERFACE_R", "DSP_R"]: bgcolor="#ffaaff" + title = [tilename] if "segment" in tiledata: @@ -276,6 +282,10 @@ with out_open("index.html") as f: else: print("Warning: no baseaddr in segment %s (via tile %s)." % (tiledata["segment"], tilename)) + tilename = tilename.replace("INT_INTERFACE_", "INTF_") + tilename = tilename.replace("_X", "
X") + tilename = tilename.replace("B_TERM", "B
TERM") + print("" % (bgcolor, "\n".join(title)), file=f) if "segment" in tiledata: segtype = segdata["type"].lower() From 63d4d3ba9f44d481ac2d2cb0fdfc9d515cbb44ef Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Thu, 21 Dec 2017 20:56:15 +0100 Subject: [PATCH 3/7] Set tcl.collectionResultDisplayLimit to unlimited for 050-intpips Signed-off-by: Clifford Wolf --- fuzzers/050-intpips/generate.tcl | 1 + 1 file changed, 1 insertion(+) diff --git a/fuzzers/050-intpips/generate.tcl b/fuzzers/050-intpips/generate.tcl index 6db75a91..ee52458f 100644 --- a/fuzzers/050-intpips/generate.tcl +++ b/fuzzers/050-intpips/generate.tcl @@ -18,6 +18,7 @@ set_property CONFIG_VOLTAGE 3.3 [current_design] set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design] set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets clk_IBUF] +set_param tcl.collectionResultDisplayLimit 0 source ../../../utils/utils.tcl randplace_pblock 100 roi From c04f33ff3a6e4af40c88154c204c96138eb053a4 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Thu, 21 Dec 2017 20:57:31 +0100 Subject: [PATCH 4/7] Hotfix in mergedb.sh for "grep" vs "set -e" Signed-off-by: Clifford Wolf --- utils/mergedb.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/mergedb.sh b/utils/mergedb.sh index 461473d9..a8735605 100644 --- a/utils/mergedb.sh +++ b/utils/mergedb.sh @@ -48,7 +48,7 @@ case "$1" in esac touch "$db" -sort -u "$tmp1" "$db" | grep -v '<.*>' > "$tmp2" +sort -u "$tmp1" "$db" | grep -v '<.*>' > "$tmp2" || true mv "$tmp2" "$db" rm -f "$tmp1" From 206364020c870b20992b8993d72eaa2ce6426b54 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Fri, 22 Dec 2017 17:24:27 +0100 Subject: [PATCH 5/7] Add tilegrid BRAM and DSP segment support Signed-off-by: Clifford Wolf --- fuzzers/005-tilegrid/generate.py | 149 +++++++++++++++++++++---------- 1 file changed, 103 insertions(+), 46 deletions(-) diff --git a/fuzzers/005-tilegrid/generate.py b/fuzzers/005-tilegrid/generate.py index 40c0a2fc..295f67ef 100644 --- a/fuzzers/005-tilegrid/generate.py +++ b/fuzzers/005-tilegrid/generate.py @@ -8,6 +8,7 @@ import os, sys, json, re tiles = list() site_baseaddr = dict() +tile_baseaddr = dict() with open("tiles.txt") as f: for line in f: @@ -49,21 +50,43 @@ for record in tiles: framebaseaddr = site_baseaddr[site_name] database["tiles"][tile_name]["sites"][site_name] = site_type + if framebaseaddr is not None: + tile_baseaddr[tile_name] = [framebaseaddr, 0] + + +####################################### +# Add Segments + +for tile_name, tile_data in database["tiles"].items(): + tile_type = tile_data["type"] + grid_x = tile_data["grid_x"] + grid_y = tile_data["grid_y"] + if tile_type in ["CLBLL_L", "CLBLL_R", "CLBLM_L", "CLBLM_R"]: + if tile_type in ["CLBLL_L", "CLBLM_L"]: + int_tile_name = tiles_by_grid[(grid_x+1, grid_y)] + else: + int_tile_name = tiles_by_grid[(grid_x-1, grid_y)] + segment_name = "SEG_" + tile_name segtype = tile_type.lower() + database["segments"][segment_name] = dict() - database["segments"][segment_name]["tiles"] = [tile_name] + database["segments"][segment_name]["tiles"] = [tile_name, int_tile_name] database["segments"][segment_name]["type"] = segtype database["segments"][segment_name]["frames"] = 36 database["segments"][segment_name]["words"] = 2 - if framebaseaddr is not None: - database["segments"][segment_name]["baseaddr"] = [framebaseaddr, 0] + + if tile_name in tile_baseaddr: + database["segments"][segment_name]["baseaddr"] = tile_baseaddr[tile_name] + database["tiles"][tile_name]["segment"] = segment_name + database["tiles"][int_tile_name]["segment"] = segment_name if tile_type in ["HCLK_L", "HCLK_R"]: segment_name = "SEG_" + tile_name segtype = tile_type.lower() + database["segments"][segment_name] = dict() database["segments"][segment_name]["tiles"] = [tile_name] database["segments"][segment_name]["type"] = segtype @@ -71,9 +94,75 @@ for record in tiles: database["segments"][segment_name]["words"] = 1 database["tiles"][tile_name]["segment"] = segment_name + if tile_type in ["BRAM_L", "DSP_L", "BRAM_R", "DSP_R"]: + for k in range(5): + if tile_type in ["BRAM_L", "DSP_L"]: + interface_tile_name = tiles_by_grid[(grid_x+1, grid_y-k)] + int_tile_name = tiles_by_grid[(grid_x+2, grid_y-k)] + else: + interface_tile_name = tiles_by_grid[(grid_x-1, grid_y-k)] + int_tile_name = tiles_by_grid[(grid_x-2, grid_y-k)] + + segment_name = "SEG_" + tile_name.replace("_", "%d_" % k, 1) + segtype = tile_type.lower().replace("_", "%d_" % k, 1) + + database["segments"][segment_name] = dict() + database["segments"][segment_name]["type"] = segtype + database["segments"][segment_name]["frames"] = 28 + database["segments"][segment_name]["words"] = 1 + + if k == 0: + database["segments"][segment_name]["tiles"] = [tile_name, interface_tile_name, int_tile_name] + database["tiles"][tile_name]["segment"] = segment_name + database["tiles"][interface_tile_name]["segment"] = segment_name + database["tiles"][int_tile_name]["segment"] = segment_name + else: + database["segments"][segment_name]["tiles"] = [interface_tile_name, int_tile_name] + database["tiles"][interface_tile_name]["segment"] = segment_name + database["tiles"][int_tile_name]["segment"] = segment_name + ####################################### -# Pupulate segment base addresses +# Populate segment base addresses: L/R along INT column + +for segment_name in database["segments"].keys(): + if "baseaddr" in database["segments"][segment_name]: + framebase, wordbase = database["segments"][segment_name]["baseaddr"] + inttile = [tile for tile in database["segments"][segment_name]["tiles"] if database["tiles"][tile]["type"] in ["INT_L", "INT_R"]][0] + grid_x = database["tiles"][inttile]["grid_x"] + grid_y = database["tiles"][inttile]["grid_y"] + + if database["tiles"][inttile]["type"] == "INT_L": + grid_x += 1 + framebase = "0x%08x" % (int(framebase, 16) + 0x80) + else: + grid_x -= 1 + framebase = "0x%08x" % (int(framebase, 16) - 0x80) + + if (grid_x, grid_y) not in tiles_by_grid: + continue + + tile = tiles_by_grid[(grid_x, grid_y)] + + if database["tiles"][inttile]["type"] == "INT_L": + assert database["tiles"][tile]["type"] == "INT_R" + elif database["tiles"][inttile]["type"] == "INT_R": + assert database["tiles"][tile]["type"] == "INT_L" + else: + assert 0 + + assert "segment" in database["tiles"][tile] + + seg = database["tiles"][tile]["segment"] + + if "baseaddr" in database["segments"][seg]: + assert database["segments"][seg]["baseaddr"] == [framebase, wordbase] + else: + database["segments"][seg]["baseaddr"] = (framebase, wordbase) + + +####################################### +# Populate segment base addresses: Up along INT/HCLK columns start_segments = list() @@ -83,52 +172,20 @@ for segment_name in database["segments"].keys(): for segment_name in start_segments: framebase, wordbase = database["segments"][segment_name]["baseaddr"] - clbtile = [tile for tile in database["segments"][segment_name]["tiles"] if tile.startswith("CLBL")][0] - grid_x = database["tiles"][clbtile]["grid_x"] - grid_y = database["tiles"][clbtile]["grid_y"] + inttile = [tile for tile in database["segments"][segment_name]["tiles"] if database["tiles"][tile]["type"] in ["INT_L", "INT_R"]][0] + grid_x = database["tiles"][inttile]["grid_x"] + grid_y = database["tiles"][inttile]["grid_y"] - for i in range(49): - while True: - grid_y -= 1 - clbtile = tiles_by_grid[(grid_x, grid_y)] - if clbtile.startswith("CLBL"): break + for i in range(50): + grid_y -= 1 - wordbase += 2 - if wordbase == 50: wordbase += 1 - - segname = database["tiles"][clbtile]["segment"] - database["segments"][segname]["baseaddr"] = [framebase, wordbase] - - -####################################### -# Add INT tiles to segments - -for segment_name in database["segments"].keys(): - for clbtile in database["segments"][segment_name]["tiles"]: - if not clbtile.startswith("CLBL"): - continue - - grid_x = database["tiles"][clbtile]["grid_x"] - grid_y = database["tiles"][clbtile]["grid_y"] - - if database["tiles"][clbtile]["type"] in ["CLBLL_L", "CLBLM_L"]: - grid_x += 1 + if wordbase == 50: + wordbase += 1 else: - grid_x -= 1 + wordbase += 2 - inttile = tiles_by_grid[(grid_x, grid_y)] - assert inttile.startswith("INT_") - - database["tiles"][inttile]["segment"] = segment_name - s = set(database["segments"][segment_name]["tiles"] + [inttile]) - database["segments"][segment_name]["tiles"] = list(sorted(s)) - - if inttile.endswith("25") or inttile.endswith("75"): - clktile = tiles_by_grid[(grid_x, grid_y+1)] - assert clktile.startswith("HCLK_") - clkseg = database["tiles"][clktile]["segment"] - framebase, wordbase = database["segments"][segment_name]["baseaddr"] - database["segments"][clkseg]["baseaddr"] = [framebase, wordbase-1] + segname = database["tiles"][tiles_by_grid[(grid_x, grid_y)]]["segment"] + database["segments"][segname]["baseaddr"] = [framebase, wordbase] ####################################### From 533bb83f4547def1c6c0188c5c2ef516d0baa44b Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Fri, 22 Dec 2017 17:28:39 +0100 Subject: [PATCH 6/7] Fix dbfixup.py for incomplete databases Signed-off-by: Clifford Wolf --- utils/dbfixup.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/utils/dbfixup.py b/utils/dbfixup.py index b61f63fe..f7840bf9 100644 --- a/utils/dbfixup.py +++ b/utils/dbfixup.py @@ -32,10 +32,14 @@ zero_db = [ ] def add_zero_bits(tile_type): - assert os.getenv("XRAY_DATABASE") == "artix7" + assert os.getenv("XRAY_DATABASE") in ["artix7", "kintex7"] dbfile = "%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), tile_type) new_lines = set() llast = None + + if not os.path.exists(dbfile): + return + with open(dbfile, "r") as f: for line in f: # Hack: skip duplicate lines @@ -75,26 +79,39 @@ def add_zero_bits(tile_type): bits.add("!" + bit) new_lines.add(" ".join([tag] + sorted(bits))) llast = line + with open(dbfile, "w") as f: for line in sorted(new_lines): print(line, file=f) def update_mask(mask_db, *src_dbs): bits = set() - with open("%s/%s/mask_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), mask_db), "r") as f: + mask_db_file = "%s/%s/mask_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), mask_db) + + if not os.path.exists(mask_db_file): + return + + with open(mask_db_file, "r") as f: for line in f: line = line.split() assert len(line) == 2 assert line[0] == "bit" bits.add(line[1]) + for src_db in src_dbs: - with open("%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), src_db), "r") as f: + seg_db_file = "%s/%s/segbits_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), src_db) + + if not os.path.exists(seg_db_file): + continue + + with open(seg_db_file, "r") as f: for line in f: line = line.split() for bit in line[1:]: if bit[0] != "!": bits.add(bit) - with open("%s/%s/mask_%s.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"), mask_db), "w") as f: + + with open(mask_db_file, "w") as f: for bit in sorted(bits): print("bit %s" % bit, file=f) From b602904ee2f42ca07edcaf45d41632735e0ec99e Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Fri, 22 Dec 2017 17:37:36 +0100 Subject: [PATCH 7/7] Reduce size of HCLK segments to 26 frames Signed-off-by: Clifford Wolf --- fuzzers/005-tilegrid/generate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fuzzers/005-tilegrid/generate.py b/fuzzers/005-tilegrid/generate.py index 295f67ef..298515fc 100644 --- a/fuzzers/005-tilegrid/generate.py +++ b/fuzzers/005-tilegrid/generate.py @@ -90,7 +90,7 @@ for tile_name, tile_data in database["tiles"].items(): database["segments"][segment_name] = dict() database["segments"][segment_name]["tiles"] = [tile_name] database["segments"][segment_name]["type"] = segtype - database["segments"][segment_name]["frames"] = 36 + database["segments"][segment_name]["frames"] = 26 database["segments"][segment_name]["words"] = 1 database["tiles"][tile_name]["segment"] = segment_name