MicroModelicaCCompiler  4.5.3
alg_usage.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 "alg_usage.hpp"
21 
22 #include "expression.hpp"
23 #include <util/model_config.hpp>
24 #include <util/util.hpp>
25 #include <util/visitors/apply_var_usage.hpp>
26 #include <util/visitors/partial_eval_exp.hpp>
27 
28 namespace MicroModelica {
29 using namespace Util;
30 namespace IR {
31 
32 VariableUsage::VariableUsage(Expression lhs, Expression rhs, Index usage)
33  : _lhs(lhs), _rhs(rhs), _replaced(), _usage(usage), _range(), _usage_map()
34 {
35  generateMapFromUsage();
36 }
37 
38 VariableUsage::VariableUsage(Expression usage, Range range) : _lhs(usage), _rhs(), _replaced(), _usage(), _range(range), _usage_map()
39 {
40  generateMapFromRange();
41 }
42 
43 VariableUsage::VariableUsage(Expression exp, Index usage) : _lhs(), _rhs(exp), _replaced(), _usage(usage), _range(), _usage_map()
44 {
45  generateMapFromLHS();
46 }
47 
48 Expression VariableUsage::lhs() const { return _usage.expression(); }
49 
50 Expression VariableUsage::rhs() const { return _rhs; }
51 
52 Expression VariableUsage::usage() const { return _replaced; }
53 
55 {
56  Index lhs_index(_lhs);
58  // The second condition could come from a merdeg matrix.
59  if (lhs_index.isConstant() || ranges.size() != lhs_index.dimension()) {
61  return;
62  }
64  int i = 0;
65  for (RangeDefinition def = ranges.begin(it); !ranges.end(it); def = ranges.next(it), i++) {
66  const bool LHS_VARIABLE = lhs_index.hasVariable(i);
67  const bool SCALAR_USAGE = def.size() == 1;
68  if (LHS_VARIABLE && SCALAR_USAGE) {
69  int new_constant = (def.begin() - lhs_index.constant(i)) / lhs_index.factor(i);
70  _usage_map[lhs_index.variable(i)] = newAST_Expression_Integer(new_constant);
71  ;
72  }
73  }
74  ApplyVariableUsage var_usage(_usage_map);
76  _replaced = Expression(var_usage.apply(_lhs.expression()));
77 }
78 
80 {
81  Index lhs_index(_lhs);
82  if (lhs_index.isConstant()) {
83  return;
84  }
85  assert(lhs_index.dimension() == _usage.dimension());
86  int dimension = lhs_index.dimension();
87  for (int i = 0; i < dimension; i++) {
88  const bool LHS_VARIABLE = lhs_index.hasVariable(i);
89  const bool RHS_VARIABLE = _usage.hasVariable(i);
90  if (LHS_VARIABLE && RHS_VARIABLE) {
91  int new_constant = (_usage.constant(i) - lhs_index.constant(i)) / lhs_index.factor(i);
92  int new_factor = _usage.factor(i) / lhs_index.factor(i);
94  AST_Expression cte = newAST_Expression_Integer(abs(new_constant));
95  AST_Expression factor = newAST_Expression_Integer(new_factor);
96  AST_Expression left = newAST_Expression_BinOp(factor, idx, BINOPMULT);
97  _usage_map[lhs_index.variable(i)] = newAST_Expression_BinOp(left, cte, ((new_constant >= 0) ? BINOPADD : BINOPSUB));
98  } else if (LHS_VARIABLE && !RHS_VARIABLE) {
99  int new_constant = (_usage.constant(i) - lhs_index.constant(i)) / lhs_index.factor(i);
100  _usage_map[lhs_index.variable(i)] = newAST_Expression_Integer(new_constant);
101  }
102  }
103  ApplyVariableUsage var_usage(_usage_map);
104  VarSymbolTable symbols = ModelConfig::instance().symbols();
105  PartialEvalExp partial_eval;
106  _rhs = Expression(partial_eval.apply(var_usage.apply(_rhs.expression())));
107 }
108 
110 {
111  int dimension = _usage.dimension();
112  for (int i = 0; i < dimension; i++) {
113  const bool REPLACE_VARIABLE = _usage.hasVariable(i);
114  if (REPLACE_VARIABLE) {
115  int new_constant = _usage.constant(i);
116  int new_factor = _usage.factor(i);
118  AST_Expression cte = newAST_Expression_Integer(abs(new_constant));
119  AST_Expression factor = newAST_Expression_Integer(new_factor);
120  AST_Expression left = newAST_Expression_BinOp(factor, idx, BINOPMULT);
121  _usage_map[_usage.variable(i)] = newAST_Expression_BinOp(left, cte, ((new_constant >= 0) ? BINOPADD : BINOPSUB));
122  }
123  }
124  ApplyVariableUsage var_usage(_usage_map);
125  VarSymbolTable symbols = ModelConfig::instance().symbols();
126  PartialEvalExp partial_eval;
127  _replaced = Expression(partial_eval.apply(var_usage.apply(_rhs.expression())));
128 }
129 
130 } // namespace IR
131 } // namespace MicroModelica
MicroModelica::IR::VariableUsage::generateMapFromLHS
void generateMapFromLHS()
Definition: alg_usage.cpp:126
ModelTable< std::string, RangeDefinition >
ModelTable::begin
iterator begin()
Definition: table.hpp:68
usage
void usage()
Definition: main.cpp:48
MicroModelica::Util::VarSymbolTable
Definition: symbol_table.hpp:184
MicroModelica::Util::ModelConfig::symbols
VarSymbolTable & symbols()
Definition: model_config.hpp:122
expression.hpp
MicroModelica::IR::Expression::expression
AST_Expression expression() const
Definition: expression.hpp:87
MicroModelica::IR::Index::constant
int constant(int dim)
Definition: index.cpp:236
MicroModelica::IR::VariableUsage::rhs
Expression rhs() const
Definition: alg_usage.cpp:67
BINOPMULT
@ BINOPMULT
Definition: ast_types.hpp:152
model_config.hpp
newAST_Expression_ComponentReferenceExp
AST_Expression newAST_Expression_ComponentReferenceExp(AST_String s)
Definition: ast_builder.cpp:198
MicroModelica::IR::Range::definition
RangeDefinitionTable definition() const
Definition: index.hpp:177
MicroModelica::IR::Expression
Definition: expression.hpp:64
ModelTable::end
iterator end()
Definition: table.hpp:70
MicroModelica::IR::Index::factor
int factor(int dim)
Definition: index.cpp:232
BINOPSUB
@ BINOPSUB
Definition: ast_types.hpp:148
MicroModelica::IR::VariableUsage::_rhs
Expression _rhs
Definition: alg_usage.hpp:97
MicroModelica::IR::VariableUsage::usage
Expression usage() const
Definition: alg_usage.cpp:69
MicroModelica::IR::Index::dimension
int dimension()
Definition: index.cpp:124
MicroModelica::IR::VariableUsage::VariableUsage
VariableUsage(Expression lhs, Expression rhs, Index usage)
Definition: alg_usage.cpp:49
alg_usage.hpp
MicroModelica::IR::Index::isConstant
bool isConstant() const
Definition: index.cpp:134
ModelTable< std::string, RangeDefinition >::iterator
std::map< std::string, RangeDefinition >::iterator iterator
Definition: table.hpp:61
newAST_Expression_BinOp
AST_Expression newAST_Expression_BinOp(AST_Expression left, AST_Expression right, BinOpType type)
Definition: ast_builder.cpp:265
MicroModelica::Util::ModelConfig::instance
static ModelConfig & instance()
Definition: model_config.hpp:87
MicroModelica::IR::VariableUsage::_replaced
Expression _replaced
Definition: alg_usage.hpp:98
MicroModelica::IR::VariableUsage::_usage_map
map< std::string, AST_Expression > _usage_map
Definition: alg_usage.hpp:101
MicroModelica::IR::VariableUsage::lhs
Expression lhs() const
Definition: alg_usage.cpp:65
MicroModelica::IR::Index
Definition: index.hpp:92
MicroModelica::IR::VariableUsage::_lhs
Expression _lhs
Definition: alg_usage.hpp:96
MicroModelica::IR::VariableUsage::generateMapFromUsage
void generateMapFromUsage()
Definition: alg_usage.cpp:96
MicroModelica
Definition: files.cpp:45
MicroModelica::IR::VariableUsage::generateMapFromRange
void generateMapFromRange()
Definition: alg_usage.cpp:71
BINOPADD
@ BINOPADD
Definition: ast_types.hpp:146
MicroModelica::IR::VariableUsage::_range
Range _range
Definition: alg_usage.hpp:100
MicroModelica::IR::Index::variable
Util::Variable variable() const
Definition: index.cpp:160
ModelTable::size
const int size() const
Definition: table.hpp:109
MicroModelica::IR::Index::hasVariable
bool hasVariable(int dim)
Definition: index.cpp:226
MicroModelica::IR::VariableUsage::_usage
Index _usage
Definition: alg_usage.hpp:99
MicroModelica::IR::Index::expression
Expression expression() const
Definition: index.cpp:126
MicroModelica::IR::RangeDefinition
Definition: index.hpp:136
newAST_Expression_Integer
AST_Expression newAST_Expression_Integer(int i)
Definition: ast_builder.cpp:130
util.hpp
ModelTable::next
Value next(iterator &it)
Definition: table.hpp:78
newAST_String
AST_String newAST_String(string s)
Definition: ast_builder.cpp:57