From 596bb27e3b6d4142e3f7bb45153103ca5bb4f77c Mon Sep 17 00:00:00 2001 From: Jake Mercer Date: Sun, 13 Oct 2019 00:59:28 +0100 Subject: [PATCH] FUZZER - DSP - Add All Attributes Added the rest of the DSP attributes; there are still some issues with mapping the bits. AREG/BREG mode 2 will require inputs to be connected. Signed-off-by: Jake Mercer --- fuzzers/100-dsp-mskpat/generate.py | 107 +++++++++++++++++++++++++++++ fuzzers/100-dsp-mskpat/top.py | 94 +++++++++++++++++++++++-- 2 files changed, 195 insertions(+), 6 deletions(-) diff --git a/fuzzers/100-dsp-mskpat/generate.py b/fuzzers/100-dsp-mskpat/generate.py index 5bf19e82..63ddb7fb 100644 --- a/fuzzers/100-dsp-mskpat/generate.py +++ b/fuzzers/100-dsp-mskpat/generate.py @@ -10,6 +10,58 @@ with open('params.csv', 'r') as f: for d in csv.DictReader(f): dsp = "DSP_0" if d['SITE'][-1] in "02468" else "DSP_1" + acascreg = int(d['ACASCREG']) + segmk.add_site_tag( + d['SITE'], "%s.ZACASCREG[0]" % (dsp), ~(acascreg >> 0) & 1) + segmk.add_site_tag( + d['SITE'], "%s.ZACASCREG[1]" % (dsp), ~(acascreg >> 1) & 1) + + adreg = int(d['ADREG']) + segmk.add_site_tag(d['SITE'], "%s.ADREG[0]" % (dsp), adreg & 1) + + alumodereg = int(d['ALUMODEREG']) + segmk.add_site_tag( + d['SITE'], "%s.ZALUMODEREG[0]" % (dsp), ~alumodereg & 1) + + areg = int(d['AREG']) + segmk.add_site_tag(d['SITE'], "%s.ZAREG[0]" % (dsp), ~(areg >> 0) & 1) + segmk.add_site_tag(d['SITE'], "%s.ZAREG[1]" % (dsp), ~(areg >> 1) & 1) + + bcascreg = int(d['BCASCREG']) + segmk.add_site_tag( + d['SITE'], "%s.ZBCASCREG[0]" % (dsp), ~(bcascreg >> 0) & 1) + segmk.add_site_tag( + d['SITE'], "%s.ZBCASCREG[1]" % (dsp), ~(bcascreg >> 1) & 1) + + breg = int(d['BREG']) + segmk.add_site_tag(d['SITE'], "%s.ZBREG[0]" % (dsp), ~(breg >> 0) & 1) + segmk.add_site_tag(d['SITE'], "%s.ZBREG[1]" % (dsp), ~(breg >> 1) & 1) + + carryinreg = int(d['CARRYINREG']) + segmk.add_site_tag(d['SITE'], "%s.ZCARRYINREG[0]" % (dsp), ~carryinreg) + + carryinselreg = int(d['CARRYINSELREG']) + segmk.add_site_tag( + d['SITE'], "%s.ZCARRYINSELREG[0]" % (dsp), ~carryinselreg) + + creg = int(d['CREG']) + segmk.add_site_tag(d['SITE'], "%s.ZCREG[0]" % (dsp), ~creg) + + dreg = int(d['DREG']) + segmk.add_site_tag(d['SITE'], "%s.DREG[0]" % (dsp), dreg) + + inmodereg = int(d['INMODEREG']) + segmk.add_site_tag(d['SITE'], "%s.ZINMODEREG[0]" % (dsp), ~inmodereg) + + mreg = int(d['MREG']) + segmk.add_site_tag(d['SITE'], "%s.ZMREG[0]" % (dsp), ~mreg) + + opmodereg = int(d['OPMODEREG']) + segmk.add_site_tag(d['SITE'], "%s.ZOPMODEREG[0]" % (dsp), ~opmodereg) + + preg = int(d['PREG']) + segmk.add_site_tag(d['SITE'], "%s.ZPREG[0]" % (dsp), ~preg) + a_input = str(d['A_INPUT']) segmk.add_site_tag( d['SITE'], "%s.ZA_INPUT[0]" % (dsp), @@ -20,6 +72,33 @@ with open('params.csv', 'r') as f: d['SITE'], "%s.ZB_INPUT[0]" % (dsp), (0 if b_input == "DIRECT" else 1)) + use_dport = str(d['USE_DPORT']) + segmk.add_site_tag( + d['SITE'], "%s.USE_DPORT[0]" % (dsp), + (0 if use_dport == "FALSE" else 1)) + + use_mult = str(d['USE_MULT']) + if use_mult == "NONE": + segmk.add_site_tag(d['SITE'], "%s.USE_MULT[0]" % (dsp), 0) + segmk.add_site_tag(d['SITE'], "%s.ZUSE_MULT[1]" % (dsp), ~0) + elif use_mult == "MULTIPLY": + segmk.add_site_tag(d['SITE'], "%s.USE_MULT[0]" % (dsp), 0) + segmk.add_site_tag(d['SITE'], "%s.ZUSE_MULT[1]" % (dsp), ~1) + elif use_mult == "DYNAMIC": + segmk.add_site_tag(d['SITE'], "%s.USE_MULT[0]" % (dsp), 1) + segmk.add_site_tag(d['SITE'], "%s.ZUSE_MULT[1]" % (dsp), ~1) + + use_simd = str(d['USE_SIMD']) + if use_simd == "ONE48": + segmk.add_site_tag(d['SITE'], "%s.USE_SIMD[0]" % (dsp), 0) + segmk.add_site_tag(d['SITE'], "%s.USE_SIMD[1]" % (dsp), 0) + elif use_simd == "TWO24": + segmk.add_site_tag(d['SITE'], "%s.USE_SIMD[0]" % (dsp), 0) + segmk.add_site_tag(d['SITE'], "%s.USE_SIMD[1]" % (dsp), 1) + elif use_simd == "FOUR12": + segmk.add_site_tag(d['SITE'], "%s.USE_SIMD[0]" % (dsp), 1) + segmk.add_site_tag(d['SITE'], "%s.USE_SIMD[1]" % (dsp), 1) + autoreset_patdet = str(d['AUTORESET_PATDET']) if autoreset_patdet == "RESET_MATCH": segmk.add_site_tag(d['SITE'], "%s.AUTO_RESET_PATDET[0]" % (dsp), 0) @@ -43,5 +122,33 @@ with open('params.csv', 'r') as f: segmk.add_site_tag( d['SITE'], "%s.PATTERN[%d]" % (dsp, i), (pattern >> i) & 1) + sel_mask = str(d['SEL_MASK']) + if sel_mask == "MASK": + segmk.add_site_tag(d['SITE'], "%s.SEL_MASK[0]" % (dsp), 0) + segmk.add_site_tag(d['SITE'], "%s.SEL_MASK[1]" % (dsp), 0) + segmk.add_site_tag(d['SITE'], "%s.SEL_MASK[2]" % (dsp), 0) + elif sel_mask == "C": + segmk.add_site_tag(d['SITE'], "%s.SEL_MASK[0]" % (dsp), 0) + segmk.add_site_tag(d['SITE'], "%s.SEL_MASK[1]" % (dsp), 1) + segmk.add_site_tag(d['SITE'], "%s.SEL_MASK[2]" % (dsp), 0) + elif sel_mask == "ROUNDING_MODE1": + segmk.add_site_tag(d['SITE'], "%s.SEL_MASK[0]" % (dsp), 1) + segmk.add_site_tag(d['SITE'], "%s.SEL_MASK[1]" % (dsp), 1) + segmk.add_site_tag(d['SITE'], "%s.SEL_MASK[2]" % (dsp), 0) + elif sel_mask == "ROUNDING_MODE2": + segmk.add_site_tag(d['SITE'], "%s.SEL_MASK[0]" % (dsp), 0) + segmk.add_site_tag(d['SITE'], "%s.SEL_MASK[1]" % (dsp), 0) + segmk.add_site_tag(d['SITE'], "%s.SEL_MASK[2]" % (dsp), 1) + + sel_pattern = str(d['SEL_PATTERN']) + segmk.add_site_tag( + d['SITE'], "%s.ZSEL_PATTERN[0]" % (dsp), + (0 if sel_pattern == "PATTERN" else 1)) + + use_pattern_detect = str(d['USE_PATTERN_DETECT']) + segmk.add_site_tag( + d['SITE'], "%s.USE_PATTERN_DETECT[0]" % (dsp), + (0 if use_pattern_detect == "PATDET" else 1)) + segmk.compile() segmk.write() diff --git a/fuzzers/100-dsp-mskpat/top.py b/fuzzers/100-dsp-mskpat/top.py index 288619e1..01c4e42c 100644 --- a/fuzzers/100-dsp-mskpat/top.py +++ b/fuzzers/100-dsp-mskpat/top.py @@ -6,7 +6,7 @@ from prjxray import util from prjxray.db import Database -def gen_sites (): +def gen_sites(): db = Database(util.get_db_root()) grid = db.grid() for tile in sorted(grid.tiles()): @@ -17,7 +17,8 @@ def gen_sites (): if gridinfo.sites[site] == 'DSP48E1': yield tile, site -def fuzz (*args): + +def fuzz(*args): if len(args) == 1 and isinstance(args[0], int): # Argument indicates that we should generate a random integer with # args[0] number of bits. @@ -26,19 +27,44 @@ def fuzz (*args): # Otherwise make a random choice return random.choice(*args) -def run (): + +def run(): # Attributes list: # Attribute name # Verilog parameter value prefix # Arguments to `fuzz` # Verilog parameter value suffix attributes = [] + attributes.append(('ADREG', '', (0, 1), '')) + attributes.append(('ALUMODEREG', '', (0, 1), '')) + # AREG/BREG requires inputs to be connected when configured with a value of + # 2, contstraining to 0 and 1 for now. + attributes.append(('AREG', '', (0, 1), '')) + attributes.append(('BREG', '', (0, 1), '')) + attributes.append(('CARRYINREG', '', (0, 1), '')) + attributes.append(('CARRYINSELREG', '', (0, 1), '')) + attributes.append(('CREG', '', (0, 1), '')) + attributes.append(('DREG', '', (0, 1), '')) + attributes.append(('INMODEREG', '', (0, 1), '')) + attributes.append(('OPMODEREG', '', (0, 1), '')) + attributes.append(('PREG', '', (0, 1), '')) attributes.append(('A_INPUT', '"', ('DIRECT', 'CASCADE'), '"')) attributes.append(('B_INPUT', '"', ('DIRECT', 'CASCADE'), '"')) - attributes.append(('AUTORESET_PATDET', '"',('NO_RESET', 'RESET_MATCH', - 'RESET_NOT_MATCH'), '"')) + attributes.append(('USE_DPORT', '"', ('TRUE', 'FALSE'), '"')) + attributes.append(('USE_SIMD', '"', ('ONE48', 'TWO24', 'FOUR12'), '"')) + attributes.append( + ( + 'AUTORESET_PATDET', '"', + ('NO_RESET', 'RESET_MATCH', 'RESET_NOT_MATCH'), '"')) attributes.append(('MASK', '48\'d', (48), '')) attributes.append(('PATTERN', '48\'d', (48), '')) + attributes.append( + ( + 'SEL_MASK', '"', ('MASK', 'C', 'ROUNDING_MODE1', 'ROUNDING_MODE2'), + '"')) + attributes.append(('SEL_PATTERN', '"', ('PATTERN', 'C'), '"')) + attributes.append( + ('USE_PATTERN_DETECT', '"', ('NO_PATDET', 'PATDET'), '"')) # CSV headings headings = [] @@ -48,6 +74,20 @@ def run (): for attribute in attributes: headings.append(attribute[0]) + # ACASCREG dependent on AREG + if attribute[0] == 'AREG': + headings.append('ACASCREG') + + # BCASCREG dependent on BREG + if attribute[0] == 'BREG': + headings.append('BCASCREG') + + # USE_MULT dependent on USE_SIMD + if attribute[0] == 'USE_SIMD': + headings.append('USE_MULT') + # MREG dependent on USE_MULT + headings.append('MREG') + # CSV rows rows = [] rows.append(headings) @@ -69,7 +109,49 @@ def run (): for attr in attributes[:-1]: val = fuzz(attr[2]) row.append(val) - print('\t\t.{0}({1}{2}{3}),'.format(attr[0], attr[1], val, attr[3])) + print( + '\t\t.{0}({1}{2}{3}),'.format(attr[0], attr[1], val, attr[3])) + + # ACASCREG dependent on AREG + if attr[0] == 'AREG': + if val == 0 or val == 1: + print('\t\t.ACASCREG({0}),'.format(val)) + elif val == 2: + val = fuzz((1, 2)) + print('\t\t.ACASCREG({0}),'.format(val)) + + row.append(val) + + # BCASCREG dependent on BREG + elif attr[0] == 'BREG': + if val == 0 or val == 1: + print('\t\t.BCASCREG({0}),'.format(val)) + elif val == 2: + val = fuzz((1, 2)) + print('\t\t.BCASCREG({0}),'.format(val)) + + row.append(val) + + # USE_MULT dependent on USE_SIMD + elif attr[0] == 'USE_SIMD': + if val != "ONE48": + val = 'NONE' + print('\t\t.USE_MULT("{0}"),'.format(val)) + else: + val = fuzz(('NONE', 'MULTIPLY', 'DYNAMIC')) + print('\t\t.USE_MULT("{0}"),'.format(val)) + + row.append(val) + + # MREG dependent on USE_MULT + if val == 'NONE': + val = 0 + print('\t\t.MREG("{0}"),'.format(val)) + else: + val = fuzz((0, 1)) + print('\t\t.MREG("{0}"),'.format(val)) + + row.append(val) attr = attributes[-1] val = fuzz(attr[2])