mirror of https://github.com/openXC7/prjxray.git
timfuz: cleanup help
Signed-off-by: John McMaster <johndmcmaster@gmail.com>
This commit is contained in:
parent
3b686de46f
commit
bf5b435a69
|
|
@ -119,7 +119,7 @@ def run(
|
||||||
def main():
|
def main():
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Timing fuzzer')
|
parser = argparse.ArgumentParser(description='Matrix solving performance tests')
|
||||||
|
|
||||||
parser.add_argument('--verbose', action='store_true', help='')
|
parser.add_argument('--verbose', action='store_true', help='')
|
||||||
parser.add_argument('--sparse', action='store_true', help='')
|
parser.add_argument('--sparse', action='store_true', help='')
|
||||||
|
|
@ -108,11 +108,11 @@ def main():
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description='Check sub.json solution feasibility')
|
description='Check if sub.json would make a linear equation solvable')
|
||||||
|
|
||||||
parser.add_argument('--verbose', action='store_true', help='')
|
parser.add_argument('--verbose', action='store_true', help='')
|
||||||
parser.add_argument('--sub-json', help='')
|
parser.add_argument('--sub-json', help='')
|
||||||
parser.add_argument('fns_in', nargs='*', help='timing3.csv input files')
|
parser.add_argument('fns_in', nargs='+', help='timing3.csv input files')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
# Store options in dict to ease passing through functions
|
# Store options in dict to ease passing through functions
|
||||||
bench = Benchmark()
|
bench = Benchmark()
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ def main():
|
||||||
'--auto-name', action='store_true', help='timing3.csv => timing3c.csv')
|
'--auto-name', action='store_true', help='timing3.csv => timing3c.csv')
|
||||||
parser.add_argument('--out', default=None, help='Output csv')
|
parser.add_argument('--out', default=None, help='Output csv')
|
||||||
parser.add_argument('--corner', help='Output csv')
|
parser.add_argument('--corner', help='Output csv')
|
||||||
parser.add_argument('fns_in', nargs='*', help='timing3.csv input files')
|
parser.add_argument('fns_in', nargs='+', help='timing3.csv input files')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
bench = Benchmark()
|
bench = Benchmark()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,8 @@ def run(fns_in, fnout, sub_json, strict=False, verbose=False):
|
||||||
def main():
|
def main():
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Solve timing solution')
|
parser = argparse.ArgumentParser(
|
||||||
|
description='Substitute .csv to group correlated symbols')
|
||||||
|
|
||||||
parser.add_argument('--verbose', action='store_true', help='')
|
parser.add_argument('--verbose', action='store_true', help='')
|
||||||
parser.add_argument('--strict', action='store_true', help='')
|
parser.add_argument('--strict', action='store_true', help='')
|
||||||
|
|
@ -44,7 +45,7 @@ def main():
|
||||||
required=True,
|
required=True,
|
||||||
help='Group substitutions to make fully ranked')
|
help='Group substitutions to make fully ranked')
|
||||||
parser.add_argument('--out', help='Output sub.json substitution result')
|
parser.add_argument('--out', help='Output sub.json substitution result')
|
||||||
parser.add_argument('fns_in', nargs='*', help='timing3.txt input files')
|
parser.add_argument('fns_in', nargs='+', help='timing3.csv input files')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
# Store options in dict to ease passing through functions
|
# Store options in dict to ease passing through functions
|
||||||
bench = Benchmark()
|
bench = Benchmark()
|
||||||
|
|
|
||||||
|
|
@ -52,37 +52,44 @@ def gen_flat(fnin, sub_json, corner=None):
|
||||||
yield zero, zero_row
|
yield zero, zero_row
|
||||||
|
|
||||||
|
|
||||||
def run(fnin, fnout, sub_json, corner=None, sort=False, verbose=False):
|
def run(fns_in, fnout, sub_json, corner=None, sort=False, verbose=False):
|
||||||
|
'''
|
||||||
if sort:
|
if sort:
|
||||||
sortf = sorted
|
sortf = sorted
|
||||||
else:
|
else:
|
||||||
sortf = lambda x: x
|
sortf = lambda x: x
|
||||||
|
'''
|
||||||
|
|
||||||
with open(fnout, 'w') as fout:
|
with open(fnout, 'w') as fout:
|
||||||
fout.write('ico,fast_max fast_min slow_max slow_min,rows...\n')
|
fout.write('ico,fast_max fast_min slow_max slow_min,rows...\n')
|
||||||
#for name, corners in sortf(gen_flat(fnin, sub_json)):
|
for fnin in fns_in:
|
||||||
for name, corners in gen_flat(fnin, sub_json, corner=corner):
|
#for name, corners in sortf(gen_flat(fnin, sub_json)):
|
||||||
row_ico = 1
|
for name, corners in gen_flat(fnin, sub_json, corner=corner):
|
||||||
items = [str(row_ico), corners2csv(corners)]
|
row_ico = 1
|
||||||
items.append('%u %s' % (1, name))
|
items = [str(row_ico), corners2csv(corners)]
|
||||||
fout.write(','.join(items) + '\n')
|
items.append('%u %s' % (1, name))
|
||||||
|
fout.write(','.join(items) + '\n')
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Solve timing solution')
|
parser = argparse.ArgumentParser(
|
||||||
|
description='Substitute .csv to ungroup correlated symbols')
|
||||||
|
|
||||||
parser.add_argument('--verbose', action='store_true', help='')
|
parser.add_argument('--verbose', action='store_true', help='')
|
||||||
parser.add_argument('--sort', action='store_true', help='')
|
#parser.add_argument('--sort', action='store_true', help='')
|
||||||
parser.add_argument('--sub-csv', help='')
|
parser.add_argument('--sub-csv', help='')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--sub-json',
|
'--sub-json',
|
||||||
required=True,
|
required=True,
|
||||||
help='Group substitutions to make fully ranked')
|
help='Group substitutions to make fully ranked')
|
||||||
parser.add_argument('--corner', default=None, help='')
|
parser.add_argument('--corner', default=None, help='')
|
||||||
parser.add_argument('fnin', default=None, help='input timing delay .csv')
|
parser.add_argument('--out', default=None, help='output timing delay .csv')
|
||||||
parser.add_argument('fnout', default=None, help='output timing delay .csv')
|
parser.add_argument(
|
||||||
|
'fns_in',
|
||||||
|
default=None,
|
||||||
|
help='input timing delay .csv (NOTE: must be single column)')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
# Store options in dict to ease passing through functions
|
# Store options in dict to ease passing through functions
|
||||||
bench = Benchmark()
|
bench = Benchmark()
|
||||||
|
|
@ -91,10 +98,10 @@ def main():
|
||||||
|
|
||||||
try:
|
try:
|
||||||
run(
|
run(
|
||||||
args.fnin,
|
args.fns_in,
|
||||||
args.fnout,
|
args.out,
|
||||||
sub_json=sub_json,
|
sub_json=sub_json,
|
||||||
sort=args.sort,
|
#sort=args.sort,
|
||||||
verbose=args.verbose,
|
verbose=args.verbose,
|
||||||
corner=args.corner)
|
corner=args.corner)
|
||||||
finally:
|
finally:
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ build/$(CORNER)/linprog.csv: build/$(CORNER)/leastsq.csv build/grouped.csv
|
||||||
|
|
||||||
build/$(CORNER)/flat.csv: build/$(CORNER)/linprog.csv
|
build/$(CORNER)/flat.csv: build/$(CORNER)/linprog.csv
|
||||||
# Take separated variables and back-annotate them to the original timing variables
|
# Take separated variables and back-annotate them to the original timing variables
|
||||||
python3 $(TIMFUZ_DIR)/csv_group2flat.py --sub-json build/sub.json --corner $(CORNER) --sort build/$(CORNER)/linprog.csv build/$(CORNER)/flat.csv.tmp
|
python3 $(TIMFUZ_DIR)/csv_group2flat.py --sub-json build/sub.json --corner $(CORNER) --sort --out build/$(CORNER)/flat.csv.tmp build/$(CORNER)/linprog.csv
|
||||||
mv build/$(CORNER)/flat.csv.tmp build/$(CORNER)/flat.csv
|
mv build/$(CORNER)/flat.csv.tmp build/$(CORNER)/flat.csv
|
||||||
|
|
||||||
build/$(CORNER)/tilea.json: build/$(CORNER)/flat.csv
|
build/$(CORNER)/tilea.json: build/$(CORNER)/flat.csv
|
||||||
|
|
|
||||||
|
|
@ -14,28 +14,12 @@ from collections import OrderedDict
|
||||||
from fractions import Fraction
|
from fractions import Fraction
|
||||||
|
|
||||||
|
|
||||||
def fracr(r):
|
|
||||||
DELTA = 0.0001
|
|
||||||
|
|
||||||
for i, x in enumerate(r):
|
|
||||||
if type(x) is float:
|
|
||||||
xi = int(x)
|
|
||||||
assert abs(xi - x) < DELTA
|
|
||||||
r[i] = xi
|
|
||||||
return [Fraction(x) for x in r]
|
|
||||||
|
|
||||||
|
|
||||||
def fracm(m):
|
|
||||||
return [fracr(r) for r in m]
|
|
||||||
|
|
||||||
|
|
||||||
def fracr_quick(r):
|
def fracr_quick(r):
|
||||||
return [Fraction(numerator=int(x), denominator=1) for x in r]
|
return [Fraction(numerator=int(x), denominator=1) for x in r]
|
||||||
|
|
||||||
|
|
||||||
# the way I'm doing thing they should all be even integers
|
|
||||||
# hmm this was only slightly faster
|
|
||||||
def fracm_quick(m):
|
def fracm_quick(m):
|
||||||
|
'''Convert integer matrix to Fraction matrix'''
|
||||||
t = type(m[0][0])
|
t = type(m[0][0])
|
||||||
print('fracm_quick type: %s' % t)
|
print('fracm_quick type: %s' % t)
|
||||||
return [fracr_quick(r) for r in m]
|
return [fracr_quick(r) for r in m]
|
||||||
|
|
@ -149,7 +133,6 @@ def state_rref(state, verbose=False):
|
||||||
#msym = sympy.MutableSparseMatrix(mfrac)
|
#msym = sympy.MutableSparseMatrix(mfrac)
|
||||||
msym = sympy.Matrix(mfrac)
|
msym = sympy.Matrix(mfrac)
|
||||||
# internal encoding has significnat performance implications
|
# internal encoding has significnat performance implications
|
||||||
#print(type(msym[3]))
|
|
||||||
#assert type(msym[0]) is sympy.Integer
|
#assert type(msym[0]) is sympy.Integer
|
||||||
|
|
||||||
if verbose:
|
if verbose:
|
||||||
|
|
@ -221,7 +204,10 @@ def run(fnout, fn_ins, simplify=False, corner=None, verbose=0):
|
||||||
def main():
|
def main():
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Timing fuzzer')
|
parser = argparse.ArgumentParser(
|
||||||
|
description=
|
||||||
|
'Compute reduced row echelon (RREF) to form sub.json (variable groups)'
|
||||||
|
)
|
||||||
|
|
||||||
parser.add_argument('--verbose', action='store_true', help='')
|
parser.add_argument('--verbose', action='store_true', help='')
|
||||||
parser.add_argument('--simplify', action='store_true', help='')
|
parser.add_argument('--simplify', action='store_true', help='')
|
||||||
|
|
@ -231,14 +217,10 @@ def main():
|
||||||
default='build_speed/speed.json',
|
default='build_speed/speed.json',
|
||||||
help='Provides speed index to name translation')
|
help='Provides speed index to name translation')
|
||||||
parser.add_argument('--out', help='Output sub.json substitution result')
|
parser.add_argument('--out', help='Output sub.json substitution result')
|
||||||
parser.add_argument('fns_in', nargs='+', help='timing3.txt input files')
|
parser.add_argument('fns_in', nargs='+', help='timing3.csv input files')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
bench = Benchmark()
|
bench = Benchmark()
|
||||||
|
|
||||||
fns_in = args.fns_in
|
|
||||||
if not fns_in:
|
|
||||||
fns_in = glob.glob('specimen_*/timing3.csv')
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
run(
|
run(
|
||||||
fnout=args.out,
|
fnout=args.out,
|
||||||
|
|
|
||||||
|
|
@ -156,13 +156,16 @@ def main():
|
||||||
'Solve timing solution using least squares objective function')
|
'Solve timing solution using least squares objective function')
|
||||||
|
|
||||||
parser.add_argument('--verbose', action='store_true', help='')
|
parser.add_argument('--verbose', action='store_true', help='')
|
||||||
parser.add_argument('--massage', action='store_true', help='')
|
parser.add_argument(
|
||||||
|
'--massage',
|
||||||
|
action='store_true',
|
||||||
|
help='Derive additional constraints to improve solution')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--sub-json', help='Group substitutions to make fully ranked')
|
'--sub-json', help='Group substitutions to make fully ranked')
|
||||||
parser.add_argument('--corner', default="slow_max", help='')
|
parser.add_argument('--corner', required=True, default="slow_max", help='')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--out', default=None, help='output timing delay .json')
|
'--out', default=None, help='output timing delay .json')
|
||||||
parser.add_argument('fns_in', nargs='+', help='timing3.csv input files')
|
parser.add_argument('fns_in', nargs='+', 'timing3.csv input files')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
# Store options in dict to ease passing through functions
|
# Store options in dict to ease passing through functions
|
||||||
bench = Benchmark()
|
bench = Benchmark()
|
||||||
|
|
|
||||||
|
|
@ -195,10 +195,10 @@ def main():
|
||||||
parser.add_argument('--sub-csv', help='')
|
parser.add_argument('--sub-csv', help='')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--sub-json', help='Group substitutions to make fully ranked')
|
'--sub-json', help='Group substitutions to make fully ranked')
|
||||||
parser.add_argument('--corner', default=None, required=True, help='')
|
parser.add_argument('--corner', required=True, default="slow_max", help='')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--out', default=None, help='output timing delay .json')
|
'--out', default=None, help='output timing delay .json')
|
||||||
parser.add_argument('fns_in', nargs='*', help='timing3.csv input files')
|
parser.add_argument('fns_in', nargs='+', help='timing3.csv input files')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
# Store options in dict to ease passing through functions
|
# Store options in dict to ease passing through functions
|
||||||
bench = Benchmark()
|
bench = Benchmark()
|
||||||
|
|
@ -216,7 +216,7 @@ def main():
|
||||||
run_corner=run_corner,
|
run_corner=run_corner,
|
||||||
sub_json=sub_json,
|
sub_json=sub_json,
|
||||||
sub_csv=args.sub_csv,
|
sub_csv=args.sub_csv,
|
||||||
fns_in=fns_in,
|
fn_in=fn_in,
|
||||||
corner=args.corner,
|
corner=args.corner,
|
||||||
massage=args.massage,
|
massage=args.massage,
|
||||||
outfn=args.out,
|
outfn=args.out,
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,7 @@ def main():
|
||||||
|
|
||||||
parser.add_argument('--verbose', action='store_true', help='')
|
parser.add_argument('--verbose', action='store_true', help='')
|
||||||
parser.add_argument('--out', help='Output csv')
|
parser.add_argument('--out', help='Output csv')
|
||||||
parser.add_argument('fns_in', nargs='*', help='sub.json input files')
|
parser.add_argument('fns_in', nargs='+', help='sub.json input files')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
bench = Benchmark()
|
bench = Benchmark()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,16 +9,10 @@ import time
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
|
||||||
# corner wokraround
|
|
||||||
def quad(x):
|
|
||||||
return [x for _ in range(4)]
|
|
||||||
|
|
||||||
|
|
||||||
def run(fnin, fnout, tile_json_fn, verbose=False):
|
def run(fnin, fnout, tile_json_fn, verbose=False):
|
||||||
# modified in place
|
# modified in place
|
||||||
tilej = json.load(open(tile_json_fn, 'r'))
|
tilej = json.load(open(tile_json_fn, 'r'))
|
||||||
|
|
||||||
# FIXME: all corners
|
|
||||||
Ads, bs = loadc_Ads_bs([fnin], ico=True)
|
Ads, bs = loadc_Ads_bs([fnin], ico=True)
|
||||||
bounds = Ads2bounds(Ads, bs)
|
bounds = Ads2bounds(Ads, bs)
|
||||||
|
|
||||||
|
|
@ -71,9 +65,12 @@ def run(fnin, fnout, tile_json_fn, verbose=False):
|
||||||
def main():
|
def main():
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='')
|
parser = argparse.ArgumentParser(
|
||||||
|
description=
|
||||||
|
'Substitute timgrid timing model names for real timing values')
|
||||||
parser.add_argument('--tile-json', default='tiles.json', help='')
|
parser.add_argument('--tile-json', default='tiles.json', help='')
|
||||||
parser.add_argument('fnin', default=None, help='Flattened timing csv')
|
parser.add_argument(
|
||||||
|
'fnin', default=None, help='Input flattened timing csv (flat.json)')
|
||||||
parser.add_argument('fnout', default=None, help='output tile .json')
|
parser.add_argument('fnout', default=None, help='output tile .json')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -255,14 +255,15 @@ def main():
|
||||||
)
|
)
|
||||||
|
|
||||||
parser.add_argument('--verbose', type=int, help='')
|
parser.add_argument('--verbose', type=int, help='')
|
||||||
|
# made a bulk conversion easier...keep?
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--auto-name', action='store_true', help='timing3.txt => timing3.csv')
|
'--auto-name', action='store_true', help='timing3.txt => timing3.csv')
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--speed-json',
|
'--speed-json',
|
||||||
default='build_speed/speed.json',
|
default='build_speed/speed.json',
|
||||||
help='Provides speed index to name translation')
|
help='Provides speed index to name translation')
|
||||||
parser.add_argument('--out', default=None, help='Output csv')
|
parser.add_argument('--out', default=None, help='Output timing3.csv file')
|
||||||
parser.add_argument('fns_in', nargs='*', help='timing3.txt input files')
|
parser.add_argument('fns_in', nargs='+', help='Input timing3.txt files')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
bench = Benchmark()
|
bench = Benchmark()
|
||||||
|
|
||||||
|
|
@ -274,6 +275,8 @@ def main():
|
||||||
fnout = fnin.replace('.txt', '.csv')
|
fnout = fnin.replace('.txt', '.csv')
|
||||||
assert fnout != fnin, 'Expect .txt in'
|
assert fnout != fnin, 'Expect .txt in'
|
||||||
else:
|
else:
|
||||||
|
# practically there are too many stray prints to make this work as expected
|
||||||
|
assert 0, 'File name required'
|
||||||
fnout = '/dev/stdout'
|
fnout = '/dev/stdout'
|
||||||
print("Writing to %s" % fnout)
|
print("Writing to %s" % fnout)
|
||||||
fout = open(fnout, 'w')
|
fout = open(fnout, 'w')
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue