1#!/usr/bin/env python 2# SPDX-License-Identifier: GPL-2.0 3 4data = {} 5times = [] 6threads = [] 7cpus = [] 8 9def get_key(time, event, cpu, thread): 10 return "%d-%s-%d-%d" % (time, event, cpu, thread) 11 12def store_key(time, cpu, thread): 13 if (time not in times): 14 times.append(time) 15 16 if (cpu not in cpus): 17 cpus.append(cpu) 18 19 if (thread not in threads): 20 threads.append(thread) 21 22def store(time, event, cpu, thread, val, ena, run): 23 #print "event %s cpu %d, thread %d, time %d, val %d, ena %d, run %d" % \ 24 # (event, cpu, thread, time, val, ena, run) 25 26 store_key(time, cpu, thread) 27 key = get_key(time, event, cpu, thread) 28 data[key] = [ val, ena, run] 29 30def get(time, event, cpu, thread): 31 key = get_key(time, event, cpu, thread) 32 return data[key][0] 33 34def stat__cycles_k(cpu, thread, time, val, ena, run): 35 store(time, "cycles", cpu, thread, val, ena, run); 36 37def stat__instructions_k(cpu, thread, time, val, ena, run): 38 store(time, "instructions", cpu, thread, val, ena, run); 39 40def stat__cycles_u(cpu, thread, time, val, ena, run): 41 store(time, "cycles", cpu, thread, val, ena, run); 42 43def stat__instructions_u(cpu, thread, time, val, ena, run): 44 store(time, "instructions", cpu, thread, val, ena, run); 45 46def stat__cycles(cpu, thread, time, val, ena, run): 47 store(time, "cycles", cpu, thread, val, ena, run); 48 49def stat__instructions(cpu, thread, time, val, ena, run): 50 store(time, "instructions", cpu, thread, val, ena, run); 51 52def stat__interval(time): 53 for cpu in cpus: 54 for thread in threads: 55 cyc = get(time, "cycles", cpu, thread) 56 ins = get(time, "instructions", cpu, thread) 57 cpi = 0 58 59 if ins != 0: 60 cpi = cyc/float(ins) 61 62 print "%15f: cpu %d, thread %d -> cpi %f (%d/%d)" % (time/(float(1000000000)), cpu, thread, cpi, cyc, ins) 63 64def trace_end(): 65 pass 66# XXX trace_end callback could be used as an alternative place 67# to compute same values as in the script above: 68# 69# for time in times: 70# for cpu in cpus: 71# for thread in threads: 72# cyc = get(time, "cycles", cpu, thread) 73# ins = get(time, "instructions", cpu, thread) 74# 75# if ins != 0: 76# cpi = cyc/float(ins) 77# 78# print "time %.9f, cpu %d, thread %d -> cpi %f" % (time/(float(1000000000)), cpu, thread, cpi) 79