From: Anouk Van Laer Date: Wed, 4 Oct 2017 13:15:36 +0000 (+0100) Subject: sim-power: Specify the states a PowerState object can be in X-Git-Tag: v20.0.0.0~98 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4b2f2b5ceda9779a282450c868d65ebdb42eed38;p=gem5.git 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 Signed-off-by: Nikos Nikoleris Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/28050 Reviewed-by: Bobby R. Bruce Maintainer: Jason Lowe-Power Tested-by: kokoro --- diff --git a/src/cpu/BaseCPU.py b/src/cpu/BaseCPU.py index 67d95d0f4..ab70d1d7f 100644 --- a/src/cpu/BaseCPU.py +++ b/src/cpu/BaseCPU.py @@ -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'] diff --git a/src/sim/PowerState.py b/src/sim/PowerState.py index 59491ec15..bfa53e268 100644 --- a/src/sim/PowerState.py +++ b/src/sim/PowerState.py @@ -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") diff --git a/src/sim/power_state.cc b/src/sim/power_state.cc index 28b0b83de..a2ed7fe28 100644 --- a/src/sim/power_state.cc +++ b/src/sim/power_state.cc @@ -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, " diff --git a/src/sim/power_state.hh b/src/sim/power_state.hh index 8b93b450b..4565c2b1f 100644 --- a/src/sim/power_state.hh +++ b/src/sim/power_state.hh @@ -98,11 +98,22 @@ class PowerState : public SimObject */ void computeStats(); + /** + * Return the power states this object can be in + */ + std::set 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 possibleStates; + /** Last tick the power stats were calculated */ Tick prvEvalTick = 0;