tilegrid: params on fuzzaddr/generate.py

Signed-off-by: John McMaster <johndmcmaster@gmail.com>
This commit is contained in:
John McMaster 2018-12-18 15:41:23 -08:00
parent 535769ad04
commit cecba098fc
4 changed files with 67 additions and 7 deletions

View File

@ -2,9 +2,9 @@
from prjxray import bitsmaker
def run(bits_fn, design_fn, fnout, oneval, verbose=False):
# Raw: IOB_X0Y101 00020027_003_03
metastr = "DFRAME:27.DWORD:3.DBIT:3"
def run(bits_fn, design_fn, fnout, oneval, dframe, dword, dbit, verbose=False):
metastr = "DFRAME:%02x.DWORD:%u.DBIT:%u" % (dframe, dword, dbit)
tags = dict()
f = open(design_fn, 'r')
@ -29,9 +29,32 @@ def main():
parser.add_argument("--design", default="design.csv", help="")
parser.add_argument("--fnout", default="/dev/stdout", help="")
parser.add_argument("--oneval", required=True, help="")
parser.add_argument(
"--dframe",
type=str,
required=True,
help="Reference frame delta (base 16)")
parser.add_argument(
"--dword",
type=str,
required=True,
help="Reference word delta (base 10)")
parser.add_argument(
"--dbit",
type=str,
required=True,
help="Reference bit delta (base 10)")
args = parser.parse_args()
run(args.bits_file, args.design, args.fnout, oneval=args.oneval, verbose=args.verbose)
run(
args.bits_file,
args.design,
args.fnout,
args.oneval,
int(args.dframe, 16),
int(args.dword, 10),
int(args.dbit, 10),
verbose=args.verbose)
if __name__ == "__main__":

View File

@ -1,3 +1,3 @@
N ?= 15
GENERATE_ARGS?="--oneval KEEPER"
GENERATE_ARGS?="--oneval KEEPER --dframe 27 --dword 3 --dbit 3"
include ../fuzzaddr/common.mk

View File

@ -24,7 +24,7 @@ def gen_iobs():
yield site_name, site_type
def write_pins(ports):
def write_params(ports):
pinstr = ''
for site, (name, dir_, cell) in sorted(ports.items(), key=lambda x: x[1]):
# pinstr += 'set_property -dict "PACKAGE_PIN %s IOSTANDARD LVCMOS33" [get_ports %s]' % (packpin, port)
@ -76,7 +76,7 @@ def run():
else:
assign_o(rand_site(), 'do[%u]' % DOUT_N)
write_pins(ports)
write_params(ports)
print(
'''

View File

@ -197,3 +197,40 @@ def specn():
# ex: build/specimen_001
specdir = os.getenv("SPECDIR")
return int(re.match(".*specimen_([0-9]*)", specdir).group(1), 10)
def gen_fuzz_states(nvals):
'''
Generates an optimal encoding to solve single bits as quickly as possible
tilegrid's initial solve for 4 bits works like this:
Initial reference value of all 0s:
0000
Then one-hot for each:
0001
0010
0100
1000
Which requires 5 samples total to diff these
However, using correlation instead its possible to resolve n bits using ceil(log(n, 2)) + 1 samples
With 4 positions it takes only 3 samples:
0000
0101
1010
'''
bits = 0
# First pass all 0's
for speci in range(2, specn() + 1):
# First pass do nothing
# Second pass invert every other bit (mod 2)
# Third pass invert blocks of two (mod 4)
block_size = 2**(speci - 1)
for maski in range(nvals):
mask = (1 << maski)
if maski % block_size < block_size / 2:
bits ^= mask
for i in range(nvals):
mask = (1 << i)
yield int(bool(bits & mask))