blob: 0b34fc82622afc3cb578979f2a9d6b710c2996cd [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.powermodel.component;
import java.util.Arrays;
import java.util.HashMap;
import com.android.powermodel.ComponentProfile;
import com.android.powermodel.ParseException;
public class CpuProfile extends ComponentProfile {
public float suspendMa;
public float idleMa;
public float activeMa;
public Cluster[] clusters;
public static class Cluster {
public int coreCount;
public float onMa;
public Frequency[] frequencies;
}
public static class Frequency {
public int speedHz;
public float onMa;
}
public static class Builder {
private float mSuspendMa;
private float mIdleMa;
private float mActiveMa;
private int[] mCoreCount;
private HashMap<Integer,Float> mClusterOnPower = new HashMap<Integer,Float>();
private HashMap<Integer,int[]> mCoreSpeeds = new HashMap<Integer,int[]>();
private HashMap<Integer,float[]> mCorePower = new HashMap<Integer,float[]>();
public Builder() {
}
public void setSuspendMa(float value) throws ParseException {
mSuspendMa = value;
}
public void setIdleMa(float value) throws ParseException {
mIdleMa = value;
}
public void setActiveMa(float value) throws ParseException {
mActiveMa = value;
}
public void setCoreCount(int[] value) throws ParseException {
mCoreCount = Arrays.copyOf(value, value.length);
}
public void setClusterPower(int cluster, float value) throws ParseException {
mClusterOnPower.put(cluster, value);
}
public void setCoreSpeeds(int cluster, int[] value) throws ParseException {
mCoreSpeeds.put(cluster, Arrays.copyOf(value, value.length));
float[] power = mCorePower.get(cluster);
if (power != null && value.length != power.length) {
throw new ParseException("length of cpu.core_speeds.cluster" + cluster
+ " (" + value.length + ") is different from length of"
+ " cpu.core_power.cluster" + cluster + " (" + power.length + ")");
}
if (mCoreCount != null && cluster >= mCoreCount.length) {
throw new ParseException("cluster " + cluster
+ " in cpu.core_speeds.cluster" + cluster
+ " is larger than the number of clusters specified in cpu.clusters.cores ("
+ mCoreCount.length + ")");
}
}
public void setCorePower(int cluster, float[] value) throws ParseException {
mCorePower.put(cluster, Arrays.copyOf(value, value.length));
int[] speeds = mCoreSpeeds.get(cluster);
if (speeds != null && value.length != speeds.length) {
throw new ParseException("length of cpu.core_power.cluster" + cluster
+ " (" + value.length + ") is different from length of"
+ " cpu.clusters.cores" + cluster + " (" + speeds.length + ")");
}
if (mCoreCount != null && cluster >= mCoreCount.length) {
throw new ParseException("cluster " + cluster
+ " in cpu.core_power.cluster" + cluster
+ " is larger than the number of clusters specified in cpu.clusters.cores ("
+ mCoreCount.length + ")");
}
}
public CpuProfile build() throws ParseException {
final CpuProfile result = new CpuProfile();
// Validate cluster count
// All null or none null
// TODO
// Same size
// TODO
// No gaps
// TODO
// Fill in values
result.suspendMa = mSuspendMa;
result.idleMa = mIdleMa;
result.activeMa = mActiveMa;
if (mCoreCount != null) {
result.clusters = new Cluster[mCoreCount.length];
for (int i = 0; i < result.clusters.length; i++) {
final Cluster cluster = result.clusters[i] = new Cluster();
cluster.coreCount = mCoreCount[i];
cluster.onMa = mClusterOnPower.get(i);
int[] speeds = mCoreSpeeds.get(i);
float[] power = mCorePower.get(i);
cluster.frequencies = new Frequency[speeds.length];
for (int j = 0; j < speeds.length; j++) {
final Frequency freq = cluster.frequencies[j] = new Frequency();
freq.speedHz = speeds[j];
freq.onMa = power[j];
}
}
}
return result;
}
}
}