summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorpi-cheng.chen <pi-cheng.chen@linaro.org>2015-05-18 18:01:10 +0800
committerVincent Guittot <vincent.guittot@linaro.org>2015-05-18 13:40:46 +0200
commit02b767027c275e23e09b134be472ab353d99103f (patch)
tree30938fd22f59821d1a3242211c2ea956fb12f53c /doc
parentaca529ad24f59029fe0b443f7d46596b76531b69 (diff)
rt-app: Add a script to tune parameters in json file
This scripts strips all comments in the input JSON file, modifies the parameters according to command line arguments, and write the content to a new JSON file. changes from v1: - use us instead of ms as units of period/run/sleep Signed-off-by: pi-cheng.chen <pi-cheng.chen@linaro.org> Acked-by: Vincent Guittot <vincent.guittot@linaro.org>
Diffstat (limited to 'doc')
-rwxr-xr-xdoc/tune_json.py131
1 files changed, 131 insertions, 0 deletions
diff --git a/doc/tune_json.py b/doc/tune_json.py
new file mode 100755
index 0000000..3045437
--- /dev/null
+++ b/doc/tune_json.py
@@ -0,0 +1,131 @@
+#!/usr/bin/env python
+
+import argparse
+import collections
+import json
+import os
+import re
+import shutil
+import sys
+import tempfile
+
+
+def find_dict_by_key(doc, key):
+ if key in doc and type(doc[key]) is collections.OrderedDict:
+ return doc[key]
+
+ for k in doc:
+ if type(doc[k]) is collections.OrderedDict:
+ return find_dict_by_key(doc[k], key)
+
+
+def dict_find_and_replace_value(dic, key, val):
+ for k in dic:
+ if type(dic[k]) is collections.OrderedDict:
+ dict_find_and_replace_value(dic[k], key, val)
+ if k == key:
+ dic[k] = val
+
+
+def dict_of_loading(dic):
+ if not 'run' in dic:
+ return False, None
+
+ for k in dic:
+ if 'timer' in k and 'period' in dic[k]:
+ return True, k
+ else:
+ return False, None
+
+
+def calculate_and_update_loading(dic, loading):
+ of_loading, timer_id = dict_of_loading(dic)
+
+ if of_loading:
+ period = dic[timer_id]['period']
+ run = period * loading / 100
+ dic['run'] = run
+
+ for k in dic:
+ if type(dic[k]) is collections.OrderedDict:
+ calculate_and_update_loading(dic[k], loading)
+
+
+# strip comments in json file and load the file as a dict
+def load_json_file(filename):
+ try:
+ f = open(filename, 'r')
+ except:
+ print 'ERROR: Unable to open %s' %filename
+ sys.exit(2)
+
+ comment_re = re.compile(
+ '(^)?[^\S\n]*/(?:\*(.*?)\*/[^\S\n]*|/[^\n]*)($)?',
+ re.DOTALL | re.MULTILINE)
+
+ content = ''.join(f.readlines())
+ f.close()
+
+ match = comment_re.search(content)
+ while match:
+ content = content[:match.start()] + content[match.end():]
+ match = comment_re.search(content)
+
+ return json.JSONDecoder(object_pairs_hook=collections.OrderedDict).decode(content)
+
+
+def dump_json_file(doc, outfile):
+ tmp = tempfile.NamedTemporaryFile(delete=False)
+ json.dump(doc, tmp, indent=4, sort_keys=False)
+ tmp.close()
+
+ shutil.move(tmp.name, outfile)
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser()
+
+ parser.add_argument('-f', '--file', dest='infile', default='', help='input json filename')
+ parser.add_argument('-o', '--out', dest='outfile', default='workload.json', help='output json filename');
+ parser.add_argument('--instance', default=0, type=int, help='number of thread instance')
+ parser.add_argument('--period', default=0, type=int, help='period of each thread/phase (us)')
+ parser.add_argument('--run', default=0, type=int, help='run time of each thread/phase (us)')
+ parser.add_argument('--sleep', default=0, type=int, help='sleep time of each thread/phase (us)')
+ parser.add_argument('--loop', default=0,type=int, help='loop count of each thread/phase (-1 as infinite loop)')
+ parser.add_argument('--loading', default=0, type=int, help='loading of each thread (%%)')
+ parser.add_argument('--key', type=str, help='the key id of thread/phase in which the parameters will be changed')
+
+ args = parser.parse_args()
+
+ if not os.path.isfile(args.infile):
+ print 'ERROR: input file %s does not exist\n' %args.infile
+ parser.print_help()
+ sys.exit(2)
+
+ doc = target = load_json_file(args.infile)
+
+ if args.key:
+ target = find_dict_by_key(doc, args.key)
+ if not target:
+ print 'ERROR: key id %s is not found' %args.key
+ sys.exit(2)
+
+ if args.instance > 0:
+ dict_find_and_replace_value(target, 'instance', args.instance)
+
+ if args.period > 0:
+ dict_find_and_replace_value(target, 'period', args.period)
+
+ if args.run > 0:
+ dict_find_and_replace_value(target, 'run', args.run)
+
+ if args.sleep > 0:
+ dict_find_and_replace_value(target, 'sleep', args.sleep)
+
+ if args.loop > 0 or args.loop == -1:
+ dict_find_and_replace_value(target, 'loop', args.loop)
+
+ if args.loading > 0:
+ calculate_and_update_loading(target, args.loading);
+
+ dump_json_file(doc, args.outfile)