diff --git a/fuzzers/100-dsp-mskpat/generate.py b/fuzzers/100-dsp-mskpat/generate.py index 6376b62a..5bf19e82 100644 --- a/fuzzers/100-dsp-mskpat/generate.py +++ b/fuzzers/100-dsp-mskpat/generate.py @@ -8,40 +8,40 @@ segmk = Segmaker("design.bits", verbose=True) print("Loading tags") 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" + dsp = "DSP_0" if d['SITE'][-1] in "02468" else "DSP_1" - a_input = str(d['a_input']) + a_input = str(d['A_INPUT']) segmk.add_site_tag( - d['site'], "%s.ZA_INPUT[0]" % (dsp), + d['SITE'], "%s.ZA_INPUT[0]" % (dsp), (0 if a_input == "DIRECT" else 1)) - b_input = str(d['b_input']) + b_input = str(d['B_INPUT']) segmk.add_site_tag( - d['site'], "%s.ZB_INPUT[0]" % (dsp), + d['SITE'], "%s.ZB_INPUT[0]" % (dsp), (0 if b_input == "DIRECT" else 1)) - autoreset_patdet = str(d['autoreset_patdet']) + autoreset_patdet = str(d['AUTORESET_PATDET']) if autoreset_patdet == "RESET_MATCH": - segmk.add_site_tag(d['site'], "%s.AUTO_RESET_PATDET[0]" % (dsp), 0) + segmk.add_site_tag(d['SITE'], "%s.AUTO_RESET_PATDET[0]" % (dsp), 0) segmk.add_site_tag( - d['site'], "%s.ZAUTO_RESET_PATDET[1]" % (dsp), 1) + d['SITE'], "%s.ZAUTO_RESET_PATDET[1]" % (dsp), 1) elif autoreset_patdet == "NO_RESET": - segmk.add_site_tag(d['site'], "%s.AUTO_RESET_PATDET[0]" % (dsp), 0) + segmk.add_site_tag(d['SITE'], "%s.AUTO_RESET_PATDET[0]" % (dsp), 0) segmk.add_site_tag( - d['site'], "%s.ZAUTO_RESET_PATDET[1]" % (dsp), 0) + d['SITE'], "%s.ZAUTO_RESET_PATDET[1]" % (dsp), 0) elif autoreset_patdet == "RESET_NOT_MATCH": - segmk.add_site_tag(d['site'], "%s.AUTO_RESET_PATDET[0]" % (dsp), 1) + segmk.add_site_tag(d['SITE'], "%s.AUTO_RESET_PATDET[0]" % (dsp), 1) segmk.add_site_tag( - d['site'], "%s.ZAUTO_RESET_PATDET[1]" % (dsp), 1) + d['SITE'], "%s.ZAUTO_RESET_PATDET[1]" % (dsp), 1) - mask = int(d['mask']) - pattern = int(d['pattern']) + mask = int(d['MASK']) + pattern = int(d['PATTERN']) for i in range(48): segmk.add_site_tag( - d['site'], "%s.MASK[%d]" % (dsp, i), (mask >> i) & 1) + d['SITE'], "%s.MASK[%d]" % (dsp, i), (mask >> i) & 1) segmk.add_site_tag( - d['site'], "%s.PATTERN[%d]" % (dsp, i), (pattern >> i) & 1) + d['SITE'], "%s.PATTERN[%d]" % (dsp, i), (pattern >> i) & 1) segmk.compile() segmk.write() diff --git a/fuzzers/100-dsp-mskpat/top.py b/fuzzers/100-dsp-mskpat/top.py index d536a91e..288619e1 100644 --- a/fuzzers/100-dsp-mskpat/top.py +++ b/fuzzers/100-dsp-mskpat/top.py @@ -1,71 +1,91 @@ import os import random +import csv random.seed(int(os.getenv("SEED"), 16)) 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_name in sorted(grid.tiles()): - loc = grid.loc_of_tilename(tile_name) + for tile in sorted(grid.tiles()): + loc = grid.loc_of_tilename(tile) gridinfo = grid.gridinfo_at_loc(loc) if gridinfo.tile_type in ['DSP_L', 'DSP_R']: for site in sorted(gridinfo.sites.keys()): if gridinfo.sites[site] == 'DSP48E1': - yield tile_name, site + yield tile, site +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. + return random.getrandbits(args[0]) + else: + # Otherwise make a random choice + return random.choice(*args) -def write_params(lines): - pinstr = 'tile,site,a_input,b_input,autoreset_patdet,mask,pattern\n' - for tile, site, a_input, b_input, autoreset_patdet, mask, pattern in lines: - pinstr += '%s,' % (tile) - pinstr += '%s,' % (site) - pinstr += '%s,' % (a_input) - pinstr += '%s,' % (b_input) - pinstr += '%s,' % (autoreset_patdet) - pinstr += '%s,' % (mask) - pinstr += '%s\n' % (pattern) +def run (): + # Attributes list: + # Attribute name + # Verilog parameter value prefix + # Arguments to `fuzz` + # Verilog parameter value suffix + attributes = [] + 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(('MASK', '48\'d', (48), '')) + attributes.append(('PATTERN', '48\'d', (48), '')) - open('params.csv', 'w').write(pinstr) + # CSV headings + headings = [] + headings.append('TILE') + headings.append('SITE') + for attribute in attributes: + headings.append(attribute[0]) -def run(): - print(''' -module top(); - ''') + # CSV rows + rows = [] + rows.append(headings) - lines = [] + print('module top();') sites = list(gen_sites()) - for (tile_name, site_name) in sites: - mask = random.randint(0, 2**48 - 1) - pattern = random.randint(0, 2**48 - 1) - a_input = random.choice(('DIRECT', 'CASCADE')) - b_input = random.choice(('DIRECT', 'CASCADE')) - autoreset_patdet = random.choice( - ('NO_RESET', 'RESET_MATCH', 'RESET_NOT_MATCH')) - lines.append( - ( - tile_name, site_name, a_input, b_input, autoreset_patdet, mask, - pattern)) - print( - ''' - (* KEEP, DONT_TOUCH, LOC = "{0}" *) - DSP48E1 #( - .A_INPUT("{1}"), - .B_INPUT("{2}"), - .AUTORESET_PATDET("{3}"), - .MASK(48'h{4:x}), - .PATTERN(48'h{5:x}) - ) dsp_{0} ( - ); -'''.format(site_name, a_input, b_input, autoreset_patdet, mask, pattern)) + # For every DSP site: + # Add an instance to top.v with fuzzed attributes + # Add a row for params.csv + for (tile, site) in sites: + row = [] + row.append(tile) + row.append(site) + print('\t(* KEEP, DONT_TOUCH, LOC = "{0}" *)'.format(site)) + print('\tDSP48E1 #(') + + 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])) + + attr = attributes[-1] + val = fuzz(attr[2]) + row.append(val) + print('\t\t.{0}({1}{2}{3})'.format(attr[0], attr[1], val, attr[3])) + + rows.append(row) + print('\t) dsp_{0} ();\n'.format(site)) print("endmodule") - write_params(lines) + + # Generate params.csv + with open('params.csv', 'w') as writeFile: + writer = csv.writer(writeFile) + writer.writerows(rows) + writeFile.close() if __name__ == '__main__':