#!/usr/bin/env python3 import argparse import math def calc_utilization(tasks): util = 0 for task in tasks: util += task['wcet'] / task['period'] return util def main(): parser = argparse.ArgumentParser(description='Generate plotable results from the experiments.') parser.add_argument('results', type=str, nargs='+', help='file containing experiment results.') parser.add_argument('analysis', type=str, nargs=1, help='name identifying the analysis results.') args = parser.parse_args() out = {} for result in args.results: with open(result, 'r') as result_file: tasks = {} instances = {} for line in result_file: tokens = line.strip().split(' ') if tokens[0] == 'task': #task 0 wcet 5 period 39 deadline 32 executions 15480 task_id = int(tokens[1]) wcet = int(tokens[3]) period = int(tokens[5]) deadline = int(tokens[7]) executions = int(tokens[9]) tasks[task_id] = { 'id': task_id, 'wcet': wcet, 'period': period, 'deadline': deadline, 'executions': executions } instances[task_id] = { 's2s':0, 'e2e':0, 'misses':0, 'response':0 } elif tokens[0] == 'instance': #instance 12 start 478 end 487 core_id 0 start = int(tokens[3]) end = int(tokens[5]) if start == 0 and end == 0: # Ignore not executed tasks, not realy that clean but it # happens hardly, so nobody should care... tasks[task_id]['executions'] -= 1 continue release = start - (start % tasks[task_id]['period']) abs_deadline = release + tasks[task_id]['deadline'] instances[task_id]['s2s'] += start - release instances[task_id]['e2e'] += end - release instances[task_id]['response'] += end - release if end > abs_deadline: instances[task_id]['misses'] += 1 else: continue util = calc_utilization(tasks.values()) s2s = 0 e2e = 0 misses = 0 misses_avrg = 0 exec_cnt = 0 response = 0 for task_id, task in instances.items(): exec_cnt += tasks[task_id]['executions'] s2s += math.sqrt(task['s2s'] / tasks[task_id]['executions']) e2e += math.sqrt(task['e2e'] / tasks[task_id]['executions']) misses += task['misses'] response += (task['response'] / tasks[task_id]['executions']) / tasks[task_id]['period'] s2s /= len(tasks) e2e /= len(tasks) response /= len(tasks) outkey = round(util, 2) try: out[outkey].append((s2s, e2e, misses, response, exec_cnt)) except KeyError: out[outkey] = [(s2s, e2e, misses, response, exec_cnt)] with open('analysis/{}_s2s.dat'.format(args.analysis), 'w') as s2sfile: for key, value in out.items(): for elem in value: print('{}; {}; {}'.format(key, elem[0], elem[4]), file=s2sfile) with open('analysis/{}_e2e.dat'.format(args.analysis), 'w') as e2efile: for key, value in out.items(): for elem in value: print('{}; {}; {}'.format(key, elem[1], elem[4]), file=e2efile) with open('analysis/{}_misses.dat'.format(args.analysis), 'w') as missesfile: for key, value in out.items(): for elem in value: print('{}; {}; {}'.format(key, elem[2], elem[4]), file=missesfile) with open('analysis/{}_response.dat'.format(args.analysis), 'w') as responsefile: for key, value in out.items(): for elem in value: print('{}; {}; {}'.format(key, elem[3], elem[4]), file=responsefile) if __name__ == '__main__': main()