diff --git a/opev.py b/opev.py
new file mode 100755
index 0000000..9f11e75
--- /dev/null
+++ b/opev.py
@@ -0,0 +1,84 @@
+#! /usr/bin/env python
+"""
+Read oprofile events file, generate C data struct for Android opcontrol.
+
+Android does not use script for opcontrol, they use a C binary, which
+has embedded data structures with the event set that is supported.
+Initially that is just Arm V6 and V7.
+
+This tool allows us to convert various MIPS cpu event files for
+inclusion, and should work with other processor arch's as well.
+
+Neither Arm or Mips uses unit_masks, so that file is ignored.
+
+Event entries in file look like this:
+
+    event:0x1 counters:0,1 um:zero minimum:500 name:INSTRUCTIONS : Instructions completed
+
+The format is key:value. A single : appears at the end of line
+and the remaining text is the description
+"""
+
+import os, sys
+
+def number(s):
+    if s == 'zero':
+        return '0'
+    if s == 'one':
+        return '1'
+    if s[0] == 'x':
+        return '0'+s
+    
+def parse_event(line,ovf):
+    ''' return dictionary of items from one line of event file '''
+    dict = {}
+    fields = line.split(None, 1)
+    while (fields):
+        first = fields[0].split(':', 1)
+        if first[0] == 'include':
+            ev(first[1] + "/events", ovf)
+            return None
+        line = fields[1]
+        if first[0] == 'um':
+            first[1] = number(first[1])
+        if first[0] == '':
+            dict['description'] = fields[1]
+            fields = None;
+        else:
+            dict[first[0]] = first[1]
+            fields = line.split(None, 1)
+    return dict
+
+def parse_ctr(s):
+    ''' convert comma separated list of integers x,y,... , to CTR(x) | CTR(y) | ... '''
+    if s == 'cpuid':
+        return 0
+    ctrs = s.split(',')
+    c = ''
+    for i in range(len(ctrs)-1):
+        c += ("CTR(%s) | " % ctrs[i])
+    c += ("CTR(%s)" % ctrs[-1])
+    return c
+
+def ev(fname,ovf):
+    ''' read file, parse, generate C data struct to file ovf '''
+    evf = open(fname, "r")
+    all_lines = evf.readlines()
+    lines = [s.strip() for s in all_lines if s.strip()]     # strip blanks
+    lines = [s for s in lines if not s.startswith('#')]     # strip comments
+    eventlist = [parse_event(line,ovf) for line in lines]
+
+    ovf.write("// events from file %s\n" % fname)
+    for d in eventlist:
+        if d!=None:
+            ovf.write('    {%s, %s, %s, "%s",\n' % (d['event'], parse_ctr(d['counters']), d['um'], d['name']))
+            ovf.write('     "%s"},\n' % d['description'])
+
+
+if __name__ == "__main__" :
+    if len(sys.argv) != 2:
+        fname = "events/mips/24K/events"    # convenient testing
+    else:
+        fname = sys.argv[1]
+    ovf = open(fname + ".h", "w")
+    ev(fname, ovf)
