mirror of
https://github.com/openhwgroup/cvw.git
synced 2025-04-22 12:57:23 -04:00
restored functionality of makeCoefTable()
This commit is contained in:
parent
a54837b102
commit
f50b3837f5
2 changed files with 114 additions and 58 deletions
|
@ -197,6 +197,8 @@ def oneMetricPlot(module, var, freq=None, ax=None, fits='clsgn', norm=True, colo
|
|||
allMetrics = []
|
||||
|
||||
ale = (var != 'delay') # if not delay, must be area, leakage, or energy
|
||||
modFit = fitDict[mod]
|
||||
fits = modFit[ale]
|
||||
|
||||
for spec in techSpecs:
|
||||
metric = getVals(spec.tech, module, var, freq=freq)
|
||||
|
@ -207,8 +209,8 @@ def oneMetricPlot(module, var, freq=None, ax=None, fits='clsgn', norm=True, colo
|
|||
metric = [m/norm for m in metric]
|
||||
|
||||
if len(metric) == 5: # don't include the spec if we don't have points for all widths
|
||||
xp, pred, leg = regress(widths, metric, spec, fits, ale=ale)
|
||||
fullLeg += leg
|
||||
xp, pred, coefs, r2 = regress(widths, metric, fits)
|
||||
fullLeg += genLegend(fits, coefs, r2, spec, ale=ale)
|
||||
c = color if color else spec.color
|
||||
ax.scatter(widths, metric, color=c, marker=spec.shape)
|
||||
ax.plot(xp, pred, color=c)
|
||||
|
@ -216,7 +218,8 @@ def oneMetricPlot(module, var, freq=None, ax=None, fits='clsgn', norm=True, colo
|
|||
allMetrics += metric
|
||||
|
||||
combined = TechSpec('combined', 'red', '_', 0, 0, 0, 0)
|
||||
xp, pred, leg = regress(allWidths, allMetrics, combined, fits, ale=ale)
|
||||
xp, pred, coefs, r2 = regress(allWidths, allMetrics, fits)
|
||||
leg = genLegend(fits, coefs, r2, combined, ale=ale)
|
||||
fullLeg += leg
|
||||
ax.plot(xp, pred, color='red')
|
||||
|
||||
|
@ -232,14 +235,17 @@ def oneMetricPlot(module, var, freq=None, ax=None, fits='clsgn', norm=True, colo
|
|||
|
||||
if (module in ['flop', 'csa']) & (var == 'delay'):
|
||||
ax.set_ylim(ymin=0)
|
||||
ytop = ax.get_ylim()[1]
|
||||
ax.set_ylim(ymax=1.1*ytop)
|
||||
|
||||
if singlePlot:
|
||||
titleStr = " (target " + str(freq)+ "MHz)" if freq != None else " (best achievable delay)"
|
||||
ax.set_title(module + titleStr)
|
||||
plt.savefig('./plots/PPA/'+ module + '_' + var + '.png')
|
||||
# plt.show()
|
||||
return fullLeg
|
||||
|
||||
def regress(widths, var, spec, fits='clsgn', ale=False):
|
||||
def regress(widths, var, fits='clsgn'):
|
||||
''' fits a curve to the given points
|
||||
returns lists of x and y values to plot that curve and legend elements with the equation
|
||||
'''
|
||||
|
@ -267,28 +273,41 @@ def regress(widths, var, spec, fits='clsgn', ale=False):
|
|||
for x in xp:
|
||||
n = [func(x/normAddWidth) for func in funcArr]
|
||||
pred += [sum(np.multiply(coefs, n))]
|
||||
|
||||
leg = genLegend(fits, coefs, r2, spec, ale=ale)
|
||||
|
||||
return xp, pred, leg
|
||||
return xp, pred, coefs, r2
|
||||
|
||||
def makeCoefTable(tech):
|
||||
''' not currently in use, may salvage later
|
||||
def makeCoefTable():
|
||||
'''
|
||||
writes CSV with each line containing the coefficients for a regression fit
|
||||
to a particular combination of module, metric, and target frequency
|
||||
to a particular combination of module, metric (including both techs, normalized)
|
||||
'''
|
||||
file = open("ppaFitting.csv", "w")
|
||||
writer = csv.writer(file)
|
||||
writer.writerow(['Module', 'Metric', 'Freq', '1', 'N', 'N^2', 'log2(N)', 'Nlog2(N)', 'R^2'])
|
||||
writer.writerow(['Module', 'Metric', '1', 'N', 'N^2', 'log2(N)', 'Nlog2(N)', 'R^2'])
|
||||
|
||||
for mod in ['add', 'mult', 'comparator', 'shifter']:
|
||||
for comb in [['delay', 5000], ['area', 5000], ['area', 10]]:
|
||||
var = comb[0]
|
||||
freq = comb[1]
|
||||
metric = getVals(tech, mod, freq, var)
|
||||
global widths
|
||||
coefs, r2, funcArr = regress(widths, metric)
|
||||
row = [mod] + comb + np.ndarray.tolist(coefs) + [r2]
|
||||
for module in modules:
|
||||
for var in ['delay', 'area', 'lpower', 'denergy']:
|
||||
ale = (var != 'delay')
|
||||
metL = []
|
||||
modFit = fitDict[module]
|
||||
fits = modFit[ale]
|
||||
|
||||
for spec in techSpecs:
|
||||
metric = getVals(spec.tech, module, var)
|
||||
techdict = spec._asdict()
|
||||
norm = techdict[var]
|
||||
metL += [m/norm for m in metric]
|
||||
|
||||
xp, pred, coefs, r2 = regress(widths*2, metL, fits)
|
||||
coefs = np.ndarray.tolist(coefs)
|
||||
coefsToWrite = [None]*5
|
||||
fitTerms = 'clsgn'
|
||||
ind = 0
|
||||
for i in range(len(fitTerms)):
|
||||
if fitTerms[i] in fits:
|
||||
coefsToWrite[i] = coefs[ind]
|
||||
ind += 1
|
||||
row = [module, var] + coefsToWrite + [r2]
|
||||
writer.writerow(row)
|
||||
|
||||
file.close()
|
||||
|
@ -341,8 +360,8 @@ def freqPlot(tech, mod, width):
|
|||
|
||||
median = np.median(list(flatten(freqsL)))
|
||||
|
||||
f, (ax1, ax2, ax3, ax4) = plt.subplots(4, 1, sharex=True)
|
||||
for ax in (ax1, ax2, ax3, ax4):
|
||||
f, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
|
||||
for ax in (ax1, ax2): #, ax3, ax4):
|
||||
ax.ticklabel_format(useOffset=False, style='plain')
|
||||
|
||||
for ind in [0,1]:
|
||||
|
@ -353,23 +372,23 @@ def freqPlot(tech, mod, width):
|
|||
freqs, delays, areas = noOutliers(median, freqs, delays, areas) # comment out to see all syntheses
|
||||
|
||||
c = 'blue' if ind else 'green'
|
||||
adprod = adprodpow(areas, delays, 1)
|
||||
adpow = adprodpow(areas, delays, 2)
|
||||
# adprod = adprodpow(areas, delays, 1)
|
||||
# adpow = adprodpow(areas, delays, 2)
|
||||
ax1.scatter(freqs, delays, color=c)
|
||||
ax2.scatter(freqs, areas, color=c)
|
||||
ax3.scatter(freqs, adprod, color=c)
|
||||
ax4.scatter(freqs, adpow, color=c)
|
||||
# ax3.scatter(freqs, adprod, color=c)
|
||||
# ax4.scatter(freqs, adpow, color=c)
|
||||
|
||||
legend_elements = [lines.Line2D([0], [0], color='green', ls='', marker='o', label='timing achieved'),
|
||||
lines.Line2D([0], [0], color='blue', ls='', marker='o', label='slack violated')]
|
||||
|
||||
ax1.legend(handles=legend_elements)
|
||||
|
||||
ax4.set_xlabel("Target Freq (MHz)")
|
||||
ax2.set_xlabel("Target Freq (MHz)")
|
||||
ax1.set_ylabel('Delay (ns)')
|
||||
ax2.set_ylabel('Area (sq microns)')
|
||||
ax3.set_ylabel('Area * Delay')
|
||||
ax4.set_ylabel('Area * $Delay^2$')
|
||||
# ax3.set_ylabel('Area * Delay')
|
||||
# ax4.set_ylabel('Area * $Delay^2$')
|
||||
ax1.set_title(mod + '_' + str(width))
|
||||
plt.savefig('./plots/freqBuckshot/' + tech + '/' + mod + '/' + str(width) + '.png')
|
||||
# plt.show()
|
||||
|
@ -464,23 +483,31 @@ def plotPPA(mod, freq=None, norm=True, aleOpt=False):
|
|||
if no freq specified, uses the synthesis with best achievable delay for each width
|
||||
overlays data from both techs
|
||||
'''
|
||||
plt.rcParams["figure.figsize"] = (12,8)
|
||||
plt.rcParams["figure.figsize"] = (10,7)
|
||||
fig, axs = plt.subplots(2, 2)
|
||||
modFit = fitDict[mod]
|
||||
# fig, axs = plt.subplots(4, 1)
|
||||
|
||||
oneMetricPlot(mod, 'delay', ax=axs[0,0], fits=modFit[0], freq=freq, norm=norm)
|
||||
oneMetricPlot(mod, 'area', ax=axs[0,1], fits=modFit[1], freq=freq, norm=norm)
|
||||
oneMetricPlot(mod, 'lpower', ax=axs[1,0], fits=modFit[1], freq=freq, norm=norm)
|
||||
oneMetricPlot(mod, 'denergy', ax=axs[1,1], fits=modFit[1], freq=freq, norm=norm)
|
||||
# oneMetricPlot(mod, 'delay', ax=axs[0], fits=modFit[0], freq=freq, norm=norm)
|
||||
# oneMetricPlot(mod, 'area', ax=axs[1], fits=modFit[1], freq=freq, norm=norm)
|
||||
# oneMetricPlot(mod, 'lpower', ax=axs[2], fits=modFit[1], freq=freq, norm=norm)
|
||||
# oneMetricPlot(mod, 'denergy', ax=axs[3], fits=modFit[1], freq=freq, norm=norm)
|
||||
oneMetricPlot(mod, 'delay', ax=axs[0,0], freq=freq, norm=norm)
|
||||
oneMetricPlot(mod, 'area', ax=axs[0,1], freq=freq, norm=norm)
|
||||
oneMetricPlot(mod, 'lpower', ax=axs[1,0], freq=freq, norm=norm)
|
||||
fullLeg = oneMetricPlot(mod, 'denergy', ax=axs[1,1], freq=freq, norm=norm)
|
||||
|
||||
if aleOpt:
|
||||
oneMetricPlot(mod, 'area', ax=axs[0,1], fits=modFit[1], freq=10, norm=norm, color='black')
|
||||
oneMetricPlot(mod, 'lpower', ax=axs[1,0], fits=modFit[1], freq=10, norm=norm, color='black')
|
||||
oneMetricPlot(mod, 'denergy', ax=axs[1,1], fits=modFit[1], freq=10, norm=norm, color='black')
|
||||
oneMetricPlot(mod, 'area', ax=axs[0,1], freq=10, norm=norm, color='black')
|
||||
oneMetricPlot(mod, 'lpower', ax=axs[1,0], freq=10, norm=norm, color='black')
|
||||
oneMetricPlot(mod, 'denergy', ax=axs[1,1], freq=10, norm=norm, color='black')
|
||||
|
||||
titleStr = " (target " + str(freq)+ "MHz)" if freq != None else " (best achievable delay)"
|
||||
n = 'normalized' if norm else 'unnormalized'
|
||||
saveStr = './plots/PPA/'+ n + '/' + mod + '.png'
|
||||
plt.suptitle(mod + titleStr)
|
||||
|
||||
# fig.legend(handles=fullLeg, ncol=3, loc='center', bbox_to_anchor=(0.3, 0.82, 0.4, 0.2))
|
||||
|
||||
if freq != 10: plt.savefig(saveStr)
|
||||
# plt.show()
|
||||
|
||||
|
@ -511,7 +538,7 @@ if __name__ == '__main__':
|
|||
|
||||
fitDict = {'add': ['cg', 'l', 'l'], 'mult': ['cg', 's', 'ls'], 'comparator': ['cg', 'l', 'l'], 'csa': ['c', 'l', 'l'], 'shiftleft': ['cg', 'l', 'ln'], 'flop': ['c', 'l', 'l'], 'priorityencoder': ['cg', 'l', 'l']}
|
||||
fitDict.update(dict.fromkeys(['mux2', 'mux4', 'mux8'], ['cg', 'l', 'l']))
|
||||
leftblue = [['mux2', 'sky90', 32], ['mux2', 'sky90', 64], ['mux2', 'sky90', 128], ['mux2', 'tsmc28', 16], ['mux2', 'tsmc28', 8], ['mux8', 'sky90', 32]]
|
||||
leftblue = [['mux2', 'sky90', 32], ['mux2', 'sky90', 64], ['mux2', 'sky90', 128], ['mux8', 'sky90', 32], ['mux2', 'tsmc28', 8], ['mux2', 'tsmc28', 64]]
|
||||
|
||||
TechSpec = namedtuple("TechSpec", "tech color shape delay area lpower denergy")
|
||||
techSpecs = [['sky90', 'green', 'o', 43.2e-3, 1330.84, 582.81, 520.66], ['tsmc28', 'blue', '^', 12.2e-3, 209.29, 1060, 81.43]]
|
||||
|
@ -529,12 +556,13 @@ if __name__ == '__main__':
|
|||
# squareAreaDelay('sky90', 'add', 32)
|
||||
# oneMetricPlot('add', 'delay')
|
||||
# freqPlot('sky90', 'mux4', 16)
|
||||
# makeCoefTable()
|
||||
|
||||
for mod in modules:
|
||||
# plotPPA(mod, norm=False)
|
||||
plotPPA(mod, aleOpt=True)
|
||||
plotBestAreas(mod)
|
||||
for w in [8, 16, 32, 64, 128]:
|
||||
freqPlot('sky90', mod, w)
|
||||
freqPlot('tsmc28', mod, w)
|
||||
for mod in ['mux2']: #modules:
|
||||
plotPPA(mod, norm=False)
|
||||
plotPPA(mod) #, aleOpt=True)
|
||||
# plotBestAreas(mod)
|
||||
# for w in [8, 16, 32, 64, 128]:
|
||||
# freqPlot('sky90', mod, w)
|
||||
# freqPlot('tsmc28', mod, w)
|
||||
plt.close('all')
|
|
@ -1,13 +1,41 @@
|
|||
Module,Metric,Freq,1,N,N^2,log2(N),Nlog2(N),R^2
|
||||
add,delay,5000,-0.038978555556527635,-0.08911531250030817,-0.00012953428819478948,0.2083593333340971,0.013950093750045424,1.0
|
||||
add,area,5000,-1913.1778463362505,-268.21377075092175,-0.4100347526051751,1046.9667200022955,47.59125331263557,1.0
|
||||
add,area,10,-13.720001333167332,14.700000312552621,1.3021426840869221e-09,-1.3062278840780171e-10,-9.375775472819561e-08,1.0
|
||||
mult,delay,5000,-0.2915958888891911,-0.02828693750009581,-3.445876736121953e-05,0.32169033333357117,0.0044735312500140964,1.0
|
||||
mult,area,5000,27780.605184113756,10418.196477973508,26.857274703166343,-24448.387256089416,-1468.2850310678027,1.0
|
||||
mult,area,10,-6472.791005245042,-2075.5787013197305,8.20962684330778,5345.246556351299,313.5693677823146,1.0
|
||||
comparator,delay,5000,0.1903951111111219,0.000987500000002994,3.427951388890516e-06,3.333333324460974e-06,-0.00012593750000039925,1.0
|
||||
comparator,area,5000,-508.51109056188875,-579.7924890645068,-1.0888888741341944,969.5466443383111,101.5524983752957,1.0
|
||||
comparator,area,10,-155.6022268893253,-40.3637507501383,-0.07230902908001494,132.9533363336765,8.452500156270371,1.0
|
||||
shifter,delay,5000,0.06953233333235516,-0.08957893750031035,-0.00015877864583368578,0.16727300000076853,0.014763625000045773,1.0
|
||||
shifter,area,5000,-237.48663487568587,1208.7075255666841,1.5708073263938906,-1678.7400476770383,-166.69187856311666,1.0
|
||||
shifter,area,10,-1079.4155736731122,-591.3687615645423,-0.877491337241916,1211.9333560050677,103.11437703155087,1.0
|
||||
Module,Metric,1,N,N^2,log2(N),Nlog2(N),R^2
|
||||
priorityencoder,delay,4.865032478368464,,,1.0346781590203091,,0.990533246983837
|
||||
priorityencoder,area,,0.3296349181169891,,,,0.9718942704677337
|
||||
priorityencoder,lpower,,0.2508481588069769,,,,0.9418329012771585
|
||||
priorityencoder,denergy,,0.09327161156406552,,,,0.8065924672945542
|
||||
add,delay,8.961254531683414,,,1.4310340215065527,,0.9564367595740637
|
||||
add,area,,1.0710989265923485,,,,0.988580182173048
|
||||
add,lpower,,0.9470245397661955,,,,0.9951383820581323
|
||||
add,denergy,,0.9954952282287014,,,,0.9928308616130285
|
||||
csa,delay,3.590384717869601,,,,,0.0
|
||||
csa,area,,0.9312877569527923,,,,0.999393942859829
|
||||
csa,lpower,,1.5320774877598933,,,,0.9400384192534433
|
||||
csa,denergy,,1.1454135769936609,,,,0.9735205275004183
|
||||
shiftleft,delay,8.66019468793489,,,1.6351711913499432,,0.9873681453602638
|
||||
shiftleft,area,,1.9102134686740575,,,,0.9466461680123697
|
||||
shiftleft,lpower,,2.277088275290811,,,,0.9624044038708768
|
||||
shiftleft,denergy,,1.4931073444617051,,,,0.9454881696599784
|
||||
comparator,delay,6.680678539086959,,,0.9397668550976327,,0.98789326603378
|
||||
comparator,area,,0.6003877936704982,,,,0.9672416909621802
|
||||
comparator,lpower,,0.46756802348373877,,,,0.8609362596824635
|
||||
comparator,denergy,,0.3089180049610159,,,,0.8267293340232036
|
||||
flop,delay,3.3270503187614153,,,,,0.0
|
||||
flop,area,,0.34478305655859876,,,,0.9433629202566682
|
||||
flop,lpower,,0.3707856336608904,,,,0.9170347531086821
|
||||
flop,denergy,,0.0011765517257429892,,,,0.688648230209356
|
||||
mux2,delay,4.732514086885074,,,0.38138175938205005,,0.5638177354804589
|
||||
mux2,area,,0.19794547955000782,,,,0.9753613114571431
|
||||
mux2,lpower,,0.1881638557015794,,,,0.7572248871637561
|
||||
mux2,denergy,,0.16278100836605952,,,,0.9811112115671446
|
||||
mux4,delay,5.67790744523475,,,0.5081925137582493,,0.8316415055210026
|
||||
mux4,area,,0.35778033738856435,,,,0.9880049722019894
|
||||
mux4,lpower,,0.32236674794207065,,,,0.8279138454959137
|
||||
mux4,denergy,,0.28073375091037084,,,,0.9943662618662574
|
||||
mux8,delay,7.252700330388384,,,0.45254210999717837,,0.8464368692304263
|
||||
mux8,area,,0.7614128432326613,,,,0.9863118376555963
|
||||
mux8,lpower,,0.6570734849206145,,,,0.9855956038468652
|
||||
mux8,denergy,,0.4496346388149245,,,,0.9785597135426944
|
||||
mult,delay,29.562138166420393,,,6.711916207386673,,0.9833266087176287
|
||||
mult,area,,,13.838943348894976,,,0.9875861886135875
|
||||
mult,lpower,,,14.380577146903335,,,0.9349609233308782
|
||||
mult,denergy,,,36.51397409545879,,,0.9719012952478829
|
||||
|
|
|
Loading…
Add table
Add a link
Reference in a new issue