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

daisytuner / sdfglib / 15494289007

06 Jun 2025 03:36PM UTC coverage: 57.304% (-0.4%) from 57.704%
15494289007

push

github

web-flow
Merge pull request #60 from daisytuner/kernels

removes kernel node in favor of function types

78 of 99 new or added lines in 11 files covered. (78.79%)

91 existing lines in 14 files now uncovered.

7583 of 13233 relevant lines covered (57.3%)

116.04 hits per line

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

82.08
/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/schedule.h"
14
#include "sdfg/structured_control_flow/block.h"
15
#include "sdfg/structured_control_flow/control_flow_node.h"
16
#include "sdfg/structured_control_flow/for.h"
17
#include "sdfg/structured_control_flow/if_else.h"
18
#include "sdfg/structured_control_flow/return.h"
19
#include "sdfg/structured_control_flow/sequence.h"
20
#include "sdfg/structured_control_flow/while.h"
21
#include "sdfg/symbolic/symbolic.h"
22
#include "sdfg/types/type.h"
23
#include "symengine/basic.h"
24

25
namespace sdfg {
26
namespace visualizer {
27

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

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

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

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

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

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

UNCOV
492
void Visualizer::visualizeLibraryNode(const data_flow::LibraryNodeType libnode_type) {
×
UNCOV
493
    switch (libnode_type) {
×
494
        case data_flow::LibraryNodeType::LocalBarrier:
UNCOV
495
            this->stream_ << "Local Barrier";
×
UNCOV
496
            break;
×
497
        default:
498
            throw std::runtime_error("Unsupported library node type");
×
499
    }
UNCOV
500
}
×
501

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

533
}  // namespace visualizer
534
}  // 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