From 96d3b3de690332f9a2d7d14cb70e311161052468 Mon Sep 17 00:00:00 2001 From: Jan Kowalewski Date: Tue, 19 Jan 2021 14:32:52 +0100 Subject: [PATCH] 064-gtp-channel: add gtp_channel_mid support Signed-off-by: Jan Kowalewski --- fuzzers/064-gtp-channel-conf/Makefile | 54 ++++++--- fuzzers/064-gtp-channel-conf/generate.py | 126 ++++++++++++++------- fuzzers/064-gtp-channel-conf/generate.tcl | 1 + fuzzers/064-gtp-channel-conf/pushdb.sh | 40 +++++++ fuzzers/064-gtp-channel-conf/top.py | 127 ++++++++++++++-------- fuzzers/Makefile | 2 +- 6 files changed, 247 insertions(+), 103 deletions(-) create mode 100644 fuzzers/064-gtp-channel-conf/pushdb.sh diff --git a/fuzzers/064-gtp-channel-conf/Makefile b/fuzzers/064-gtp-channel-conf/Makefile index 0ccb0b23..058b3f34 100644 --- a/fuzzers/064-gtp-channel-conf/Makefile +++ b/fuzzers/064-gtp-channel-conf/Makefile @@ -5,27 +5,49 @@ # https://opensource.org/licenses/ISC # # SPDX-License-Identifier: ISC -N ?= 40 -include ../fuzzer.mk +SHELL = bash -database: build/segbits_gtp_channelx.db +N ?= 10 -build/segbits_gtp_channelx.rdb: $(SPECIMENS_OK) - ${XRAY_SEGMATCH} -o build/segbits_gtp_channelx.rdb $(addsuffix /segdata_gtp_channel_[0123].txt,$(SPECIMENS)) +BUILD_DIR = build_${XRAY_PART} -build/segbits_gtp_channelx.db: build/segbits_gtp_channelx.rdb - ${XRAY_DBFIXUP} --db-root build --zero-db bits.dbf --seg-fn-in $^ --seg-fn-out $@ - ${XRAY_MASKMERGE} build/mask_gtp_channelx.db $(addsuffix /segdata_gtp_channel_[0123].txt,$(SPECIMENS)) +SPECIMENS := $(addprefix ${BUILD_DIR}/specimen_,$(shell seq -f '%03.0f' $(N))) +SPECIMENS_OK := $(addsuffix /OK,$(SPECIMENS)) +FUZDIR ?= ${PWD} + + +all: database + +# generate.sh / top_generate.sh call make, hence the command must +# have a + before it. +$(SPECIMENS_OK): $(SPECIMENS_DEPS) + mkdir -p ${BUILD_DIR} + bash ${XRAY_DIR}/utils/top_generate.sh $(subst /OK,,$@) + +run: + $(MAKE) clean + $(MAKE) database + $(MAKE) pushdb + touch run.${XRAY_PART}.ok + +clean: + rm -rf ${BUILD_DIR} run.${XRAY_PART}.ok + +.PHONY: all run clean + +database: ${BUILD_DIR}/segbits_gtp_channelx.db + +${BUILD_DIR}/segbits_gtp_channelx.rdb: $(SPECIMENS_OK) + ${XRAY_SEGMATCH} -o ${BUILD_DIR}/segbits_gtp_channelx.rdb $$(find $(SPECIMENS) -name "segdata_gtp_channel_[0123]*") + +${BUILD_DIR}/segbits_gtp_channelx.db: ${BUILD_DIR}/segbits_gtp_channelx.rdb + ${XRAY_DBFIXUP} --db-root ${BUILD_DIR} --zero-db bits.dbf \ + --seg-fn-in ${BUILD_DIR}/segbits_gtp_channelx.rdb \ + --seg-fn-out ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MASKMERGE} ${BUILD_DIR}/mask_gtp_channelx.db $$(find $(SPECIMENS) -name "segdata_gtp_channel_[0123]*") pushdb: - ${XRAY_MERGEDB} gtp_channel_0 build/segbits_gtp_channelx.db - ${XRAY_MERGEDB} gtp_channel_1 build/segbits_gtp_channelx.db - ${XRAY_MERGEDB} gtp_channel_2 build/segbits_gtp_channelx.db - ${XRAY_MERGEDB} gtp_channel_3 build/segbits_gtp_channelx.db - ${XRAY_MERGEDB} mask_gtp_channel_0 build/mask_gtp_channelx.db - ${XRAY_MERGEDB} mask_gtp_channel_1 build/mask_gtp_channelx.db - ${XRAY_MERGEDB} mask_gtp_channel_2 build/mask_gtp_channelx.db - ${XRAY_MERGEDB} mask_gtp_channel_3 build/mask_gtp_channelx.db + BUILD_DIR=$(BUILD_DIR) source pushdb.sh .PHONY: database pushdb diff --git a/fuzzers/064-gtp-channel-conf/generate.py b/fuzzers/064-gtp-channel-conf/generate.py index 194efd98..45655e81 100644 --- a/fuzzers/064-gtp-channel-conf/generate.py +++ b/fuzzers/064-gtp-channel-conf/generate.py @@ -21,7 +21,7 @@ BOOL = "BOOL" STR = "STR" -def bitfilter(frame, bit): +def bitfilter_gtp_channel_x(frame, bit): # Filter out interconnect bits. if frame not in [28, 29, 30, 31]: return False @@ -29,6 +29,14 @@ def bitfilter(frame, bit): return True +def bitfilter_gtp_channel_x_mid(frame, bit): + # Filter out interconnect bits. + if frame not in [0, 1, 2, 3]: + return False + + return True + + def main(): segmk = Segmaker("design.bits") @@ -39,53 +47,91 @@ def main(): print("Loading tags") with open("params.json") as f: - params = json.load(f) + primitives_list = json.load(f) - site = params["site"] - in_use = params["IN_USE"] + for primitive in primitives_list: + tile_type = primitive["tile_type"] + params_list = primitive["params"] - segmk.add_site_tag(site, "IN_USE", in_use) + for params in params_list: + site = params["site"] - for param, param_info in attrs.items(): - value = params[param] - param_type = param_info["type"] - param_digits = param_info["digits"] - param_values = param_info["values"] + if "GTPE2_CHANNEL" not in site: + continue - if param_type == INT: - param_encodings = param_info["encoding"] - param_encoding = param_encodings[param_values.index(value)] - bitstr = [ - int(x) for x in "{value:0{digits}b}".format( - value=param_encoding, digits=param_digits)[::-1] - ] + in_use = params["IN_USE"] - for i in range(param_digits): - segmk.add_site_tag(site, '%s[%u]' % (param, i), bitstr[i]) - elif param_type == BIN: - bitstr = [ - int(x) for x in "{value:0{digits}b}".format( - value=value, digits=param_digits)[::-1] - ] + segmk.add_site_tag(site, "IN_USE", in_use) - for i in range(param_digits): - segmk.add_site_tag(site, "%s[%u]" % (param, i), bitstr[i]) - elif param_type == BOOL: - segmk.add_site_tag(site, param, value == "TRUE") - else: - assert param_type == STR + if in_use: + for param, param_info in attrs.items(): + value = params[param] + param_type = param_info["type"] + param_digits = param_info["digits"] + param_values = param_info["values"] - for param_value in param_values: - segmk.add_site_tag(site, "{}.{}".format(param, param_value), value == param_value) + if param_type == INT: + param_encodings = param_info["encoding"] + param_encoding = param_encodings[param_values.index( + value)] + bitstr = [ + int(x) for x in "{value:0{digits}b}".format( + value=param_encoding, digits=param_digits) + [::-1] + ] - for param, invert in [("TXUSRCLK", 1), ("TXUSRCLK2", 1), ("TXPHDLYTSTCLK", 1), - ("SIGVALIDCLK", 1), ("RXUSRCLK", 1), ("RXUSRCLK2", 1), - ("DRPCLK", 1), ("DMONITORCLK", 1), ("CLKRSVD0", 1), - ("CLKRSVD1", 1)]: - if invert: - segmk.add_site_tag(site, "ZINV_" + param, 1 ^ params[param]) - else: - segmk.add_site_tag(site, "INV_" + param, params[param]) + for i in range(param_digits): + segmk.add_site_tag( + site, '%s[%u]' % (param, i), bitstr[i]) + elif param_type == BIN: + bitstr = [ + int(x) for x in "{value:0{digits}b}".format( + value=value, digits=param_digits)[::-1] + ] + + for i in range(param_digits): + segmk.add_site_tag( + site, "%s[%u]" % (param, i), bitstr[i]) + elif param_type == BOOL: + segmk.add_site_tag(site, param, value == "TRUE") + else: + assert param_type == STR + + for param_value in param_values: + segmk.add_site_tag( + site, "{}.{}".format(param, param_value), + value == param_value) + + for param in ["TXUSRCLK", "TXUSRCLK2", "TXPHDLYTSTCLK", + "SIGVALIDCLK", "RXUSRCLK", "RXUSRCLK2", "DRPCLK", + "DMONITORCLK", "CLKRSVD0", "CLKRSVD1"]: + segmk.add_site_tag( + site, "ZINV_" + param, 1 ^ params[param]) + + gtp_channel_x = [ + "GTP_CHANNEL_0", + "GTP_CHANNEL_1", + "GTP_CHANNEL_2", + "GTP_CHANNEL_3", + ] + + gtp_channel_x_mid = [ + "GTP_CHANNEL_0_MID_LEFT", + "GTP_CHANNEL_1_MID_LEFT", + "GTP_CHANNEL_2_MID_LEFT", + "GTP_CHANNEL_3_MID_LEFT", + "GTP_CHANNEL_0_MID_RIGHT", + "GTP_CHANNEL_1_MID_RIGHT", + "GTP_CHANNEL_2_MID_RIGHT", + "GTP_CHANNEL_3_MID_RIGHT", + ] + + if tile_type in gtp_channel_x: + bitfilter = bitfilter_gtp_channel_x + elif tile_type in gtp_channel_x_mid: + bitfilter = bitfilter_gtp_channel_x_mid + else: + assert False, tile_type segmk.compile(bitfilter=bitfilter) segmk.write() diff --git a/fuzzers/064-gtp-channel-conf/generate.tcl b/fuzzers/064-gtp-channel-conf/generate.tcl index 338b4906..5caa57a2 100644 --- a/fuzzers/064-gtp-channel-conf/generate.tcl +++ b/fuzzers/064-gtp-channel-conf/generate.tcl @@ -18,6 +18,7 @@ proc run {} { set_property IS_ENABLED 0 [get_drc_checks {UCIO-1}] set_property IS_ENABLED 0 [get_drc_checks {REQP-48}] set_property IS_ENABLED 0 [get_drc_checks {REQP-47}] + set_property IS_ENABLED 0 [get_drc_checks {REQP-1619}] place_design route_design diff --git a/fuzzers/064-gtp-channel-conf/pushdb.sh b/fuzzers/064-gtp-channel-conf/pushdb.sh new file mode 100644 index 00000000..f976e51b --- /dev/null +++ b/fuzzers/064-gtp-channel-conf/pushdb.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# Copyright (C) 2017-2020 The Project X-Ray Authors. +# +# Use of this source code is governed by a ISC-style +# license that can be found in the LICENSE file or at +# https://opensource.org/licenses/ISC +# +# SPDX-License-Identifier: ISC + +if ! test $(find . -name "segdata_gtp_channel_[0123]_mid_*.txt" | wc -c) -eq 0 +then + ${XRAY_MERGEDB} gtp_channel_0_mid_left ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MERGEDB} gtp_channel_1_mid_left ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MERGEDB} gtp_channel_2_mid_left ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MERGEDB} gtp_channel_3_mid_left ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MERGEDB} mask_gtp_channel_0_mid_left ${BUILD_DIR}/mask_gtp_channelx.db + ${XRAY_MERGEDB} mask_gtp_channel_1_mid_left ${BUILD_DIR}/mask_gtp_channelx.db + ${XRAY_MERGEDB} mask_gtp_channel_2_mid_left ${BUILD_DIR}/mask_gtp_channelx.db + ${XRAY_MERGEDB} mask_gtp_channel_3_mid_left ${BUILD_DIR}/mask_gtp_channelx.db + ${XRAY_MERGEDB} gtp_channel_0_mid_right ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MERGEDB} gtp_channel_1_mid_right ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MERGEDB} gtp_channel_2_mid_right ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MERGEDB} gtp_channel_3_mid_right ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MERGEDB} mask_gtp_channel_0_mid_right ${BUILD_DIR}/mask_gtp_channelx.db + ${XRAY_MERGEDB} mask_gtp_channel_1_mid_right ${BUILD_DIR}/mask_gtp_channelx.db + ${XRAY_MERGEDB} mask_gtp_channel_2_mid_right ${BUILD_DIR}/mask_gtp_channelx.db + ${XRAY_MERGEDB} mask_gtp_channel_3_mid_right ${BUILD_DIR}/mask_gtp_channelx.db +fi + +if ! test $(find . -name "segdata_gtp_channel_[0123].txt" | wc -c) -eq 0 +then + ${XRAY_MERGEDB} gtp_channel_0 ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MERGEDB} gtp_channel_1 ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MERGEDB} gtp_channel_2 ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MERGEDB} gtp_channel_3 ${BUILD_DIR}/segbits_gtp_channelx.db + ${XRAY_MERGEDB} mask_gtp_channel_0 ${BUILD_DIR}/mask_gtp_channelx.db + ${XRAY_MERGEDB} mask_gtp_channel_1 ${BUILD_DIR}/mask_gtp_channelx.db + ${XRAY_MERGEDB} mask_gtp_channel_2 ${BUILD_DIR}/mask_gtp_channelx.db + ${XRAY_MERGEDB} mask_gtp_channel_3 ${BUILD_DIR}/mask_gtp_channelx.db +fi diff --git a/fuzzers/064-gtp-channel-conf/top.py b/fuzzers/064-gtp-channel-conf/top.py index f90e385b..7e6dd642 100644 --- a/fuzzers/064-gtp-channel-conf/top.py +++ b/fuzzers/064-gtp-channel-conf/top.py @@ -25,21 +25,44 @@ BOOL = "BOOL" STR = "STR" -def gen_sites(): +def gen_sites(site): db = Database(util.get_db_root(), util.get_part()) grid = db.grid() + already_used = list() for tile_name in sorted(grid.tiles()): loc = grid.loc_of_tilename(tile_name) gridinfo = grid.gridinfo_at_loc(loc) - if "GTP_CHANNEL" not in gridinfo.tile_type: + if gridinfo.tile_type not in [ + "GTP_CHANNEL_0", + "GTP_CHANNEL_1", + "GTP_CHANNEL_2", + "GTP_CHANNEL_3", + "GTP_CHANNEL_0_MID_LEFT", + "GTP_CHANNEL_1_MID_LEFT", + "GTP_CHANNEL_2_MID_LEFT", + "GTP_CHANNEL_3_MID_LEFT", + "GTP_CHANNEL_0_MID_RIGHT", + "GTP_CHANNEL_1_MID_RIGHT", + "GTP_CHANNEL_2_MID_RIGHT", + "GTP_CHANNEL_3_MID_RIGHT", + ] or gridinfo.tile_type in already_used: continue + else: + tile_type = gridinfo.tile_type + already_used.append(tile_type) for site_name, site_type in gridinfo.sites.items(): - if site_type != "GTPE2_CHANNEL": + if site_type != site: continue - return site_name + if "RIGHT" in tile_type and "X0" in site_name: + continue + + if "LEFT" in tile_type and "X1" in site_name: + continue + + yield tile_name, tile_type, site_name, site_type def main(): @@ -53,66 +76,78 @@ module top( assign out = in; ''') - site_name = gen_sites() + primitives_list = list() - params = dict() - params['site'] = site_name + for tile_name, tile_type, site_name, site_type in gen_sites( + "GTPE2_CHANNEL"): - verilog_attr = "" + params_list = list() + params_dict = dict() - verilog_attr = "#(" + params_dict["tile_type"] = tile_type + params = dict() + params['site'] = site_name - fuz_dir = os.getenv("FUZDIR", None) - assert fuz_dir - with open(os.path.join(fuz_dir, "attrs.json"), "r") as attrs_file: - attrs = json.load(attrs_file) + verilog_attr = "" - in_use = bool(random.randint(0, 9)) - params["IN_USE"] = in_use + verilog_attr = "#(" - for param, param_info in attrs.items(): - param_type = param_info["type"] - param_values = param_info["values"] - param_digits = param_info["digits"] + fuz_dir = os.getenv("FUZDIR", None) + assert fuz_dir + with open(os.path.join(fuz_dir, "attrs.json"), "r") as attrs_file: + attrs = json.load(attrs_file) - if param_type == INT: - value = random.choice(param_values) - value_str = value - elif param_type == BIN: - value = random.randint(0, param_values[0]) - value_str = "{digits}'b{value:0{digits}b}".format( - value=value, digits=param_digits) - elif param_type in [BOOL, STR]: - value = random.choice(param_values) - value_str = verilog.quote(value) + in_use = bool(random.randint(0, 9)) + params["IN_USE"] = in_use - params[param] = value + if in_use: + for param, param_info in attrs.items(): + param_type = param_info["type"] + param_values = param_info["values"] + param_digits = param_info["digits"] - verilog_attr += """ - .{}({}),""".format(param, value_str) + if param_type == INT: + value = random.choice(param_values) + value_str = value + elif param_type == BIN: + value = random.randint(0, param_values[0]) + value_str = "{digits}'b{value:0{digits}b}".format( + value=value, digits=param_digits) + elif param_type in [BOOL, STR]: + value = random.choice(param_values) + value_str = verilog.quote(value) - for param in ["TXUSRCLK", "TXUSRCLK2", "TXPHDLYTSTCLK", - "SIGVALIDCLK", "RXUSRCLK", "RXUSRCLK2", - "DRPCLK", "DMONITORCLK", "CLKRSVD0", "CLKRSVD1"]: - is_inverted = random.randint(0, 1) + params[param] = value - params[param] = is_inverted + verilog_attr += """ + .{}({}),""".format(param, value_str) - verilog_attr += """ - .IS_{}_INVERTED({}),""".format(param, is_inverted) + for param in ["TXUSRCLK", "TXUSRCLK2", "TXPHDLYTSTCLK", + "SIGVALIDCLK", "RXUSRCLK", "RXUSRCLK2", "DRPCLK", + "DMONITORCLK", "CLKRSVD0", "CLKRSVD1"]: + is_inverted = random.randint(0, 1) - verilog_attr = verilog_attr.rstrip(",") - verilog_attr += "\n)" + params[param] = is_inverted - print("(* KEEP, DONT_TOUCH, LOC=\"{}\" *)".format(site_name)) - print( - """GTPE2_CHANNEL {} gtp_channel (); - """.format(verilog_attr)) + verilog_attr += """ + .IS_{}_INVERTED({}),""".format(param, is_inverted) + + verilog_attr = verilog_attr.rstrip(",") + verilog_attr += "\n)" + + print("(* KEEP, DONT_TOUCH, LOC=\"{}\" *)".format(site_name)) + print( + """GTPE2_CHANNEL {} {} (); + """.format(verilog_attr, tile_type.lower())) + + params_list.append(params) + params_dict["params"] = params_list + primitives_list.append(params_dict) print("endmodule") with open('params.json', 'w') as f: - json.dump(params, f, indent=2) + json.dump(primitives_list, f, indent=2) if __name__ == '__main__': diff --git a/fuzzers/Makefile b/fuzzers/Makefile index 0debe850..4e96d661 100644 --- a/fuzzers/Makefile +++ b/fuzzers/Makefile @@ -159,7 +159,7 @@ endif ifeq ($(XRAY_DATABASE),artix7) $(eval $(call fuzzer,061-pcie-conf,005-tilegrid,all)) $(eval $(call fuzzer,063-gtp-common-conf,005-tilegrid,part)) -$(eval $(call fuzzer,064-gtp-channel-conf,005-tilegrid,all)) +$(eval $(call fuzzer,064-gtp-channel-conf,005-tilegrid,part)) endif endif endif