From 59c6980052fb30b9be6ee6a889cffc1f78af35cc Mon Sep 17 00:00:00 2001 From: Tim 'mithro' Ansell Date: Sun, 29 Nov 2020 12:59:17 -0800 Subject: [PATCH] Rework run_script command. * Use Python subprocess module. * Echo the command output to the console. * Print while things are still running. --- compiler/verify/run_script.py | 55 +++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/compiler/verify/run_script.py b/compiler/verify/run_script.py index f7bb2d9f..8fda376c 100644 --- a/compiler/verify/run_script.py +++ b/compiler/verify/run_script.py @@ -11,24 +11,67 @@ Some baseline functions to run scripts. import os import debug +import subprocess +import time from globals import OPTS def run_script(cell_name, script="lvs"): """ Run script and create output files. """ + # FIXME: Set this value based on options somewhere + echo_cmd_output = True + cwd = os.getcwd() os.chdir(OPTS.openram_temp) errfile = "{0}{1}.{2}.err".format(OPTS.openram_temp, cell_name, script) outfile = "{0}{1}.{2}.out".format(OPTS.openram_temp, cell_name, script) resultsfile = "{0}{1}.{2}.report".format(OPTS.openram_temp, cell_name, script) - cmd = "{0}run_{1}.sh 2> {2} 1> {3}".format(OPTS.openram_temp, - script, - errfile, - outfile) - debug.info(2, cmd) - os.system(cmd) + scriptpath = '{0}run_{1}.sh'.format(OPTS.openram_temp, script) + + debug.info(2, "Starting {}".format(scriptpath)) + start = time.time() + with open(outfile, 'wb') as fo, open(errfile, 'wb') as fe: + p = subprocess.Popen( + [scriptpath], stdout=fo, stderr=fe, cwd=OPTS.openram_temp) + + if echo_cmd_output: + tailo = subprocess.Popen([ + 'tail', + '-f', # Follow the output + '--pid', str(p.pid), # Close when this pid exits + outfile, + ]) + taile = subprocess.Popen([ + 'tail', + '-f', # Follow the output + '--pid', str(p.pid), # Close when this pid exits + errfile, + ]) + + lastoutput = start + while p.poll() == None: + runningfor = time.time() - start + outputdelta = time.time() - lastoutput + if outputdelta > 30: + lastoutput = time.time() + debug.info(1, "Still running {} ({:.0f} seconds)".format(scriptpath, runningfor)) + time.sleep(1) + assert p.poll() != None, (p.poll(), p) + p.wait() + + # Kill the tail commands if they haven't finished. + if cmd_output: + if tailo.poll() != None: + tailo.kill() + tailo.wait() + if taile.poll() != None: + taile.kill() + taile.wait() + + debug.info(2, "Finished {} with {}".format(scriptpath, p.returncode)) + os.chdir(cwd) return (outfile, errfile, resultsfile)