MicroModelicaCCompiler  4.5.3
package.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 <generator/function.hpp>
23 #include <generator/package.hpp>
24 #include <util/util.hpp>
25 
26 namespace MicroModelica {
27 using namespace IR;
28 using namespace Util;
29 namespace Generator {
30 
31 Package::Package(IR::Package& package, CompileFlags& flags, WriterPtr writer) : _package(package), _flags(flags), _writer(writer) {}
32 
33 void Package::generate()
34 {
35  string indent = _writer->indent(1);
36  string name;
37  if (_flags.hasOutputFile()) {
38  name = _flags.outputFilePath();
39  }
40  name.append(_package.fileName());
41  string fileName;
42  stringstream buffer;
43  fileName = name;
44  fileName.append(".moo");
45  _writer->setFile(fileName);
46  if (_flags.hasObjects()) {
47  list<string> objects = _flags.objects();
48  _writer->print("DEPENDENCES");
49  for (list<string>::iterator it = objects.begin(); it != objects.end(); it++) {
50  _writer->print(*it);
51  }
52  _writer->print("ENDDEPENDENCES");
53  }
55  SymbolTable includes;
57  for (IR::Function f = ft.begin(it); !ft.end(it); f = ft.next(it)) {
58  _writer->print("DEFINITION");
59  _writer->print("FUNCTION");
60  _writer->print(f.name());
61  _writer->print("ENDFUNCTION");
62  FunctionAnnotation annot = f.annotations();
63  if (annot.hasInclude()) {
64  string inc = annot.include();
65  includes.insert(inc, inc);
66  }
67  if (annot.hasDerivative()) {
68  _writer->print("DERIVATIVE");
69  _writer->print(_package.prefix() + f.name());
70  _writer->print(annot.derivative());
71  _writer->print("ENDDERIVATIVE");
72  }
73  if (annot.hasIncludeDirectory()) {
74  _writer->print("INCLUDEDIRECTORY");
75  _writer->print(annot.includeDirectory());
76  _writer->print("ENDINCLUDEDIRECTORY");
77  }
78  if (annot.hasLibraryDirectory()) {
79  _writer->print("LIBRARYDIRECTORY");
80  _writer->print(annot.libraryDirectory());
81  _writer->print("ENDLIBRARYDIRECTORY");
82  }
83  if (annot.hasLibraries()) {
84  _writer->print("LIBRARIES");
85  SymbolTable libs = annot.libraries();
87  for (string i = libs.begin(it); !libs.end(it); i = libs.next(it)) {
88  _writer->print(i);
89  }
90  _writer->print("ENDLIBRARIES");
91  }
92  _writer->print("ENDDEFINITION");
93  }
94  _writer->clearFile();
95  fileName = name;
96  fileName.append(".h");
97  _writer->setFile(fileName);
98  _writer->print("#pragma once\n");
99  for (IR::Function f = ft.begin(it); !ft.end(it); f = ft.next(it)) {
100  Function func(f, _flags, _writer);
101  func.setPrefix(_package.prefix());
102  _writer->print(func.header());
103  _writer->print("\n");
104  }
105  _writer->clearFile();
106  fileName = name;
107  fileName.append(".c");
108  _writer->setFile(fileName);
109  buffer << "#include <math.h>" << endl;
110  buffer << "#include <stdlib.h>" << endl;
111  buffer << "#include \"" << name << ".h\"" << endl;
112  SymbolTable::iterator incIt;
113  for (string i = includes.begin(incIt); !includes.end(incIt); i = includes.next(incIt)) {
114  buffer << i;
115  }
116  buffer << endl;
117  ImportTable imports = _package.imports();
118  ImportTable::iterator impIt;
119  for (string i = imports.begin(impIt); !imports.end(impIt); i = imports.next(impIt)) {
120  string addInclude = Utils::instance().packagePath(i, _flags) + Utils::instance().packageName(i);
121  buffer << "#include \"" << addInclude << ".h\"" << endl;
122  includes.insert(addInclude, addInclude);
123  }
124  if (!imports.empty()) {
125  buffer << endl;
126  }
127  _writer->write(buffer, WRITER::Function_Header);
128  for (IR::Function f = ft.begin(it); !ft.end(it); f = ft.next(it)) {
129  Function func(f, _flags, _writer);
130  func.setPrefix(_package.prefix());
131  func.addInclude(includes);
132  func.definition();
133  }
136  _writer->clearFile();
137 }
138 } // namespace Generator
139 } // namespace MicroModelica
MicroModelica::IR::FunctionAnnotation::includeDirectory
string includeDirectory()
Definition: annotation.cpp:131
function.hpp
MicroModelica::IR::Function
Definition: class.hpp:93
ModelTable< std::string, Function >
ModelTable::begin
iterator begin()
Definition: table.hpp:68
MicroModelica::Util::ImportTable
ModelTable< std::string, std::string > ImportTable
Definition: util.hpp:66
MicroModelica::Util::Utils::packageName
std::string packageName(std::string name)
Definition: util.cpp:298
MicroModelica::IR::Package::Package
Package()
Definition: class.hpp:134
MicroModelica::IR::FunctionAnnotation::hasIncludeDirectory
bool hasIncludeDirectory()
Definition: annotation.cpp:71
MicroModelica::IR::FunctionAnnotation::hasInclude
bool hasInclude()
Definition: annotation.cpp:69
MicroModelica::IR::FunctionAnnotation::hasLibraryDirectory
bool hasLibraryDirectory()
Definition: annotation.cpp:75
MicroModelica::Generator::Package::_package
IR::Package _package
Definition: package.hpp:88
MicroModelica::IR::FunctionAnnotation
Definition: annotation.hpp:90
MicroModelica::Util::SymbolTable
ModelTable< std::string, std::string > SymbolTable
Definition: equation.hpp:62
MicroModelica::Generator::Package::generate
void generate()
Definition: package.cpp:50
MicroModelica::Generator::Package::_flags
Util::CompileFlags _flags
Definition: package.hpp:89
MicroModelica::Util::CompileFlags::hasOutputFile
bool hasOutputFile()
Definition: compile_flags.cpp:116
ModelTable::end
iterator end()
Definition: table.hpp:70
MicroModelica::IR::FunctionAnnotation::libraries
Util::SymbolTable libraries() const
Definition: annotation.cpp:133
MicroModelica::IR::Package::fileName
std::string fileName()
Definition: class.cpp:214
ModelTable< std::string, Function >::iterator
std::map< std::string, Function >::iterator iterator
Definition: table.hpp:61
MicroModelica::Generator::Package::_writer
WriterPtr _writer
Definition: package.hpp:90
MicroModelica::Generator::WRITER::Function_Code
@ Function_Code
Definition: writer.hpp:102
MicroModelica::IR::FunctionAnnotation::include
string include()
Definition: annotation.cpp:129
MicroModelica::IR::Package::definitions
FunctionTable definitions()
Definition: class.cpp:212
MicroModelica::Generator::WRITER::Function_Header
@ Function_Header
Definition: writer.hpp:101
MicroModelica::Util::CompileFlags::outputFilePath
string outputFilePath()
Definition: compile_flags.cpp:112
MicroModelica
Definition: files.cpp:45
MicroModelica::IR::FunctionAnnotation::hasDerivative
bool hasDerivative()
Definition: annotation.cpp:67
MicroModelica::IR::FunctionAnnotation::libraryDirectory
string libraryDirectory()
Definition: annotation.cpp:135
MicroModelica::Util::Utils::instance
static Utils & instance()
Definition: util.hpp:83
ModelTable::insert
void insert(Key k, Value v)
Definition: table.hpp:48
MicroModelica::Util::CompileFlags::objects
list< string > objects()
Definition: compile_flags.cpp:128
MicroModelica::Util::Utils::packagePath
std::string packagePath(std::string pname, CompileFlags flags, std::string ext=".mo")
MicroModelica::IR::Package::imports
Util::ImportTable imports() const
Definition: class.cpp:210
MicroModelica::Generator::WriterPtr
std::shared_ptr< Writer > WriterPtr
Definition: writer.hpp:146
MicroModelica::IR::FunctionAnnotation::hasLibraries
bool hasLibraries()
Definition: annotation.cpp:73
MicroModelica::IR::Package::prefix
std::string prefix()
Definition: class.cpp:216
MicroModelica::Util::CompileFlags::hasObjects
bool hasObjects()
Definition: compile_flags.cpp:137
util.hpp
package.hpp
MicroModelica::IR::FunctionAnnotation::derivative
string derivative()
Definition: annotation.cpp:127
ModelTable::next
Value next(iterator &it)
Definition: table.hpp:78