31 #include <util/visitors/get_index_variables.hpp>
32 #include <util/visitors/is_constant_expression.hpp>
37 using namespace Generator;
44 std::ostream&
operator<<(std::ostream& out,
const ExternalFunction& e)
48 if (!e._lvalue.empty()) {
49 buffer << e._lvalue <<
" = ";
51 buffer << e._name <<
"(";
52 if (e._args !=
nullptr) {
53 AST_ExpressionListIterator it;
54 unsigned int count = 0;
55 foreach (it, e._args) {
58 if (++count < e._args->size()) {
73 : _name(name), _prefix(prefix), _prototype(), _includeDirectory(includeDir), _libraryDirectory(libraryDir), _libraries(libraries)
77 std::ostream&
operator<<(std::ostream& out,
const CompiledFunction& cf)
88 AST_ExpressionListIterator it;
94 buffer << (i < size ?
", " :
"");
108 if (var->isArray()) {
116 buffer << (i < size ?
", " :
"");
144 if (cf.hasLibraries()) {
145 ret.
merge(cf.libraries());
156 if (cf.hasLibraryDirectory()) {
157 string ld = cf.libraryDirectory();
169 if (cf.hasIncludeDirectory()) {
170 string id = cf.includeDirectory();
182 buffer <<
"for (idx = 0; idx <" << end <<
"; idx++) {";
196 buffer <<
"switch(idx) {";
206 buffer <<
"if (_is_var" << token <<
"(idx)) {" << endl;
207 buffer <<
TAB <<
"_get" << token <<
"_idxs(idx);" << endl;
208 range->addLocalVariables();
210 buffer <<
TAB <<
"case " << token <<
": {" << endl;
220 buffer <<
"return;" << endl;
224 buffer <<
"break;" << endl;
229 buffer <<
"continue;" << endl;
243 buffer <<
"}" << endl;
253 buffer <<
TAB <<
"_apply_usage" << token <<
"(" << args <<
");" << endl;
256 int size = ranges.size(), idx = 1;
257 buffer <<
TAB <<
"if (";
259 string variable = ranges.key(it);
260 if (used_variables.find(variable) != used_variables.end()) {
261 buffer <<
"(" << ranges.key(it) <<
" >= " << rd.begin() <<
" && " << ranges.key(it) <<
" <= " << rd.end() <<
")";
262 buffer << (idx < size ?
" && " :
"");
265 buffer <<
") {" << endl;
266 range->addLocalVariables();
275 bool reduction_range = reduction && range;
276 if (reduction_range) {
277 buffer << range.get();
279 buffer <<
TAB << alg;
280 if (reduction_range) {
281 buffer << range.get().end() << endl;
290 map<string, string> parsed_indexes =
parseIndexes(var, range, offset, modelica_index);
291 for (
auto index_def : parsed_indexes) {
292 buffer <<
TAB << index_def.first <<
" = " << index_def.second << endl;
300 map<int, string> ctes;
301 list<Expression> indexes = ref.
indexes();
304 IsConstantExpression constant_exp;
305 if (constant_exp.apply(exp.expression())) {
306 ctes[i] = exp.print();
315 map<string, string> parsed_indexes;
319 int size = rdt.
size(), i = 0, idx = 0;
320 stringstream offset_var;
321 offset_var <<
"(" << var;
323 offset_var <<
"-" << offset;
326 string alligned_var = offset_var.str();
331 def << (i + 1 < size ?
div(
mod(alligned_var, idx - 1, range), idx, range) :
mod(alligned_var, idx - 1, range))
332 << (modelica_index ?
"+ 1;" :
";") << (i + 1 < size ?
"\\" :
"");
333 parsed_indexes[key.str()] = def.str();
337 return parsed_indexes;
344 FunctionPrinter printer;
347 Index revert =
usage.replace();
348 arguments = revert.usageExp();
350 buffer << printer.beginDimGuards(alg.applyId(), arguments, range, alg.usedVariables());
357 if (range && !range->isEmpty()) {
358 macros <<
"#define _is_var" << token <<
"(idx) ";
359 macros <<
"idx >= " << offset <<
" && ";
360 macros <<
"idx < " << offset + range->size() << endl;
361 macros <<
"#define _get" << token <<
"_idxs(idx)\\" << endl;
362 macros <<
TAB <<
getIndexes(
"idx", range, offset, modelica_index);
373 buffer <<
"(" <<
mod(idx, dim - 1, range) <<
"%" << range->rowSize(dim) <<
")";
380 buffer <<
"(" << idx <<
"/" << range->rowSize(dim) <<
")";
390 buffer <<
"\"" << var->name();
391 if (var->isArray()) {
395 buffer << range->getPrintDimensionVarsString() <<
"]\"," << exp.
usage();
396 }
else if (var->isArray()) {
397 buffer << exp.
usage() <<
"]\"";
399 buffer << exp.
usage() <<
"\"";
408 GetIndexVariables index_usage;
410 buffer <<
"#define _get" <<
id <<
"_var_idxs";
411 buffer <<
"(row, var)\\" << endl;
413 map<string, string> parse_row =
parseIndexes(
"row", range, 1);
415 int i = 1, size =
usage.size();
416 static const bool USE_RANGE_DIM_VARS =
true;
417 for (
auto index :
usage) {
418 string local_range_var = range->getDimensionVar(index.second, USE_RANGE_DIM_VARS);
419 buffer <<
TAB << local_range_var <<
" = ";
420 buffer << range_def[index.first]->cBegin() <<
" + " << parse_row[index.first];
421 buffer << ((i + 1 <= size) ?
"\n" :
"\\\n");
425 for (
auto index : ctes) {
426 string local_range_var = range->getDimensionVar(index.first, USE_RANGE_DIM_VARS);
427 buffer <<
TAB << local_range_var <<
" = " << index.second <<
";\\\n";
432 Index var_ind(a_exp);
433 buffer <<
TAB <<
"var = " << var_ind <<
";";
444 code << tab <<
"_get" << eq.applyId() <<
"_var_idxs(" << index <<
", eq_var);" << endl;
445 code << tab <<
"_get" << var.get() <<
"_idxs(eq_var);" << endl;
446 eq.range()->addRangeLocalVariables();
447 eq.range()->addLocalVariables();
473 buffer <<
"_input_" <<
_id;