From e2aab0e92f4d34329658a41b49c2f5b1b3067323 Mon Sep 17 00:00:00 2001 From: "joaquin.f.fernandez" Date: Thu, 3 Nov 2022 10:01:40 -0300 Subject: [PATCH] [iss-209] Squashed commit of the following: commit b05dfcbf2b1718dff8366bb210fe0c8ca8b050e6 Author: joaquin.f.fernandez Date: Thu Nov 3 09:47:09 2022 -0300 Updated NeuralNetwork1 gt test data. commit dabc29be5b1b378c1779a7960e0045611e362a05 Author: joaquin.f.fernandez Date: Thu Nov 3 09:46:51 2022 -0300 Print equation guards only for used variables. commit dc62b9d0ccbf8a4878709a06c8c3a092cf2306f3 Author: joaquin.f.fernandez Date: Thu Nov 3 09:46:03 2022 -0300 Added getusedVariables method to equations. commit 20bfc1a83cb4e8ec61f372cb5657f8937e1c1377 Author: joaquin.f.fernandez Date: Thu Nov 3 09:45:46 2022 -0300 Added getUsedVariables method to expression. commit 05b106c193787aaaa8f1d7370017fac2ea08c176 Author: joaquin.f.fernandez Date: Thu Nov 3 09:45:22 2022 -0300 Parse exp calls in get index variables visitor. --- src/mmoc/ir/equation.cpp | 20 ++++---- src/mmoc/ir/equation.h | 20 ++++---- src/mmoc/ir/equation_printer.cpp | 9 ++-- src/mmoc/ir/equation_printer.h | 4 +- src/mmoc/ir/event.cpp | 2 +- src/mmoc/ir/expression.cpp | 11 ++++- src/mmoc/ir/expression.h | 4 +- src/mmoc/ir/helpers.cpp | 46 +++++++++---------- src/mmoc/ir/helpers.h | 21 +++++---- .../gt_data/NeuralNetwork1/NeuralNetwork1.c | 6 +-- .../util/visitors/get_index_variables.cpp | 17 +++++++ 11 files changed, 97 insertions(+), 63 deletions(-) diff --git a/src/mmoc/ir/equation.cpp b/src/mmoc/ir/equation.cpp index cd278017..bd96a709 100644 --- a/src/mmoc/ir/equation.cpp +++ b/src/mmoc/ir/equation.cpp @@ -68,17 +68,7 @@ Equation::Equation(AST_Expression lhs, AST_Expression rhs, Option range, } Equation::Equation(AST_Expression eq, Option range, EQUATION::Type type, int id, int offset) - : _eq(), - _lhs(), - _rhs(), - _range(range), - _autonomous(true), - _type(type), - _id(id), - _offset(offset), - _lhs_exp(), - _usage(), - _alg_code() + : _eq(), _lhs(), _rhs(), _range(range), _autonomous(true), _type(type), _id(id), _offset(offset), _lhs_exp(), _usage(), _alg_code() { initialize(eq); } @@ -242,5 +232,13 @@ void Equation::setAlgCode(std::string alg_code) { _alg_code = alg_code; } std::string Equation::algCode() const { return _alg_code; } +std::multimap Equation::usedVariables() const +{ + std::multimap ret = _lhs.usedVariables(); + std::multimap ret_rhs = _rhs.usedVariables(); + ret.insert(ret_rhs.begin(), ret_rhs.end()); + return ret; +} + } // namespace IR } // namespace MicroModelica diff --git a/src/mmoc/ir/equation.h b/src/mmoc/ir/equation.h index 784916cc..a69477c1 100644 --- a/src/mmoc/ir/equation.h +++ b/src/mmoc/ir/equation.h @@ -70,7 +70,10 @@ class Equation { inline void setRange(Option range) { _range = range; }; inline int id() const { return _id; }; inline EQUATION::Type type() const { return _type; } - inline bool isDerivative() const { return _type == EQUATION::QSSDerivative || _type == EQUATION::ClassicDerivative || _type == EQUATION::QSSBDFDerivative; } + inline bool isDerivative() const + { + return _type == EQUATION::QSSDerivative || _type == EQUATION::ClassicDerivative || _type == EQUATION::QSSBDFDerivative; + } inline bool isZeroCrossing() const { return _type == EQUATION::ZeroCrossing; } inline bool isOutput() const { return _type == EQUATION::Output; } inline bool isAlgebraic() const { return _type == EQUATION::Algebraic; } @@ -91,6 +94,7 @@ class Equation { int arrayId() const; void setAlgCode(std::string alg_code); std::string algCode() const; + std::multimap usedVariables() const; protected: void initialize(AST_Equation eq); @@ -115,12 +119,12 @@ class Equation { class EquationDefOrder { public: - EquationDefOrder() : _var_name(), _var_init() {}; - EquationDefOrder(std::string var_name, std::vector var_init) : _var_name(var_name), _var_init(var_init) {}; + EquationDefOrder() : _var_name(), _var_init(){}; + EquationDefOrder(std::string var_name, std::vector var_init) : _var_name(var_name), _var_init(var_init){}; - bool operator<(const EquationDefOrder& other) const + bool operator<(const EquationDefOrder &other) const { - int var_compare = _var_name.compare(other._var_name); + int var_compare = _var_name.compare(other._var_name); if (var_compare == 0) { assert(_var_init.size() == other._var_init.size()); size_t size = _var_init.size(); @@ -135,15 +139,15 @@ class EquationDefOrder { } std::string variable() const { return _var_name; } - + protected: std::string _var_name; std::vector _var_init; }; -typedef std::map> OrderedEquations; +typedef std::map> OrderedEquations; -typedef std::map EquationOrderMap; +typedef std::map EquationOrderMap; typedef ModelTable EquationTable; diff --git a/src/mmoc/ir/equation_printer.cpp b/src/mmoc/ir/equation_printer.cpp index 4fcfbac3..ce3b5f95 100644 --- a/src/mmoc/ir/equation_printer.cpp +++ b/src/mmoc/ir/equation_printer.cpp @@ -83,10 +83,13 @@ void EquationPrinter::setup(Equation eq) } const bool QSS_EQS = eq.type() == EQUATION::QSSDerivative || eq.type() == EQUATION::ZeroCrossing; _return_stm = (QSS_EQS) ? FUNCTION_PRINTER::ReturnStatementType::Return : FUNCTION_PRINTER::ReturnStatementType::Continue; + _used_variables = eq.usedVariables(); } FUNCTION_PRINTER::ReturnStatementType EquationPrinter::returnStm() const { return _return_stm; } +std::multimap EquationPrinter::usedVariables() const { return _used_variables; } + string EquationPrinter::equationId() const { stringstream buffer; @@ -228,7 +231,7 @@ string DerivativePrinter::print() const tabs += TAB; buffer << printer.beginExpression(identifier(), _range); buffer << algCode(); - buffer << printer.beginDimGuards(equationId(), arguments, _range); + buffer << printer.beginDimGuards(equationId(), arguments, _range, usedVariables()); buffer << tabs << prefix() << lhs() << " = " << _rhs << ";" << endl; buffer << generateDerivatives(tabs) << endl; buffer << endl << TAB << printer.endDimGuards(_range); @@ -275,7 +278,7 @@ string OutputPrinter::print() const } block += TAB; buffer << fp.beginExpression(identifier(), _range); - buffer << fp.beginDimGuards(equationId(), arguments, _range); + buffer << fp.beginDimGuards(equationId(), arguments, _range, usedVariables()); buffer << algCode(); buffer << block << prefix() << lhs() << " = " << _rhs << ";"; buffer << endl << TAB << fp.endDimGuards(_range); @@ -368,7 +371,7 @@ string DependencyPrinter::print() const } } tabs += TAB; - buffer << printer.beginDimGuards(equationId(), arguments, _range); + buffer << printer.beginDimGuards(equationId(), arguments, _range, usedVariables()); buffer << beginParallelMap(tabs); buffer << tabs << prefix() << lhs(FIRST_ORDER) << " = " << _rhs << ";" << endl; buffer << generateDerivatives(tabs, SECOND_ORDER) << endl; diff --git a/src/mmoc/ir/equation_printer.h b/src/mmoc/ir/equation_printer.h index 01d3e4b5..55e47c5f 100644 --- a/src/mmoc/ir/equation_printer.h +++ b/src/mmoc/ir/equation_printer.h @@ -45,6 +45,7 @@ class EquationPrinter { std::string lhs(int order = 0) const; virtual std::string equationId() const; FUNCTION_PRINTER::ReturnStatementType returnStm() const; + std::multimap usedVariables() const; protected: void setup(Equation eq); @@ -56,6 +57,7 @@ class EquationPrinter { Expression _lhs; std::string _alg_code; FUNCTION_PRINTER::ReturnStatementType _return_stm; + std::multimap _used_variables; }; EquationPrinter* getPrinter(Equation eq); @@ -127,7 +129,7 @@ class DependencyPrinter : public DerivativePrinter { std::string print() const override; protected: - std::string beginParallelMap(std::string &tabs) const; + std::string beginParallelMap(std::string& tabs) const; std::string endParallelMap() const; private: diff --git a/src/mmoc/ir/event.cpp b/src/mmoc/ir/event.cpp index 7930170d..811fc8e4 100644 --- a/src/mmoc/ir/event.cpp +++ b/src/mmoc/ir/event.cpp @@ -123,7 +123,7 @@ string Event::handler(EVENT::Type type) const } block += TAB; buffer << fp.beginExpression(_zero_crossing.identifier(), _range); - buffer << fp.beginDimGuards(_zero_crossing.identifier(), arguments, _range); + buffer << fp.beginDimGuards(_zero_crossing.identifier(), arguments, _range, _zero_crossing.usedVariables()); StatementTable::iterator it; for (Statement stm = stms.begin(it); !stms.end(it); stm = stms.next(it)) { buffer << block << stm << endl; diff --git a/src/mmoc/ir/expression.cpp b/src/mmoc/ir/expression.cpp index c88a9099..4f23957e 100644 --- a/src/mmoc/ir/expression.cpp +++ b/src/mmoc/ir/expression.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -161,8 +162,8 @@ std::ostream& operator<<(std::ostream& out, const Expression& s) out << s.print(); return out; } -bool Expression::operator<(const Expression &other) const -{ +bool Expression::operator<(const Expression& other) const +{ std::stringstream cmp_this; std::stringstream cmp_other; cmp_this << *this; @@ -170,5 +171,11 @@ bool Expression::operator<(const Expression &other) const return cmp_this.str() < cmp_other.str(); } +std::multimap Expression::usedVariables() const +{ + GetIndexVariables used_variables; + return used_variables.apply(_exp); +} + } // namespace IR } // namespace MicroModelica diff --git a/src/mmoc/ir/expression.h b/src/mmoc/ir/expression.h index ed0aecfd..fb0ae688 100644 --- a/src/mmoc/ir/expression.h +++ b/src/mmoc/ir/expression.h @@ -43,10 +43,12 @@ class Expression { bool isScalar() const; list indexes() const; static Expression generate(std::string var_name, std::vector indices); - bool operator<(const Expression &other) const; + bool operator<(const Expression& other) const; friend std::ostream& operator<<(std::ostream& out, const Expression& s); + std::multimap usedVariables() const; + protected: std::vector usageExps() const; diff --git a/src/mmoc/ir/helpers.cpp b/src/mmoc/ir/helpers.cpp index 4573a508..69b044c0 100644 --- a/src/mmoc/ir/helpers.cpp +++ b/src/mmoc/ir/helpers.cpp @@ -19,16 +19,16 @@ #include +#include #include "helpers.h" -#include "built_in_functions.h" -#include "expression.h" -#include "equation.h" -#include "../generator/macros.h" -#include "../util/error.h" -#include "../util/model_config.h" -#include "../util/util.h" -#include "../util/visitors/get_index_variables.h" -#include "../util/visitors/is_constant_expression.h" +#include +#include +#include +#include +#include +#include +#include +#include namespace MicroModelica { using namespace Deps; @@ -38,10 +38,7 @@ namespace IR { /* ExternalFunction Class Implementation */ -ExternalFunction::ExternalFunction(string lvalue, string name, AST_ExpressionList args) - : _lvalue(lvalue), _name(name), _args(args) -{ -} +ExternalFunction::ExternalFunction(string lvalue, string name, AST_ExpressionList args) : _lvalue(lvalue), _name(name), _args(args) {} std::ostream& operator<<(std::ostream& out, const ExternalFunction& e) { @@ -229,7 +226,7 @@ string FunctionPrinter::endExpression(Option range, FUNCTION_PRINTER::Ret } break; } - case FUNCTION_PRINTER::Continue: + case FUNCTION_PRINTER::Continue: buffer << "continue;" << endl; break; } @@ -250,18 +247,21 @@ string FunctionPrinter::endDimGuards(Option range) const return ""; } -string FunctionPrinter::beginDimGuards(string token, string args, Option range) const +string FunctionPrinter::beginDimGuards(string token, string args, Option range, std::multimap used_variables) const { stringstream buffer; if (range) { buffer << TAB << "_apply_usage" << token << "(" << args << ");" << endl; - RangeDefinitionTable rdt = range->definition(); + RangeDefinitionTable ranges = range->definition(); RangeDefinitionTable::iterator it; - int size = rdt.size(), i = 0, idx = 0; + int size = ranges.size(), idx = 1; buffer << TAB << "if ("; - for (RangeDefinition rd = rdt.begin(it); !rdt.end(it); rd = rdt.next(it), idx++) { - buffer << "(" << rdt.key(it) << " >= " << rd.begin() << " && " << rdt.key(it) << " <= " << rd.end() << ")"; - buffer << (++i < size ? " && " : ""); + for (RangeDefinition rd = ranges.begin(it); !ranges.end(it); rd = ranges.next(it), idx++) { + string variable = ranges.key(it); + if (used_variables.find(variable) != used_variables.end()) { + buffer << "(" << ranges.key(it) << " >= " << rd.begin() << " && " << ranges.key(it) << " <= " << rd.end() << ")"; + buffer << (idx < size ? " && " : ""); + } } buffer << ") {" << endl; range->addLocalVariables(); @@ -348,7 +348,7 @@ string FunctionPrinter::printAlgebraicGuards(Equation alg, Index usage) Index revert = usage.replace(); arguments = revert.usageExp(); } - buffer << printer.beginDimGuards(alg.applyId(), arguments, range); + buffer << printer.beginDimGuards(alg.applyId(), arguments, range, alg.usedVariables()); return buffer.str(); } @@ -409,7 +409,7 @@ string FunctionPrinter::equationVariableMacros(Option range, Expression l GetIndexVariables index_usage; RangeDefinitionTable range_def = range->definition(); buffer << "#define _get" << id << "_var_idxs"; - buffer << "(row, var)\\" << endl; + buffer << "(row, var)\\" << endl; multimap usage = index_usage.apply(lhs.expression()); map parse_row = parseIndexes("row", range, 1); map ctes = parseConstants(lhs); @@ -426,7 +426,7 @@ string FunctionPrinter::equationVariableMacros(Option range, Expression l for (auto index : ctes) { string local_range_var = range->getDimensionVar(index.first, USE_RANGE_DIM_VARS); buffer << TAB << local_range_var << " = " << index.second << ";\\\n"; - } + } vector exps; exps.push_back(lhs.dimVariables(USE_RANGE_DIM_VARS)); Expression a_exp = Expression::generate(lhs.reference()->name(), exps); diff --git a/src/mmoc/ir/helpers.h b/src/mmoc/ir/helpers.h index bafa21a8..2d371420 100644 --- a/src/mmoc/ir/helpers.h +++ b/src/mmoc/ir/helpers.h @@ -17,16 +17,16 @@ ******************************************************************************/ -#pragma once +#pragma once #include -#include "annotation.h" -#include "index.h" -#include "equation.h" -#include "expression.h" -#include "../util/symbol_table.h" -#include "../util/util.h" +#include +#include +#include +#include +#include +#include namespace MicroModelica { namespace IR { @@ -37,7 +37,7 @@ namespace IR { */ class ExternalFunction { public: - ExternalFunction() {}; + ExternalFunction(){}; ExternalFunction(std::string lvalue, std::string name, AST_ExpressionList args); ~ExternalFunction() = default; friend std::ostream& operator<<(std::ostream& out, const ExternalFunction& e); @@ -53,7 +53,8 @@ typedef ModelTable ExternalFunctionTable; class CompiledFunction { public: CompiledFunction(); - CompiledFunction(std::string name, std::string includeDir, std::string libraryDir, Util::SymbolTable& libraries, std::string prefix = "__"); + CompiledFunction(std::string name, std::string includeDir, std::string libraryDir, Util::SymbolTable& libraries, + std::string prefix = "__"); ~CompiledFunction() = default; inline bool hasIncludeDirectory() const { return !_includeDirectory.empty(); }; inline bool hasLibraryDirectory() const { return !_libraryDirectory.empty(); }; @@ -123,7 +124,7 @@ class FunctionPrinter { std::string getIndexes(string var, Option range, int offset, bool modelica_index) const; std::map parseIndexes(string var, Option range, int offset, bool modelica_index = true) const; std::map parseConstants(Expression ref) const; - std::string beginDimGuards(std::string token, string args, Option range) const; + std::string beginDimGuards(std::string token, string args, Option range, std::multimap used_variables) const; std::string endDimGuards(Option range) const; std::string printAlgebraicGuards(Equation alg, Index usage); /// TODO: Review modelica_index parameter usage. diff --git a/src/mmoc/tests/system/gt_data/NeuralNetwork1/NeuralNetwork1.c b/src/mmoc/tests/system/gt_data/NeuralNetwork1/NeuralNetwork1.c index 9db1aa26..bf323962 100644 --- a/src/mmoc/tests/system/gt_data/NeuralNetwork1/NeuralNetwork1.c +++ b/src/mmoc/tests/system/gt_data/NeuralNetwork1/NeuralNetwork1.c @@ -28,7 +28,7 @@ void MOD_definition(int idx, double *x, double *d, double *a, double t, double * if (_is_var_V(idx)) { _get_V_idxs(idx); _apply_usage_alg_eq_1(_d1); - if ((_d2 >= 1 && _d2 <= 1) && (i >= 1 && i <= 100)) { + if ((i >= 1 && i <= 100)) { _Is(i,0) = _Islast(i)*exp(-(_time-_tlast(i))/_taus); _Is(i,1) = 0; } @@ -180,7 +180,7 @@ void MOD_dependencies(int idx, double *x, double *d, double *a, double t, double if (_is_var_V(idx)) { _get_V_idxs(idx); _apply_usage_alg_eq_1(_d1); - if ((_d2 >= 1 && _d2 <= 1) && (i >= 1 && i <= 100)) { + if ((i >= 1 && i <= 100)) { _Is(i,0) = _Islast(i)*exp(-(_time-_tlast(i))/_taus); _Is(i,1) = 0; } @@ -204,7 +204,7 @@ void MOD_BDF_definition(double *x, double *d, double *a, double t, double *dx, i if (_is_var_V(idx)) { _get_V_idxs(idx); _apply_usage_alg_eq_1(_d1); - if ((_d2 >= 1 && _d2 <= 1) && (i >= 1 && i <= 100)) { + if ((i >= 1 && i <= 100)) { _Is(i,0) = _Islast(i)*exp(-(_time-_tlast(i))/_taus); } diff --git a/src/mmoc/util/visitors/get_index_variables.cpp b/src/mmoc/util/visitors/get_index_variables.cpp index 6c4762c1..433661a5 100644 --- a/src/mmoc/util/visitors/get_index_variables.cpp +++ b/src/mmoc/util/visitors/get_index_variables.cpp @@ -76,6 +76,23 @@ multimap GetIndexVariables::foldTraverseElement(AST_Expression } break; } + case EXPCALL: { + AST_Expression_Call call = exp->getAsCall(); + AST_ExpressionListIterator it; + foreach (it, call->arguments()) { + multimap args = apply(current_element(it)); + ret.insert(args.begin(), args.end()); + } + break; + } + case EXPCALLARG: { + AST_Expression_CallArgs call = exp->getAsCallArgs(); + AST_ExpressionListIterator it; + foreach (it, call->arguments()) { + multimap args = apply(current_element(it)); + ret.insert(args.begin(), args.end()); + } + } default: break; }