MicroModelicaCCompiler  4.5.3
class.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 "class.hpp"
21 
22 #include <iterator>
23 #include <sstream>
24 #include <utility>
25 
26 #include <ast/ast_builder.hpp>
27 #include <ast/composition.hpp>
28 #include <ast/equation.hpp>
29 #include <ast/expression.hpp>
30 #include <ast/modification.hpp>
31 #include <ast/statement.hpp>
32 #include <ir/helpers.hpp>
33 #include <util/error.hpp>
34 #include <util/model_config.hpp>
36 #include <util/util.hpp>
37 #include <util/visitors/convert_condition.hpp>
38 #include <util/visitors/convert_cont_red.hpp>
39 #include <util/visitors/convert_equation.hpp>
40 #include <util/visitors/convert_output_range.hpp>
41 #include <util/visitors/convert_statement.hpp>
42 #include <util/visitors/eval_init_exp.hpp>
43 #include <util/visitors/partial_eval_exp.hpp>
44 #include <util/visitors/variable_lookup.hpp>
45 
46 namespace MicroModelica {
47 using namespace Deps;
48 using namespace Util;
49 namespace IR {
50 
51 /* Function Class Implementation*/
52 
54  : _imports(),
55  _name(),
56  _local_symbols(),
57  _statements(),
58  _packages(),
59  _arguments(),
60  _output_nbr(0),
61  _external_function_id(0),
62  _statement_id(0),
63  _external_functions()
64 {
65 }
66 
67 Function::Function(string name)
68  : _imports(),
69  _name(name),
70  _local_symbols(),
71  _statements(),
72  _packages(),
73  _arguments(),
74  _output_nbr(0),
75  _external_function_id(0),
76  _statement_id(0),
77  _external_functions()
78 {
79 }
80 
81 VarSymbolTable Function::symbols() const { return _local_symbols; }
82 
83 void Function::insert(string n)
84 {
85  _imports.insert(n, n);
86  if (!Utils::instance().readPackage(n, _packages)) {
87  Error::instance().add(0, EM_IR | EM_CANT_OPEN_FILE, ER_Error, "%s.moo", n.c_str());
88  }
89  Option<CompiledPackage> cp = _packages[n];
90  if (cp) {
91  Utils::instance().addCompiledFunctions(cp->definitions());
92  }
93 }
94 
95 void Function::insert(AST_Equation eq) { return; }
96 
97 void Function::insert(AST_Statement stm) { _statements.insert(++_statement_id, Statement(stm)); }
98 
99 void Function::insert(AST_Statement stm, bool initial) { insert(stm); }
100 
101 void Function::insert(AST_External_Function_Call efc)
102 {
103  string lvalue;
104  VariableLookup var_lookup(symbols());
105  if (efc->hasComponentReference()) {
106  AST_Expression_ComponentReference cr = efc->componentReference();
107  if (!var_lookup.apply(cr)) {
108  Error::instance().add(efc->lineNum(), EM_IR | EM_VARIABLE_NOT_FOUND, ER_Error, "Insert external function call: %s",
109  cr->name().c_str());
110  return;
111  }
112  lvalue = cr->name();
113  }
114  AST_ExpressionListIterator eli;
115  if (efc->args() != nullptr) {
116  foreach (eli, efc->args()) {
117  if (!var_lookup.apply(current_element(eli))) {
118  Error::instance().add(efc->lineNum(), EM_IR | EM_VARIABLE_NOT_FOUND, ER_Error, "External function call.");
119  return;
120  }
121  }
122  }
123  _external_functions.insert(++_external_function_id, ExternalFunction(lvalue, efc->name(), efc->args()));
124 }
125 
126 void Function::insert(VarName n, Variable &vi, DEC_Type type)
127 {
128  EvalInitExp eval;
129  vi.setName(n);
130  if (vi.typePrefix() & TP_CONSTANT) {
131  vi.setValue(eval.apply(vi.modification()->getAsEqual()->exp()));
132  }
133  _local_symbols.insert(n, vi);
134  if (type == DEC_PUBLIC) {
135  if (vi.isOutput()) {
136  _output_nbr++;
137  }
138  _arguments.push_back(vi);
139  }
140 }
141 
142 void Function::insert(VarName n, Variable &vi) { insert(n, vi, DEC_PUBLIC); }
143 
144 void Function::insert(AST_Argument_Modification x)
145 {
146  if (!_annotations.insert(x)) {
147  Error::instance().add(x->lineNum(), EM_IR | EM_ANNOTATION_NOT_FOUND, ER_Error, "%s", x->name()->c_str());
148  }
149 }
150 
151 string Function::name() const { return _name; }
152 
153 ImportTable Function::imports() const { return _imports; }
154 
155 StatementTable Function::statements() const { return _statements; }
156 
157 ExternalFunctionTable Function::externalFunctions() const { return _external_functions; }
158 
159 CompiledPackageTable Function::packages() const { return _packages; }
160 
161 unsigned int Function::outputNbr() const { return _output_nbr; }
162 
163 FunctionAnnotation Function::annotations() const { return _annotations; }
164 
165 Util::VariableList Function::arguments() const { return _arguments; }
166 
167 /* Package Class Implementation */
168 
169 Package::Package(string name) : _imports(), _name(name), _functions(), _packages() {}
170 
171 VarSymbolTable Package::symbols() const { return VarSymbolTable(); }
172 
173 void Package::insert(string n) { _imports.insert(n, n); }
174 
175 void Package::insert(AST_Equation eq) {}
176 
177 void Package::insert(AST_Statement stm) {}
178 
179 void Package::insert(AST_Statement stm, bool initial) {}
180 
182 
183 void Package::insert(AST_External_Function_Call efc) {}
184 
185 void Package::insert(VarName n, Variable &vi, DEC_Type type) {}
186 
187 void Package::insert(VarName n, Variable &vi) {}
188 
189 void Package::insert(AST_Argument_Modification x) {}
190 
191 string Package::name() const { return _name; }
192 
193 ImportTable Package::imports() const { return _imports; }
194 
196 
197 string Package::fileName() { return Utils::instance().packageName(_name); }
198 
199 string Package::prefix() { return "__" + _name + "__"; }
200 
201 /* Model Class Implementation */
202 
203 Model::Model()
204  : _name(),
205  _imports(),
206  _annotations(),
207  _called_functions(),
208  _derivatives(),
209  _ordered_derivatives(),
210  _algebraics(),
211  _events(),
212  _dependencies(),
213  _packages(),
214  _initial_code(),
215  _library_directories(),
216  _link_libraries(),
217  _include_directories(),
218  _ast_equations(),
219  _ast_statements(),
220  _state_nbr(0),
221  _discrete_nbr(0),
222  _algebraic_nbr(0),
223  _event_nbr(0),
224  _output_nbr(0),
225  _input_nbr(0),
226  _derivative_id(1),
227  _algebraic_id(1),
228  _event_id(1),
229  _output_id(1),
230  _input_id(1),
231  _external_functions(false)
232 {
233 }
234 
235 Model::Model(string name)
236  : _name(name),
237  _imports(),
238  _annotations(),
239  _called_functions(),
240  _derivatives(),
241  _ordered_derivatives(),
242  _algebraics(),
243  _events(),
244  _dependencies(),
245  _packages(),
246  _initial_code(),
247  _library_directories(),
248  _link_libraries(),
249  _include_directories(),
250  _ast_equations(),
251  _ast_statements(),
252  _state_nbr(0),
253  _discrete_nbr(0),
254  _algebraic_nbr(0),
255  _event_nbr(0),
256  _output_nbr(0),
257  _input_nbr(0),
258  _derivative_id(1),
259  _algebraic_id(1),
260  _event_id(1),
261  _output_id(1),
262  _input_id(1),
263  _external_functions(false)
264 {
265 }
266 
268 
269 void Model::insert(VarName n, Variable &vi, DEC_Type type) { insert(n, vi); }
270 
271 void Model::insert(VarName n, Variable &vi)
272 {
273  vi.setName(n);
274  if (vi.typePrefix() & TP_CONSTANT) {
275  EvalInitExp eval;
276  vi.setValue(eval.apply(vi.exp()));
277  }
278  if (vi.typePrefix() & TP_DISCRETE) {
279  vi.setOffset(_discrete_nbr);
280  _discrete_nbr += vi.size();
281  }
283 }
284 
285 void Model::setVariableOffset(Variable var, unsigned int &offset, Util::Variable::RealType type, bool set_variable_count)
286 {
287  if (!var.hasOffset()) {
288  var.setOffset(offset);
289  var.setRealType(type);
290  if (set_variable_count) {
291  offset += var.size();
292  }
293  }
294  ModelConfig::instance().addVariable(var.name(), var);
295 }
296 
297 void Model::setRealVariables(AST_Equation eq)
298 {
299  AST_Equation_Equality eqe = eq->getAsEquality();
300  if (eqe->left()->expressionType() == EXPDERIVATIVE) {
301  AST_Expression_Derivative ed = eqe->left()->getAsDerivative();
302  AST_Expression derArg = AST_ListFirst(ed->arguments());
303  setVariableOffset(Utils::instance().variable(derArg), _state_nbr, Variable::RealType::State);
304  } else if (eqe->left()->expressionType() == EXPCOMPREF) {
306  } else if (eqe->left()->expressionType() == EXPOUTPUT) {
307  AST_Expression_Output eout = eqe->left()->getAsOutput();
308  AST_ExpressionList el = eout->expressionList();
309  AST_ExpressionListIterator it;
310  list<string> lvars;
311  list<Index> lidx;
312  foreach (it, el) {
314  }
315  } else {
316  Error::instance().add(eq->lineNum(), EM_IR | EM_UNKNOWN_ODE, ER_Error, "Insert model equation.");
317  }
318 }
319 
320 void Model::insert(AST_Equation eq)
321 {
322  AST_Equation teq = ConvertEquation(eq).get();
323  _ast_equations.push_back(teq);
324  if (teq->equationType() == EQEQUALITY) {
325  setRealVariables(teq);
326  } else if (teq->equationType() == EQFOR) {
327  AST_Equation_For eqf = teq->getAsFor();
328  AST_EquationList eqs = eqf->equationList();
329  AST_EquationListIterator it;
330  foreach (it, eqs) {
331  if (current_element(it)->equationType() == EQFOR) {
332  insert(current_element(it));
333  } else {
335  }
336  }
337  } else {
338  Error::instance().add(eq->lineNum(), EM_IR | EM_UNKNOWN_ODE, ER_Error, "Equation type not recognized.");
339  }
340 }
341 
342 void Model::insert(AST_Statement stm) { insert(stm, false); }
343 
344 void Model::insert(AST_External_Function_Call efc) { return; }
345 
346 void Model::insert(AST_Statement stm, bool initial)
347 {
348  AST_Statement st = ConvertStatement(stm).get();
349  if (initial) {
350  _initial_code.insert(_statement_id++, Statement(stm, initial));
351  } else {
352  _ast_statements.push_back(st);
353  }
354 }
355 
357 {
359  for (string s = symbols.begin(fit); !symbols.end(fit); s = symbols.next(fit)) {
360  Option<Function> ef = fs[s];
361  if (ef) {
362  SymbolTable libraries;
363  _called_functions.insert(s, ef.get());
364  FunctionAnnotation fa = ef->annotations();
365  if (fa.hasIncludeDirectory()) {
366  string in = fa.includeDirectory();
368  }
369  if (fa.hasLibraryDirectory()) {
370  string in = fa.libraryDirectory();
372  }
373  if (fa.hasLibraries()) {
374  libraries = fa.libraries();
375  _link_libraries.merge(libraries);
376  }
377  CompiledFunction cf(s, fa.includeDirectory(), fa.libraryDirectory(), libraries);
379  _external_functions = true;
380  }
381  }
382 }
383 
385 {
387  for (Statement stm = _initial_code.begin(stm_it); !_initial_code.end(stm_it); stm = _initial_code.next(stm_it)) {
388  addFunction(stm.calledFunctions(), fs);
389  }
391  for (Equation eq = _derivatives.begin(it); !_derivatives.end(it); eq = _derivatives.next(it)) {
392  addFunction(eq.calledFunctions(), fs);
393  }
394  for (Equation eq = _algebraics.begin(it); !_algebraics.end(it); eq = _algebraics.next(it)) {
395  addFunction(eq.calledFunctions(), fs);
396  }
398  for (Event ev = _events.begin(eit); !_events.end(eit); ev = _events.next(eit)) {
399  addFunction(ev.zeroCrossing().calledFunctions(), fs);
401  StatementTable stms = ev.positiveHandler();
402  for (Statement stm = stms.begin(sit); !stms.end(sit); stm = stms.next(sit)) {
403  addFunction(stm.calledFunctions(), fs);
404  }
405  stms = ev.negativeHandler();
406  for (Statement stm = stms.begin(sit); !stms.end(sit); stm = stms.next(sit)) {
407  addFunction(stm.calledFunctions(), fs);
408  }
409  }
410 }
411 
412 void Model::insert(AST_Argument_Modification x)
413 {
414  if (!_annotations.insert(x)) {
415  Error::instance().add(x->lineNum(), EM_IR | EM_ANNOTATION_NOT_FOUND, ER_Error, "%s", x->name()->c_str());
416  }
417 }
418 
419 void Model::insert(string n)
420 {
421  _imports.insert(n, n);
422  if (!Utils::instance().readPackage(n, _packages)) {
423  Error::instance().add(0, EM_IR | EM_CANT_OPEN_FILE, ER_Error, "%s.moo", n.c_str());
424  }
426  if (cp) {
427  Utils::instance().addCompiledFunctions(cp->definitions());
428  _link_libraries.merge(cp->linkLibraries());
429  _library_directories.merge(cp->libraryDirectories());
430  _include_directories.merge(cp->includeDirectories());
431  }
432 }
433 
434 void Model::addEquation(AST_Equation eq, Option<Range> range)
435 {
436  assert(eq->equationType() == EQEQUALITY);
437  AST_Equation_Equality eqe = eq->getAsEquality();
439  if (eqe->left()->expressionType() == EXPDERIVATIVE) {
440  Equation mse(eq, range, t, _derivative_id);
441  _annotations.expComment(eqe->comment(), _derivative_id);
443  } else if (eqe->left()->expressionType() == EXPCOMPREF) {
444  Equation mse(eq, range, EQUATION::Algebraic, _algebraic_id);
446  } else if (eqe->left()->expressionType() == EXPOUTPUT) {
447  if (eqe->right()->expressionType() != EXPCALL) {
448  Error::instance().add(eqe->lineNum(), EM_IR | EM_UNKNOWN_ODE, ER_Error, "Insert model equation.");
449  }
450  AST_Expression_Output eout = eqe->left()->getAsOutput();
451  AST_ExpressionList el = eout->expressionList();
452  AST_ExpressionListIterator it;
453  foreach (it, el) {
454  Equation mse(eq, range, EQUATION::Algebraic, _algebraic_id);
456  }
457  } else {
458  Error::instance().add(eq->lineNum(), EM_IR | EM_UNKNOWN_ODE, ER_Error, "Equation type not recognized.");
459  }
460 }
461 
462 void Model::reduceEquation(AST_Equation_Equality eq, list<AST_Equation> &new_eqs)
463 {
464  if (eq->left()->expressionType() != EXPOUTPUT) {
465  ReductionFunctions<AST_Equation, ConvertContRed> reduction_functions(eq->right(), Utils::instance().variable(eq->left()));
466  AST_Expression new_exp = reduction_functions.apply();
467  eq->setRight(new_exp);
468  list<AST_Equation> code = reduction_functions.code();
469  new_eqs.insert(new_eqs.end(), code.begin(), code.end());
470  list<Variable> variables = reduction_functions.variables();
471  for (Variable v : variables) {
473  }
474  }
475 }
476 
478 {
479  EquationTable bdf_equations;
481  for (Equation der = _derivatives.begin(it); !_derivatives.end(it); der = _derivatives.next(it)) {
482  Equation bdf_der = der;
484  bdf_equations.insert(bdf_der.id(), bdf_der);
485  }
486  return bdf_equations;
487 }
488 
490 {
491  Option<Variable> eq_var = eq.LHSVariable();
492  assert(eq_var);
493  string var_name = eq_var->name();
494  Index var_index(eq.lhs());
495  return EquationDefOrder(var_name, var_index.initValues(eq.range()));
496 }
497 
499 {
500  EquationOrderMap equation_map;
501  OrderedEquations orderded_derivatives;
503  for (Equation eq = _derivatives.begin(eq_it); !_derivatives.end(eq_it); eq = _derivatives.next(eq_it)) {
504  equation_map.insert(make_pair(getEquationDefOrder(eq), eq));
505  }
506 
507  EquationOrderMap::iterator map_it;
508  for (map_it = equation_map.begin(); map_it != equation_map.end(); map_it++) {
509  Option<Variable> var = ModelConfig::instance().lookup(map_it->first.variable());
510  assert(var);
511  list<Equation> current_eqs = orderded_derivatives[var->offset()];
512  current_eqs.push_back(map_it->second);
513  orderded_derivatives[var->offset()] = current_eqs;
514  }
515  OrderedEquations::iterator ord_eq_it;
516  int total_ord = 1;
517  for (ord_eq_it = orderded_derivatives.begin(); ord_eq_it != orderded_derivatives.end(); ord_eq_it++) {
518  list<Equation> ordered_eqs = ord_eq_it->second;
519  for (Equation ord_eq : ordered_eqs) {
520  _ordered_derivatives.insert(total_ord++, ord_eq);
521  }
522  }
523 }
524 
525 void Model::setEquations()
526 {
527  list<AST_Equation> new_eqs;
528  list<AST_Equation>::iterator it;
529  for (it = _ast_equations.begin(); it != _ast_equations.end(); it++) {
530  AST_Equation eq = current_element(it);
531  if (eq->equationType() == EQEQUALITY) {
532  reduceEquation(eq->getAsEquality(), new_eqs);
533  } else if (eq->equationType() == EQFOR) {
534  AST_Equation_For eqf = eq->getAsFor();
535  AST_EquationList eqs = eqf->equationList();
536  AST_EquationListIterator for_eq_it;
537  foreach (for_eq_it, eqs) {
538  assert(current_element(for_eq_it)->equationType() == EQEQUALITY);
539  reduceEquation(current_element(for_eq_it)->getAsEquality(), new_eqs);
540  }
541  }
542  }
543  _ast_equations.insert(_ast_equations.end(), new_eqs.begin(), new_eqs.end());
544  for (it = _ast_equations.begin(); it != _ast_equations.end(); it++) {
545  AST_Equation eq = current_element(it);
546  if (eq->equationType() == EQEQUALITY) {
547  addEquation(eq, Option<Range>());
548  } else if (eq->equationType() == EQFOR) {
549  vector<int> begin, end;
550  AST_Equation_For eqf = eq->getAsFor();
551  Range range(eqf);
552  AST_EquationList eqs = eqf->equationList();
553  AST_EquationListIterator for_eq_it;
554  foreach (for_eq_it, eqs) {
555  addEquation(current_element(for_eq_it), range);
556  }
557  }
558  }
559  orderEquations();
560 }
561 
562 void Model::addVariable(int id, Option<Range> range, EQUATION::Type type, unsigned int &offset)
563 {
564  vector<int> s;
565  if (range) {
566  RangeDefinitionTable ranges = range->definition();
568  for (RangeDefinition def = ranges.begin(it); !ranges.end(it); def = ranges.next(it)) {
569  s.push_back(def.size());
570  }
571  }
572  TypePrefix eq_type = TP_EQ;
573  if (type == EQUATION::Type::Output) {
574  eq_type = TP_OUTPUT;
575  }
576  Variable var(newType_Integer(), eq_type, nullptr, nullptr, s, !s.empty());
577  string var_name = EquationVariable::modelVariables(id, type);
578  insert(var_name, var);
580  static bool DONT_INCREASE_OFFSET = false;
581  setVariableOffset(variable.get(), offset, Variable::RealType::NotAssigned, DONT_INCREASE_OFFSET);
582 }
583 
585 {
586  int offset_shift = 0;
587  if (range) {
588  RangeDefinitionTable rdt = range->definition();
590  int i = 0;
591  for (RangeDefinition rd = rdt.begin(it); !rdt.end(it); rd = rdt.next(it), i++) {
592  offset_shift += i * range->rowSize(i) + rd.cBegin();
593  }
594  }
595  return offset_shift;
596 }
597 
598 void Model::addEvent(AST_Statement stm, Option<Range> range)
599 {
600  if (stm->statementType() == STWHEN) {
601  int new_event = false;
602  unsigned int event_offset = _event_nbr - computeEventOffsetShift(range);
603  AST_Statement_When sw = stm->getAsWhen();
604  _annotations.expComment(sw->comment(), _event_id);
605  addVariable(_event_id, range, EQUATION::Type::ZeroCrossing, event_offset);
606  Event event(sw->condition(), _event_id, event_offset, range, _annotations.EventId());
607  _event_nbr += (range ? range->size() : 1);
608  AST_StatementList stl = sw->statements();
609  AST_StatementListIterator it;
610  foreach (it, stl) {
611  event.add(current_element(it));
612  }
613  if (sw->hasElsewhen()) {
614  AST_Statement_ElseList ewl = sw->else_when();
615  AST_Statement_ElseListIterator ewit;
616  foreach (ewit, ewl) {
617  AST_Statement_Else se = current_element(ewit);
618  Event else_event = event;
619  if (!else_event.compare(se->condition())) {
620  event_offset = _event_nbr - computeEventOffsetShift(range);
621  addVariable(_event_id + 1, range, EQUATION::Type::ZeroCrossing, event_offset);
622  else_event = Event(se->condition(), _event_id + 1, event_offset, range, _annotations.EventId());
623  _event_nbr += (range ? range->size() : 1);
624  new_event = true;
625  }
626  AST_StatementList stel = se->statements();
627  AST_StatementListIterator steit;
628  foreach (steit, stel) {
629  else_event.add(current_element(steit));
630  }
631  if (new_event) {
632  _events.insert(_event_id + 1, else_event);
633  } else {
634  event = else_event;
635  }
636  }
637  }
638  _events.insert(_event_id++, event);
639  if (new_event) {
640  _event_id++;
641  }
642  }
643 }
644 
645 void Model::reduceEvent(AST_Statement_When event)
646 {
647  assert(event->statementType() == STWHEN);
648  AST_StatementList stms = event->statements();
649  AST_StatementListIterator stm_it;
650  foreach (stm_it, stms) {
651  reduceStatement(current_element(stm_it), stms, stm_it);
652  }
653  if (event->hasElsewhen()) {
654  AST_Statement_ElseList else_when = event->else_when();
655  AST_Statement_ElseListIterator else_when_it;
656  foreach (else_when_it, else_when) {
657  AST_Statement_Else else_stm = current_element(else_when_it);
658  stms = else_stm->statements();
659  foreach (stm_it, stms) {
660  reduceStatement(current_element(stm_it), stms, stm_it);
661  }
662  }
663  }
664 }
665 
666 void Model::setEvents()
667 {
668  list<AST_Statement>::iterator it;
669  for (it = _ast_statements.begin(); it != _ast_statements.end(); it++) {
670  AST_Statement stm = *it;
671  if (stm->statementType() == STWHEN) {
672  reduceEvent(stm->getAsWhen());
673  } else if (stm->statementType() == STFOR) {
674  AST_Statement_For for_stm = stm->getAsFor();
675  AST_StatementList stms = for_stm->statements();
676  AST_StatementListIterator stm_it;
677  foreach (stm_it, stms) {
678  reduceEvent(current_element(stm_it)->getAsWhen());
679  }
680  }
681  }
682  for (it = _ast_statements.begin(); it != _ast_statements.end(); it++) {
683  AST_Statement stm = *it;
684  if (stm->statementType() == STWHEN) {
685  addEvent(stm, Option<Range>());
686  } else if (stm->statementType() == STFOR) {
687  AST_Statement_For stf = stm->getAsFor();
688  Range range(stf, RANGE::For);
689  AST_StatementList sts = stf->statements();
690  AST_StatementListIterator stit;
691  foreach (stit, sts) {
692  addEvent(current_element(stit), range);
693  }
694  }
695  }
696 }
697 
698 void Model::setOutputs()
699 {
700  list<AST_Expression> ast_outputs = _annotations.output();
701  list<AST_Expression>::iterator it;
702  for (it = ast_outputs.begin(); it != ast_outputs.end(); it++) {
703  PartialEvalExp partial_eval;
704  AST_Expression reduced_out_exp = partial_eval.apply(*it);
705  ConvertOutputRange convert;
706  AST_Expression converted = convert.apply(reduced_out_exp);
707  Option<Range> range = convert.range();
709  Equation eq(converted, range, EQUATION::Output, _output_id, _output_nbr);
710  _output_nbr += (range ? range->size() : 1);
711  _outputs.insert(_output_id++, eq);
712  }
713 }
714 
716 {
717  if (!eq.autonomous()) {
718  _input_nbr += (eq.hasRange() ? eq.range()->size() : 1);
720  _input_id++;
721  }
722 }
723 
724 void Model::setInputs()
725 {
727  for (Equation eq = _derivatives.begin(it); !_derivatives.end(it); eq = _derivatives.next(it)) {
728  if (!eq.autonomous()) {
729  addInput(eq);
730  continue;
731  }
732  }
733 }
734 
736 {
737  _dependencies.compute(derivatives(), outputs(), algebraics(), events());
739 }
740 
742 {
750 }
751 } // namespace IR
752 } // namespace MicroModelica
MicroModelica::IR::FunctionAnnotation::includeDirectory
string includeDirectory()
Definition: annotation.cpp:131
equation.hpp
MicroModelica::Util::ModelConfig::lookup
Option< Variable > lookup(std::string var_name)
Definition: model_config.hpp:125
MicroModelica::IR::Range
Definition: index.hpp:164
EXPOUTPUT
@ EXPOUTPUT
Definition: ast_types.hpp:182
MicroModelica::Util::Error::instance
static Error & instance()
Definition: error.hpp:128
ModelTable< std::string, std::string >
MicroModelica::IR::CompiledFunction
Definition: helpers.hpp:87
EM_ANNOTATION_NOT_FOUND
#define EM_ANNOTATION_NOT_FOUND
Definition: error.hpp:117
MicroModelica::IR::Model::_called_functions
FunctionTable _called_functions
Definition: class.hpp:229
ModelTable::begin
iterator begin()
Definition: table.hpp:68
MicroModelica::IR::ModelAnnotation::insert
bool insert(AST_Argument_Modification x)
Definition: annotation.cpp:266
ast_builder.hpp
MicroModelica::Util::Variable::setRealType
void setRealType(RealType type)
Definition: symbol_table.hpp:86
MicroModelica::IR::Model::algebraics
EquationTable algebraics()
Definition: class.hpp:190
EXPCOMPREF
@ EXPCOMPREF
Definition: ast_types.hpp:165
MicroModelica::Util::VarSymbolTable
Definition: symbol_table.hpp:184
MicroModelica::Util::ModelConfig::symbols
VarSymbolTable & symbols()
Definition: model_config.hpp:122
MicroModelica::IR::Model::_output_nbr
unsigned int _output_nbr
Definition: class.hpp:248
MicroModelica::Util::Variable
Definition: symbol_table.hpp:75
MicroModelica::IR::Equation::autonomous
bool autonomous()
Definition: equation.hpp:82
MicroModelica::Util::Utils::packageName
std::string packageName(std::string name)
Definition: util.cpp:298
MicroModelica::IR::EQUATION::ClassicDerivative
@ ClassicDerivative
Definition: equation.hpp:50
MicroModelica::IR::Model::_initial_code
StatementTable _initial_code
Definition: class.hpp:238
TP_EQ
@ TP_EQ
Definition: ast_types.hpp:202
MicroModelica::IR::EquationDefOrder
Definition: equation.hpp:137
MicroModelica::IR::Model::_packages
CompiledPackageTable _packages
Definition: class.hpp:237
MicroModelica::IR::Model::_events
EventTable _events
Definition: class.hpp:234
MicroModelica::IR::Model::_algebraic_id
int _algebraic_id
Definition: class.hpp:251
MicroModelica::IR::Model::Model
Model()
Definition: class.cpp:220
MicroModelica::Util::Variable::size
unsigned int size()
Definition: symbol_table.cpp:192
MicroModelica::IR::Model::_input_nbr
unsigned int _input_nbr
Definition: class.hpp:249
MicroModelica::Util::ModelConfig::setAlgebraics
void setAlgebraics(IR::EquationTable algebraics)
Definition: model_config.hpp:95
MicroModelica::Util::Variable::hasOffset
bool hasOffset() const
Definition: symbol_table.hpp:138
MicroModelica::IR::Equation::LHSVariable
Option< Util::Variable > LHSVariable() const
Definition: equation.cpp:165
MicroModelica::IR::Model::reduceEquation
void reduceEquation(AST_Equation_Equality eq, list< AST_Equation > &new_eqs)
Definition: class.cpp:479
MicroModelica::IR::Model::_dependencies
Deps::ModelDependencies _dependencies
Definition: class.hpp:236
MicroModelica::IR::EquationTable
ModelTable< int, Equation > EquationTable
Definition: equation.hpp:169
MicroModelica::IR::Model::addEvent
void addEvent(AST_Statement stm, Option< Range > range)
Definition: class.cpp:615
MicroModelica::IR::Model::_ast_statements
std::list< AST_Statement > _ast_statements
Definition: class.hpp:243
MicroModelica::IR::Package::_imports
Util::ImportTable _imports
Definition: class.hpp:154
MicroModelica::IR::Model::_external_functions
bool _external_functions
Definition: class.hpp:256
MicroModelica::Generator::Function::Function
Function(IR::Function &function, Util::CompileFlags &flags, WriterPtr writer)
Definition: function.cpp:47
MicroModelica::IR::Package::name
string name() const
Definition: class.cpp:208
MicroModelica::IR::FunctionAnnotation::hasIncludeDirectory
bool hasIncludeDirectory()
Definition: annotation.cpp:71
TP_CONSTANT
@ TP_CONSTANT
Definition: ast_types.hpp:200
helpers.hpp
Option
Definition: util_types.hpp:32
composition.hpp
MicroModelica::Util::Variable::name
string name() const
Definition: symbol_table.hpp:127
MicroModelica::IR::EQUATION::Type
Type
Definition: equation.hpp:50
MicroModelica::IR::EQUATION::Output
@ Output
Definition: equation.hpp:50
newType_Integer
Type_Integer newType_Integer()
Definition: type.cpp:56
EQFOR
@ EQFOR
Definition: ast_types.hpp:161
MicroModelica::IR::FunctionAnnotation::hasLibraryDirectory
bool hasLibraryDirectory()
Definition: annotation.cpp:75
MicroModelica::IR::Model::_output_id
int _output_id
Definition: class.hpp:254
MicroModelica::Util::ModelConfig::addVariable
void addVariable(VarName name, Variable var)
Definition: model_config.hpp:134
MicroModelica::IR::Model::setOutputs
void setOutputs()
Definition: class.cpp:715
MicroModelica::IR::Model::symbols
Util::VarSymbolTable symbols() const
Definition: class.cpp:284
MicroModelica::Util::reduceStatement
void reduceStatement(AST_Statement stm, AST_StatementList stms, AST_StatementListIterator stm_it)
Definition: process_statement.cpp:162
MicroModelica::Util::Variable::RealType
RealType
Definition: symbol_table.hpp:84
MicroModelica::IR::Model::addEquation
void addEquation(AST_Equation eq, Option< Range > range)
Definition: class.cpp:451
model_config.hpp
TypePrefix
TypePrefix
Definition: ast_types.hpp:193
MicroModelica::Util::ModelConfig::setDependencies
void setDependencies(Deps::ModelDependencies dependencies)
Definition: model_config.hpp:98
MicroModelica::IR::Package::setFunctions
void setFunctions(FunctionTable &fs)
Definition: class.cpp:198
MicroModelica::IR::Model::orderEquations
void orderEquations()
Definition: class.cpp:515
MicroModelica::Util::Variable::setOffset
void setOffset(int offset)
Definition: symbol_table.hpp:139
MicroModelica::IR::Model::_imports
Util::ImportTable _imports
Definition: class.hpp:227
MicroModelica::IR::Model::addFunction
void addFunction(Util::SymbolTable symbols, FunctionTable &fs)
Definition: class.cpp:373
MicroModelica::IR::Model::_algebraic_nbr
unsigned int _algebraic_nbr
Definition: class.hpp:246
MicroModelica::IR::Model::_library_directories
Util::SymbolTable _library_directories
Definition: class.hpp:239
MicroModelica::IR::Package::_functions
FunctionTable _functions
Definition: class.hpp:156
MicroModelica::Util::ModelConfig::setEvents
void setEvents(IR::EventTable events)
Definition: model_config.hpp:140
MicroModelica::Util::ModelConfig::setStateNbr
void setStateNbr(int state_nbr)
Definition: model_config.hpp:114
MicroModelica::IR::Model::getEquationDefOrder
EquationDefOrder getEquationDefOrder(Equation eq)
Definition: class.cpp:506
MicroModelica::IR::FunctionAnnotation
Definition: annotation.hpp:90
MicroModelica::Util::SymbolTable
ModelTable< std::string, std::string > SymbolTable
Definition: equation.hpp:62
MicroModelica::IR::ModelAnnotation::isClassic
bool isClassic()
Definition: annotation.cpp:666
STFOR
@ STFOR
Definition: ast_types.hpp:191
EXPDERIVATIVE
@ EXPDERIVATIVE
Definition: ast_types.hpp:167
MicroModelica::IR::Model::computeDependencies
void computeDependencies()
Definition: class.cpp:752
MicroModelica::Util::ER_Error
@ ER_Error
ER_Error.
Definition: error.hpp:122
ModelTable::end
iterator end()
Definition: table.hpp:70
MicroModelica::IR::Model::reduceEvent
void reduceEvent(AST_Statement_When ev)
Definition: class.cpp:662
MicroModelica::IR::Equation::lhs
Expression lhs() const
Definition: equation.hpp:78
MicroModelica::IR::Package::symbols
Util::VarSymbolTable symbols() const
Definition: class.cpp:188
MicroModelica::IR::Model::_outputs
EquationTable _outputs
Definition: class.hpp:233
MicroModelica::IR::Event::compare
bool compare(AST_Expression zc)
Definition: event.cpp:99
MicroModelica::Util::Utils::variable
Variable variable(AST_Expression exp)
Definition: util.cpp:363
MicroModelica::IR::DEC_Type
DEC_Type
Definition: class.hpp:75
MicroModelica::IR::ExternalFunctionTable
ModelTable< int, ExternalFunction > ExternalFunctionTable
Definition: helpers.hpp:85
VarName
std::string VarName
Definition: util_types.hpp:43
MicroModelica::IR::FunctionAnnotation::libraries
Util::SymbolTable libraries() const
Definition: annotation.cpp:133
MicroModelica::IR::Model::BDFDerivatives
EquationTable BDFDerivatives()
Definition: class.cpp:494
MicroModelica::IR::Package::insert
void insert(string n)
Definition: class.cpp:190
MicroModelica::IR::Equation
Definition: equation.hpp:67
MicroModelica::IR::Model::setVariableOffset
void setVariableOffset(Util::Variable var, unsigned int &offset, Util::Variable::RealType type, bool set_variable_count=true)
Definition: class.cpp:302
MicroModelica::IR::Event
Definition: event.hpp:84
MicroModelica::IR::Model::outputs
EquationTable outputs()
Definition: class.hpp:192
MicroModelica::Util::Error::add
void add(int pos, unsigned int code, ER_Type t, const std::string message,...)
Definition: error.cpp:42
MicroModelica::IR::Model::derivatives
EquationTable derivatives()
Definition: class.hpp:188
MicroModelica::Util::Utils::addCompiledFunction
void addCompiledFunction(IR::CompiledFunction f)
Definition: util.cpp:351
MicroModelica::IR::Model::setInputs
void setInputs()
Definition: class.cpp:741
MicroModelica::IR::Equation::range
Option< Range > range() const
Definition: equation.hpp:86
MicroModelica::IR::Model::addInput
void addInput(Equation eq)
Definition: class.cpp:732
MicroModelica::IR::Package::fileName
std::string fileName()
Definition: class.cpp:214
EXPCALL
@ EXPCALL
Definition: ast_types.hpp:173
ModelTable< std::string, std::string >::iterator
std::map< std::string, std::string >::iterator iterator
Definition: table.hpp:61
MicroModelica::IR::ModelAnnotation::output
list< AST_Expression > output()
Definition: annotation.cpp:686
MicroModelica::IR::Model::_link_libraries
Util::SymbolTable _link_libraries
Definition: class.hpp:240
MicroModelica::Util::ModelConfig::instance
static ModelConfig & instance()
Definition: model_config.hpp:87
EM_VARIABLE_NOT_FOUND
#define EM_VARIABLE_NOT_FOUND
Definition: error.hpp:71
MicroModelica::Generator::WRITER::Output
@ Output
Definition: writer.hpp:98
MicroModelica::IR::Model::_algebraics
EquationTable _algebraics
Definition: class.hpp:232
MicroModelica::IR::ModelAnnotation::EventId
string EventId()
Definition: annotation.cpp:704
MicroModelica::IR::Equation::setType
void setType(EQUATION::Type type)
Definition: equation.cpp:213
EM_CANT_OPEN_FILE
#define EM_CANT_OPEN_FILE
Definition: error.hpp:72
MicroModelica::Util::ModelConfig::setAlgebraicNbr
void setAlgebraicNbr(int algebraic_nbr)
Definition: model_config.hpp:116
AST_ListFirst
T1 AST_ListFirst(list< T1 > *l)
Definition: ast_types.hpp:271
MicroModelica::IR::Model::setModelConfig
void setModelConfig()
Definition: class.cpp:758
TP_OUTPUT
@ TP_OUTPUT
Definition: ast_types.hpp:195
MicroModelica::IR::Equation::id
int id() const
Definition: equation.hpp:88
MicroModelica::IR::Model::_derivatives
EquationTable _derivatives
Definition: class.hpp:230
MicroModelica::IR::Model::_statement_id
int _statement_id
Definition: class.hpp:252
MicroModelica::IR::ModelAnnotation::expComment
void expComment(AST_Comment x, int id)
Definition: annotation.cpp:235
MicroModelica::IR::Model::computeEventOffsetShift
int computeEventOffsetShift(Option< Range > range)
Definition: class.cpp:601
MicroModelica::Util::VarSymbolTable::insert
void insert(VarName name, Variable variable)
Definition: symbol_table.cpp:312
MicroModelica::IR::Package::definitions
FunctionTable definitions()
Definition: class.cpp:212
MicroModelica::Util::ModelConfig::setOrderedDerivatives
void setOrderedDerivatives(IR::EquationTable ordered_derivatives)
Definition: model_config.hpp:110
MicroModelica::IR::EQUATION::QSSDerivative
@ QSSDerivative
Definition: equation.hpp:50
MicroModelica::IR::Model::_include_directories
Util::SymbolTable _include_directories
Definition: class.hpp:241
MicroModelica::IR::Index
Definition: index.hpp:92
MicroModelica::Generator::MODEL_INSTANCE::Component::Deps
@ Deps
MicroModelica::Util::Utils::addCompiledFunctions
void addCompiledFunctions(IR::CompiledFunctionTable fs)
Definition: util.cpp:353
MicroModelica::IR::OrderedEquations
std::map< int, std::list< Equation > > OrderedEquations
Definition: equation.hpp:165
process_statement.hpp
EM_IR
#define EM_IR
Definition: error.hpp:66
MicroModelica::IR::RangeDefinitionTable
ModelTable< std::string, RangeDefinition > RangeDefinitionTable
Definition: index.hpp:162
MicroModelica::IR::Model::_state_nbr
unsigned int _state_nbr
Definition: class.hpp:244
modification.hpp
MicroModelica
Definition: files.cpp:45
MicroModelica::IR::RANGE::For
@ For
Definition: index.hpp:102
MicroModelica::IR::Model::_annotations
ModelAnnotation _annotations
Definition: class.hpp:228
MicroModelica::IR::Model::_input_id
int _input_id
Definition: class.hpp:255
MicroModelica::Util::ModelConfig::setModelAnnotations
void setModelAnnotations(IR::ModelAnnotation model_annotations)
Definition: model_config.hpp:100
MicroModelica::IR::EquationVariable::modelVariables
static std::string modelVariables(int id, EQUATION::Type type)
Definition: equation.hpp:54
MicroModelica::IR::StatementTable
ModelTable< int, Statement > StatementTable
Definition: statement.hpp:98
MicroModelica::IR::FunctionAnnotation::libraryDirectory
string libraryDirectory()
Definition: annotation.cpp:135
MicroModelica::IR::Model::_ordered_derivatives
EquationTable _ordered_derivatives
Definition: class.hpp:231
MicroModelica::Util::Utils::instance
static Utils & instance()
Definition: util.hpp:83
MicroModelica::IR::Package::_name
std::string _name
Definition: class.hpp:155
MicroModelica::IR::Model::events
EventTable events()
Definition: class.hpp:193
MicroModelica::IR::Equation::hasRange
bool hasRange() const
Definition: equation.hpp:77
TP_DISCRETE
@ TP_DISCRETE
Definition: ast_types.hpp:196
MicroModelica::IR::Model::_inputs
InputTable _inputs
Definition: class.hpp:235
MicroModelica::IR::EQUATION::ZeroCrossing
@ ZeroCrossing
Definition: equation.hpp:50
ModelTable::insert
void insert(Key k, Value v)
Definition: table.hpp:48
EM_UNKNOWN_ODE
#define EM_UNKNOWN_ODE
Definition: error.hpp:101
MicroModelica::IR::Statement
Definition: statement.hpp:54
EQEQUALITY
@ EQEQUALITY
Definition: ast_types.hpp:161
MicroModelica::Util::VariableList
std::list< Variable > VariableList
Definition: symbol_table.hpp:199
MicroModelica::Util::ModelConfig::setDerivatives
void setDerivatives(IR::EquationTable derivatives)
Definition: model_config.hpp:108
STWHEN
@ STWHEN
Definition: ast_types.hpp:191
MicroModelica::IR::Model::_event_id
int _event_id
Definition: class.hpp:253
MicroModelica::Generator::WRITER::Input
@ Input
Definition: writer.hpp:78
MicroModelica::IR::Model::setRealVariables
void setRealVariables(AST_Equation eq)
Definition: class.cpp:314
MicroModelica::IR::EquationOrderMap
std::map< EquationDefOrder, Equation > EquationOrderMap
Definition: equation.hpp:167
MicroModelica::IR::FunctionTable
ModelTable< std::string, Function > FunctionTable
Definition: class.hpp:130
MicroModelica::IR::Model::setEvents
void setEvents()
Definition: class.cpp:683
MicroModelica::IR::Model::_derivative_id
int _derivative_id
Definition: class.hpp:250
MicroModelica::IR::EQUATION::Algebraic
@ Algebraic
Definition: equation.hpp:50
MicroModelica::IR::EQUATION::QSSBDFDerivative
@ QSSBDFDerivative
Definition: equation.hpp:50
MicroModelica::IR::Model::setCalledFunctions
void setCalledFunctions(FunctionTable &fs)
Definition: class.cpp:401
MicroModelica::IR::Model::setEquations
void setEquations()
Definition: class.cpp:542
MicroModelica::IR::Model::_discrete_nbr
unsigned int _discrete_nbr
Definition: class.hpp:245
MicroModelica::IR::Package::imports
Util::ImportTable imports() const
Definition: class.cpp:210
MicroModelica::IR::DEC_PUBLIC
@ DEC_PUBLIC
Definition: class.hpp:92
MicroModelica::IR::RangeDefinition
Definition: index.hpp:136
MicroModelica::IR::FunctionAnnotation::hasLibraries
bool hasLibraries()
Definition: annotation.cpp:73
MicroModelica::IR::Event::add
void add(AST_Statement)
Definition: event.cpp:89
MicroModelica::IR::Package::prefix
std::string prefix()
Definition: class.cpp:216
class.hpp
current_element
#define current_element(it)
Definition: ast_types.hpp:34
MicroModelica::IR::Model::addVariable
void addVariable(int id, Option< Range > range, EQUATION::Type type, unsigned int &offset)
Adds a new variable for events and output equations that doesn't have associated variables in the mod...
Definition: class.cpp:579
util.hpp
ModelTable::merge
void merge(ModelTable< Key, Value > other)
Definition: table.hpp:95
MicroModelica::IR::Model::_event_nbr
unsigned int _event_nbr
Definition: class.hpp:247
MicroModelica::IR::Model::_ast_equations
std::list< AST_Equation > _ast_equations
Definition: class.hpp:242
error.hpp
ModelTable::next
Value next(iterator &it)
Definition: table.hpp:78
expression.hpp
MicroModelica::IR::Model::insert
void insert(string n)
Definition: class.cpp:436
statement.hpp