FUZZER - DSP - Refactor for Readability & Extensibility

Signed-off-by: Jake Mercer <jmercer04@qub.ac.uk>
This commit is contained in:
Jake Mercer 2019-10-10 01:06:13 +01:00 committed by Jake Mercer
parent 624de250e8
commit 8da263c502
2 changed files with 80 additions and 60 deletions

View File

@ -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()

View File

@ -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__':