summaryrefslogtreecommitdiff
path: root/src/sim/power/mathexpr_powermodel.hh
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2017-04-05 16:38:00 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2017-04-06 13:35:17 +0000
commit0b223f4001fce26cad3b3c7e03501e7222d85ee0 (patch)
treea6ac967bff398bb5fbd8ae43e5fd1bf0b2cce49a /src/sim/power/mathexpr_powermodel.hh
parent01bc2ea80d514abb5009869fc6b765208192906f (diff)
downloadgem5-0b223f4001fce26cad3b3c7e03501e7222d85ee0.tar.xz
power: Add error checking to MathExprPowerModel
MathExprPower model currently doesn't print any useful error messages if an expression fails to evaluate. To add insult to injury, the model only detects a failure when dumping stats and not at initialization. This change adds a verification step in startup() that ensures that all of the referenced stats actually exist. Change-Id: I8f71c73341578d5882c8d93e482f5383fbda5f1d Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com> Reviewed-by: Sascha Bischoff <sascha.bischoff@arm.com> Reviewed-on: https://gem5-review.googlesource.com/2661 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Maintainer: Jason Lowe-Power <jason@lowepower.com>
Diffstat (limited to 'src/sim/power/mathexpr_powermodel.hh')
-rw-r--r--src/sim/power/mathexpr_powermodel.hh37
1 files changed, 24 insertions, 13 deletions
diff --git a/src/sim/power/mathexpr_powermodel.hh b/src/sim/power/mathexpr_powermodel.hh
index 5c121c7b6..b4d0254d8 100644
--- a/src/sim/power/mathexpr_powermodel.hh
+++ b/src/sim/power/mathexpr_powermodel.hh
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016 ARM Limited
+ * Copyright (c) 2016-2017 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -66,24 +66,14 @@ class MathExprPowerModel : public PowerModelState
*
* @return Power (Watts) consumed by this object (dynamic component)
*/
- double getDynamicPower() const {
- return dyn_expr.eval(
- std::bind(&MathExprPowerModel::getStatValue,
- this, std::placeholders::_1)
- );
- }
+ double getDynamicPower() const { return eval(dyn_expr); }
/**
* 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)
- );
- }
+ double getStaticPower() const { return eval(st_expr); }
/**
* Get the value for a variable (maps to a stat)
@@ -99,6 +89,23 @@ class MathExprPowerModel : public PowerModelState
void regStats();
private:
+ /**
+ * Evaluate an expression in the context of this object, fatal if
+ * evaluation fails.
+ *
+ * @param expr Expression to evaluate
+ * @return Value of expression.
+ */
+ double eval(const MathExpr &expr) const;
+
+ /**
+ * Evaluate an expression in the context of this object, set
+ * failed if evaluation failed.
+ *
+ * @param expr Expression to evaluate
+ * @return Value of expression.
+ */
+ double tryEval(const MathExpr &expr) const;
// Math expressions for dynamic and static power
MathExpr dyn_expr, st_expr;
@@ -108,6 +115,10 @@ class MathExprPowerModel : public PowerModelState
// Map that contains relevant stats for this power model
std::unordered_map<std::string, Stats::Info*> stats_map;
+
+ // Did the expression fail to evaluate (e.g., because a stat value
+ // can't be resolved)
+ mutable bool failed;
};
#endif