You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.4 KiB
80 lines
2.4 KiB
4 months ago
|
#!/usr/bin/env vpython
|
||
|
# Copyright 2020 The Chromium Authors. All rights reserved.
|
||
|
# Use of this source code is governed by a BSD-style license that can be
|
||
|
# found in the LICENSE file.
|
||
|
|
||
|
import argparse
|
||
|
import os
|
||
|
import sys
|
||
|
import xml.etree.ElementTree as ET
|
||
|
|
||
|
|
||
|
def ExtractValues(xml_path, correction):
|
||
|
root = ET.parse(xml_path).getroot()
|
||
|
|
||
|
speeds = []
|
||
|
power = []
|
||
|
clusters = []
|
||
|
for array in root.iter('array'):
|
||
|
if array.get('name') == 'cpu.clusters.cores':
|
||
|
clusters = [int(value.text) for value in array.iter('value')]
|
||
|
if array.get('name').startswith('cpu.core_speeds.'):
|
||
|
speeds.append([int(value.text) for value in array.iter('value')])
|
||
|
if array.get('name').startswith('cpu.core_power.'):
|
||
|
power.append([float(value.text) for value in array.iter('value')])
|
||
|
|
||
|
values = []
|
||
|
cpu = 0
|
||
|
for cluster, n_cpus in enumerate(clusters):
|
||
|
for _ in range(n_cpus):
|
||
|
for freq, drain in zip(speeds[cluster], power[cluster]):
|
||
|
if correction:
|
||
|
drain /= n_cpus
|
||
|
values.append((cpu, cluster, freq, drain))
|
||
|
cpu += 1
|
||
|
|
||
|
return values
|
||
|
|
||
|
|
||
|
def ExportProfiles(device_xmls, sql_path):
|
||
|
sql_values = []
|
||
|
for device, xml_path, correction in device_xmls:
|
||
|
sql_values += [
|
||
|
'("%s", %s, %s, %s, %s)' % ((device,) + v)
|
||
|
for v in ExtractValues(xml_path, correction == 'yes')
|
||
|
]
|
||
|
|
||
|
with open(sql_path, 'w') as sql_file:
|
||
|
sql_file.write('INSERT OR REPLACE INTO power_profile VALUES\n')
|
||
|
sql_file.write(',\n'.join(sql_values))
|
||
|
sql_file.write(';\n')
|
||
|
|
||
|
|
||
|
def main(args):
|
||
|
parser = argparse.ArgumentParser(
|
||
|
description='Export XML power profile as a SQL INSERT query.',
|
||
|
epilog='Example usage:\n'
|
||
|
'python export_power_profiles.py '
|
||
|
'--device-xml sailfish sailfish/power_profile.xml no '
|
||
|
'--device-xml sargo sargo/power_profile.xml yes '
|
||
|
'--output power_profile_data.sql')
|
||
|
parser.add_argument(
|
||
|
'--device-xml',
|
||
|
nargs=3,
|
||
|
metavar=('DEVICE', 'XML_FILE', 'CORRECTION'),
|
||
|
action='append',
|
||
|
help='First argument: device name; second argument: path to the XML '
|
||
|
'file with the device power profile; third argument(yes|no): '
|
||
|
'whether correction is necessary. Can be used multiple times.')
|
||
|
parser.add_argument(
|
||
|
'--output', metavar='SQL_FILE', help='Path to the output file.')
|
||
|
|
||
|
args = parser.parse_args(args)
|
||
|
|
||
|
sql_path = 'result.sql'
|
||
|
ExportProfiles(args.device_xml, args.output)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
sys.exit(main(sys.argv[1:]))
|