From 7c09ec981c6e06af2e62d67a609eb53728267954 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Thu, 27 Sep 2012 19:03:22 -0400 Subject: Added script to parse directory data, create CSVs for every chagned value. This change also makes SchedTrace and OverheadTrace events configurable. --- parse/dir_map.py | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 parse/dir_map.py (limited to 'parse/dir_map.py') diff --git a/parse/dir_map.py b/parse/dir_map.py new file mode 100644 index 0000000..6e959f2 --- /dev/null +++ b/parse/dir_map.py @@ -0,0 +1,104 @@ +import os + +from collections import defaultdict +from point import Type + +class TreeNode(object): + def __init__(self, parent = None): + self.parent = parent + self.children = defaultdict(lambda : TreeNode(self)) + self.values = [] + +class DirMap(object): + def to_csv(self, vals): + val_strs = [] + for key in sorted(vals.keys()): + val_strs += ["%s=%s" % (key, vals[key])] + return "%s.csv" % ("_".join(val_strs)) + + def __init__(self, out_dir): + self.root = TreeNode(None) + self.out_dir = out_dir + self.values = [] + + def debug_update_node(self, path, keys, value): + self.__update_node(path, keys, value) + + def __update_node(self, path, keys, value): + node = self.root + + path += [ self.to_csv(keys) ] + for p in path: + node = node.children[p] + + node.values += [value] + + def add_point(self, vary, vary_value, keys, point): + for stat in point.get_stats(): + summary = point[stat] + + for summary_type in Type: + measurement = summary[summary_type] + + for base_type in Type: + if not base_type in measurement: + continue + # Ex: wcet/avg/max/vary-type/other-stuff.csv + path = [ stat, summary_type, base_type, "vary-%s" % vary ] + result = measurement[base_type] + + self.__update_node(path, keys, (vary_value, result)) + + + + def reduce(self): + def reduce2(node): + for key in node.children.keys(): + child = node.children[key] + reduce2(child) + if not (child.children or child.values): + node.children.pop(key) + + if len(node.values) == 1: + node.values = [] + + reduce2(self.root) + + def write(self): + def write2(path, node): + out_path = "/".join(path) + if node.values: + # Leaf + with open("/".join(path), "w") as f: + arr = [",".join([str(b) for b in n]) for n in node.values] + f.write("\n".join(arr) + "\n") + elif not os.path.isdir(out_path): + os.mkdir(out_path) + + for (key, child) in node.children.iteritems(): + path.append(key) + write2(path, child) + path.pop() + + + write2([self.out_dir], self.root) + + + def __str__(self): + def str2(node, level): + header = " " * level + ret = "" + if not node.children: + return "%s%s\n" % (header, str(node.values) if node.values else "") + for key,child in node.children.iteritems(): + ret += "%s/%s\n" % (header, key) + ret += str2(child, level + 1) + return ret + + return "%s\n%s" % (self.out_dir, str2(self.root, 1)) + + + + + + -- cgit v1.2.2