MicroModelicaCCompiler  4.5.3
equation.hpp
Go to the documentation of this file.
1 /*****************************************************************************
2 
3  This file is part of QSS Solver.
4 
5  QSS Solver is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9 
10  QSS Solver is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with QSS Solver. If not, see <http://www.gnu.org/licenses/>.
17 
18  ******************************************************************************/
19 
20 #pragma once
21 
22 #include <ast/ast_types.hpp>
23 #include <util/table.hpp>
24 #include <ir/index.hpp>
25 
26 namespace MicroModelica {
27 namespace Util {
29 }
30 
31 namespace IR {
32 namespace EQUATION {
34 }
35 class EquationVariable {
36  public:
37  static std::string modelVariables(int id, EQUATION::Type type)
38  {
39  stringstream buffer;
40  if (type == EQUATION::Type::Output) {
41  buffer << "_out_exp_";
42  } else {
43  buffer << "_event_";
44  }
45  buffer << id;
46  return buffer.str();
47  };
48 };
49 
50 class Equation {
51  public:
53  Equation(AST_Expression lhs, AST_Expression rhs, Option<Range> range, EQUATION::Type type, int id);
54  Equation(AST_Expression eq, Option<Range> range, EQUATION::Type type, int id, int offset);
55  Equation(AST_Equation eq, EQUATION::Type type, int id);
56  Equation(AST_Equation eq, Range r, EQUATION::Type type, int id);
57  Equation(AST_Equation eq, Option<Range> r, EQUATION::Type type, int id);
58  ~Equation() = default;
59 
60  inline bool hasRange() const { return _range.is_initialized(); };
61  inline Expression lhs() const { return _lhs; };
62  Index index() const;
63  inline Expression rhs() const { return _rhs; };
64  inline AST_Expression equation() { return _rhs.expression(); };
65  inline bool autonomous() { return _autonomous; };
67  std::string print() const;
68  std::string macro() const;
69  inline Option<Range> range() const { return _range; };
70  inline void setRange(Option<Range> range) { _range = range; };
71  inline int id() const { return _id; };
72  inline EQUATION::Type type() const { return _type; }
73  inline bool isDerivative() const
74  {
76  }
77  inline bool isZeroCrossing() const { return _type == EQUATION::ZeroCrossing; }
78  inline bool isOutput() const { return _type == EQUATION::Output; }
79  inline bool isAlgebraic() const { return _type == EQUATION::Algebraic; }
81  friend std::ostream &operator<<(std::ostream &out, const Equation &e);
82  bool isValid() const;
83  bool hasAlgebraics();
84  std::string identifier() const;
85  bool isRHSReference() const;
86  inline void setUsage(Index usage) { _usage = usage; };
87  inline Index usage() const { return _usage; };
89  bool isRecursive() const;
91  bool isEmpty() const;
92  std::string applyId() const;
93  Equation genAlgEquation(Equation der_eq, Index rhs_usage, Index lhs_usage);
94  int arrayId() const;
95  void setAlgCode(std::string alg_code);
96  std::string algCode() const;
97  std::multimap<std::string, int> usedVariables() const;
98 
99  protected:
100  void initialize(AST_Equation eq);
101  void initialize(AST_Expression exp);
102  void initialize(AST_Expression lhs, AST_Expression rhs);
103  void setup();
104 
105  private:
106  AST_Equation _eq;
110  bool _autonomous;
113  int _id;
114  int _offset;
115  std::string _lhs_exp;
116  Index _usage;
117  std::string _alg_code;
118 };
119 
120 class EquationDefOrder {
121  public:
123  EquationDefOrder(std::string var_name, std::vector<int> var_init) : _var_name(var_name), _var_init(var_init){};
124 
125  bool operator<(const EquationDefOrder &other) const
126  {
127  int var_compare = _var_name.compare(other._var_name);
128  if (var_compare == 0) {
129  assert(_var_init.size() == other._var_init.size());
130  size_t size = _var_init.size();
131  for (size_t i = 0; i < size; i++) {
132  if (_var_init[i] < other._var_init[i]) {
133  return true;
134  }
135  }
136  return false;
137  }
138  return var_compare < 0;
139  }
140 
141  std::string variable() const { return _var_name; }
142 
143  protected:
144  std::string _var_name;
145  std::vector<int> _var_init;
146 };
147 
148 typedef std::map<int, std::list<Equation>> OrderedEquations;
149 
150 typedef std::map<EquationDefOrder, Equation> EquationOrderMap;
151 
153 
154 } // namespace IR
155 } // namespace MicroModelica
MicroModelica::IR::EquationDefOrder::_var_name
std::string _var_name
Definition: equation.hpp:161
MicroModelica::IR::Range
Definition: index.hpp:164
ModelTable< std::string, std::string >
MicroModelica::IR::Equation::_offset
int _offset
Definition: equation.hpp:131
MicroModelica::IR::Equation::isRHSReference
bool isRHSReference() const
Definition: equation.cpp:200
index.hpp
MicroModelica::IR::Equation::macro
std::string macro() const
Definition: equation.cpp:209
MicroModelica::IR::Equation::autonomous
bool autonomous()
Definition: equation.hpp:82
MicroModelica::IR::EQUATION::ClassicDerivative
@ ClassicDerivative
Definition: equation.hpp:50
MicroModelica::IR::EquationDefOrder
Definition: equation.hpp:137
MicroModelica::IR::Equation::_eq
AST_Equation _eq
Definition: equation.hpp:123
MicroModelica::IR::Equation::setRange
void setRange(Option< Range > range)
Definition: equation.hpp:87
MicroModelica::IR::Equation::_lhs
Expression _lhs
Definition: equation.hpp:124
MicroModelica::IR::Equation::_usage
Index _usage
Definition: equation.hpp:133
MicroModelica::IR::Equation::LHSVariable
Option< Util::Variable > LHSVariable() const
Definition: equation.cpp:165
MicroModelica::IR::Expression::expression
AST_Expression expression() const
Definition: expression.hpp:87
MicroModelica::IR::EquationTable
ModelTable< int, Equation > EquationTable
Definition: equation.hpp:169
MicroModelica::IR::Equation::equation
AST_Expression equation()
Definition: equation.hpp:81
MicroModelica::IR::Equation::genAlgEquation
Equation genAlgEquation(Equation der_eq, Index rhs_usage, Index lhs_usage)
Definition: equation.cpp:226
MicroModelica::IR::Equation::Equation
Equation()
Definition: equation.cpp:65
Option
Definition: util_types.hpp:32
MicroModelica::IR::EquationDefOrder::operator<
bool operator<(const EquationDefOrder &other) const
Definition: equation.hpp:142
MicroModelica::IR::Equation::_autonomous
bool _autonomous
Definition: equation.hpp:127
MicroModelica::IR::EQUATION::Type
Type
Definition: equation.hpp:50
MicroModelica::IR::Equation::_lhs_exp
std::string _lhs_exp
Definition: equation.hpp:132
MicroModelica::IR::EQUATION::Output
@ Output
Definition: equation.hpp:50
MicroModelica::IR::Equation::print
std::string print() const
Definition: equation.cpp:211
MicroModelica::IR::Equation::operator<<
friend std::ostream & operator<<(std::ostream &out, const Equation &e)
Definition: equation.cpp:185
MicroModelica::Util::SymbolTable
ModelTable< std::string, std::string > SymbolTable
Definition: equation.hpp:62
MicroModelica::IR::EquationDefOrder::_var_init
std::vector< int > _var_init
Definition: equation.hpp:162
MicroModelica::IR::Expression
Definition: expression.hpp:64
MicroModelica::IR::Equation::lhs
Expression lhs() const
Definition: equation.hpp:78
MicroModelica::IR::Equation::isValid
bool isValid() const
Definition: equation.cpp:183
MicroModelica::IR::Equation::~Equation
~Equation()=default
MicroModelica::IR::Equation::setup
void setup()
Definition: equation.cpp:147
MicroModelica::IR::Equation::calledFunctions
Util::SymbolTable calledFunctions()
Definition: equation.hpp:83
MicroModelica::IR::Equation::isZeroCrossing
bool isZeroCrossing() const
Definition: equation.hpp:94
MicroModelica::IR::Equation
Definition: equation.hpp:67
MicroModelica::IR::Equation::algCode
std::string algCode() const
Definition: equation.cpp:248
MicroModelica::IR::Equation::range
Option< Range > range() const
Definition: equation.hpp:86
MicroModelica::IR::Equation::arrayId
int arrayId() const
Definition: equation.cpp:244
MicroModelica::IR::Equation::isRecursive
bool isRecursive() const
Definition: equation.cpp:173
MicroModelica::IR::Equation::_alg_code
std::string _alg_code
Definition: equation.hpp:134
MicroModelica::IR::Equation::usage
Index usage() const
Definition: equation.hpp:104
MicroModelica::IR::Equation::setType
void setType(EQUATION::Type type)
Definition: equation.cpp:213
MicroModelica::IR::Equation::setUsage
void setUsage(Index usage)
Definition: equation.hpp:103
MicroModelica::IR::Equation::id
int id() const
Definition: equation.hpp:88
MicroModelica::IR::Equation::_id
int _id
Definition: equation.hpp:130
MicroModelica::IR::Equation::isOutput
bool isOutput() const
Definition: equation.hpp:95
MicroModelica::IR::Equation::_calledFunctions
Util::SymbolTable _calledFunctions
Definition: equation.hpp:128
MicroModelica::IR::EQUATION::QSSDerivative
@ QSSDerivative
Definition: equation.hpp:50
MicroModelica::IR::Equation::_type
EQUATION::Type _type
Definition: equation.hpp:129
MicroModelica::IR::Index
Definition: index.hpp:92
MicroModelica::IR::EQUATION::Dependency
@ Dependency
Definition: equation.hpp:50
MicroModelica::IR::Equation::identifier
std::string identifier() const
Definition: equation.cpp:161
MicroModelica::IR::Equation::applyUsage
void applyUsage(Index usage)
Definition: equation.cpp:215
MicroModelica::IR::OrderedEquations
std::map< int, std::list< Equation > > OrderedEquations
Definition: equation.hpp:165
MicroModelica
Definition: files.cpp:45
MicroModelica::IR::Equation::applyId
std::string applyId() const
Definition: equation.cpp:163
MicroModelica::IR::Equation::_range
Option< Range > _range
Definition: equation.hpp:126
MicroModelica::IR::Equation::index
Index index() const
Definition: equation.cpp:191
MicroModelica::IR::EquationVariable::modelVariables
static std::string modelVariables(int id, EQUATION::Type type)
Definition: equation.hpp:54
table.hpp
ast_types.hpp
MicroModelica::IR::Equation::hasRange
bool hasRange() const
Definition: equation.hpp:77
MicroModelica::IR::EQUATION::ZeroCrossing
@ ZeroCrossing
Definition: equation.hpp:50
MicroModelica::IR::Equation::usedVariables
std::multimap< std::string, int > usedVariables() const
Definition: equation.cpp:250
MicroModelica::IR::Equation::setAlgCode
void setAlgCode(std::string alg_code)
Definition: equation.cpp:246
MicroModelica::IR::EquationDefOrder::variable
std::string variable() const
Definition: equation.hpp:158
MicroModelica::IR::EquationOrderMap
std::map< EquationDefOrder, Equation > EquationOrderMap
Definition: equation.hpp:167
MicroModelica::IR::EQUATION::Algebraic
@ Algebraic
Definition: equation.hpp:50
MicroModelica::IR::EquationDefOrder::EquationDefOrder
EquationDefOrder()
Definition: equation.hpp:139
MicroModelica::IR::Equation::rhs
Expression rhs() const
Definition: equation.hpp:80
MicroModelica::IR::EQUATION::QSSBDFDerivative
@ QSSBDFDerivative
Definition: equation.hpp:50
MicroModelica::IR::Equation::initialize
void initialize(AST_Equation eq)
Definition: equation.cpp:130
MicroModelica::IR::Equation::isDerivative
bool isDerivative() const
Definition: equation.hpp:90
MicroModelica::IR::Equation::hasAlgebraics
bool hasAlgebraics()
Definition: equation.cpp:202
MicroModelica::IR::Equation::_rhs
Expression _rhs
Definition: equation.hpp:125
MicroModelica::IR::Equation::type
EQUATION::Type type() const
Definition: equation.hpp:89
MicroModelica::IR::Equation::isAlgebraic
bool isAlgebraic() const
Definition: equation.hpp:96
MicroModelica::IR::Equation::isEmpty
bool isEmpty() const
Definition: equation.cpp:198