mirror of https://github.com/openXC7/prjxray.git
tilegrid: params on fuzzaddr/generate.py
Signed-off-by: John McMaster <johndmcmaster@gmail.com>
This commit is contained in:
parent
535769ad04
commit
cecba098fc
|
|
@ -2,9 +2,9 @@
|
||||||
|
|
||||||
from prjxray import bitsmaker
|
from prjxray import bitsmaker
|
||||||
|
|
||||||
def run(bits_fn, design_fn, fnout, oneval, verbose=False):
|
|
||||||
# Raw: IOB_X0Y101 00020027_003_03
|
def run(bits_fn, design_fn, fnout, oneval, dframe, dword, dbit, verbose=False):
|
||||||
metastr = "DFRAME:27.DWORD:3.DBIT:3"
|
metastr = "DFRAME:%02x.DWORD:%u.DBIT:%u" % (dframe, dword, dbit)
|
||||||
|
|
||||||
tags = dict()
|
tags = dict()
|
||||||
f = open(design_fn, 'r')
|
f = open(design_fn, 'r')
|
||||||
|
|
@ -29,9 +29,32 @@ def main():
|
||||||
parser.add_argument("--design", default="design.csv", help="")
|
parser.add_argument("--design", default="design.csv", help="")
|
||||||
parser.add_argument("--fnout", default="/dev/stdout", help="")
|
parser.add_argument("--fnout", default="/dev/stdout", help="")
|
||||||
parser.add_argument("--oneval", required=True, 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()
|
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__":
|
if __name__ == "__main__":
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
N ?= 15
|
N ?= 15
|
||||||
GENERATE_ARGS?="--oneval KEEPER"
|
GENERATE_ARGS?="--oneval KEEPER --dframe 27 --dword 3 --dbit 3"
|
||||||
include ../fuzzaddr/common.mk
|
include ../fuzzaddr/common.mk
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ def gen_iobs():
|
||||||
yield site_name, site_type
|
yield site_name, site_type
|
||||||
|
|
||||||
|
|
||||||
def write_pins(ports):
|
def write_params(ports):
|
||||||
pinstr = ''
|
pinstr = ''
|
||||||
for site, (name, dir_, cell) in sorted(ports.items(), key=lambda x: x[1]):
|
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)
|
# pinstr += 'set_property -dict "PACKAGE_PIN %s IOSTANDARD LVCMOS33" [get_ports %s]' % (packpin, port)
|
||||||
|
|
@ -76,7 +76,7 @@ def run():
|
||||||
else:
|
else:
|
||||||
assign_o(rand_site(), 'do[%u]' % DOUT_N)
|
assign_o(rand_site(), 'do[%u]' % DOUT_N)
|
||||||
|
|
||||||
write_pins(ports)
|
write_params(ports)
|
||||||
|
|
||||||
print(
|
print(
|
||||||
'''
|
'''
|
||||||
|
|
|
||||||
|
|
@ -197,3 +197,40 @@ def specn():
|
||||||
# ex: build/specimen_001
|
# ex: build/specimen_001
|
||||||
specdir = os.getenv("SPECDIR")
|
specdir = os.getenv("SPECDIR")
|
||||||
return int(re.match(".*specimen_([0-9]*)", specdir).group(1), 10)
|
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))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue