• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

daisytuner / sdfglib / 15656007340

14 Jun 2025 08:51PM UTC coverage: 13.234% (-49.9%) from 63.144%
15656007340

Pull #76

github

web-flow
Merge 9586c8161 into 413c53212
Pull Request #76: New Loop Dependency Analysis

361 of 465 new or added lines in 7 files covered. (77.63%)

6215 existing lines in 110 files now uncovered.

1612 of 12181 relevant lines covered (13.23%)

13.64 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/visualizer/visualizer.cpp
1
#include "sdfg/visualizer/visualizer.h"
2

3
#include <cassert>
4
#include <sstream>
5
#include <stdexcept>
6
#include <string>
7
#include <utility>
8
#include <vector>
9

10
#include "sdfg/data_flow/library_node.h"
11
#include "sdfg/data_flow/tasklet.h"
12
#include "sdfg/helpers/helpers.h"
13
#include "sdfg/structured_control_flow/block.h"
14
#include "sdfg/structured_control_flow/control_flow_node.h"
15
#include "sdfg/structured_control_flow/for.h"
16
#include "sdfg/structured_control_flow/if_else.h"
17
#include "sdfg/structured_control_flow/return.h"
18
#include "sdfg/structured_control_flow/sequence.h"
19
#include "sdfg/structured_control_flow/while.h"
20
#include "sdfg/symbolic/symbolic.h"
21
#include "sdfg/types/type.h"
22
#include "symengine/basic.h"
23

24
namespace sdfg {
25
namespace visualizer {
26

UNCOV
27
constexpr const char* code_to_string(data_flow::TaskletCode c) {
×
UNCOV
28
    switch (c) {
×
29
        case data_flow::TaskletCode::assign:
UNCOV
30
            return "=";
×
31
        case data_flow::TaskletCode::neg:
UNCOV
32
            return "-";
×
33
        case data_flow::TaskletCode::add:
UNCOV
34
            return "+";
×
35
        case data_flow::TaskletCode::sub:
UNCOV
36
            return "-";
×
37
        case data_flow::TaskletCode::mul:
UNCOV
38
            return "*";
×
39
        case data_flow::TaskletCode::div:
UNCOV
40
            return "/";
×
41
        case data_flow::TaskletCode::fma:
UNCOV
42
            return "fma";
×
43
        case data_flow::TaskletCode::mod:
UNCOV
44
            return "%";
×
45
        case data_flow::TaskletCode::max:
UNCOV
46
            return "max";
×
47
        case data_flow::TaskletCode::min:
UNCOV
48
            return "min";
×
49
        case data_flow::TaskletCode::minnum:
UNCOV
50
            return "minnum";
×
51
        case data_flow::TaskletCode::maxnum:
UNCOV
52
            return "maxnum";
×
53
        case data_flow::TaskletCode::minimum:
UNCOV
54
            return "minimum";
×
55
        case data_flow::TaskletCode::maximum:
UNCOV
56
            return "maximum";
×
57
        case data_flow::TaskletCode::trunc:
UNCOV
58
            return "trunc";
×
59
        case data_flow::TaskletCode::logical_and:
UNCOV
60
            return "&&";
×
61
        case data_flow::TaskletCode::logical_or:
UNCOV
62
            return "||";
×
63
        case data_flow::TaskletCode::bitwise_and:
UNCOV
64
            return "&";
×
65
        case data_flow::TaskletCode::bitwise_or:
UNCOV
66
            return "|";
×
67
        case data_flow::TaskletCode::bitwise_xor:
UNCOV
68
            return "^";
×
69
        case data_flow::TaskletCode::bitwise_not:
UNCOV
70
            return "~";
×
71
        case data_flow::TaskletCode::shift_left:
UNCOV
72
            return "<<";
×
73
        case data_flow::TaskletCode::shift_right:
UNCOV
74
            return ">>";
×
75
        case data_flow::TaskletCode::olt:
UNCOV
76
            return "<";
×
77
        case data_flow::TaskletCode::ole:
UNCOV
78
            return "<=";
×
79
        case data_flow::TaskletCode::oeq:
UNCOV
80
            return "==";
×
81
        case data_flow::TaskletCode::one:
UNCOV
82
            return "!=";
×
83
        case data_flow::TaskletCode::oge:
UNCOV
84
            return ">=";
×
85
        case data_flow::TaskletCode::ogt:
UNCOV
86
            return ">";
×
87
        case data_flow::TaskletCode::ord:
UNCOV
88
            return "==";
×
89
        case data_flow::TaskletCode::ult:
UNCOV
90
            return "<";
×
91
        case data_flow::TaskletCode::ule:
UNCOV
92
            return "<=";
×
93
        case data_flow::TaskletCode::ueq:
UNCOV
94
            return "==";
×
95
        case data_flow::TaskletCode::une:
UNCOV
96
            return "!=";
×
97
        case data_flow::TaskletCode::uge:
UNCOV
98
            return ">=";
×
99
        case data_flow::TaskletCode::ugt:
UNCOV
100
            return ">";
×
101
        case data_flow::TaskletCode::uno:
UNCOV
102
            return "!=";
×
103
        case data_flow::TaskletCode::abs:
UNCOV
104
            return "abs";
×
105
        case data_flow::TaskletCode::acos:
UNCOV
106
            return "acos";
×
107
        case data_flow::TaskletCode::acosf:
UNCOV
108
            return "acosf";
×
109
        case data_flow::TaskletCode::acosl:
UNCOV
110
            return "acosl";
×
111
        case data_flow::TaskletCode::acosh:
UNCOV
112
            return "acosh";
×
113
        case data_flow::TaskletCode::acoshf:
UNCOV
114
            return "acoshf";
×
115
        case data_flow::TaskletCode::acoshl:
UNCOV
116
            return "acoshl";
×
117
        case data_flow::TaskletCode::asin:
UNCOV
118
            return "asin";
×
119
        case data_flow::TaskletCode::asinf:
UNCOV
120
            return "asinf";
×
121
        case data_flow::TaskletCode::asinl:
UNCOV
122
            return "asinl";
×
123
        case data_flow::TaskletCode::asinh:
UNCOV
124
            return "asinh";
×
125
        case data_flow::TaskletCode::asinhf:
UNCOV
126
            return "asinhf";
×
127
        case data_flow::TaskletCode::asinhl:
UNCOV
128
            return "asinhl";
×
129
        case data_flow::TaskletCode::atan:
UNCOV
130
            return "atan";
×
131
        case data_flow::TaskletCode::atanf:
UNCOV
132
            return "atanf";
×
133
        case data_flow::TaskletCode::atanl:
UNCOV
134
            return "atanl";
×
135
        case data_flow::TaskletCode::atan2:
UNCOV
136
            return "atan2";
×
137
        case data_flow::TaskletCode::atan2f:
UNCOV
138
            return "atan2f";
×
139
        case data_flow::TaskletCode::atan2l:
UNCOV
140
            return "atan2l";
×
141
        case data_flow::TaskletCode::atanh:
UNCOV
142
            return "atanh";
×
143
        case data_flow::TaskletCode::atanhf:
UNCOV
144
            return "atanhf";
×
145
        case data_flow::TaskletCode::atanhl:
UNCOV
146
            return "atanhl";
×
147
        case data_flow::TaskletCode::cabs:
UNCOV
148
            return "cabs";
×
149
        case data_flow::TaskletCode::cabsf:
UNCOV
150
            return "cabsf";
×
151
        case data_flow::TaskletCode::cabsl:
UNCOV
152
            return "cabsl";
×
153
        case data_flow::TaskletCode::ceil:
UNCOV
154
            return "ceil";
×
155
        case data_flow::TaskletCode::ceilf:
UNCOV
156
            return "ceilf";
×
157
        case data_flow::TaskletCode::ceill:
UNCOV
158
            return "ceill";
×
159
        case data_flow::TaskletCode::copysign:
UNCOV
160
            return "copysign";
×
161
        case data_flow::TaskletCode::copysignf:
UNCOV
162
            return "copysignf";
×
163
        case data_flow::TaskletCode::copysignl:
UNCOV
164
            return "copysignl";
×
165
        case data_flow::TaskletCode::cos:
UNCOV
166
            return "cos";
×
167
        case data_flow::TaskletCode::cosf:
UNCOV
168
            return "cosf";
×
169
        case data_flow::TaskletCode::cosl:
UNCOV
170
            return "cosl";
×
171
        case data_flow::TaskletCode::cosh:
UNCOV
172
            return "cosh";
×
173
        case data_flow::TaskletCode::coshf:
UNCOV
174
            return "coshf";
×
175
        case data_flow::TaskletCode::coshl:
UNCOV
176
            return "coshl";
×
177
        case data_flow::TaskletCode::cbrt:
UNCOV
178
            return "cbrt";
×
179
        case data_flow::TaskletCode::cbrtf:
UNCOV
180
            return "cbrtf";
×
181
        case data_flow::TaskletCode::cbrtl:
UNCOV
182
            return "cbrtl";
×
183
        case data_flow::TaskletCode::exp10:
UNCOV
184
            return "exp10";
×
185
        case data_flow::TaskletCode::exp10f:
UNCOV
186
            return "exp10f";
×
187
        case data_flow::TaskletCode::exp10l:
UNCOV
188
            return "exp10l";
×
189
        case data_flow::TaskletCode::exp2:
UNCOV
190
            return "exp2";
×
191
        case data_flow::TaskletCode::exp2f:
UNCOV
192
            return "exp2f";
×
193
        case data_flow::TaskletCode::exp2l:
UNCOV
194
            return "exp2l";
×
195
        case data_flow::TaskletCode::exp:
UNCOV
196
            return "exp";
×
197
        case data_flow::TaskletCode::expf:
UNCOV
198
            return "expf";
×
199
        case data_flow::TaskletCode::expl:
UNCOV
200
            return "expl";
×
201
        case data_flow::TaskletCode::expm1:
UNCOV
202
            return "expm1";
×
203
        case data_flow::TaskletCode::expm1f:
UNCOV
204
            return "expm1f";
×
205
        case data_flow::TaskletCode::expm1l:
UNCOV
206
            return "expm1l";
×
207
        case data_flow::TaskletCode::fabs:
UNCOV
208
            return "fabs";
×
209
        case data_flow::TaskletCode::fabsf:
UNCOV
210
            return "fabsf";
×
211
        case data_flow::TaskletCode::fabsl:
UNCOV
212
            return "fabsl";
×
213
        case data_flow::TaskletCode::floor:
UNCOV
214
            return "floor";
×
215
        case data_flow::TaskletCode::floorf:
UNCOV
216
            return "floorf";
×
217
        case data_flow::TaskletCode::floorl:
UNCOV
218
            return "floorl";
×
219
        case data_flow::TaskletCode::fls:
UNCOV
220
            return "fls";
×
221
        case data_flow::TaskletCode::flsl:
UNCOV
222
            return "flsl";
×
223
        case data_flow::TaskletCode::fmax:
UNCOV
224
            return "fmax";
×
225
        case data_flow::TaskletCode::fmaxf:
UNCOV
226
            return "fmaxf";
×
227
        case data_flow::TaskletCode::fmaxl:
UNCOV
228
            return "fmaxl";
×
229
        case data_flow::TaskletCode::fmin:
UNCOV
230
            return "fmin";
×
231
        case data_flow::TaskletCode::fminf:
UNCOV
232
            return "fminf";
×
233
        case data_flow::TaskletCode::fminl:
UNCOV
234
            return "fminl";
×
235
        case data_flow::TaskletCode::fmod:
UNCOV
236
            return "fmod";
×
237
        case data_flow::TaskletCode::fmodf:
UNCOV
238
            return "fmodf";
×
239
        case data_flow::TaskletCode::fmodl:
UNCOV
240
            return "fmodl";
×
241
        case data_flow::TaskletCode::frexp:
UNCOV
242
            return "frexp";
×
243
        case data_flow::TaskletCode::frexpf:
UNCOV
244
            return "frexpf";
×
245
        case data_flow::TaskletCode::frexpl:
UNCOV
246
            return "frexpl";
×
247
        case data_flow::TaskletCode::labs:
UNCOV
248
            return "labs";
×
249
        case data_flow::TaskletCode::ldexp:
UNCOV
250
            return "ldexp";
×
251
        case data_flow::TaskletCode::ldexpf:
UNCOV
252
            return "ldexpf";
×
253
        case data_flow::TaskletCode::ldexpl:
UNCOV
254
            return "ldexpl";
×
255
        case data_flow::TaskletCode::log10:
UNCOV
256
            return "log10";
×
257
        case data_flow::TaskletCode::log10f:
UNCOV
258
            return "log10f";
×
259
        case data_flow::TaskletCode::log10l:
UNCOV
260
            return "log10l";
×
261
        case data_flow::TaskletCode::log2:
UNCOV
262
            return "log2";
×
263
        case data_flow::TaskletCode::log2f:
UNCOV
264
            return "log2f";
×
265
        case data_flow::TaskletCode::log2l:
UNCOV
266
            return "log2l";
×
267
        case data_flow::TaskletCode::log:
UNCOV
268
            return "log";
×
269
        case data_flow::TaskletCode::logf:
UNCOV
270
            return "logf";
×
271
        case data_flow::TaskletCode::logl:
UNCOV
272
            return "logl";
×
273
        case data_flow::TaskletCode::logb:
UNCOV
274
            return "logb";
×
275
        case data_flow::TaskletCode::logbf:
UNCOV
276
            return "logbf";
×
277
        case data_flow::TaskletCode::logbl:
UNCOV
278
            return "logbl";
×
279
        case data_flow::TaskletCode::log1p:
UNCOV
280
            return "log1p";
×
281
        case data_flow::TaskletCode::log1pf:
UNCOV
282
            return "log1pf";
×
283
        case data_flow::TaskletCode::log1pl:
UNCOV
284
            return "log1pl";
×
285
        case data_flow::TaskletCode::modf:
UNCOV
286
            return "modf";
×
287
        case data_flow::TaskletCode::modff:
UNCOV
288
            return "modff";
×
289
        case data_flow::TaskletCode::modfl:
UNCOV
290
            return "modfl";
×
291
        case data_flow::TaskletCode::nearbyint:
UNCOV
292
            return "nearbyint";
×
293
        case data_flow::TaskletCode::nearbyintf:
UNCOV
294
            return "nearbyintf";
×
295
        case data_flow::TaskletCode::nearbyintl:
UNCOV
296
            return "nearbyintl";
×
297
        case data_flow::TaskletCode::pow:
UNCOV
298
            return "pow";
×
299
        case data_flow::TaskletCode::powf:
UNCOV
300
            return "powf";
×
301
        case data_flow::TaskletCode::powl:
UNCOV
302
            return "powl";
×
303
        case data_flow::TaskletCode::rint:
UNCOV
304
            return "rint";
×
305
        case data_flow::TaskletCode::rintf:
UNCOV
306
            return "rintf";
×
307
        case data_flow::TaskletCode::rintl:
UNCOV
308
            return "rintl";
×
309
        case data_flow::TaskletCode::round:
UNCOV
310
            return "round";
×
311
        case data_flow::TaskletCode::roundf:
UNCOV
312
            return "roundf";
×
313
        case data_flow::TaskletCode::roundl:
UNCOV
314
            return "roundl";
×
315
        case data_flow::TaskletCode::roundeven:
UNCOV
316
            return "roundeven";
×
317
        case data_flow::TaskletCode::roundevenf:
UNCOV
318
            return "roundevenf";
×
319
        case data_flow::TaskletCode::roundevenl:
UNCOV
320
            return "roundevenl";
×
321
        case data_flow::TaskletCode::sin:
UNCOV
322
            return "sin";
×
323
        case data_flow::TaskletCode::sinf:
UNCOV
324
            return "sinf";
×
325
        case data_flow::TaskletCode::sinl:
UNCOV
326
            return "sinl";
×
327
        case data_flow::TaskletCode::sinh:
UNCOV
328
            return "sinh";
×
329
        case data_flow::TaskletCode::sinhf:
UNCOV
330
            return "sinhf";
×
331
        case data_flow::TaskletCode::sinhl:
UNCOV
332
            return "sinhl";
×
333
        case data_flow::TaskletCode::sqrt:
UNCOV
334
            return "sqrt";
×
335
        case data_flow::TaskletCode::sqrtf:
UNCOV
336
            return "sqrtf";
×
337
        case data_flow::TaskletCode::sqrtl:
UNCOV
338
            return "sqrtl";
×
339
        case data_flow::TaskletCode::rsqrt:
UNCOV
340
            return "rsqrt";
×
341
        case data_flow::TaskletCode::rsqrtf:
UNCOV
342
            return "rsqrtf";
×
343
        case data_flow::TaskletCode::rsqrtl:
UNCOV
344
            return "rsqrtl";
×
345
        case data_flow::TaskletCode::tan:
UNCOV
346
            return "tan";
×
347
        case data_flow::TaskletCode::tanf:
UNCOV
348
            return "tanf";
×
349
        case data_flow::TaskletCode::tanl:
UNCOV
350
            return "tanl";
×
351
        case data_flow::TaskletCode::tanh:
UNCOV
352
            return "tanh";
×
353
        case data_flow::TaskletCode::tanhf:
UNCOV
354
            return "tanhf";
×
355
        case data_flow::TaskletCode::tanhl:
UNCOV
356
            return "tanhl";
×
357
    };
358
    throw InvalidSDFGException("code_to_string: Unsupported tasklet code");
×
UNCOV
359
};
×
360

UNCOV
361
std::string Visualizer::expression(const std::string expr) {
×
UNCOV
362
    if (this->replacements_.empty()) return expr;
×
363
    std::string res = expr;
×
364
    size_t pos1 = 0, pos2 = 0;
×
365
    for (std::pair<const std::string, const std::string> replace : this->replacements_) {
×
366
        pos2 = res.find(replace.first);
×
367
        if (pos2 == res.npos) continue;
×
368
        pos1 = 0;
×
369
        std::stringstream res_tmp;
×
370
        while (pos2 < res.npos) {
×
371
            res_tmp << res.substr(pos1, pos2 - pos1) << replace.second;
×
372
            pos1 = pos2 + replace.first.size();
×
373
            pos2 = res.find(replace.first, pos1);
×
374
        }
375
        if (pos1 < res.npos) res_tmp << res.substr(pos1);
×
376
        res = res_tmp.str();
×
377
    }
×
378
    return res;
×
UNCOV
379
}
×
380

UNCOV
381
void Visualizer::visualizeNode(StructuredSDFG& sdfg,
×
382
                               structured_control_flow::ControlFlowNode& node) {
UNCOV
383
    if (auto block = dynamic_cast<structured_control_flow::Block*>(&node)) {
×
UNCOV
384
        this->visualizeBlock(sdfg, *block);
×
UNCOV
385
        return;
×
386
    }
UNCOV
387
    if (auto sequence = dynamic_cast<structured_control_flow::Sequence*>(&node)) {
×
388
        this->visualizeSequence(sdfg, *sequence);
×
389
        return;
×
390
    }
UNCOV
391
    if (auto if_else = dynamic_cast<structured_control_flow::IfElse*>(&node)) {
×
UNCOV
392
        this->visualizeIfElse(sdfg, *if_else);
×
UNCOV
393
        return;
×
394
    }
UNCOV
395
    if (auto while_loop = dynamic_cast<structured_control_flow::While*>(&node)) {
×
UNCOV
396
        this->visualizeWhile(sdfg, *while_loop);
×
UNCOV
397
        return;
×
398
    }
UNCOV
399
    if (auto loop = dynamic_cast<structured_control_flow::For*>(&node)) {
×
UNCOV
400
        this->visualizeFor(sdfg, *loop);
×
UNCOV
401
        return;
×
402
    }
UNCOV
403
    if (auto return_node = dynamic_cast<structured_control_flow::Return*>(&node)) {
×
UNCOV
404
        this->visualizeReturn(sdfg, *return_node);
×
UNCOV
405
        return;
×
406
    }
UNCOV
407
    if (auto break_node = dynamic_cast<structured_control_flow::Break*>(&node)) {
×
UNCOV
408
        this->visualizeBreak(sdfg, *break_node);
×
UNCOV
409
        return;
×
410
    }
UNCOV
411
    if (auto continue_node = dynamic_cast<structured_control_flow::Continue*>(&node)) {
×
UNCOV
412
        this->visualizeContinue(sdfg, *continue_node);
×
UNCOV
413
        return;
×
414
    }
415
    if (auto map_node = dynamic_cast<structured_control_flow::Map*>(&node)) {
×
416
        this->visualizeMap(sdfg, *map_node);
×
417
        return;
×
418
    }
419
    throw std::runtime_error("Unsupported control flow node");
×
UNCOV
420
}
×
421

UNCOV
422
void Visualizer::visualizeTasklet(data_flow::Tasklet const& tasklet) {
×
UNCOV
423
    std::string op = code_to_string(tasklet.code());
×
UNCOV
424
    std::vector<std::string> arguments;
×
UNCOV
425
    for (size_t i = 0; i < tasklet.inputs().size(); ++i) {
×
UNCOV
426
        std::string arg = tasklet.input(i).first;
×
UNCOV
427
        if (!tasklet.needs_connector(i)) {
×
UNCOV
428
            if (arg != "NAN" && arg != "INFINITY") {
×
UNCOV
429
                if (tasklet.input(i).second.primitive_type() == types::PrimitiveType::Float)
×
430
                    arg += "f";
×
UNCOV
431
            }
×
UNCOV
432
        }
×
UNCOV
433
        arguments.push_back(this->expression(arg));
×
UNCOV
434
    }
×
435

UNCOV
436
    if (tasklet.code() == data_flow::TaskletCode::assign) {
×
UNCOV
437
        this->stream_ << arguments.at(0);
×
UNCOV
438
    } else if (tasklet.code() == data_flow::TaskletCode::fma) {
×
UNCOV
439
        if (arguments.size() != 3) throw std::runtime_error("FMA requires 3 arguments");
×
UNCOV
440
        this->stream_ << arguments.at(0) << " * " << arguments.at(1) << " + " << arguments.at(2);
×
UNCOV
441
    } else if (data_flow::is_infix(tasklet.code())) {
×
UNCOV
442
        switch (data_flow::arity(tasklet.code())) {
×
443
            case 1:
444
                this->stream_ << op << " " << arguments.at(0);
×
445
                break;
×
446
            case 2:
UNCOV
447
                this->stream_ << arguments.at(0) << " " << op << " " << arguments.at(1);
×
UNCOV
448
                break;
×
449
            default:
450
                throw std::runtime_error("Unsupported arity");
×
451
        }
UNCOV
452
    } else {
×
UNCOV
453
        this->stream_ << op << "(" << helpers::join(arguments, ", ") << ")";
×
454
    }
UNCOV
455
}
×
456

UNCOV
457
void Visualizer::visualizeForBounds(symbolic::Symbol const& indvar,
×
458
                                    symbolic::Expression const& init,
459
                                    symbolic::Condition const& condition,
460
                                    symbolic::Expression const& update) {
UNCOV
461
    if ((init->get_type_code() == SymEngine::TypeID::SYMENGINE_INTEGER ||
×
462
         init->get_type_code() == SymEngine::TypeID::SYMENGINE_SYMBOL) &&
×
UNCOV
463
        (condition->get_type_code() == SymEngine::TypeID::SYMENGINE_STRICTLESSTHAN ||
×
UNCOV
464
         condition->get_type_code() == SymEngine::TypeID::SYMENGINE_LESSTHAN) &&
×
UNCOV
465
        condition->get_args().size() == 2 &&
×
UNCOV
466
        condition->get_args().at(0)->__str__() == indvar->__str__() &&
×
UNCOV
467
        (condition->get_args().at(1)->get_type_code() == SymEngine::TypeID::SYMENGINE_INTEGER ||
×
UNCOV
468
         condition->get_args().at(1)->get_type_code() == SymEngine::TypeID::SYMENGINE_SYMBOL) &&
×
UNCOV
469
        update->get_type_code() == SymEngine::TypeID::SYMENGINE_ADD &&
×
UNCOV
470
        update->get_args().size() == 2 &&
×
UNCOV
471
        (update->get_args().at(0)->__str__() == indvar->__str__() ||
×
UNCOV
472
         update->get_args().at(1)->__str__() == indvar->__str__()) &&
×
UNCOV
473
        (update->get_args().at(0)->get_type_code() == SymEngine::TypeID::SYMENGINE_INTEGER ||
×
474
         update->get_args().at(0)->get_type_code() == SymEngine::TypeID::SYMENGINE_SYMBOL ||
×
475
         update->get_args().at(1)->get_type_code() == SymEngine::TypeID::SYMENGINE_INTEGER ||
×
476
         update->get_args().at(1)->get_type_code() == SymEngine::TypeID::SYMENGINE_SYMBOL)) {
×
UNCOV
477
        this->stream_ << indvar->get_name() << " = " << init->__str__() << ":";
×
UNCOV
478
        if (condition->get_type_code() == SymEngine::TypeID::SYMENGINE_STRICTLESSTHAN)
×
UNCOV
479
            this->stream_ << "(" << condition->get_args().at(1)->__str__() << "-1)";
×
480
        else
UNCOV
481
            this->stream_ << condition->get_args().at(1)->__str__();
×
UNCOV
482
        size_t i = (update->get_args().at(0).get() == indvar.get()) ? 1 : 0;
×
UNCOV
483
        if (update->get_args().at(i)->__str__() != "1")
×
484
            this->stream_ << ":" << update->get_args().at(i)->__str__();
×
UNCOV
485
    } else {
×
486
        this->stream_ << indvar->get_name() << " = " << this->expression(init->__str__()) << "; "
×
487
                      << this->expression(condition->__str__()) << "; " << indvar->get_name()
×
488
                      << " = " << this->expression(update->__str__());
×
489
    }
UNCOV
490
}
×
491

492
void Visualizer::visualizeLibraryNode(const data_flow::LibraryNodeCode libnode_type) {
×
493
    this->stream_ << libnode_type.value();
×
494
}
×
495

UNCOV
496
void Visualizer::visualizeSubset(Function const& function, types::IType const& type,
×
497
                                 data_flow::Subset const& sub) {
UNCOV
498
    if (sub.empty()) return;
×
UNCOV
499
    if (dynamic_cast<const types::Scalar*>(&type)) {
×
500
        return;
×
UNCOV
501
    } else if (auto array_type = dynamic_cast<const types::Array*>(&type)) {
×
UNCOV
502
        this->stream_ << "[" << this->expression(sub.at(0)->__str__()) << "]";
×
UNCOV
503
        if (sub.size() > 1) {
×
504
            data_flow::Subset element_subset(sub.begin() + 1, sub.end());
×
505
            types::IType const& element_type = array_type->element_type();
×
506
            this->visualizeSubset(function, element_type, element_subset);
×
507
        }
×
UNCOV
508
    } else if (auto pointer_type = dynamic_cast<const types::Pointer*>(&type)) {
×
UNCOV
509
        this->stream_ << "[" << this->expression(sub.at(0)->__str__()) << "]";
×
UNCOV
510
        data_flow::Subset element_subset(sub.begin() + 1, sub.end());
×
UNCOV
511
        types::IType const& pointee_type = pointer_type->pointee_type();
×
UNCOV
512
        this->visualizeSubset(function, pointee_type, element_subset);
×
UNCOV
513
    } else if (auto structure_type = dynamic_cast<const types::Structure*>(&type)) {
×
514
        types::StructureDefinition const& definition = function.structure(structure_type->name());
×
515
        this->stream_ << ".member_" << this->expression(sub.at(0)->__str__());
×
516
        if (sub.size() > 1) {
×
517
            auto member = SymEngine::rcp_dynamic_cast<const SymEngine::Integer>(sub.at(0));
×
518
            types::IType const& member_type = definition.member_type(member);
×
519
            data_flow::Subset element_subset(sub.begin() + 1, sub.end());
×
520
            this->visualizeSubset(function, member_type, element_subset);
×
521
        }
×
522
    } else {
×
523
        throw InvalidSDFGException("visualizeSubset: Unsupported type");
×
524
    }
UNCOV
525
}
×
526

527
}  // namespace visualizer
528
}  // namespace sdfg
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc