28 #include <util/visitors/called_functions.hpp>
35 : _stm(stm), _range(range), _block(
block), _lhs_assignments(), _rhs_assignments(), _lhs_discretes(), _lhs_states()
40 Statement::Statement(AST_Statement stm,
bool initial,
const string&
block)
41 : _stm(stm), _range(), _block(
block), _lhs_assignments(), _rhs_assignments(), _lhs_discretes(), _lhs_states()
46 void Statement::initialize()
48 StatementCalledFunctions cf;
50 _calledFunctions = cf.apply(_stm);
57 void Statement::setRange()
61 if (_stm->statementType() ==
STFOR) {
62 AST_Statement_For for_stm = _stm->getAsFor();
70 switch (_stm->statementType()) {
72 AST_Statement_If sti = _stm->getAsIf();
73 AST_StatementList stl = sti->statements();
74 AST_StatementListIterator stlit;
78 asgs.push_back(emptyRef());
80 foreach (stlit, stl) {
82 asgs.splice(asgs.end(), st.generateExps(asg));
84 AST_Statement_ElseList stelsel = sti->else_if();
85 AST_Statement_ElseListIterator stelselit;
86 foreach (stelselit, stelsel) {
90 asgs.push_back(emptyRef());
93 foreach (stlit, stl) {
98 stl = sti->else_statements();
100 foreach (stlit, stl) {
102 asgs.splice(asgs.end(), st.generateExps(asg));
109 asgs.push_back(Expression(_stm->getAsAssign()->lhs()));
111 asgs.push_back(Expression(_stm->getAsAssign()->exp()));
116 AST_Statement_For stf = _stm->getAsFor();
117 AST_StatementList stms = stf->statements();
118 AST_StatementListIterator stmit;
120 foreach (stmit, stms) {
122 asgs.splice(asgs.end(), st.generateExps(asg));
127 AST_Statement_OutputAssigment out_stm = _stm->getAsOutputAssigment();
129 AST_ExpressionList exps = out_stm->out_expressions();
130 AST_ExpressionListIterator exp_it;
131 foreach (exp_it, exps) {
136 asgs.push_back(Expression(call_exp));
146 bool Statement::checkStateAssignment(Expression exp)
const
148 assert(exp.isReference());
151 return var->isState();
154 bool Statement::isForStatement()
const {
return _stm->statementType() ==
STFOR; }
156 string Statement::printAssignment(AST_Statement_Assign asg)
const
159 switch (asg->exp()->expressionType()) {
161 code <<
"CMD_terminate();";
166 bool state_assignment = checkStateAssignment(lhs);
167 if (state_assignment) {
168 ModelConfig::instance().setReinit(
true);
170 code << lhs <<
" = " << rhs <<
";";
171 if (state_assignment) {
172 ModelConfig::instance().setReinit(
false);
180 string Statement::print()
const
183 switch (_stm->statementType()) {
185 AST_Statement_If sti = _stm->getAsIf();
186 Expression ifcond(sti->condition());
187 buffer << _block <<
"if(" << ifcond <<
") {" << endl;
188 AST_StatementList stl = sti->statements();
189 AST_StatementListIterator stlit;
190 foreach (stlit, stl) {
192 buffer << st << endl;
194 buffer << _block <<
"}";
195 AST_Statement_ElseList stelsel = sti->else_if();
196 AST_Statement_ElseListIterator stelselit;
197 foreach (stelselit, stelsel) {
199 buffer << _block <<
"else if(" << eifcond <<
") {" << endl;
201 foreach (stlit, stl) {
203 buffer << st << endl;
205 buffer << _block <<
"}";
207 stl = sti->else_statements();
209 buffer << _block <<
"else {" << endl;
210 foreach (stlit, stl) {
212 buffer << st << endl;
214 buffer << _block <<
"}";
219 buffer << _block << printAssignment(_stm->getAsAssign());
223 AST_Statement_For stf = _stm->getAsFor();
226 AST_StatementList stms = stf->statements();
227 AST_StatementListIterator stmit;
228 foreach (stmit, stms) {
230 buffer << st << endl;
232 buffer << range.end();
236 AST_Statement_OutputAssigment out_stm = _stm->getAsOutputAssigment();
237 AST_Expression call_exp =
239 Expression call(call_exp);
240 buffer << call <<
";";
249 bool Statement::isAssignment()
const {
return _stm->statementType() ==
STASSIGN; }
251 Expression Statement::emptyRef()
254 return Expression(lhs);
262 return _lhs_assignments;
264 return _rhs_assignments;
271 bool Statement::autonomous()
const
273 bool autonomous =
true;
274 for (
const auto& exp : _rhs_assignments) {
275 autonomous = autonomous && exp.autonomous();