diff options
Diffstat (limited to 'src/sim/power')
-rw-r--r-- | src/sim/power/MathExprPowerModel.py | 52 | ||||
-rw-r--r-- | src/sim/power/PowerModel.py | 61 | ||||
-rw-r--r-- | src/sim/power/PowerModelState.py | 55 | ||||
-rw-r--r-- | src/sim/power/SConscript | 5 | ||||
-rw-r--r-- | src/sim/power/mathexpr_powermodel.cc | 102 | ||||
-rw-r--r-- | src/sim/power/mathexpr_powermodel.hh | 111 | ||||
-rw-r--r-- | src/sim/power/power_model.cc | 138 | ||||
-rw-r--r-- | src/sim/power/power_model.hh | 188 |
8 files changed, 712 insertions, 0 deletions
diff --git a/src/sim/power/MathExprPowerModel.py b/src/sim/power/MathExprPowerModel.py new file mode 100644 index 000000000..1a7b0ae78 --- /dev/null +++ b/src/sim/power/MathExprPowerModel.py @@ -0,0 +1,52 @@ +# Copyright (c) 2016 ARM Limited +# All rights reserved. +# +# The license below extends only to copyright in the software and shall +# not be construed as granting a license to any other intellectual +# property including but not limited to intellectual property relating +# to a hardware implementation of the functionality of the software +# licensed hereunder. You may use the software subject to the license +# terms below provided that you ensure that this notice is replicated +# unmodified and in its entirety in all distributions of the software, +# modified or unmodified, in source code or in binary form. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: David Guillen Fandos + +from m5.SimObject import SimObject +from m5.params import * +from PowerModelState import PowerModelState + +# Represents a power model for a simobj +class MathExprPowerModel(PowerModelState): + type = 'MathExprPowerModel' + cxx_header = "sim/power/mathexpr_powermodel.hh" + + # Equations for dynamic and static power + # Equations may use gem5 stats ie. "1.1*ipc + 2.3*l2_cache.overall_misses" + # It is possible to use automatic variables such as "temp" + # You may also use stat names (relative path to the simobject) + dyn = Param.String("", "Expression for the dynamic power") + st = Param.String("", "Expression for the static power") diff --git a/src/sim/power/PowerModel.py b/src/sim/power/PowerModel.py new file mode 100644 index 000000000..9002743cd --- /dev/null +++ b/src/sim/power/PowerModel.py @@ -0,0 +1,61 @@ +# Copyright (c) 2016 ARM Limited +# All rights reserved. +# +# The license below extends only to copyright in the software and shall +# not be construed as granting a license to any other intellectual +# property including but not limited to intellectual property relating +# to a hardware implementation of the functionality of the software +# licensed hereunder. You may use the software subject to the license +# terms below provided that you ensure that this notice is replicated +# unmodified and in its entirety in all distributions of the software, +# modified or unmodified, in source code or in binary form. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: David Guillen Fandos + +from m5.SimObject import SimObject +from m5.params import * +from m5.proxy import Parent + +# Represents a power model for a simobj +# The model itself is also a SimObject so we can make use some +# nice features available such as Parent.any +class PowerModel(SimObject): + type = 'PowerModel' + cxx_header = "sim/power/power_model.hh" + + @classmethod + def export_methods(cls, code): + code(''' + double getDynamicPower() const; + double getStaticPower() const; +''') + + # Keep a list of every model for every power state + pm = VectorParam.PowerModelState([], "List of per-state power models.") + + # Need a reference to the system so we can query the thermal domain + # about temperature (temperature is needed for leakage calculation) + subsystem = Param.SubSystem(Parent.any, "subsystem") diff --git a/src/sim/power/PowerModelState.py b/src/sim/power/PowerModelState.py new file mode 100644 index 000000000..1c37ab078 --- /dev/null +++ b/src/sim/power/PowerModelState.py @@ -0,0 +1,55 @@ +# Copyright (c) 2016 ARM Limited +# All rights reserved. +# +# The license below extends only to copyright in the software and shall +# not be construed as granting a license to any other intellectual +# property including but not limited to intellectual property relating +# to a hardware implementation of the functionality of the software +# licensed hereunder. You may use the software subject to the license +# terms below provided that you ensure that this notice is replicated +# unmodified and in its entirety in all distributions of the software, +# modified or unmodified, in source code or in binary form. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: David Guillen Fandos + +from m5.SimObject import SimObject +from m5.params import * + +# Represents a power model for a simobj +class PowerModelState(SimObject): + type = 'PowerModelState' + cxx_header = "sim/power/power_model.hh" + abstract = True + cxx_class = 'PowerModelState' + + @classmethod + def export_methods(cls, code): + code(''' + double getDynamicPower() const; + double getStaticPower() const; +''') + + diff --git a/src/sim/power/SConscript b/src/sim/power/SConscript index 8ec65519c..2f0eb4fc1 100644 --- a/src/sim/power/SConscript +++ b/src/sim/power/SConscript @@ -30,9 +30,14 @@ Import('*') +SimObject('MathExprPowerModel.py') +SimObject('PowerModel.py') +SimObject('PowerModelState.py') SimObject('ThermalDomain.py') SimObject('ThermalModel.py') +Source('power_model.cc') +Source('mathexpr_powermodel.cc') Source('thermal_domain.cc') Source('thermal_model.cc') diff --git a/src/sim/power/mathexpr_powermodel.cc b/src/sim/power/mathexpr_powermodel.cc new file mode 100644 index 000000000..7bd218659 --- /dev/null +++ b/src/sim/power/mathexpr_powermodel.cc @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2016 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: David Guillen Fandos + */ + +#include "sim/power/mathexpr_powermodel.hh" + +#include "base/statistics.hh" +#include "params/MathExprPowerModel.hh" +#include "sim/mathexpr.hh" +#include "sim/power/thermal_model.hh" +#include "sim/sim_object.hh" + +MathExprPowerModel::MathExprPowerModel(const Params *p) + : PowerModelState(p), dyn_expr(p->dyn), st_expr(p->st) +{ + // Calculate the name of the object we belong to + std::vector<std::string> path; + tokenize(path, name(), '.', true); + // It's something like xyz.power_model.pm2 + assert(path.size() > 2); + for (unsigned i = 0; i < path.size() - 2; i++) + basename += path[i] + "."; +} + +void +MathExprPowerModel::startup() +{ + // Create a map with stats and pointers for quick access + // Has to be done here, since we need access to the statsList + for (auto & i: Stats::statsList()) + if (i->name.find(basename) == 0) + stats_map[i->name.substr(basename.size())] = i; +} + +double +MathExprPowerModel::getStatValue(const std::string &name) const +{ + using namespace Stats; + + // Automatic variables: + if (name == "temp") + return _temp; + + // Try to cast the stat, only these are supported right now + Info *info = stats_map.at(name); + + ScalarInfo *si = dynamic_cast<ScalarInfo*>(info); + if (si) + return si->value(); + FormulaInfo *fi = dynamic_cast<FormulaInfo*>(info); + if (fi) + return fi->total(); + + panic("Unknown stat type!\n"); +} + +void +MathExprPowerModel::regStats() +{ + PowerModelState::regStats(); +} + +MathExprPowerModel* +MathExprPowerModelParams::create() +{ + return new MathExprPowerModel(this); +} diff --git a/src/sim/power/mathexpr_powermodel.hh b/src/sim/power/mathexpr_powermodel.hh new file mode 100644 index 000000000..563b1fa7f --- /dev/null +++ b/src/sim/power/mathexpr_powermodel.hh @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2016 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: David Guillen Fandos + */ + +#ifndef __SIM_MATHEXPR_POWERMODEL_PM_HH__ +#define __SIM_MATHEXPR_POWERMODEL_PM_HH__ + +#include <unordered_map> + +#include "base/statistics.hh" +#include "params/MathExprPowerModel.hh" +#include "sim/mathexpr.hh" +#include "sim/power/power_model.hh" +#include "sim/sim_object.hh" + +/** + * A Equation power model. The power is represented as a combination + * of some stats and automatic variables (like temperature). + */ +class MathExprPowerModel : public PowerModelState +{ + public: + + typedef MathExprPowerModelParams Params; + MathExprPowerModel(const Params *p); + + /** + * Get the dynamic power consumption. + * + * @return Power (Watts) consumed by this object (dynamic component) + */ + double getDynamicPower() const { + return dyn_expr.eval( + std::bind(&MathExprPowerModel::getStatValue, + this, std::placeholders::_1) + ); + } + + /** + * Get the static power consumption. + * + * @return Power (Watts) consumed by this object (static component) + */ + double getStaticPower() const { + return st_expr.eval( + std::bind(&MathExprPowerModel::getStatValue, + this, std::placeholders::_1) + ); + } + + /** + * Get the value for a variable (maps to a stat) + * + * @param name Name of the variable to retrieve the value from + * + * @return Power (Watts) consumed by this object (static component) + */ + double getStatValue(const std::string & name) const; + + void startup(); + + void regStats(); + + private: + + // Math expressions for dynamic and static power + MathExpr dyn_expr, st_expr; + + // Basename of the object in the gem5 stats hierachy + std::string basename; + + // Map that contains relevant stats for this power model + std::unordered_map<std::string, Stats::Info*> stats_map; +}; + +#endif diff --git a/src/sim/power/power_model.cc b/src/sim/power/power_model.cc new file mode 100644 index 000000000..bd06ced70 --- /dev/null +++ b/src/sim/power/power_model.cc @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2016 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: David Guillen Fandos + */ + +#include "sim/power/power_model.hh" + +#include "base/statistics.hh" +#include "params/PowerModel.hh" +#include "params/PowerModelState.hh" +#include "sim/sim_object.hh" +#include "sim/sub_system.hh" + +PowerModelState::PowerModelState(const Params *p) + : SimObject(p), _temp(0), clocked_object(NULL) +{ +} + +PowerModel::PowerModel(const Params *p) + : SimObject(p), states_pm(p->pm), subsystem(p->subsystem), + clocked_object(NULL) +{ + panic_if(subsystem == NULL, + "Subsystem is NULL! This is not acceptable for a PowerModel!\n"); + subsystem->registerPowerProducer(this); +} + +void +PowerModel::setClockedObject(ClockedObject * clkobj) +{ + this->clocked_object = clkobj; + + for (auto & pms: states_pm) + pms->setClockedObject(clkobj); +} + +void +PowerModel::thermalUpdateCallback(const double & temp) +{ + for (auto & pms: states_pm) + pms->setTemperature(temp); +} + +void +PowerModel::regProbePoints() +{ + thermalListener.reset(new ThermalProbeListener ( + *this, this->subsystem->getProbeManager(), "thermalUpdate" + )); +} + +PowerModel* +PowerModelParams::create() +{ + return new PowerModel(this); +} + +double +PowerModel::getDynamicPower() const +{ + assert(clocked_object); + + std::vector<double> w = clocked_object->pwrStateWeights(); + + // Same number of states (excluding UNDEFINED) + assert(w.size() - 1 == states_pm.size()); + + // Make sure we have no UNDEFINED state + warn_if(w[Enums::PwrState::UNDEFINED] > 0, + "SimObject in UNDEFINED power state! Power figures might be wrong!\n"); + + double power = 0; + for (unsigned i = 0; i < states_pm.size(); i++) + if (w[i + 1] > 0.0f) + power += states_pm[i]->getDynamicPower() * w[i + 1]; + + return power; +} + +double +PowerModel::getStaticPower() const +{ + assert(clocked_object); + + std::vector<double> w = clocked_object->pwrStateWeights(); + + // Same number of states (excluding UNDEFINED) + assert(w.size() - 1 == states_pm.size()); + + // Make sure we have no UNDEFINED state + if (w[0] > 0) + warn("SimObject in UNDEFINED power state! " + "Power figures might be wrong!\n"); + + // We have N+1 states, being state #0 the default 'UNDEFINED' state + double power = 0; + for (unsigned i = 0; i < states_pm.size(); i++) + // Don't evaluate power if the object hasn't been in that state + // This fixes issues with NaNs and similar. + if (w[i + 1] > 0.0f) + power += states_pm[i]->getStaticPower() * w[i + 1]; + + return power; +} diff --git a/src/sim/power/power_model.hh b/src/sim/power/power_model.hh new file mode 100644 index 000000000..a2ddcea18 --- /dev/null +++ b/src/sim/power/power_model.hh @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2016 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: David Guillen Fandos + */ + +#ifndef __SIM_POWER_POWER_MODEL_HH__ +#define __SIM_POWER_POWER_MODEL_HH__ + +#include "base/statistics.hh" +#include "params/PowerModel.hh" +#include "params/PowerModelState.hh" +#include "sim/power/thermal_model.hh" +#include "sim/probe/probe.hh" +#include "sim/sim_object.hh" + +/** + * A PowerModelState is an abstract class used as interface to get power + * figures out of SimObjects + */ +class PowerModelState : public SimObject +{ + public: + + typedef PowerModelStateParams Params; + PowerModelState(const Params *p); + + /** + * Get the dynamic power consumption. + * + * @return Power (Watts) consumed by this object (dynamic component) + */ + virtual double getDynamicPower() const = 0; + + /** + * Get the static power consumption. + * + * @return Power (Watts) consumed by this object (static component) + */ + virtual double getStaticPower() const = 0; + + /** + * Temperature update. + * + * @param temp Current temperature of the HW part (Celsius) + */ + virtual void setTemperature(double temp) { _temp = temp; } + + void setClockedObject(ClockedObject * clkobj) { + clocked_object = clkobj; + } + + void regStats() { + dynamicPower + .method(this, &PowerModelState::getDynamicPower) + .name(params()->name + ".dynamic_power") + .desc("Dynamic power for this object (Watts)") + ; + + staticPower + .method(this, &PowerModelState::getStaticPower) + .name(params()->name + ".static_power") + .desc("Static power for this object (Watts)") + ; + } + + protected: + Stats::Value dynamicPower, staticPower; + + /** Current temperature */ + double _temp; + + /** The clocked object we belong to */ + ClockedObject * clocked_object; +}; + +/** + * A PowerModel is a class containing a power model for a SimObject. + * The PM describes the power consumption for every power state. + */ +class PowerModel : public SimObject +{ + public: + + typedef PowerModelParams Params; + PowerModel(const Params *p); + + /** + * Get the dynamic power consumption. + * + * @return Power (Watts) consumed by this object (dynamic component) + */ + double getDynamicPower() const; + + /** + * Get the static power consumption. + * + * @return Power (Watts) consumed by this object (static component) + */ + double getStaticPower() const; + + void regStats() { + dynamicPower + .method(this, &PowerModel::getDynamicPower) + .name(params()->name + ".dynamic_power") + .desc("Dynamic power for this power state") + ; + + staticPower + .method(this, &PowerModel::getStaticPower) + .name(params()->name + ".static_power") + .desc("Static power for this power state") + ; + } + + void setClockedObject(ClockedObject *clkobj); + + virtual void regProbePoints(); + + void thermalUpdateCallback(const double & temp); + + protected: + /** Listener class to catch thermal events */ + class ThermalProbeListener : public ProbeListenerArgBase<double> + { + public: + ThermalProbeListener(PowerModel &_pm, ProbeManager *pm, + const std::string &name) + : ProbeListenerArgBase(pm, name), pm(_pm) {} + + void notify(const double &temp) + { + pm.thermalUpdateCallback(temp); + } + + protected: + PowerModel ± + }; + + Stats::Value dynamicPower, staticPower; + + /** Actual power models (one per power state) */ + std::vector<PowerModelState*> states_pm; + + /** Listener to catch temperature changes in the SubSystem */ + std::unique_ptr<ThermalProbeListener> thermalListener; + + /** The subsystem this power model belongs to */ + SubSystem * subsystem; + + /** The clocked object we belong to */ + ClockedObject * clocked_object; +}; + +#endif |