22 #include "../ir/reduction_functions.hpp"
27 #include "./visitors/convert_disc_red.hpp"
37 switch (stm->statementType()) {
39 AST_Statement_If sti = stm->getAsIf();
40 AST_StatementList stl = sti->statements();
41 AST_StatementListIterator stlit;
42 foreach (stlit, stl) {
45 AST_Statement_ElseList stelsel = sti->else_if();
46 AST_Statement_ElseListIterator stelselit;
47 foreach (stelselit, stelsel) {
49 foreach (stlit, stl) {
53 stl = sti->else_statements();
55 foreach (stlit, stl) {
62 AST_Statement_Assign sa = stm->getAsAssign();
63 if (sa->exp()->expressionType() ==
EXPCALLARG) {
64 AST_Expression_CallArgs eca = sa->exp()->getAsCallArgs();
65 AST_Expression_ComponentReference cr = sa->lhs();
66 int arg_num = eca->arguments()->size();
67 string function_name = cr->name();
68 const string REINIT =
"reinit";
69 const string TERMINATE =
"terminate";
70 if (function_name.compare(REINIT) == 0) {
75 AST_Expression_ComponentReference lhs =
nullptr;
76 AST_Expression rhs =
nullptr;
79 "Only variables references allowed, expressions not allowed.");
81 lhs = e->getAsComponentReference();
83 string sname = lhs->name();
88 if (!var->isState()) {
91 AST_ExpressionListIterator eli;
92 AST_ExpressionList el = eca->arguments();
105 }
else if (function_name.compare(TERMINATE) == 0) {
106 assert(sa->lhs() !=
nullptr);
107 assert(sa->exp() !=
nullptr);
116 AST_Statement_For stf = stm->getAsFor();
117 AST_StatementList stms = stf->statements();
118 AST_StatementListIterator stmit;
119 foreach (stmit, stms) {
129 void applyReduction(AST_Statement_Assign asg, AST_StatementList stms, AST_StatementListIterator stm_it)
132 ReductionFunctions<AST_Statement, ConvertDiscRed> reduction_functions(asg->exp(),
Utils::instance().
variable(asg->lhs()));
133 AST_Expression new_exp = reduction_functions.apply();
134 if (reduction_functions.hasReductionFunctions()) {
135 asg->setExp(new_exp);
136 list<AST_Statement> code = reduction_functions.code();
138 assert(code.size() == 1);
139 AST_Statement ast = code.front();
140 assert(ast !=
nullptr);
145 void reduceStatement(AST_Statement stm, AST_StatementList stms, AST_StatementListIterator stm_it)
148 if (stm->statementType() ==
STASSIGN) {
149 AST_Statement_Assign asg = stm->getAsAssign();
151 }
else if (stm->statementType() ==
STFOR) {
152 AST_Statement_For stm_for = stm->getAsFor();
153 AST_StatementList for_stms = stm_for->statements();
154 AST_StatementListIterator for_it;
155 foreach (for_it, for_stms) {
158 }
else if (stm->statementType() ==
STIF) {
159 AST_Statement_If stm_if = stm->getAsIf();
160 AST_StatementList if_stms = stm_if->statements();
161 AST_StatementListIterator if_it;
162 foreach (if_it, if_stms) {
165 AST_Statement_ElseList else_if_stms = stm_if->else_if();
166 AST_Statement_ElseListIterator else_if_it;
167 foreach (else_if_it, else_if_stms) {
169 foreach (if_it, if_stms) {
173 if_stms = stm_if->else_statements();
174 if (!if_stms->empty()) {
175 foreach (if_it, if_stms) {