mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Merge pull request #469 from stineje/main
update ppaAnalyze to analyze correctionly freqSweep
This commit is contained in:
		
						commit
						62ab604113
					
				@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
		
		
			
  | 
@ -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')
 | 
			
		||||
 | 
			
		||||
@ -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']
 | 
			
		||||
@ -70,8 +83,15 @@ if __name__ == '__main__':
 | 
			
		||||
	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)
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user