timfuz: fully support min corner

Signed-off-by: John McMaster <johndmcmaster@gmail.com>
This commit is contained in:
John McMaster 2018-09-12 15:29:32 -07:00
parent c965288e75
commit 0b3aa34b5b
1 changed files with 46 additions and 14 deletions

View File

@ -18,6 +18,13 @@ def save(outfn, xvals, names, corner):
delta = 0.5 delta = 0.5
corneri = corner_s2i[corner] corneri = corner_s2i[corner]
roundf = {
'fast_max': math.ceil,
'fast_min': math.floor,
'slow_max': math.ceil,
'slow_min': math.floor,
}[corner]
print('Writing results') print('Writing results')
zeros = 0 zeros = 0
with open(outfn, 'w') as fout: with open(outfn, 'w') as fout:
@ -34,10 +41,11 @@ def save(outfn, xvals, names, corner):
print('WARNING: near 0 delay on %s: %0.6f' % (name, xval)) print('WARNING: near 0 delay on %s: %0.6f' % (name, xval))
zeros += 1 zeros += 1
#continue #continue
items = [str(row_ico), acorner2csv(math.ceil(xval), corneri)] items = [str(row_ico), acorner2csv(roundf(xval), corneri)]
items.append('%u %s' % (1, name)) items.append('%u %s' % (1, name))
fout.write(','.join(items) + '\n') fout.write(','.join(items) + '\n')
print('Wrote: zeros %u => %u / %u constrained delays' % (zeros, len(names) - zeros, len(names))) nonzeros = len(names) - zeros
print('Wrote: %u / %u constrained delays, %u zeros' % (nonzeros, len(names), zeros))
def run_corner(Anp, b, names, corner, verbose=False, opts={}, meta={}, outfn=None): def run_corner(Anp, b, names, corner, verbose=False, opts={}, meta={}, outfn=None):
if len(Anp) == 0: if len(Anp) == 0:
@ -45,6 +53,12 @@ def run_corner(Anp, b, names, corner, verbose=False, opts={}, meta={}, outfn=Non
if outfn: if outfn:
save(outfn, [], [], corner) save(outfn, [], [], corner)
return return
maxcorner = {
'slow_max': True,
'slow_min': False,
'fast_max': True,
'fast_min': False,
}[corner]
# Given timing scores for above delays (-ps) # Given timing scores for above delays (-ps)
assert type(Anp[0]) is np.ndarray, type(Anp[0]) assert type(Anp[0]) is np.ndarray, type(Anp[0])
@ -54,28 +68,46 @@ def run_corner(Anp, b, names, corner, verbose=False, opts={}, meta={}, outfn=Non
''' '''
Be mindful of signs Be mindful of signs
Have something like t1, t2: total delay contants
timing1/timing 2 are constants d1, d2..: variables to solve for
delay1 + delay2 + delay4 >= timing1
delay2 + delay3 >= timing2 Max corner intuitive form:
d1 + d2 + d4 >= t1
d2 + d3 >= t2
But need it in compliant form: But need it in compliant form:
-delay1 + -delay2 + -delay4 <= -timing1 -d1 + -d2 + -d4 <= -t1
-delay2 + -delay3 <= -timing2 -d2 + -d3 <= -t2
Minimize delay elements
Min corner intuitive form:
d1 + d2 + d4 <= t1
d2 + d3 <= t2
Maximize delay elements
''' '''
assert 'max' in corner, 'FIXME: support min corner math'
rows = len(Anp) rows = len(Anp)
cols = len(Anp[0]) cols = len(Anp[0])
print('Scaling to solution form...') if maxcorner:
b_ub = -1.0 * b print('maxcorner => scaling to solution form...')
#A_ub = -1.0 * Anp b_ub = -1.0 * b
A_ub = [-1.0 * x for x in Anp] #A_ub = -1.0 * Anp
A_ub = [-1.0 * x for x in Anp]
else:
print('mincorner => no scaling required')
b_ub = b
A_ub = Anp
print('Creating misc constants...') print('Creating misc constants...')
# Minimization function scalars # Minimization function scalars
# Treat all logic elements as equally important # Treat all logic elements as equally important
c = [1 for _i in range(len(names))] if maxcorner:
# Best result are min delays
c = [1 for _i in range(len(names))]
else:
# Best result are max delays
c = [-1 for _i in range(len(names))]
# Delays cannot be negative # Delays cannot be negative
# (this is also the default constraint) # (this is also the default constraint)
#bounds = [(0, None) for _i in range(len(names))] #bounds = [(0, None) for _i in range(len(names))]