sim-power: Specify the states a PowerState object can be in

This commit adds the concept of possible power states to the
PowerState SimObject. This is a list of the power states a specific
object can be in. Before transitioning to a power state, a PowerState
object will first check if the requested power states is actually an
allowed state. The user can restricted the power states a
ClockedObject can go to during configuration. In addition, this change
sets the power states, a CPU can be in.

Change-Id: Ida414a87554a14f09767a272b54b5d19bfc8e911
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/28050
Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Anouk Van Laer
2017-10-04 14:15:36 +01:00
committed by Nikos Nikoleris
parent 818961969a
commit 4b2f2b5ced
4 changed files with 28 additions and 1 deletions

View File

@@ -303,3 +303,7 @@ class BaseCPU(ClockedObject):
cpus_node.append(node)
yield cpus_node
def __init__(self, **kwargs):
super(BaseCPU, self).__init__(**kwargs)
self.power_state.possible_states=['ON', 'CLK_GATED', 'OFF']

View File

@@ -62,6 +62,11 @@ class PowerState(SimObject):
# routine
default_state = Param.PwrState("UNDEFINED", "Default Power State")
# Possible power states this object can be in sorted from the most
# to the least performant
possible_states = VectorParam.PwrState(
[], "Power states this object can be in")
clk_gate_min = Param.Latency('1ns',"Min value of the distribution")
clk_gate_max = Param.Latency('1s',"Max value of the distribution")
clk_gate_bins = Param.Unsigned('20', "# bins in clk gated distribution")

View File

@@ -41,7 +41,9 @@
PowerState::PowerState(const PowerStateParams *p) :
SimObject(p), _currState(p->default_state),
stats(*this)
possibleStates(p->possible_states.begin(),
p->possible_states.end()),
prvEvalTick(0), stats(*this)
{
}
@@ -68,6 +70,11 @@ PowerState::unserialize(CheckpointIn &cp)
void
PowerState::set(Enums::PwrState p)
{
// Check if this power state is actually allowed by checking whether it is
// present in pwrStateToIndex-dictionary
panic_if(possibleStates.find(p) == possibleStates.end(),
"Cannot go to %s in %s \n", Enums::PwrStateStrings[p], name());
// Function should ideally be called only when there is a state change
if (_currState == p) {
warn_once("PowerState: Already in the requested power state, "

View File

@@ -98,11 +98,22 @@ class PowerState : public SimObject
*/
void computeStats();
/**
* Return the power states this object can be in
*/
std::set<Enums::PwrState> getPossibleStates() const
{
return possibleStates;
}
protected:
/** To keep track of the current power state */
Enums::PwrState _currState;
/** The possible power states this object can be in */
const std::set<Enums::PwrState> possibleStates;
/** Last tick the power stats were calculated */
Tick prvEvalTick = 0;