mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-01-18 12:06:08 +00:00
d27443deb5
Update the workload generation script to be python3 compatible and invoke with python3.
237 lines
5.3 KiB
Python
Executable File
237 lines
5.3 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import os
|
|
import sys
|
|
import getopt
|
|
import subprocess
|
|
import signal
|
|
import re
|
|
|
|
def check_unikid_json(infile, outfile, verbose=0):
|
|
if not os.path.exists(infile):
|
|
print("WARN: %s does not exist", infile)
|
|
|
|
try:
|
|
fi = open(infile, "r")
|
|
except IOError:
|
|
print("WARN: Unable to open %s", infile)
|
|
sys.exit(2)
|
|
|
|
lines = fi.readlines()
|
|
fi.close()
|
|
|
|
try:
|
|
fo = open(outfile, "w+")
|
|
except IOError:
|
|
print("WARN: Unable to open %s", f)
|
|
sys.exit(2)
|
|
|
|
curid = 1
|
|
refcount = 0
|
|
idlist = {}
|
|
myid = []
|
|
for myline in lines:
|
|
if "{" in myline:
|
|
refcount += 1
|
|
myid.append(curid)
|
|
curid = 1
|
|
idlist[refcount] = {}
|
|
|
|
if "}" in myline:
|
|
del idlist[refcount]
|
|
curid = myid.pop()
|
|
refcount -= 1
|
|
|
|
try:
|
|
key_id, value = myline.split(":", 1)
|
|
except ValueError:
|
|
fo.write(myline)
|
|
continue
|
|
|
|
key_id = key_id.strip('\"\t\n\r ')
|
|
value = value.strip(',\"\t\n\r ')
|
|
|
|
if key_id in idlist[refcount]:
|
|
newkey_id = key_id + str(curid)
|
|
while newkey_id in idlist[refcount]:
|
|
curid += 1
|
|
newkey_id = key_id + str(curid)
|
|
|
|
if verbose:
|
|
print("level ", refcount, " : key ", key_id, " changed into ", newkey_id)
|
|
|
|
myline = myline.replace(key_id, newkey_id, 1)
|
|
key_id = newkey_id
|
|
|
|
idlist[refcount][key_id] = value
|
|
fo.write(myline)
|
|
|
|
fo.close()
|
|
|
|
return
|
|
|
|
def check_suspend_json(infile, outfile, verbose=0):
|
|
if not os.path.exists(infile):
|
|
print("WARN: %s does not exist", infile)
|
|
|
|
try:
|
|
fi = open(infile, "r")
|
|
except IOError:
|
|
print("WARN: Unable to open %s", infile)
|
|
sys.exit(2)
|
|
|
|
lines = fi.readlines()
|
|
fi.close()
|
|
|
|
try:
|
|
fo = open(outfile, "w+")
|
|
except IOError:
|
|
print("WARN: Unable to open %s", f)
|
|
sys.exit(2)
|
|
|
|
|
|
taskobj = 0
|
|
curid = ""
|
|
for myline in lines:
|
|
|
|
exception = 0
|
|
key_id = "exception"
|
|
|
|
try:
|
|
key_id, value = myline.split(":", 1)
|
|
except ValueError:
|
|
if "suspend" in myline:
|
|
key_id = "suspend"
|
|
exception = 1
|
|
|
|
key_id = key_id.strip('\"\t\n\r ')
|
|
|
|
if not "tasks" in key_id and \
|
|
taskobj == 0:
|
|
fo.write(myline)
|
|
continue
|
|
|
|
if "{" in myline:
|
|
taskobj += 1
|
|
if taskobj == 2:
|
|
curid = key_id
|
|
|
|
if "}" in myline:
|
|
taskobj -= 1
|
|
|
|
if "suspend" in key_id and \
|
|
exception == 1:
|
|
|
|
if verbose:
|
|
print("value ", curid, " added to suspend key")
|
|
|
|
if "," in myline:
|
|
myline = myline.replace(",", " : " + "\"" + curid + "\",", 1)
|
|
else:
|
|
myline = myline.replace("\n", " : " + "\"" + curid + "\"\n", 1)
|
|
|
|
fo.write(myline)
|
|
|
|
fo.close()
|
|
|
|
return
|
|
|
|
# remove trailing commas that may appear after closing
|
|
# brackets and last entries in every section
|
|
def remove_trailing_commas(outfile):
|
|
try:
|
|
f = open(outfile, 'r+')
|
|
except IOError:
|
|
print("WARN: Unable to open %s", f)
|
|
sys.exit(2)
|
|
|
|
lines = f.read()
|
|
check_last_entry_regex = r'(.),(\n\s*})'
|
|
check_end_bracket_regex = r'(}),(\n\s*})'
|
|
|
|
lines = re.sub(check_last_entry_regex, r'\g<1>\g<2>', lines)
|
|
lines = re.sub(check_end_bracket_regex, r'\g<1>\g<2>', lines)
|
|
|
|
f.seek(0)
|
|
f.write(lines)
|
|
f.truncate()
|
|
f.close()
|
|
|
|
return
|
|
|
|
|
|
# Search for comments to remove
|
|
def comment_remover(text):
|
|
def replacer(match):
|
|
s = match.group(0)
|
|
if s.startswith('/'):
|
|
return " " # note: a space and not an empty string
|
|
else:
|
|
return s
|
|
|
|
pattern = re.compile(
|
|
r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
|
|
re.DOTALL | re.MULTILINE)
|
|
|
|
return re.sub(pattern, replacer, text)
|
|
|
|
# Remove all comments inside the file
|
|
def remove_all_comments(outfile):
|
|
try:
|
|
f = open(outfile, 'r+')
|
|
except IOError:
|
|
print("WARN: Unable to open %s", f)
|
|
sys.exit(2)
|
|
|
|
lines = f.read()
|
|
|
|
lines = comment_remover(lines)
|
|
f.seek(0)
|
|
f.write(lines)
|
|
f.truncate()
|
|
|
|
f.close()
|
|
|
|
return
|
|
|
|
if __name__ == '__main__':
|
|
|
|
def handleSigTERM(signum, frame):
|
|
sys.exit()
|
|
|
|
signal.signal(signal.SIGTERM, handleSigTERM)
|
|
signal.signal(signal.SIGINT, handleSigTERM)
|
|
|
|
outfile = "unikid.json"
|
|
selfupdate = 0
|
|
verbose = 0
|
|
dry_run = False
|
|
|
|
try:
|
|
opts, args = getopt.getopt(sys.argv[1:], "o:avd")
|
|
except getopt.GetoptError as err:
|
|
print(str(err)) # will print something like "option -a not recognized"
|
|
sys.exit(2)
|
|
|
|
for o, a in opts:
|
|
if o == "-o":
|
|
outfile = a
|
|
if o == "-a":
|
|
selfupdate = 1
|
|
if o == "-v":
|
|
verbose = 1
|
|
if o == "-d":
|
|
dry_run = True
|
|
|
|
for f in args:
|
|
if selfupdate:
|
|
outfile = f
|
|
|
|
check_suspend_json(f, outfile)
|
|
check_unikid_json(outfile, outfile)
|
|
remove_trailing_commas(outfile)
|
|
remove_all_comments(outfile)
|
|
|
|
if not dry_run:
|
|
subprocess.call(["rt-app", outfile])
|