MicroModelicaCCompiler  4.5.3
generator.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 <sstream>
21 
22 #include <ir/annotation.hpp>
23 #include <ir/class.hpp>
24 #include <ir/statement.hpp>
25 #include <ir/stored_definition.hpp>
26 #include <util/error.hpp>
27 #include <util/symbol_table.hpp>
28 #include <util/type.hpp>
29 #include <util/util.hpp>
30 #include <generator/function.hpp>
31 #include <generator/generator.hpp>
32 #include <generator/package.hpp>
33 
34 namespace MicroModelica {
35 using namespace IR;
36 using namespace Util;
37 namespace Generator {
38 
39 Generator::Generator(const StoredDefinition& std, const CompileFlags& flags)
40  : _std(std), _flags(flags), _model_instance(nullptr), _writer(nullptr), _includes(), _fheader()
41 {
42  if (_flags.output()) {
43  _writer = WriterPtr(std::make_shared<MemoryWriter>());
44  } else {
45  _writer = WriterPtr(std::make_shared<FileWriter>());
46  }
47 }
48 
50 {
51  if (_std.isModel()) {
52  Model model = _std.model();
53  string base_name = model.name();
54  if (_flags.hasOutputFile()) {
55  base_name = _flags.outputFile();
56  }
57  _writer->setFile(base_name + ".c");
58  switch (model.annotations().solver()) {
59  case Solver::DOPRI:
60  case Solver::DASSL:
61  case Solver::CVODE_BDF:
62  case Solver::IDA:
63  case Solver::CVODE_AM:
64  _model_instance = ModelInstancePtr(std::make_shared<ClassicModelInstance>(model, _flags, _writer));
65  break;
66  default:
67  _model_instance = ModelInstancePtr(std::make_shared<QSSModelInstance>(model, _flags, _writer));
68  }
69  _model_instance->generate();
70  _writer->clearFile();
71  _writer->setFile(base_name + ".h");
72  _model_instance->header();
74  _writer->clearFile();
75  Files files(_model_instance, model, _flags);
76  files.makefile();
77  files.run();
78  files.plot();
79  files.settings(model.annotations());
80  if (model.annotations().solver() == Solver::LIQSS_BDF && !model.annotations().BDFPartition()->empty()) {
81  files.bdfPartition();
82  }
83  if (model.externalFunctions()) {
84  string ffname = base_name + "_functions";
85  generateIncludes(ffname);
86  FunctionTable ft = model.calledFunctions();
88  for (IR::Function f = ft.begin(it); !ft.end(it); f = ft.next(it)) {
89  Function func(f, _flags, _writer);
90  func.definition();
91  _fheader.push_back(func.header());
92  }
93  calledFunctionHeader(ffname);
94  _writer->setFile(ffname + ".c");
97  _writer->clearFile();
98  }
99  } else {
100  Package pkg(_std.package(), _flags, _writer);
101  pkg.generate();
102  }
103  return Error::instance().errors();
104 }
105 
106 void Generator::generateIncludes(const string& name)
107 {
108  stringstream buffer;
109  buffer << "#include <math.h>" << endl;
110  buffer << "#include <stdlib.h>" << endl;
111  buffer << "#include \"" << name << ".h\"" << endl;
112  _writer->write(buffer, WRITER::Function_Header);
113 }
114 
115 void Generator::calledFunctionHeader(const string& file_name)
116 {
117  string indent = _writer->indent(1);
118  string file = file_name;
119  file.append(".h");
120  _writer->setFile(file);
121  for (auto it = _fheader.begin(); it != _fheader.end(); it++) {
122  _writer->print(*it);
123  }
124  _writer->clearFile();
125 }
126 
127 } // namespace Generator
128 } // namespace MicroModelica
MicroModelica::Generator::Generator::_writer
WriterPtr _writer
Definition: generator.hpp:103
MicroModelica::Util::Error::instance
static Error & instance()
Definition: error.hpp:128
function.hpp
MicroModelica::IR::Function
Definition: class.hpp:93
ModelTable< std::string, Function >
MicroModelica::IR::StoredDefinition::model
Model & model()
Definition: stored_definition.cpp:75
ModelTable::begin
iterator begin()
Definition: table.hpp:68
MicroModelica::Generator::Generator::_model_instance
ModelInstancePtr _model_instance
Definition: generator.hpp:102
MicroModelica::Generator::Function::_flags
Util::CompileFlags _flags
Definition: function.hpp:98
MicroModelica::Generator::Function
Definition: function.hpp:65
MicroModelica::Generator::Generator::calledFunctionHeader
void calledFunctionHeader(const string &file_name)
Definition: generator.cpp:132
MicroModelica::Generator::WRITER::Model
@ Model
Definition: writer.hpp:79
MicroModelica::Generator::Generator::_fheader
list< string > _fheader
Definition: generator.hpp:106
MicroModelica::Util::CompileFlags::outputFile
string outputFile()
Definition: compile_flags.cpp:114
MicroModelica::Generator::WRITER::Model_Header
@ Model_Header
Definition: writer.hpp:103
MicroModelica::Util::CompileFlags::output
bool output()
Definition: compile_flags.cpp:96
symbol_table.hpp
generator.hpp
MicroModelica::Generator::Generator::generate
int generate()
Definition: generator.cpp:66
MicroModelica::IR::StoredDefinition::isModel
bool isModel()
Definition: stored_definition.cpp:79
MicroModelica::Generator::Generator::generateIncludes
void generateIncludes(const string &name)
Definition: generator.cpp:123
MicroModelica::Util::CompileFlags::hasOutputFile
bool hasOutputFile()
Definition: compile_flags.cpp:116
ModelTable::end
iterator end()
Definition: table.hpp:70
MicroModelica::Generator::Function::_writer
WriterPtr _writer
Definition: function.hpp:99
type.hpp
MicroModelica::Util::Error::errors
int errors()
Definition: error.cpp:257
ModelTable< std::string, Function >::iterator
std::map< std::string, Function >::iterator iterator
Definition: table.hpp:61
MicroModelica::Generator::WRITER::Function_Code
@ Function_Code
Definition: writer.hpp:102
MicroModelica::Generator::Generator::_flags
Util::CompileFlags _flags
Definition: generator.hpp:101
MicroModelica::Generator::Generator::Generator
Generator(const IR::StoredDefinition &std, const Util::CompileFlags &flags)
Definition: generator.cpp:56
MicroModelica::Generator::WRITER::Function_Header
@ Function_Header
Definition: writer.hpp:101
MicroModelica::Generator::Generator::_std
IR::StoredDefinition _std
Definition: generator.hpp:98
MicroModelica
Definition: files.cpp:45
stored_definition.hpp
MicroModelica::Generator::Files
Definition: files.hpp:68
annotation.hpp
MicroModelica::Generator::WriterPtr
std::shared_ptr< Writer > WriterPtr
Definition: writer.hpp:146
statement.hpp
MicroModelica::IR::StoredDefinition::package
Package & package()
Definition: stored_definition.cpp:77
class.hpp
util.hpp
package.hpp
MicroModelica::Generator::ModelInstancePtr
std::shared_ptr< ModelInstance > ModelInstancePtr
Definition: model_instance.hpp:197
error.hpp
ModelTable::next
Value next(iterator &it)
Definition: table.hpp:78
MicroModelica::IR::Model::name
string name() const
Definition: class.hpp:165