blob: 9f11e75330aad4f863ff82d61785653fb672fac9 [file] [log] [blame]
Paul Lind73f45fe2013-03-04 17:10:49 -08001#! /usr/bin/env python
2"""
3Read oprofile events file, generate C data struct for Android opcontrol.
4
5Android does not use script for opcontrol, they use a C binary, which
6has embedded data structures with the event set that is supported.
7Initially that is just Arm V6 and V7.
8
9This tool allows us to convert various MIPS cpu event files for
10inclusion, and should work with other processor arch's as well.
11
12Neither Arm or Mips uses unit_masks, so that file is ignored.
13
14Event entries in file look like this:
15
16 event:0x1 counters:0,1 um:zero minimum:500 name:INSTRUCTIONS : Instructions completed
17
18The format is key:value. A single : appears at the end of line
19and the remaining text is the description
20"""
21
22import os, sys
23
24def number(s):
25 if s == 'zero':
26 return '0'
27 if s == 'one':
28 return '1'
29 if s[0] == 'x':
30 return '0'+s
31
32def parse_event(line,ovf):
33 ''' return dictionary of items from one line of event file '''
34 dict = {}
35 fields = line.split(None, 1)
36 while (fields):
37 first = fields[0].split(':', 1)
38 if first[0] == 'include':
39 ev(first[1] + "/events", ovf)
40 return None
41 line = fields[1]
42 if first[0] == 'um':
43 first[1] = number(first[1])
44 if first[0] == '':
45 dict['description'] = fields[1]
46 fields = None;
47 else:
48 dict[first[0]] = first[1]
49 fields = line.split(None, 1)
50 return dict
51
52def parse_ctr(s):
53 ''' convert comma separated list of integers x,y,... , to CTR(x) | CTR(y) | ... '''
54 if s == 'cpuid':
55 return 0
56 ctrs = s.split(',')
57 c = ''
58 for i in range(len(ctrs)-1):
59 c += ("CTR(%s) | " % ctrs[i])
60 c += ("CTR(%s)" % ctrs[-1])
61 return c
62
63def ev(fname,ovf):
64 ''' read file, parse, generate C data struct to file ovf '''
65 evf = open(fname, "r")
66 all_lines = evf.readlines()
67 lines = [s.strip() for s in all_lines if s.strip()] # strip blanks
68 lines = [s for s in lines if not s.startswith('#')] # strip comments
69 eventlist = [parse_event(line,ovf) for line in lines]
70
71 ovf.write("// events from file %s\n" % fname)
72 for d in eventlist:
73 if d!=None:
74 ovf.write(' {%s, %s, %s, "%s",\n' % (d['event'], parse_ctr(d['counters']), d['um'], d['name']))
75 ovf.write(' "%s"},\n' % d['description'])
76
77
78if __name__ == "__main__" :
79 if len(sys.argv) != 2:
80 fname = "events/mips/24K/events" # convenient testing
81 else:
82 fname = sys.argv[1]
83 ovf = open(fname + ".h", "w")
84 ev(fname, ovf)