From 3a5d85f38b9d4ea256202f44cbe6b5f0ab787e89 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Fri, 31 Aug 2018 09:38:05 +0100 Subject: [PATCH] ported bst-vs-heap --- README.adoc | 2 +- bst-vs-heap | 28 +++++++++++++++++----------- common.py | 23 ++++++++++++++++++++--- gem5-stat | 18 ++++++------------ 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/README.adoc b/README.adoc index 201903d..44a4c1e 100644 --- a/README.adoc +++ b/README.adoc @@ -7692,7 +7692,7 @@ Usage: .... printf '/bst_vs_heap.out' > data/readfile ./run -aA -g -F '/gem5.sh' -./bst-vs-heap > bst_vs_heap.dat +./bst-vs-heap -aA -g > bst_vs_heap.dat .... and then feed `bst_vs_heap.dat` into: https://github.com/cirosantilli/cpp-cheat/blob/9d0f77792fc8e55b20b6ee32018761ef3c5a3f2f/cpp/interactive/bst_vs_heap.gnuplot diff --git a/bst-vs-heap b/bst-vs-heap index ab236f0..b8cbda5 100755 --- a/bst-vs-heap +++ b/bst-vs-heap @@ -1,11 +1,17 @@ -#!/usr/bin/env bash -. "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common" -while getopts "${common_getopts_flags}" OPT; do - case "$OPT" in - ?) - common_getopts_case "$OPT" - ;; - esac -done -shift "$(($OPTIND - 1))" -"${common_root_dir}/gem5-stat" -a "$common_arch" | awk 'NR % 2 { printf "%d %s ", NR/2, $0; next; } 1' +#!/usr/bin/env python3 +import common +parser = common.get_argparse( + argparse_args={'description':'Convert a BST vs heap stat file into a gnuplot input'} +) +args = common.setup(parser) +stats = common.get_stats() +it = iter(stats) +i = 1 +for stat in it: + try: + next_stat = next(it) + except StopIteration: + # Automatic dumpstats at end may lead to odd number of stats. + break + print('{} {} {}'.format(i, stat, next_stat)) + i += 1 diff --git a/common.py b/common.py index 611cf66..df2789a 100644 --- a/common.py +++ b/common.py @@ -135,10 +135,27 @@ around when you checkout between branches. parser.set_defaults(**defaults) return parser +def get_stats(stat_re=None, stats_file=None): + global this + if stat_re is None: + stat_re = '^system.cpu[0-9]*.numCycles$' + if stats_file is None: + stats_file = this.stats_file + stat_re = re.compile(stat_re) + ret = [] + with open(stats_file, 'r') as statfile: + for line in statfile: + if line[0] != '-': + cols = line.split() + if len(cols) > 1 and stat_re.search(cols[0]): + ret.append(cols[1]) + return ret + def print_cmd(cmd, cmd_file=None, extra_env=None): - if extra_env is None: - extra_env = {} - newline_separator = ' \\\n' + """ + Format a command given as a list of strings so that it can + be viewed nicely and executed by bash directly. + """ out = [] for key in extra_env: out.extend(['{}={}'.format(shlex.quote(key), shlex.quote(extra_env[key])), newline_separator]) diff --git a/gem5-stat b/gem5-stat index a3ec8a0..9b19b4c 100755 --- a/gem5-stat +++ b/gem5-stat @@ -1,20 +1,14 @@ #!/usr/bin/env python3 -import re import common parser = common.get_argparse( argparse_args={'description':'Get the value of a gem5 stat from the stats.txt file.'} ) parser.add_argument( - 'stat', - default='^system.cpu[0-9]*.numCycles$', - help='Python regexp matching the full stat name of interest', - nargs='?', + 'stat', + default=None, + help='Python regexp matching the full stat name of interest', + nargs='?', ) args = common.setup(parser) -stat_re = re.compile(args.stat) -with open(common.stats_file, 'r') as statfile: - for line in statfile: - if line[0] != '-': - cols = line.split() - if len(cols) > 1 and stat_re.search(cols[0]): - print(cols[1]) +stats = common.get_stats(args.stat) +print('\n'.join(stats))