cvw/synthDC/ppa/ppaSynth.py

78 lines
2.7 KiB
Python
Raw Normal View History

2022-05-17 18:29:38 +00:00
#!/usr/bin/python3
#
2023-11-09 06:52:40 +00:00
# Python regression test for DC
# Madeleine Masser-Frye mmasserfrye@hmc.edu 5/22
# James Stine james.stine@okstate.edu 15 October 2023
#
2023-11-09 06:52:40 +00:00
2022-05-17 18:29:38 +00:00
import subprocess
import re
2022-06-17 19:34:58 +00:00
from multiprocessing import Pool
2022-06-03 21:23:04 +00:00
from ppaAnalyze import synthsfromcsv
2022-05-17 18:29:38 +00:00
def runCommand(module, width, tech, freq):
2023-11-09 06:52:40 +00:00
command = "make synth DESIGN={} WIDTH={} TECH={} DRIVE=INV FREQ={} MAXOPT=1 MAXCORES=1".format(module, width, tech, freq)
2022-05-17 18:29:38 +00:00
subprocess.Popen(command, shell=True)
def deleteRedundant(synthsToRun):
2022-05-17 18:29:38 +00:00
'''removes any previous runs for the current synthesis specifications'''
synthStr = "rm -rf runs/ppa_{}_{}_rv32e_{}nm_{}_*"
for synth in synthsToRun:
2022-05-17 18:29:38 +00:00
bashCommand = synthStr.format(*synth)
outputCPL = subprocess.check_output(['bash','-c', bashCommand])
def freqSweep(module, width, tech):
2022-06-17 19:34:58 +00:00
synthsToRun = []
arr = [-8, -6, -4, -2, 0, 2, 4, 6, 8]
2023-11-09 06:52:40 +00:00
allSynths = synthsfromcsv('ppa/bestSynths.csv')
2022-06-17 19:34:58 +00:00
for synth in allSynths:
if (synth.module == module) & (synth.tech == tech) & (synth.width == width):
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):
2022-06-17 19:34:58 +00:00
bashCommand = "find . -path '*runs/ppa*rv32e*' -prune"
output = subprocess.check_output(['bash','-c', bashCommand])
specReg = re.compile('[a-zA-Z0-9]+')
allSynths = output.decode("utf-8").split('\n')[:-1]
allSynths = [specReg.findall(oneSynth)[2:7] for oneSynth in allSynths]
allSynths = [oneSynth[0:2] + [oneSynth[3][:-2]] + [oneSynth[4]] for oneSynth in allSynths]
output = []
for synth in synthsToRun:
2022-06-17 19:34:58 +00:00
if (synth not in allSynths):
output += [synth]
return output
def allCombos(widths, modules, techs, freqs):
synthsToRun = []
for w in widths:
for module in modules:
for tech in techs:
for freq in freqs:
synthsToRun += [[module, str(w), tech, str(freq)]]
return synthsToRun
if __name__ == '__main__':
##### Run specific syntheses
2023-11-09 06:52:40 +00:00
widths = [8, 16, 32, 64, 128]
modules = ['mul', 'adder', 'shifter', 'flop', 'comparator', 'binencoder', 'csa', 'mux2', 'mux4', 'mux8']
techs = ['sky90', 'sky130', 'tsmc28', 'tsmc28psyn']
2023-11-09 06:52:40 +00:00
freqs = [5000]
synthsToRun = allCombos(widths, modules, techs, freqs)
##### Run a sweep based on best delay found in existing syntheses
module = 'adder'
2023-11-09 06:52:40 +00:00
width = 32
tech = 'tsmc28psyn'
2023-11-09 06:52:40 +00:00
synthsToRun = freqSweep(module, width, tech)
##### Only do syntheses for which a run doesn't already exist
2023-11-09 06:52:40 +00:00
synthsToRun = filterRedundant(synthsToRun)
pool = Pool(processes=25)
pool.starmap(runCommand, synthsToRun)