From 206364020c870b20992b8993d72eaa2ce6426b54 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Fri, 22 Dec 2017 17:24:27 +0100 Subject: [PATCH] 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] #######################################