From 46bfdf5df9d0553daa01cf0e6457a17f84e42196 Mon Sep 17 00:00:00 2001 From: "James E. Stine" Date: Mon, 13 Nov 2023 02:39:25 -0600 Subject: [PATCH] update ppaAnalyze to analyze correctionly freqSweep --- synthDC/Makefile | 4 +-- synthDC/ppa/bestSynths.csv | 16 +++++------ synthDC/ppa/ppaAnalyze.py | 57 ++++++++++++++++++++------------------ synthDC/ppa/ppaSynth.py | 24 ++++++++++++++-- 4 files changed, 62 insertions(+), 39 deletions(-) diff --git a/synthDC/Makefile b/synthDC/Makefile index 8e1b09d01..e6332e60f 100755 --- a/synthDC/Makefile +++ b/synthDC/Makefile @@ -11,7 +11,7 @@ export MOD ?= orig # title to add a note in the synth's directory name TITLE = # tsmc28, sky130, and sky90 presently supported -export TECH ?= sky90 +export TECH ?= sky130 # MAXCORES allows parallel compilation, which is faster but less CPU-efficient # Avoid when doing sweeps of many optimization points in parallel export MAXCORES ?= 1 @@ -24,7 +24,7 @@ export WIDTH ?= 32 time := $(shell date +%F-%H-%M) hash := $(shell git rev-parse --short HEAD) -export OUTPUTDIR := runs/$(DESIGN)_$(WIDTH)_$(CONFIG)_$(MOD)_$(TECH)_$(FREQ)_MHz_$(time)_$(TITLE)_$(hash) +export OUTPUTDIR := runs/ppa_$(DESIGN)_$(WIDTH)_$(CONFIG)_$(TECH)_$(FREQ)_MHz_$(time)_$(TITLE)_$(hash) export SAIFPOWER ?= 0 OLDCONFIGDIR ?= ${WALLY}/config diff --git a/synthDC/ppa/bestSynths.csv b/synthDC/ppa/bestSynths.csv index d57ac6924..885eeb962 100644 --- a/synthDC/ppa/bestSynths.csv +++ b/synthDC/ppa/bestSynths.csv @@ -3,12 +3,12 @@ binencoder,sky130,8,1000,1.0000,50.960001,24.761,0.010685929975270078 binencoder,sky130,16,1000,1.0000,136.220003,77.243,0.021773774467348 binencoder,sky130,32,1000,1.0000,372.400007,189.626,0.04371111111111111 binencoder,sky130,64,1000,1.0000,797.720015,382.205,0.07393850658857981 -binencoder,sky130,128,1000,1.0000,1602.300031,610.009,0.1261366969785861 +binencoder,sky130,128,900,1.1111,1602.300031,610.009,0.1261366969785861 adder,sky130,8,1000,1.0000,253.820005,154.438,0.10825587752870422 adder,sky130,16,1000,1.0000,722.260013,485.109,0.32460910944935417 adder,sky130,32,1000,1.0000,1440.600027,714.057,0.6580226904376014 adder,sky130,64,1000,1.0000,2781.240054,1050.0,0.9392239364188874 -adder,sky130,128,1000,1.0000,6186.740118,2230.0,2.1480106100795755 +adder,sky130,128,900,1.1111,6186.740118,2230.0,2.1480106100795755 csa,sky130,8,1000,1.0000,266.560005,154.202,0.13650573115665163 csa,sky130,16,1000,1.0000,533.12001,308.404,0.27263530601922104 csa,sky130,32,1000,1.0000,1066.240021,616.808,0.5448072247308093 @@ -18,12 +18,12 @@ shifter,sky130,8,1000,1.0000,259.700005,196.451,0.07534088282874972 shifter,sky130,16,1000,1.0000,666.400006,558.433,0.19552906110283155 shifter,sky130,32,1000,1.0000,1475.880027,768.262,0.3807431082700759 shifter,sky130,64,1000,1.0000,3914.120062,2680.0,1.144802541988198 -shifter,sky130,128,1000,1.0000,9192.400136,6080.0,2.9008914525432616 +shifter,sky130,128,900,1.1111,9192.400136,6080.0,2.9008914525432616 comparator,sky130,8,1000,1.0000,200.900004,136.6,0.05001033271337053 comparator,sky130,16,1000,1.0000,358.680007,189.253,0.06321553011448482 -comparator,sky130,32,1000,1.0000,690.900013,315.709,0.10771793448084398 -comparator,sky130,64,1000,1.0000,1372.980026,508.393,0.2048577820389901 -comparator,sky130,128,1000,1.0000,2744.980052,796.047,0.34396273737011823 +comparator,sky130,32,1500,0.666666,690.900013,315.709,0.10771793448084398 +comparator,sky130,64,1300,0.7692307,1372.980026,508.393,0.2048577820389901 +comparator,sky130,128,1100,0.909090,2744.980052,796.047,0.34396273737011823 flop,sky130,8,1000,1.0000,133.279999,64.8145,0.193835 flop,sky130,16,1000,1.0000,266.5599975,129.629,0.38715000000000005 flop,sky130,32,1000,1.0000,533.119995,259.258,0.7723000000000001 @@ -48,7 +48,7 @@ mul,sky130,8,1000,1.0000,2194.220041,1440.0,1.421374045801527 mul,sky130,16,1000,1.0000,7519.540137,4940.0,6.376128385155466 mul,sky130,32,1000,1.0000,25200.700446,14900.0,24.931847968545217 mul,sky130,64,1000,1.0000,86011.661365,42600.0,88.84651898734177 -mul,sky130,128,1000,1.0000,296198.144128,114000.0,273.3148854961832 +mul,sky130,128,800,1.2500,296198.144128,114000.0,273.3148854961832 binencoder,sky90,8,7683,0.12508649056358195,50.960001,24.761,0.010685929975270078 binencoder,sky90,16,5773,0.16977016282695304,136.220003,77.243,0.021773774467348 binencoder,sky90,32,4500,0.2218912222222222,372.400007,189.626,0.04371111111111111 @@ -158,7 +158,7 @@ adder,tsmc28psyn,8,13838,0.07207477814713109,34.272,187.089,0.013311172134701546 adder,tsmc28psyn,16,11521,0.08678002100512108,90.972001,475.207,0.03367763214998698 adder,tsmc28psyn,32,9812,0.1018860211985324,209.286002,1060.0,0.08153281695882594 adder,tsmc28psyn,64,8206,0.12185605215695831,388.836003,1770.0,0.1409943943456008 -adder,tsmc28psyn,128,7354,0.13597341881968997,907.452008,4360.0,0.3451183029643731 +adder,tsmc28psyn,128,7000,0.142857142857,907.452008,4360.0,0.3451183029643731 csa,tsmc28psyn,8,24524,0.040663382319360626,52.416,482.462,0.02173381177621921 csa,tsmc28psyn,16,24524,0.040663382319360626,104.832,964.99,0.04346762355243842 csa,tsmc28psyn,32,24524,0.040663382319360626,209.664,1930.0,0.08677214157559941 diff --git a/synthDC/ppa/ppaAnalyze.py b/synthDC/ppa/ppaAnalyze.py index 459a8520d..80cd57604 100755 --- a/synthDC/ppa/ppaAnalyze.py +++ b/synthDC/ppa/ppaAnalyze.py @@ -38,7 +38,7 @@ def synthsintocsv(): each line contains the module, tech, width, target freq, and resulting metrics ''' print("This takes a moment...") - bashCommand = "find . -path '*runs/ppa*rv32e*' -prune" + bashCommand = "find . -path '*runs/ppa*' -prune" output = subprocess.check_output(['bash','-c', bashCommand]) allSynths = output.decode("utf-8").split('\n')[:-1] @@ -51,7 +51,6 @@ def synthsintocsv(): for oneSynth in allSynths: module, width, risc, tech, freq = specReg.findall(oneSynth)[2:7] - tech = tech[:-2] metrics = [] for phrase in [['Path Slack', 'qor'], ['Design Area', 'qor'], ['100', 'power']]: bashCommand = 'grep "{}" '+ oneSynth[2:]+'/reports/*{}*' @@ -87,7 +86,7 @@ def cleanup(): output = subprocess.check_output(['bash','-c', bc]) except: pass - bashCommand = "find . -path '*runs/ppa*rv32e*' -prune" + bashCommand = "find . -path '*runs/ppa*' -prune" output = subprocess.check_output(['bash','-c', bashCommand]) allSynths = output.decode("utf-8").split('\n')[:-1] for oneSynth in allSynths: @@ -186,7 +185,7 @@ def genLegend(fits, coefs, r2=None, spec=None, ale=False): legend_elements += [lines.Line2D([0], [0], color=spec.color, ls='', marker=spec.shape, label='$R^2$='+ str(round(r2, 4)))] return legend_elements -def oneMetricPlot(module, var, freq=None, ax=None, fits='clsgn', norm=True, color=None): +def oneMetricPlot(module, widths, var, freq=None, ax=None, fits='clsgn', norm=True, color=None): ''' module: string module name freq: int freq (MHz) var: string delay, area, lpower, or denergy @@ -519,7 +518,7 @@ def squarify(fig): l = (1.-axs/h)/2 fig.subplots_adjust(bottom=l, top=1-l) -def plotPPA(mod, freq=None, norm=True, aleOpt=False): +def plotPPA(mod, widths, freq=None, norm=True, aleOpt=False): ''' for the module specified, plots width vs delay, area, leakage power, and dynamic energy with fits if no freq specified, uses the synthesis with best achievable delay for each width overlays data from both techs @@ -539,7 +538,7 @@ def plotPPA(mod, freq=None, norm=True, aleOpt=False): if (arr[i][j]=='delay') and (f==10): pass else: - r2 = oneMetricPlot(mod, arr[i][j], ax=axs[i, j], freq=f, norm=norm) + r2 = oneMetricPlot(mod, widths, arr[i][j], ax=axs[i, j], freq=f, norm=norm) ls = '--' if f else '-' leg += [lines.Line2D([0], [0], color='red', label='$R^2$='+str(round(r2, 4)), linestyle=ls)] @@ -568,6 +567,7 @@ def makeLineLegend(): fullLeg = [lines.Line2D([0], [0], color='black', label='fastest', linestyle='-')] fullLeg += [lines.Line2D([0], [0], color='black', label='smallest', linestyle='--')] fullLeg += [lines.Line2D([0], [0], color='blue', label='tsmc28', marker='^')] + fullLeg += [lines.Line2D([0], [0], color='blue', label='tsmc28psyn', marker='x')] fullLeg += [lines.Line2D([0], [0], color='green', label='sky90', marker='o')] fullLeg += [lines.Line2D([0], [0], color='green', label='sky130', marker='+')] fullLeg += [lines.Line2D([0], [0], color='red', label='combined', marker='_')] @@ -694,7 +694,7 @@ def makePlotDirectory(): os.makedirs(new_directory) os.chdir(new_directory) if 'freq' in folder: - for tech in ['sky90', 'sky130', 'tsmc28']: + for tech in ['sky90', 'sky130', 'tsmc28', 'tsmc28psyn']: for mod in modules: tech_directory = os.path.join(new_directory, tech) mod_directory = os.path.join(tech_directory, mod) @@ -707,24 +707,26 @@ def makePlotDirectory(): if __name__ == '__main__': ############################## # set up stuff, global variables - widths = [8, 16, 32, 64, 128] - modules = ['priorityencoder', 'add', 'csa', 'shiftleft', 'comparator', 'flop', 'mux2', 'mux4', 'mux8', 'mult'] - normAddWidth = 32 # divisor to use with N since normalizing to add_32 + widths = [64, 128] + modules = ['adder', 'comparator'] - fitDict = {'add': ['cg', 'l', 'l'], 'mult': ['cg', 's', 's'], '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'])) + normAddWidth = 32 # divisor to use with N since normalizing to add_32 - TechSpec = namedtuple("TechSpec", "tech color shape delay area lpower denergy") - techSpecs = [['sky90', 'green', 'o', 43.2e-3, 1440.600027, 714.057, 0.658022690438], ['sky130', 'red', 'o', 43.2e-3, 1440.600027, 714.057, 0.658022690438], ['tsmc28', 'blue', '^', 12.2e-3, 209.286002, 1060.0, .08153281695882594]] - techSpecs = [TechSpec(*t) for t in techSpecs] - combined = TechSpec('combined fit', 'red', '_', 0, 0, 0, 0) + fitDict = {'adder': ['cg', 'l', 'l'], 'mul': ['cg', 's', 's'], 'comparator': ['cg', 'l', 'l'], 'csa': ['c', 'l', 'l'], 'shifter': ['cg', 'l', 'ln'], 'flop': ['c', 'l', 'l'], 'binencoder': ['cg', 'l', 'l']} + fitDict.update(dict.fromkeys(['mux2', 'mux4', 'mux8'], ['cg', 'l', 'l'])) + + TechSpec = namedtuple("TechSpec", "tech color shape delay area lpower denergy") + techSpecs = [['sky90', 'green', 'o', 43.2e-3, 1440.600027, 714.057, 0.658022690438], ['sky130', 'red', 'o', 43.2e-3, 1440.600027, 714.057, 0.658022690438], ['tsmc28', 'blue', '^', 12.2e-3, 209.286002, 1060.0, .08153281695882594], ['tsmc28psyn', 'blue', '^', 12.2e-3, 209.286002, 1060.0, .08153281695882594]] + techSpecs = [TechSpec(*t) for t in techSpecs] + combined = TechSpec('combined fit', 'red', '_', 0, 0, 0, 0) ############################## # cleanup() # run to remove garbage synth runs - synthsintocsv() # slow, run only when new synth runs to add to csv + synthsintocsv() # slow, run only when new synth runs to add to csv - allSynths = synthsfromcsv('ppaData.csv') # your csv here! - bestSynths = csvOfBest('bestSynths.csv') - makePlotDirectory() + allSynths = synthsfromcsv('ppaData.csv') # your csv here! + bestSynths = csvOfBest('bestSynths.csv') + makePlotDirectory() # ### other functions # makeCoefTable() @@ -732,11 +734,12 @@ if __name__ == '__main__': # muxPlot() # stdDevError() - for mod in modules: - for w in widths: - freqPlot('sky90', mod, w) - #freqPlot('sky130', mod, w) - #freqPlot('tsmc28', mod, w) - #plotPPA(mod, norm=False) - #plotPPA(mod, aleOpt=True) - plt.close('all') + for mod in modules: + for w in widths: + #freqPlot('sky90', mod, w) + freqPlot('sky130', mod, w) + #freqPlot('tsmc28', mod, w) + #freqPlot('tsmc28psyn', mod, w) + #plotPPA(mod, widths, norm=False) + #plotPPA(mod, aleOpt=True) + plt.close('all') diff --git a/synthDC/ppa/ppaSynth.py b/synthDC/ppa/ppaSynth.py index 528c851a0..ceb6edbd2 100755 --- a/synthDC/ppa/ppaSynth.py +++ b/synthDC/ppa/ppaSynth.py @@ -32,6 +32,19 @@ def freqSweep(module, width, tech): synthsToRun += [[synth.module, str(synth.width), synth.tech, str(freq)]] return synthsToRun +def freqModuleSweep(widths, modules, tech): + synthsToRun = [] + arr = [-8, -6, -4, -2, 0, 2, 4, 6, 8] + allSynths = synthsfromcsv('ppa/bestSynths.csv') + for w in widths: + for module in modules: + for synth in allSynths: + if (synth.module == str(module)) & (synth.tech == tech) & (synth.width == w): + f = 1000/synth.delay + for freq in [round(f+f*x/100) for x in arr]: + synthsToRun += [[synth.module, str(synth.width), synth.tech, str(freq)]] + return synthsToRun + def filterRedundant(synthsToRun): bashCommand = "find . -path '*runs/ppa*rv32e*' -prune" output = subprocess.check_output(['bash','-c', bashCommand]) @@ -57,7 +70,7 @@ def allCombos(widths, modules, techs, freqs): if __name__ == '__main__': - ##### Run specific syntheses + ##### Run specific syntheses for a specific frequency widths = [8, 16, 32, 64, 128] modules = ['mul', 'adder', 'shifter', 'flop', 'comparator', 'binencoder', 'csa', 'mux2', 'mux4', 'mux8'] techs = ['sky90', 'sky130', 'tsmc28', 'tsmc28psyn'] @@ -69,9 +82,16 @@ if __name__ == '__main__': width = 32 tech = 'tsmc28psyn' synthsToRun = freqSweep(module, width, tech) + + ##### Run a sweep for multiple modules/widths based on best delay found in existing syntheses + modules = ['adder', 'comparator'] + widths = [64, 128] + tech = 'sky130' + synthsToRun = freqModuleSweep(widths, modules, tech) ##### Only do syntheses for which a run doesn't already exist synthsToRun = filterRedundant(synthsToRun) pool = Pool(processes=25) - pool.starmap(runCommand, synthsToRun) + +pool.starmap(runCommand, synthsToRun) \ No newline at end of file