sim: Add function that returns all variables in a MathExpr
authorNikos Nikoleris <nikos.nikoleris@arm.com>
Fri, 3 Apr 2020 11:07:13 +0000 (12:07 +0100)
committerNikos Nikoleris <nikos.nikoleris@arm.com>
Wed, 29 Apr 2020 21:02:32 +0000 (21:02 +0000)
This changes adds support for retrieving all variables in a math
expression. The added function can be called in all valid expressions
and will return the variables in a vector of strings.

Change-Id: I086ba04aa1f798400c97a0b6bf982018a2457c64
Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/27889
Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/sim/mathexpr.cc
src/sim/mathexpr.hh

index f80c5358273359b98f1bf97da3d529aa7d918daa..0cbcd90f3f66ebf2645f355044610418b49f66e2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 ARM Limited
+ * Copyright (c) 2016, 2020 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -174,3 +174,17 @@ MathExpr::toStr(Node *n, std::string prefix) const {
     return ret;
 }
 
+void
+MathExpr::getVariables(const Node *n,
+                       std::vector<std::string> &variables) const
+{
+    if (!n || n->op == sValue || n->op == nInvalid) {
+        return;
+    } else if (n->op == sVariable) {
+        variables.push_back(n->variable);
+    } else {
+        getVariables(n->l, variables);
+        getVariables(n->r, variables);
+    }
+}
+
index b8db73926e1e5ac4944188c7000ed256aba2674e..3dfe2b829eeb3f149e26cbadfd6157ec03bb2afa 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 ARM Limited
+ * Copyright (c) 2016, 2020 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -42,6 +42,7 @@
 #include <array>
 #include <functional>
 #include <string>
+#include <vector>
 
 class MathExpr {
   public:
@@ -66,6 +67,22 @@ class MathExpr {
      */
     double eval(EvalCallback fn) const { return eval(root, fn); }
 
+    /**
+     * Return all variables in the this expression.
+     *
+     * This function starts from the root node and traverses all nodes
+     * while adding the variables it finds to a vector. Returns the
+     * found variables in a vector of strings
+     *
+     * @return A Vector with the names of all variables
+    */
+    std::vector<std::string> getVariables() const
+    {
+        std::vector<std::string> vars;
+        getVariables(root, vars);
+        return vars;
+    }
+
   private:
     enum Operator {
         bAdd, bSub, bMul, bDiv, bPow, uNeg, sValue, sVariable, nInvalid
@@ -119,8 +136,10 @@ class MathExpr {
 
     /** Eval a node */
     double eval(const Node *n, EvalCallback fn) const;
+
+    /** Return all variable reachable from a node to a vector of
+     * strings */
+    void getVariables(const Node *n, std::vector<std::string> &vars) const;
 };
 
 #endif
-
-