blob: cea30f815c4da311dba287d00197f068b7e18f97 [file] [log] [blame]
Hector Dearman492eb522021-08-31 12:01:46 +01001#!/usr/bin/env python3
Mikhail Khokhlov4f658692020-06-29 16:33:50 +01002# Copyright 2020 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6import argparse
7import os
8import sys
9import xml.etree.ElementTree as ET
10
11
12def ExtractValues(xml_path, correction):
13 root = ET.parse(xml_path).getroot()
14
15 speeds = []
16 power = []
17 clusters = []
18 for array in root.iter('array'):
19 if array.get('name') == 'cpu.clusters.cores':
20 clusters = [int(value.text) for value in array.iter('value')]
21 if array.get('name').startswith('cpu.core_speeds.'):
22 speeds.append([int(value.text) for value in array.iter('value')])
23 if array.get('name').startswith('cpu.core_power.'):
24 power.append([float(value.text) for value in array.iter('value')])
25
26 values = []
27 cpu = 0
28 for cluster, n_cpus in enumerate(clusters):
29 for _ in range(n_cpus):
30 for freq, drain in zip(speeds[cluster], power[cluster]):
31 if correction:
32 drain /= n_cpus
33 values.append((cpu, cluster, freq, drain))
34 cpu += 1
35
36 return values
37
38
39def ExportProfiles(device_xmls, sql_path):
40 sql_values = []
41 for device, xml_path, correction in device_xmls:
42 sql_values += [
43 '("%s", %s, %s, %s, %s)' % ((device,) + v)
44 for v in ExtractValues(xml_path, correction == 'yes')
45 ]
46
47 with open(sql_path, 'w') as sql_file:
Rafal Slawik8b99d432020-09-10 12:45:25 +010048 sql_file.write('INSERT OR REPLACE INTO power_profile VALUES\n')
Mikhail Khokhlov4f658692020-06-29 16:33:50 +010049 sql_file.write(',\n'.join(sql_values))
50 sql_file.write(';\n')
51
52
53def main(args):
54 parser = argparse.ArgumentParser(
55 description='Export XML power profile as a SQL INSERT query.',
56 epilog='Example usage:\n'
57 'python export_power_profiles.py '
58 '--device-xml sailfish sailfish/power_profile.xml no '
59 '--device-xml sargo sargo/power_profile.xml yes '
60 '--output power_profile_data.sql')
61 parser.add_argument(
62 '--device-xml',
63 nargs=3,
64 metavar=('DEVICE', 'XML_FILE', 'CORRECTION'),
65 action='append',
66 help='First argument: device name; second argument: path to the XML '
67 'file with the device power profile; third argument(yes|no): '
68 'whether correction is necessary. Can be used multiple times.')
69 parser.add_argument(
70 '--output', metavar='SQL_FILE', help='Path to the output file.')
71
72 args = parser.parse_args(args)
73
74 sql_path = 'result.sql'
75 ExportProfiles(args.device_xml, args.output)
76
77
78if __name__ == '__main__':
79 sys.exit(main(sys.argv[1:]))