MicroModelicaCCompiler  4.5.3
equation.cpp
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 #include "equation.hpp"
21 
22 #include <list>
23 #include <sstream>
24 
25 #include "../util/ast_util.hpp"
26 #include "expression.hpp"
27 
28 /* Equation Class */
29 
30 CLASS_PRINTER_IMP(AST_Equation);
31 
32 void AST_Equation_::accept(AST_Visitor *visitor) { visitor->visit(this); }
33 
34 /* Equality Class */
35 
37 {
38  stringstream ret(stringstream::out);
39  MAKE_SPACE;
40  ret << left() << " = " << right() << ";" << endl;
41  return ret.str();
42 }
43 
44 void AST_Equation_Equality_::setLeft(AST_Expression e) { _left = e; }
45 
46 void AST_Equation_Equality_::setRight(AST_Expression e) { _right = e; }
47 
48 AST_Equation_Equality_::AST_Equation_Equality_(AST_Expression left, AST_Expression right, AST_Comment comment)
49  : _left(left), _right(right), _comment(comment)
50 {
51 }
52 
53 AST_Expression AST_Equation_Equality_::left() const { return _left; }
54 
55 AST_Expression AST_Equation_Equality_::right() const { return _right; }
56 
58 
59 AST_Comment AST_Equation_Equality_::comment() const { return _comment; }
60 
61 GET_AS_IMP(Equation, Equality);
62 
63 /* Connect Class */
64 
65 AST_Equation_Connect_::AST_Equation_Connect_(AST_Expression_ComponentReference cr1, AST_Expression_ComponentReference cr2)
66  : _cr1(cr1), _cr2(cr2)
67 {
68 }
69 
71 {
72  stringstream ret(stringstream::out);
73  MAKE_SPACE;
74  ret << "connect(" << _cr1 << "," << _cr2 << ");" << endl;
75  return ret.str();
76 }
77 
78 AST_Expression_ComponentReference AST_Equation_Connect_::left() { return _cr1; }
79 
80 AST_Expression_ComponentReference AST_Equation_Connect_::right() { return _cr2; }
81 
83 
84 /* Call Class */
85 
86 AST_Equation_Call_::AST_Equation_Call_(AST_Expression e) : _call(e) {}
87 
88 AST_Expression AST_Equation_Call_::call() const { return _call; }
89 
91 {
92  stringstream ret(stringstream::out);
93  MAKE_SPACE;
94  ret << call() << ";" << endl;
95  return ret.str();
96 }
97 
99 
100 GET_AS_IMP(Equation, Call);
101 
102 /* If equation Class */
103 
104 AST_Equation_If_::AST_Equation_If_(AST_Expression cond, AST_EquationList eql, AST_Equation_ElseList elseif, AST_EquationList else_eq)
105  : _cond(cond), _eql(eql), _else(else_eq), _else_if(elseif)
106 {
107 }
108 
109 AST_Expression AST_Equation_If_::condition() const { return _cond; }
110 
111 void AST_Equation_If_::setCondition(AST_Expression c) { _cond = c; }
112 
113 AST_EquationList AST_Equation_If_::equationList() const { return _eql; }
114 
115 AST_EquationList AST_Equation_If_::equationElseList() const { return _else; }
116 
117 AST_Equation_ElseList AST_Equation_If_::equationElseIf() const { return _else_if; }
118 
120 
122 {
123  stringstream ret(stringstream::out);
124  AST_EquationListIterator it;
125  AST_Equation_ElseListIterator else_it;
126  MAKE_SPACE;
127  ret << "if (" << condition() << ") then " << endl;
128  BEGIN_BLOCK;
129  foreach (it, equationList())
130  ret << current_element(it);
131  END_BLOCK;
132  foreach (else_it, equationElseIf()) {
133  MAKE_SPACE;
134  ret << "elseif " << current_element(else_it)->condition() << " then" << endl;
135  BEGIN_BLOCK;
136  foreach (it, current_element(else_it)->equations())
137  ret << current_element(it);
138  END_BLOCK;
139  }
140  if (equationElseList()->size()) {
141  MAKE_SPACE;
142  ret << "else" << endl;
143  BEGIN_BLOCK;
144  foreach (it, equationElseList())
145  ret << current_element(it);
146  END_BLOCK;
147  }
148  MAKE_SPACE;
149  ret << "end if;" << endl;
150  return ret.str();
151 }
152 
153 GET_AS_IMP(Equation, If);
154 
155 /* For equation Class */
156 
157 AST_Equation_For_::AST_Equation_For_(AST_ForIndexList ind, AST_EquationList eql) : _eql(eql), _ind(ind) {}
158 
160 {
161  stringstream ret(stringstream::out);
162  AST_EquationList eql = equationList();
163  AST_EquationListIterator it;
164  AST_ForIndexListIterator ind_it;
165  MAKE_SPACE;
166  AST_ListPrint(forIndexList(), ret, "for ", ",", "", " loop\n", false);
167  BEGIN_BLOCK;
168  foreach (it, eql)
169  ret << current_element(it);
170  END_BLOCK;
171  MAKE_SPACE;
172  ret << "end for;" << endl;
173  return ret.str();
174 }
175 
176 AST_EquationList AST_Equation_For_::equationList() const { return _eql; }
177 
178 AST_ForIndexList AST_Equation_For_::forIndexList() const { return _ind; }
179 
181 
182 /* For Index Class */
183 
184 AST_ForIndex_::AST_ForIndex_(AST_String var, AST_Expression exp) : _var(var), _in(exp) {}
185 
187 
188 AST_Expression AST_ForIndex_::in_exp() const { return _in; }
189 
190 CLASSP_PRINTER_IMP(AST_ForIndex);
191 
192 ostream &operator<<(ostream &os, const AST_ForIndex_ &f)
193 {
194  os << f.variable();
195  if (f.in_exp() != nullptr) {
196  os << " in " << f.in_exp();
197  }
198  return os;
199 }
200 
201 GET_AS_IMP(Equation, For);
202 
204 {
205  visitor->visit(this);
206  _in->accept(visitor);
207 }
208 
209 /* When Equation Class */
210 
211 AST_Equation_When_::AST_Equation_When_(AST_Expression cond, AST_EquationList eql, AST_Equation_ElseList elsewhen, AST_Comment c)
212  : _cond(cond), _eql(eql), _else_when(elsewhen), _comment(c)
213 {
214 }
215 
216 AST_Expression AST_Equation_When_::condition() const { return _cond; }
217 
218 AST_EquationList AST_Equation_When_::equationList() const { return _eql; }
219 
221 
222 AST_Equation_ElseList AST_Equation_When_::equationElseWhen() const { return _else_when; }
223 
224 void AST_Equation_When_::setCondition(AST_Expression e) { _cond = e; }
225 
226 AST_Comment AST_Equation_When_::comment() const { return _comment; }
227 
228 bool AST_Equation_When_::hasComment() { return _comment != nullptr; }
229 
231 {
232  stringstream ret(stringstream::out);
233  AST_EquationList eql = equationList();
234  AST_EquationListIterator it;
235  AST_Equation_ElseListIterator else_it;
236  MAKE_SPACE;
237  ret << "when " << condition() << " then" << endl;
238  BEGIN_BLOCK;
239  foreach (it, eql)
240  ret << current_element(it);
241  END_BLOCK;
242  foreach (else_it, equationElseWhen()) {
243  MAKE_SPACE;
244  ret << "elsewhen " << current_element(else_it)->condition() << " then" << endl;
245  BEGIN_BLOCK;
246  foreach (it, current_element(else_it)->equations())
247  ret << current_element(it);
248  END_BLOCK;
249  }
250 
251  MAKE_SPACE;
252  ret << "end when;" << endl;
253  return ret.str();
254 }
255 
256 GET_AS_IMP(Equation, When);
257 
258 /* Else equation Class */
259 
260 AST_Equation_Else_::AST_Equation_Else_(AST_Expression cond, AST_EquationList eqs) : _cond(cond), _eqs(eqs) {}
261 
262 AST_Expression AST_Equation_Else_::condition() const { return _cond; }
263 
264 void AST_Equation_Else_::setCondition(AST_Expression e) { _cond = e; }
265 
266 AST_EquationList AST_Equation_Else_::equations() const { return _eqs; }
267 
269 {
270  visitor->visit(this);
271  _cond->accept(visitor);
272  AST_EquationListIterator _eqs_it;
273  foreach (_eqs_it, _eqs) {
274  current_element(_eqs_it)->accept(visitor);
275  }
276 }
equation.hpp
AST_Equation_When_::comment
AST_Comment comment() const
Definition: equation.cpp:226
AST_Equation_Equality_::comment
AST_Comment comment() const
Definition: equation.cpp:59
AST_Equation_If_::condition
AST_Expression condition() const
Definition: equation.cpp:109
AST_ForIndex_::accept
void accept(AST_Visitor *visitor)
Definition: equation.cpp:203
EQWHEN
@ EQWHEN
Definition: ast_types.hpp:161
AST_Equation_::accept
void accept(AST_Visitor *visitor)
Definition: equation.cpp:32
AST_Equation_If_::_cond
AST_Expression _cond
Definition: equation.hpp:95
AST_Equation_Equality_::setLeft
void setLeft(AST_Expression)
Definition: equation.cpp:44
AST_ForIndex_
Definition: equation.hpp:114
AST_ListPrint
void AST_ListPrint(list< T1 > *l1, ostream &ret, string sec_name="", string separator=" ", string opener="", string closer="", bool block=false)
Definition: ast_types.hpp:319
AST_Equation_When_::equationType
EquationType equationType()
Definition: equation.cpp:220
END_BLOCK
#define END_BLOCK
Definition: ast_types.hpp:33
AST_Equation_If_::equationType
EquationType equationType()
Definition: equation.cpp:119
AST_Equation_Connect_::_cr2
AST_Expression_ComponentReference _cr2
Definition: equation.hpp:69
AST_Equation_Equality_::_right
AST_Expression _right
Definition: equation.hpp:56
EQCONNECT
@ EQCONNECT
Definition: ast_types.hpp:161
AST_Equation_When_::equationList
AST_EquationList equationList() const
Definition: equation.cpp:218
AST_Equation_If_::equationElseIf
AST_Equation_ElseList equationElseIf() const
Definition: equation.cpp:117
AST_Equation_For_::equationType
EquationType equationType()
Definition: equation.cpp:180
AST_Equation_Connect_::AST_Equation_Connect_
AST_Equation_Connect_(AST_Expression_ComponentReference cr1, AST_Expression_ComponentReference cr2)
Definition: equation.cpp:65
AST_Equation_Call_::_call
AST_Expression _call
Definition: equation.hpp:80
EQIF
@ EQIF
Definition: ast_types.hpp:161
AST_ForIndex_::AST_ForIndex_
AST_ForIndex_(AST_String var, AST_Expression exp)
Definition: equation.cpp:184
AST_Equation_Call_::AST_Equation_Call_
AST_Equation_Call_(AST_Expression e)
Definition: equation.cpp:86
EQFOR
@ EQFOR
Definition: ast_types.hpp:161
AST_Equation_Equality_::equationType
EquationType equationType()
Definition: equation.cpp:57
AST_String
string * AST_String
Definition: ast_types.hpp:46
AST_Equation_Call_::call
AST_Expression call() const
Definition: equation.cpp:88
AST_Equation_For_::_eql
AST_EquationList _eql
Definition: equation.hpp:110
AST_Equation_If_::AST_Equation_If_
AST_Equation_If_(AST_Expression cond, AST_EquationList eql, AST_Equation_ElseList elseif, AST_EquationList else_eq)
Definition: equation.cpp:104
AST_Equation_If_::print
string print() const
Definition: equation.cpp:121
BEGIN_BLOCK
#define BEGIN_BLOCK
Definition: ast_types.hpp:32
AST_Equation_If_::equationElseList
AST_EquationList equationElseList() const
Definition: equation.cpp:115
GET_AS_IMP
GET_AS_IMP(Equation, Equality)
AST_Equation_Equality_::setRight
void setRight(AST_Expression)
Definition: equation.cpp:46
AST_Equation_Else_::AST_Equation_Else_
AST_Equation_Else_(AST_Expression cond, AST_EquationList eqs)
Definition: equation.cpp:260
AST_Equation_Connect_::_cr1
AST_Expression_ComponentReference _cr1
Definition: equation.hpp:69
MAKE_SPACE
#define MAKE_SPACE
Definition: ast_types.hpp:30
AST_Equation_For_::forIndexList
AST_ForIndexList forIndexList() const
Definition: equation.cpp:178
AST_Equation_Else_::setCondition
void setCondition(AST_Expression e)
Definition: equation.cpp:264
AST_Equation_If_::setCondition
void setCondition(AST_Expression c)
Definition: equation.cpp:111
AST_Equation_Else_::condition
AST_Expression condition() const
Definition: equation.cpp:262
AST_Equation_Call_::print
string print() const
Definition: equation.cpp:90
AST_Equation_Connect_::right
AST_Expression_ComponentReference right()
Definition: equation.cpp:80
AST_Equation_When_::_eql
AST_EquationList _eql
Definition: equation.hpp:155
AST_Equation_If_::_else_if
AST_Equation_ElseList _else_if
Definition: equation.hpp:98
CLASSP_PRINTER_IMP
CLASSP_PRINTER_IMP(AST_ForIndex)
AST_Equation_When_::print
string print() const
Definition: equation.cpp:230
AST_Equation_For_::equationList
AST_EquationList equationList() const
Definition: equation.cpp:176
AST_Equation_Equality_::_left
AST_Expression _left
Definition: equation.hpp:56
AST_Equation_For_::_ind
AST_ForIndexList _ind
Definition: equation.hpp:111
AST_Equation_Else_::equations
AST_EquationList equations() const
Definition: equation.cpp:266
AST_Equation_When_::setCondition
void setCondition(AST_Expression e)
Definition: equation.cpp:224
AST_Equation_Else_::_cond
AST_Expression _cond
Definition: equation.hpp:137
AST_Equation_When_::equationElseWhen
AST_Equation_ElseList equationElseWhen() const
Definition: equation.cpp:222
AST_Equation_When_::AST_Equation_When_
AST_Equation_When_(AST_Expression cond, AST_EquationList eql, AST_Equation_ElseList elsewhen, AST_Comment c)
Definition: equation.cpp:211
AST_Equation_Else_::accept
void accept(AST_Visitor *visitor)
Definition: equation.cpp:268
CLASS_PRINTER_IMP
CLASS_PRINTER_IMP(AST_Equation)
AST_ForIndex_::variable
AST_String variable() const
Definition: equation.cpp:186
AST_Equation_When_::_else_when
AST_Equation_ElseList _else_when
Definition: equation.hpp:156
AST_Equation_If_::_else
AST_EquationList _else
Definition: equation.hpp:97
AST_Equation_When_::hasComment
bool hasComment()
Definition: equation.cpp:228
AST_Equation_Connect_::equationType
virtual EquationType equationType()
Definition: equation.cpp:82
AST_Equation_Equality_::right
AST_Expression right() const
Definition: equation.cpp:55
AST_Equation_Equality_::print
string print() const
Definition: equation.cpp:36
EQCALL
@ EQCALL
Definition: ast_types.hpp:161
AST_ForIndex_::_in
AST_Expression _in
Definition: equation.hpp:125
AST_Equation_If_::equationList
AST_EquationList equationList() const
Definition: equation.cpp:113
AST_Equation_When_::_comment
AST_Comment _comment
Definition: equation.hpp:157
MicroModelica::IR::RANGE::For
@ For
Definition: index.hpp:102
AST_Visitor::visit
virtual void visit(AST_Class x)=0
AST_Equation_For_::AST_Equation_For_
AST_Equation_For_(AST_ForIndexList ind, AST_EquationList eql)
Definition: equation.cpp:157
AST_Equation_When_::condition
AST_Expression condition() const
Definition: equation.cpp:216
operator<<
ostream & operator<<(ostream &os, const AST_ForIndex_ &f)
Definition: equation.cpp:192
AST_Equation_Call_::equationType
virtual EquationType equationType()
Definition: equation.cpp:98
AST_Equation_If_::_eql
AST_EquationList _eql
Definition: equation.hpp:96
EQEQUALITY
@ EQEQUALITY
Definition: ast_types.hpp:161
EquationType
EquationType
Definition: ast_types.hpp:161
AST_ForIndex_::in_exp
AST_Expression in_exp() const
Definition: equation.cpp:188
AST_Visitor
Definition: ast_util.hpp:224
AST_Equation_Equality_::AST_Equation_Equality_
AST_Equation_Equality_(AST_Expression left, AST_Expression right, AST_Comment comment)
Definition: equation.cpp:48
MicroModelica::IR::RANGE::If
@ If
Definition: index.hpp:102
AST_Equation_When_::_cond
AST_Expression _cond
Definition: equation.hpp:154
AST_Equation_Equality_::left
AST_Expression left() const
Definition: equation.cpp:53
AST_ForIndex_::_var
AST_String _var
Definition: equation.hpp:124
current_element
#define current_element(it)
Definition: ast_types.hpp:34
AST_Equation_Connect_::left
AST_Expression_ComponentReference left()
Definition: equation.cpp:78
AST_Equation_Else_::_eqs
AST_EquationList _eqs
Definition: equation.hpp:138
AST_Equation_Equality_::_comment
AST_Comment _comment
Definition: equation.hpp:57
expression.hpp
AST_Equation_Connect_::print
string print() const
Definition: equation.cpp:70
AST_Equation_For_::print
string print() const
Definition: equation.cpp:159