diff --git a/fuzzers/007-timing/checksub.py b/fuzzers/007-timing/checksub.py index 977d5b6f..5387eaf1 100644 --- a/fuzzers/007-timing/checksub.py +++ b/fuzzers/007-timing/checksub.py @@ -58,10 +58,9 @@ def pds(Ads, s): def run(fns_in, sub_json=None, verbose=False): - # arbitrary...data is thrown away - corner = "slow_max" - - Ads, b = loadc_Ads_b(fns_in, corner, ico=True) + assert len(fn_ins) > 0 + # arbitrary corner...data is thrown away + Ads, b = loadc_Ads_b(fns_in, "slow_max", ico=True) if sub_json: print('Subbing JSON %u rows' % len(Ads)) @@ -112,7 +111,7 @@ def main(): parser.add_argument('--verbose', action='store_true', 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() # Store options in dict to ease passing through functions bench = Benchmark() diff --git a/fuzzers/007-timing/csv_flat2group.py b/fuzzers/007-timing/csv_flat2group.py index 4cdc04fd..a1defef2 100644 --- a/fuzzers/007-timing/csv_flat2group.py +++ b/fuzzers/007-timing/csv_flat2group.py @@ -50,11 +50,15 @@ def main(): # Store options in dict to ease passing through functions bench = Benchmark() + fns_in = args.fns_in + if not fns_in: + fns_in = glob.glob('specimen_*/timing3.csv') + sub_json = load_sub(args.sub_json) try: run( - args.fns_in, + fns_in, args.out, sub_json=sub_json, strict=args.strict, diff --git a/fuzzers/007-timing/csv_group2flat.py b/fuzzers/007-timing/csv_group2flat.py index 45aacdb1..bba0cc5b 100644 --- a/fuzzers/007-timing/csv_group2flat.py +++ b/fuzzers/007-timing/csv_group2flat.py @@ -1,19 +1,6 @@ #!/usr/bin/env python3 -# https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.linprog.html -from scipy.optimize import linprog from timfuz import Benchmark, loadc_Ads_bs, load_sub, Ads2bounds, corners2csv, corner_s2i -from timfuz_massage import massage_equations -import numpy as np -import glob -import json -import math -from collections import OrderedDict -from fractions import Fraction -import sys -import datetime -import os -import time def gen_flat(fnin, sub_json, corner=None): diff --git a/fuzzers/007-timing/rref.py b/fuzzers/007-timing/rref.py index 6db813b4..e160768c 100644 --- a/fuzzers/007-timing/rref.py +++ b/fuzzers/007-timing/rref.py @@ -1,8 +1,4 @@ #!/usr/bin/env python3 -''' -Triaging tool to help understand where we need more timing coverage -Finds correlated variables to help make better test cases -''' from timfuz import Benchmark, Ar_di2np, loadc_Ads_b, index_names, A_ds2np, simplify_rows import numpy as np @@ -193,6 +189,7 @@ def state_rref(state, verbose=False): def run(fnout, fn_ins, simplify=False, corner=None, verbose=0): print('Loading data') + assert len(fn_ins) > 0 state = State.load(fn_ins, simplify=simplify, corner=corner) state_rref(state, verbose=verbose) state.print_stats() @@ -217,14 +214,18 @@ def main(): default='build_speed/speed.json', help='Provides speed index to name translation') parser.add_argument('--out', help='Output sub.json substitution result') - 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() bench = Benchmark() + fns_in = args.fns_in + if not fns_in: + fns_in = glob.glob('specimen_*/timing3.csv') + try: run( fnout=args.out, - fn_ins=args.fns_in, + fn_ins=fns_in, simplify=args.simplify, corner=args.corner, verbose=args.verbose) diff --git a/fuzzers/007-timing/solve_leastsq.py b/fuzzers/007-timing/solve_leastsq.py index 5bd1f7b0..d77acd2d 100644 --- a/fuzzers/007-timing/solve_leastsq.py +++ b/fuzzers/007-timing/solve_leastsq.py @@ -1,19 +1,14 @@ #!/usr/bin/env python3 -# https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.linprog.html -from scipy.optimize import linprog from timfuz import Benchmark, load_sub, corner_s2i, acorner2csv import timfuz import numpy as np -import glob import math -from fractions import Fraction import sys import os import time import timfuz_solve import scipy.optimize as optimize -from scipy.optimize import least_squares def mkestimate(Anp, b): @@ -141,7 +136,7 @@ def run_corner( x0 = mkestimate(Anp, b) print('Solving') - res = least_squares(func, x0, bounds=(0, float('inf'))) + res = optimize.least_squares(func, x0, bounds=(0, float('inf'))) print('Done') if outfn: diff --git a/fuzzers/007-timing/solve_linprog.py b/fuzzers/007-timing/solve_linprog.py index 28f181a6..6a27ac4c 100644 --- a/fuzzers/007-timing/solve_linprog.py +++ b/fuzzers/007-timing/solve_linprog.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 -# https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.linprog.html -from scipy.optimize import linprog +import scipy.optimize as optimize from timfuz import Benchmark, load_sub, A_ub_np2d, acorner2csv, corner_s2i import numpy as np import glob @@ -151,8 +150,9 @@ def run_corner( print('') # Now find smallest values for delay constants # Due to input bounds (ex: column limit), some delay elements may get eliminated entirely + # https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.linprog.html print('Running linprog w/ %d r, %d c (%d name)' % (rows, cols, len(names))) - res = linprog( + res = optimize.linprog( c, A_ub=A_ub, b_ub=b_ub, diff --git a/fuzzers/007-timing/sub2csv.py b/fuzzers/007-timing/sub2csv.py index dfb65227..48322dff 100644 --- a/fuzzers/007-timing/sub2csv.py +++ b/fuzzers/007-timing/sub2csv.py @@ -1,25 +1,7 @@ #!/usr/bin/env python3 -from timfuz import Benchmark, Ar_di2np, loadc_Ads_b, index_names, A_ds2np, simplify_rows -import numpy as np -import glob -import math +from timfuz import Benchmark import json -import sympy -from collections import OrderedDict -from fractions import Fraction - - -def mlcm(xs): - ''' - Find the LCM between elements in a group - ''' - l = xs[0] - for n in xs: - for m in xs: - lthis = lcm(n, m) - l = int(max(lthis, l)) - return ret def write_state(state, fout): diff --git a/fuzzers/007-timing/timfuz_massage.py b/fuzzers/007-timing/timfuz_massage.py index 4871e0f4..cd96d314 100644 --- a/fuzzers/007-timing/timfuz_massage.py +++ b/fuzzers/007-timing/timfuz_massage.py @@ -339,6 +339,16 @@ def massage_equations(Ads, b, verbose=False, corner=None): Subtract equations from each other to generate additional constraints Helps provide additional guidance to solver for realistic delays + Ex: given: + a >= 10 + a + b >= 100 + A valid solution is: + a = 100 + However, a better solution is something like + a = 10 + b = 90 + This creates derived constraints to provide more realistic results + Equation pipeline Some operations may generate new equations Simplify after these to avoid unnecessary overhead on redundant constraints diff --git a/fuzzers/007-timing/timfuz_solve.py b/fuzzers/007-timing/timfuz_solve.py index 4f6446ef..684cf05d 100644 --- a/fuzzers/007-timing/timfuz_solve.py +++ b/fuzzers/007-timing/timfuz_solve.py @@ -1,19 +1,9 @@ #!/usr/bin/env python3 -# https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.linprog.html -from scipy.optimize import linprog -from timfuz import Benchmark, simplify_rows, loadc_Ads_b, index_names, A_ds2np, run_sub_json, print_eqns, Ads2bounds, instances, SimplifiedToZero, allow_zero_eqns +from timfuz import simplify_rows, loadc_Ads_b, index_names, A_ds2np, run_sub_json, print_eqns, Ads2bounds, instances, SimplifiedToZero, allow_zero_eqns from timfuz_massage import massage_equations import numpy as np -import glob -import json -import math -from collections import OrderedDict -from fractions import Fraction import sys -import datetime -import os -import time def check_feasible(A_ub, b_ub): @@ -162,18 +152,6 @@ def run( #print #col_dist(A_ubd, 'final', names) - print('b10', b[0:100]) - ''' - Given: - a >= 10 - a + b >= 100 - A valid solution is: - a = 100 - However, a better solution is something like - a = 10 - b = 90 - This creates derived constraints to provide more realistic results - ''' if massage: try: Ads, b = massage_equations(Ads, b, corner=corner) diff --git a/fuzzers/007-timing/timing_txt2csv.py b/fuzzers/007-timing/timing_txt2csv.py index ebdda26d..3f0e62af 100644 --- a/fuzzers/007-timing/timing_txt2csv.py +++ b/fuzzers/007-timing/timing_txt2csv.py @@ -12,12 +12,11 @@ from collections import OrderedDict # Speed index: some sort of special value SI_NONE = 0xFFFF +# prefix to make easier to track +# models do not overlap between PIPs and WIREs PREFIX_W = 'WIRE_' PREFIX_P = 'PIP_' -#PREFIX_W = '' -#PREFIX_P = '' - def parse_pip(s): # Entries like