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 <jmercer04@qub.ac.uk>
This commit is contained in:
Jake Mercer 2019-10-13 00:59:28 +01:00 committed by Jake Mercer
parent 8da263c502
commit 596bb27e3b
2 changed files with 195 additions and 6 deletions

View File

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

View File

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