mirror of https://github.com/openXC7/prjxray.git
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:
parent
8da263c502
commit
596bb27e3b
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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])
|
||||
|
|
|
|||
Loading…
Reference in New Issue