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

Nic30 / hdlConvertor / #201

10 Jun 2025 02:39PM UTC coverage: 59.995% (-2.5%) from 62.506%
#201

push

travis-ci

Nic30
Merge remote-tracking branch 'origin/mesonbuild'

109 of 127 new or added lines in 14 files covered. (85.83%)

11 existing lines in 6 files now uncovered.

41572 of 69293 relevant lines covered (59.99%)

1047819.11 hits per line

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

81.05
/src/svConvertor/exprParser.cpp
1
#include <hdlConvertor/svConvertor/exprParser.h>
2

3
#include <hdlConvertor/createObject.h>
4
#include <hdlConvertor/notImplementedLogger.h>
5
#include <hdlConvertor/svConvertor/utils.h>
6
#include <hdlConvertor/svConvertor/paramDefParser.h>
7
#include <hdlConvertor/svConvertor/moduleInstanceParser.h>
8
#include <hdlConvertor/svConvertor/literalParser.h>
9
#include <hdlConvertor/svConvertor/attributeParser.h>
10
#include <hdlConvertor/svConvertor/exprPrimaryParser.h>
11
#include <hdlConvertor/svConvertor/typeParser.h>
12

13

14
namespace hdlConvertor {
15
namespace sv {
16

17
using namespace std;
18
using namespace hdlConvertor::hdlAst;
19

20

21
unique_ptr<iHdlExprItem> VerExprParser::visitConstant_expression(
2,262✔
22
                sv2017Parser::Constant_expressionContext *ctx) {
23
        // constant_expression : expression ;
24
        return visitExpression(ctx->expression());
2,262✔
25
}
26

27
unique_ptr<iHdlExprItem> VerExprParser::visitRange_expression(
13,810✔
28
                sv2017Parser::Range_expressionContext *ctx) {
29
        // range_expression:
30
        //    expression ( COLON expression )?
31
        // ;
32
        auto exprs = ctx->expression();
13,810✔
33
        assert(exprs.size() >= 1);
13,810✔
34
        auto l = visitExpression(exprs[0]);
13,810✔
35
        if (exprs.size() == 2) {
13,810✔
36
                auto h = visitExpression(exprs[1]);
13,754✔
37
                return create_object<HdlOp>(ctx, move(l), HdlOpType::DOWNTO, move(h));
13,754✔
38
        } else {
13,754✔
39
                assert(exprs.size() == 1);
56✔
40
                return l;
56✔
41
        }
42
}
13,810✔
43

44
unique_ptr<iHdlExprItem> VerExprParser::visitNet_lvalue(
2,022✔
45
                sv2017Parser::Net_lvalueContext *ctx) {
46
        //net_lvalue: variable_lvalue;
47
        auto v = ctx->variable_lvalue();
2,022✔
48
        assert(v);
2,022✔
49
        return visitVariable_lvalue(v);
2,022✔
50
}
51

52
unique_ptr<iHdlExprItem> VerExprParser::visitPackage_scope(
×
53
                sv2017Parser::Package_scopeContext *ctx) {
54
        // package_scope: ( KW_DOLAR_UNIT | identifier ) DOUBLE_COLON;
55
        auto du = ctx->KW_DOLAR_UNIT();
×
56
        if (du) {
×
57
                return create_object<HdlValueId>(du, "$unit");
×
58
        } else {
59
                auto id = ctx->identifier();
×
60
                assert(id);
×
61
                return visitIdentifier(id);
×
62
        }
63
}
64

65
unique_ptr<iHdlExprItem> VerExprParser::visitPs_identifier(
108✔
66
                sv2017Parser::Ps_identifierContext *ctx) {
67
        // ps_identifier: ( package_scope )? identifier;
68
        auto id = ctx->identifier();
108✔
69
        assert(id);
108✔
70
        auto res = visitIdentifier(id);
108✔
71
        auto ps = ctx->package_scope();
108✔
72
        if (ps) {
108✔
73
                auto _ps = visitPackage_scope(ps);
×
74
                res = create_object<HdlOp>(ctx, move(_ps), HdlOpType::DOUBLE_COLON,
×
75
                                move(res));
×
76
        }
×
77
        return res;
108✔
78
}
×
79

80
unique_ptr<iHdlExprItem> VerExprParser::visitArray_range_expression(
24,623✔
81
                sv2017Parser::Array_range_expressionContext *ctx) {
82
        // array_range_expression:
83
        //  expression ( ( operator_plus_minus )? COLON expression )?;
84
        auto es = ctx->expression();
24,623✔
85
        auto e0 = visitExpression(es[0]);
24,623✔
86
        if (es.size() == 1) {
24,623✔
87
                return e0;
504✔
88
        }
89
        assert(es.size() == 2);
24,119✔
90
        auto e1 = visitExpression(es[1]);
24,119✔
91
        auto _pm = ctx->operator_plus_minus();
24,119✔
92
        HdlOpType op = HdlOpType::DOWNTO;
24,119✔
93
        if (_pm) {
24,119✔
94
                // e0 is offset
95
                // e1 is width
96
                // pm specifies direction of slice from offset
97
                auto pm = VerLiteralParser::visitOperator_plus_minus(_pm);
3,122✔
98
                if (pm == HdlOpType::ADD) {
3,122✔
99
                        op = HdlOpType::PART_SELECT_POST;
1,957✔
100
                } else {
101
                        op = HdlOpType::PART_SELECT_PRE;
1,165✔
102
                }
103
        }
104
        return create_object<HdlOp>(ctx, move(e0), op, move(e1));
24,119✔
105
}
24,623✔
106

107
unique_ptr<iHdlExprItem> VerExprParser::visitIdentifier_doted_index_at_end(
11,672✔
108
                sv2017Parser::Identifier_doted_index_at_endContext *ctx) {
109
        // identifier_doted_index_at_end:
110
        //    identifier ( DOT identifier )?  ( LSQUARE_BR range_expression RSQUARE_BR )*;
111
        auto id = ctx->identifier();
11,672✔
112
        auto res = visitIdentifier(id[0]);
11,672✔
113
        if (id.size() >= 2) {
11,672✔
114
                res = append_expr(ctx, move(res), HdlOpType::DOT,
×
115
                                visitIdentifier(id[1]));
×
116
        }
117
        for (auto _re : ctx->range_expression()) {
11,763✔
118
                auto re = visitRange_expression(_re);
91✔
119
                res = append_expr(_re, move(res), HdlOpType::INDEX, move(re));
91✔
120
        }
11,763✔
121
        return res;
11,672✔
122
}
11,672✔
123

124
unique_ptr<iHdlExprItem> VerExprParser::visitInc_or_dec_expression(
497✔
125
                sv2017Parser::Inc_or_dec_expressionContext *ctx) {
126
        // inc_or_dec_expression:
127
        //      inc_or_dec_operator ( attribute_instance )* variable_lvalue #Inc_or_dec_expressionPre
128
        //     | variable_lvalue ( attribute_instance )* inc_or_dec_operator  #Inc_or_dec_expressionPost
129
        // ;
130
        HdlOpType op;
131
        unique_ptr<iHdlExprItem> e;
497✔
132
        if (dynamic_cast<sv2017Parser::Inc_or_dec_expressionPreContext*>(ctx)) {
497✔
133
                auto c =
94✔
134
                                static_cast<sv2017Parser::Inc_or_dec_expressionPreContext*>(ctx);
135
                auto _op = c->inc_or_dec_operator();
94✔
136
                op = VerLiteralParser::visitInc_or_dec_operator(_op, true);
94✔
137
                e = visitVariable_lvalue(c->variable_lvalue());
94✔
138
                VerAttributeParser(this).visitAttribute_instance(*e, c->attribute_instance());
94✔
139
        } else {
140
                auto c =
141
                                dynamic_cast<sv2017Parser::Inc_or_dec_expressionPostContext*>(ctx);
403✔
142
                assert(c);
403✔
143
                auto _op = c->inc_or_dec_operator();
403✔
144
                op = VerLiteralParser::visitInc_or_dec_operator(_op, false);
403✔
145
                e = visitVariable_lvalue(c->variable_lvalue());
403✔
146
                VerAttributeParser(this).visitAttribute_instance(*e, c->attribute_instance());
403✔
147
        }
148
        return create_object<HdlOp>(ctx, op, move(e));
994✔
149
}
497✔
150

151

152
unique_ptr<iHdlExprItem> VerExprParser::visitExpression(
802,470✔
153
                sv2017Parser::ExpressionContext *ctx) {
154
        auto e = _visitExpression(ctx);
802,470✔
155
        VerAttributeParser ap(this);
802,470✔
156
        for (auto ai : ctx->attribute_instance()) {
802,482✔
157
                ap.visitAttribute_instance(*e, ai);
12✔
158
        }
802,470✔
159
        return e;
802,470✔
NEW
160
}
×
161
unique_ptr<iHdlExprItem> VerExprParser::_visitExpression(
802,470✔
162
                sv2017Parser::ExpressionContext *ctx) {
163
        // expression:
164
        //   primary
165
        //   | LPAREN operator_assignment RPAREN
166
        //   | KW_TAGGED identifier ( expression )?
167
        //   | unary_operator ( attribute_instance )* primary
168
        //   | inc_or_dec_expression
169
        //   | expression DOUBLESTAR           ( attribute_instance )* expression
170
        //   | expression operator_mul_div_mod ( attribute_instance )* expression
171
        //   | expression operator_plus_minus  ( attribute_instance )* expression
172
        //   | expression operator_shift       ( attribute_instance )* expression
173
        //   | expression operator_cmp         ( attribute_instance )* expression
174
        //   | expression KW_INSIDE LBRACE open_range_list RBRACE
175
        //   | expression operator_eq_neq      ( attribute_instance )* expression
176
        //   | expression AMPERSAND            ( attribute_instance )* expression
177
        //   | expression operator_xor         ( attribute_instance )* expression
178
        //   | expression BAR                  ( attribute_instance )* expression
179
        //   | expression AND_LOG              ( attribute_instance )* expression
180
        //   | expression OR_LOG               ( attribute_instance )* expression
181
        //   | expression ( KW_MATCHES pattern )? TRIPLE_AND expression ( KW_MATCHES pattern )?
182
        //   | expression ( KW_MATCHES pattern )? (QUESTIONMARK ( attribute_instance )* expression COLON expression)+ // right associative
183
        //   | expression (operator_impl        ( attribute_instance )* expression)+ // right associative
184
        // ;
185

186
        auto oa = ctx->operator_assignment();
802,470✔
187
        if (oa) {
802,470✔
188
                NotImplementedLogger::print(
×
189
                                "VerExprParser.visitExpression.operator_assignment", ctx);
190
                return create_object<HdlExprNotImplemented>(ctx);
×
191
        }
192
        if (ctx->KW_TAGGED()) {
802,470✔
193
                NotImplementedLogger::print(
×
194
                                "VerExprParser.visitExpression.KW_TAGGED identifier", ctx);
195
                return create_object<HdlExprNotImplemented>(ctx);
×
196
        }
197

198

199
        auto _p = ctx->primary();
802,470✔
200
        if (_p) {
802,470✔
201
                VerExprPrimaryParser pp(this);
647,676✔
202
                auto p = pp.visitPrimary(_p);
647,676✔
203
                auto _uo = ctx->unary_operator();
647,676✔
204
                if (_uo) {
647,676✔
205
                        auto uo = VerLiteralParser::visitUnary_operator(_uo);
13,603✔
206
                        assert(_p);
13,603✔
207
                        return create_object<HdlOp>(_uo, uo, move(p));
13,603✔
208
                } else {
209
                        return p;
634,073✔
210
                }
211
        }
647,676✔
212
        auto ide = ctx->inc_or_dec_expression();
154,794✔
213
        if (ide) {
154,794✔
214
                return visitInc_or_dec_expression(ide);
227✔
215
        }
216
        auto exprs = ctx->expression();
154,567✔
217
        //   | expression (operator_impl        ( attribute_instance )* expression)+ // right associative
218
        //auto oi = ctx->operator_impl();
219
        //if (oi.size()) {
220
        //        std::unique_ptr<iHdlExprItem> res = visitExpression(exprs[oi.size()]);
221
        //        for (size_t i = oi.size(); i != 0; i--) {
222
        //                // construct a implication operators by walking from backwards
223
        //                auto op = VerLiteralParser::visitOperator_impl(oi[i - 1]);
224
        //                auto e0 = visitExpression(exprs[i - 1]);
225
        //                res = create_object<HdlOp>(ctx, move(e0), op, move(res));
226
        //        }
227
        //        return res;
228
        //}
229

230
        if (exprs.size() == 2) {
154,567✔
231
                //   | expression DOUBLESTAR           ( attribute_instance )* expression
232
                //   | expression operator_mul_div_mod ( attribute_instance )* expression
233
                //   | expression operator_plus_minus  ( attribute_instance )* expression
234
                //   | expression operator_shift       ( attribute_instance )* expression
235
                //   | expression operator_cmp         ( attribute_instance )* expression
236
                //   | expression operator_eq_neq      ( attribute_instance )* expression
237
                //   | expression AMPERSAND            ( attribute_instance )* expression
238
                //   | expression operator_xor         ( attribute_instance )* expression
239
                //   | expression BAR                  ( attribute_instance )* expression
240
                //   | expression AND_LOG              ( attribute_instance )* expression
241
                //   | expression OR_LOG               ( attribute_instance )* expression
242
                HdlOpType op;
243
                do {
244
                        if (ctx->DOUBLESTAR()) {
150,436✔
245
                                op = HdlOpType::POW;
836✔
246
                                break;
836✔
247
                        }
248
                        auto omudm = ctx->operator_mul_div_mod();
149,600✔
249
                        if (omudm) {
149,600✔
250
                                op = VerLiteralParser::visitOperator_mul_div_mod(omudm);
11,242✔
251
                                break;
11,242✔
252
                        }
253
                        auto opm = ctx->operator_plus_minus();
138,358✔
254
                        if (opm) {
138,358✔
255
                                op = VerLiteralParser::visitOperator_plus_minus(opm);
27,645✔
256
                                break;
27,645✔
257
                        }
258
                        auto os = ctx->operator_shift();
110,713✔
259
                        if (os) {
110,713✔
260
                                op = VerLiteralParser::visitOperator_shift(os);
2,676✔
261
                                break;
2,676✔
262
                        }
263
                        auto oc = ctx->operator_cmp();
108,037✔
264
                        if (oc) {
108,037✔
265
                                op = VerLiteralParser::visitOperator_cmp(oc);
13,294✔
266
                                break;
13,294✔
267
                        }
268
                        auto oe = ctx->operator_eq_neq();
94,743✔
269
                        if (oe) {
94,743✔
270
                                op = VerLiteralParser::visitOperator_eq_neq(oe);
59,862✔
271
                                break;
59,862✔
272
                        }
273
                        auto oa = ctx->AMPERSAND();
34,881✔
274
                        if (oa) {
34,881✔
275
                                op = HdlOpType::AND;
1,962✔
276
                                break;
1,962✔
277
                        }
278
                        auto ox = ctx->operator_xor();
32,919✔
279
                        if (ox) {
32,919✔
280
                                op = VerLiteralParser::visitOperator_xor(ox);
2,937✔
281
                                break;
2,937✔
282
                        }
283
                        auto ob = ctx->BAR();
29,982✔
284
                        if (ob) {
29,982✔
285
                                op = HdlOpType::OR;
1,411✔
286
                                break;
1,411✔
287
                        }
288
                        auto ola = ctx->AND_LOG();
28,571✔
289
                        if (ola) {
28,571✔
290
                                op = HdlOpType::AND_LOG;
6,192✔
291
                                break;
6,192✔
292
                        }
293
                        auto olo = ctx->OR_LOG();
22,379✔
294
                        if (olo) {
22,379✔
295
                                op = HdlOpType::OR_LOG;
22,363✔
296
                                break;
22,363✔
297
                        }
298
                        auto imp = ctx->operator_impl();
16✔
299
                        if (imp) {
16✔
300
                                op = VerLiteralParser::visitOperator_impl(imp);
16✔
301
                                break;
16✔
302
                        }
303

304
                        assert(false && "unknown binary");
×
305
                } while (0);
306
                auto e0 = visitExpression(exprs[0]);
150,436✔
307
                auto e1 = visitExpression(exprs[1]);
150,436✔
308
                return create_object<HdlOp>(ctx, move(e0), op, move(e1));
150,436✔
309
        }
150,436✔
310
        //   | expression KW_INSIDE LBRACE open_range_list RBRACE
311
        auto inside = ctx->KW_INSIDE();
4,131✔
312
        if (inside) {
4,131✔
313
                NotImplementedLogger::print("VerExprParser.visitExpression - KW_INSIDE",
27✔
314
                                ctx);
315
                return create_object<HdlExprNotImplemented>(ctx);
27✔
316
        }
317
        if (ctx->KW_MATCHES().size()) {
4,104✔
318
                NotImplementedLogger::print(
×
319
                                "VerExprParser.visitExpression - KW_MATCHES", ctx);
320
                return create_object<HdlExprNotImplemented>(ctx);
×
321
        }
322
        //   | expression ( KW_MATCHES pattern )? TRIPLE_AND expression ( KW_MATCHES pattern )?
323
        if (ctx->TRIPLE_AND()) {
4,104✔
324
                NotImplementedLogger::print(
×
325
                                "VerExprParser.visitExpression - TRIPLE_AND", ctx);
326
                return create_object<HdlExprNotImplemented>(ctx);
×
327
        }
328
        //   | expression (( KW_MATCHES pattern )? QUESTIONMARK ( attribute_instance )* expression COLON expression)+
329
        assert(exprs.size() == 3);
4,104✔
330
        auto qm = ctx->QUESTIONMARK();
4,104✔
331
        assert(qm);
4,104✔
332
        // construct a ternary operators by walking backwards
333
        auto e0 = visitExpression(exprs[0]);
4,104✔
334
        auto e1 = visitExpression(exprs[1]);
4,104✔
335
        auto e2 = visitExpression(exprs[2]);
4,104✔
336
        return HdlOp::ternary(ctx, move(e0), move(e1), move(e2));
4,104✔
337
}
154,567✔
338

339
unique_ptr<iHdlExprItem> VerExprParser::visitConcatenation(
10,517✔
340
                sv2017Parser::ConcatenationContext *ctx) {
341
        // concatenation:
342
        //    LBRACE (expression ( concatenation | ( COMMA expression )+)?)? RBRACE;
343
        auto c = ctx->concatenation();
10,517✔
344
        if (c) {
10,517✔
345
                auto _e = ctx->expression(0);
3,572✔
346
                auto e = visitExpression(_e);
3,572✔
347
                auto c2 = visitConcatenation(c);
3,572✔
348
                return create_object<HdlOp>(ctx, move(e), HdlOpType::REPL_CONCAT,
7,144✔
349
                                move(c2));
7,144✔
350
        }
3,572✔
351
        unique_ptr<iHdlExprItem> res = nullptr;
6,945✔
352
        for (auto e : ctx->expression()) {
20,155✔
353
                auto p = VerExprParser::visitExpression(e);
13,210✔
354
                if (res == nullptr)
13,210✔
355
                        res = move(p);
6,941✔
356
                else
357
                        res = create_object<HdlOp>(e, move(res), HdlOpType::CONCAT,
12,538✔
358
                                        move(p));
12,538✔
359
        }
20,155✔
360
        return res;
6,945✔
361
}
6,945✔
362

363
unique_ptr<iHdlExprItem> VerExprParser::visitHierarchical_identifier(
×
364
                sv2017Parser::Hierarchical_identifierContext *ctx) {
365
        // hierarchical_identifier:
366
        //    ( KW_DOLAR_ROOT DOT )? ( identifier_with_bit_select DOT )* identifier;
367
        unique_ptr<iHdlExprItem> selected_name = nullptr;
×
368
        auto rd = ctx->KW_DOLAR_ROOT();
×
369
        if (rd) {
×
370
                selected_name = create_object<HdlValueId>(rd, "$root");
×
371
        }
372
        for (auto i : ctx->identifier_with_bit_select()) {
×
373
                selected_name = visitIdentifier_with_bit_select(move(i),
×
374
                                move(selected_name));
×
375
        }
×
376
        auto _id = ctx->identifier();
×
377
        auto id = visitIdentifier(_id);
×
378
        return append_expr(ctx, move(selected_name), HdlOpType::DOT, move(id));
×
379
}
×
380

381
string VerExprParser::getIdentifierStr(sv2017Parser::IdentifierContext *ctx) {
470,597✔
382
        // identifier:
383
        //     C_IDENTIFIER
384
        //     | SIMPLE_IDENTIFIER
385
        //     | ESCAPED_IDENTIFIER
386
        //     | KW_SAMPLE
387
        //     | KW_RANDOMIZE
388
        //     | KW_TYPE_OPTION
389
        //     | KW_OPTION
390
        //     | KW_STD
391
        // ;
392
        auto eid = ctx->ESCAPED_IDENTIFIER();
470,597✔
393
        if (eid) {
470,597✔
394
                return VerLiteralParser::visitESCAPED_IDENTIFIER(eid);
281✔
395
        } else {
396
                return ctx->getText();
470,316✔
397
        }
398
}
399

400
unique_ptr<iHdlExprItem> VerExprParser::visitIdentifier(
384,294✔
401
                sv2017Parser::IdentifierContext *ctx) {
402
        return create_object<HdlValueId>(ctx, getIdentifierStr(ctx));
384,294✔
403
}
404

405
unique_ptr<iHdlExprItem> VerExprParser::visitMintypmax_expression(
81,219✔
406
                sv2017Parser::Mintypmax_expressionContext *ctx) {
407
        // mintypmax_expression: expression ( COLON expression COLON expression )?;
408
        if (ctx->expression().size() > 1) {
81,219✔
409
                NotImplementedLogger::print(
15✔
410
                                "VerExprParser.visitMintypmax_expression - type and max specified",
411
                                ctx);
412
        }
413
        return visitExpression(ctx->expression(0));
81,219✔
414
}
415

416
unique_ptr<iHdlExprItem> VerExprParser::visitVariable_lvalue(
100,443✔
417
                sv2017Parser::Variable_lvalueContext *ctx) {
418
        //variable_lvalue:
419
        // LBRACE variable_lvalue ( COMMA variable_lvalue )* RBRACE
420
        //  | package_or_class_scoped_hier_id_with_select
421
        //  | ( assignment_pattern_expression_type )? assignment_pattern_variable_lvalue
422
        //  | streaming_concatenation
423
        //;
424
        auto vls = ctx->variable_lvalue();
100,443✔
425
        if (vls.size()) {
100,443✔
426
                if (vls.size() == 1) {
1,035✔
427
                        return visitVariable_lvalue(vls[0]);
10✔
428
                }
429
                vector<unique_ptr<iHdlExprItem>> parts;
1,025✔
430
                for (auto vl : vls) {
3,765✔
431
                        parts.push_back(visitVariable_lvalue(vl));
2,740✔
432
                }
433

434
                return reduce(parts, HdlOpType::CONCAT);
1,025✔
435
        }
1,025✔
436
        auto pid = ctx->package_or_class_scoped_hier_id_with_select();
99,408✔
437
        if (pid) {
99,408✔
438
                return visitPackage_or_class_scoped_hier_id_with_select(pid);
99,408✔
439
        }
440
        auto apvl = ctx->assignment_pattern_variable_lvalue();
×
441
        if (apvl) {
×
442
                NotImplementedLogger::print(
×
443
                                "VerExprParser.visitVariable_lvalue - assignment_pattern_variable_lvalue",
444
                                ctx);
445
        }
446
        auto sc = ctx->streaming_concatenation();
×
447
        assert(sc);
×
448
        NotImplementedLogger::print(
×
449
                        "VerExprParser.visitVariable_lvalue - assignment_pattern_variable_lvalue",
450
                        ctx);
451
        return create_object<HdlExprNotImplemented>(ctx);
×
452
}
100,443✔
453

454
unique_ptr<iHdlExprItem> VerExprParser::visitEvent_trigger(
×
455
                sv2017Parser::Event_triggerContext *ctx) {
456
        // event_trigger:
457
        //  ( ARROW
458
        //    | DOUBLE_RIGHT_ARROW ( delay_or_event_control )?
459
        //  ) hierarchical_identifier SEMI;
460

461
        if (ctx->delay_or_event_control()) {
×
462
                NotImplementedLogger::print(
×
463
                                "VerExprParser.visitEvent_trigger - delay_or_event_control",
464
                                ctx);
465
        }
466
        auto _e = ctx->hierarchical_identifier();
×
467
        auto e = visitHierarchical_identifier(_e);
×
468
        return create_object<HdlOp>(ctx, HdlOpType::ARROW, move(e));
×
469
}
×
470

471
unique_ptr<iHdlExprItem> VerExprParser::visitBit_select(
25,029✔
472
                sv2017Parser::Bit_selectContext *ctx,
473
                unique_ptr<iHdlExprItem> selected_name) {
474
        // bit_select: LSQUARE_BR expression RSQUARE_BR;
475
        auto _e = ctx->expression();
25,029✔
476
        auto e = visitExpression(_e);
25,029✔
477
        return append_expr(_e, move(selected_name), HdlOpType::INDEX, move(e));
50,058✔
478
}
25,029✔
479

480
unique_ptr<iHdlExprItem> VerExprParser::visitIdentifier_with_bit_select(
1✔
481
                sv2017Parser::Identifier_with_bit_selectContext *ctx,
482
                unique_ptr<iHdlExprItem> selected_name) {
483
        // identifier_with_bit_select: identifier ( bit_select )*;
484
        auto id = ctx->identifier();
1✔
485
        auto res = VerExprParser::visitIdentifier(id);
1✔
486
        res = append_expr(ctx, move(selected_name), HdlOpType::DOT, move(res));
1✔
487
        for (auto bs : ctx->bit_select()) {
1✔
488
                res = visitBit_select(bs, move(res));
×
489
        }
1✔
490
        return res;
1✔
491
}
×
492

493
unique_ptr<iHdlExprItem> VerExprParser::visitPackage_or_class_scoped_hier_id_with_select(
99,529✔
494
                sv2017Parser::Package_or_class_scoped_hier_id_with_selectContext *ctx) {
495

496
        // // '::' separated then '.' separated
497
        // package_or_class_scoped_hier_id_with_select:
498
        //     package_or_class_scoped_path ( bit_select )*
499
        //     ( DOT identifier_with_bit_select )*
500
        //     ( LSQUARE_BR expression ( operator_plus_minus )? COLON expression RSQUARE_BR )?;
501
        auto pcsp = ctx->package_or_class_scoped_path();
99,529✔
502
        auto res = visitPackage_or_class_scoped_path(pcsp);
99,529✔
503
        for (auto bs : ctx->bit_select()) {
106,780✔
504
                res = visitBit_select(bs, move(res));
7,251✔
505
        }
99,529✔
506

507
        auto exprs = ctx->expression();
99,529✔
508
        if (exprs.size()) {
99,529✔
509
                assert(exprs.size() == 2);
1,979✔
510
                auto e0 = visitExpression(exprs[0]);
1,979✔
511
                auto e1 = visitExpression(exprs[1]);
1,979✔
512
                auto _pm = ctx->operator_plus_minus();
1,979✔
513
                HdlOpType op = HdlOpType::DOWNTO;
1,979✔
514
                if (_pm) {
1,979✔
515
                        // e0 is offset
516
                        // e1 is width
517
                        // pm specifies direction of slice from offset
518
                        auto pm = VerLiteralParser::visitOperator_plus_minus(_pm);
492✔
519
                        if (pm == HdlOpType::ADD) {
492✔
520
                                op = HdlOpType::PART_SELECT_POST;
305✔
521
                        } else {
522
                                op = HdlOpType::PART_SELECT_PRE;
187✔
523
                        }
524
                }
525
                auto sel = create_object<HdlOp>(ctx, move(e0), op, move(e1));
1,979✔
526
                return append_expr(ctx, move(res), HdlOpType::INDEX, move(sel));
1,979✔
527
        }
1,979✔
528
        return res;
97,550✔
529
}
99,529✔
530

531
std::vector<unique_ptr<iHdlExprItem>> VerExprParser::visitParameter_value_assignment(
27✔
532
                sv2017Parser::Parameter_value_assignmentContext *ctx) {
533
        // parameter_value_assignment:
534
        //   HASH LPAREN ( list_of_parameter_value_assignments )? RPAREN;
535
        auto lpa = ctx->list_of_parameter_value_assignments();
27✔
536
        if (lpa) {
27✔
537
                VerModuleInstanceParser mip(this);
27✔
538
                return mip.visitList_of_parameter_value_assignments(lpa);
27✔
539
        } else {
540
                return {};
×
541
        }
542
}
543

544
unique_ptr<iHdlExprItem> VerExprParser::visitPackage_or_class_scoped_path_item(
347,495✔
545
                sv2017Parser::Package_or_class_scoped_path_itemContext *ctx,
546
                unique_ptr<iHdlExprItem> selected_name,
547
                hdlAst::HdlOpType subname_access_type) {
548
        // package_or_class_scoped_path_item:
549
        //         identifier ( parameter_value_assignment )?
550
        // ;
551
        auto _id = ctx->identifier();
347,495✔
552
        auto id = visitIdentifier(_id);
347,495✔
553
        if (selected_name) {
347,495✔
554
                id = create_object<HdlOp>(ctx, move(selected_name), subname_access_type,
168✔
555
                                move(id));
168✔
556
        }
557
        auto _pva = ctx->parameter_value_assignment();
347,495✔
558
        if (_pva) {
347,495✔
559
                auto pva = visitParameter_value_assignment(_pva);
22✔
560
                id = HdlOp::parametrization(_pva, move(id), pva);
22✔
561
        }
22✔
562
        return id;
347,495✔
563
}
×
564

565
unique_ptr<iHdlExprItem> VerExprParser::visitImplicit_class_handle(
×
566
                sv2017Parser::Implicit_class_handleContext *ctx,
567
                unique_ptr<iHdlExprItem> selected_name, HdlOpType subname_access_type) {
568
        // implicit_class_handle:
569
        //  KW_THIS ( DOT KW_SUPER )?
570
        //   | KW_SUPER
571
        //  ;
572
        auto this_ = ctx->KW_THIS();
×
573
        if (this_) {
×
574
                auto t = create_object<HdlValueId>(this_, "this");
×
575
                selected_name = append_expr(ctx, move(selected_name),
×
576
                                subname_access_type, move(t));
×
577
                subname_access_type = HdlOpType::DOT;
×
578
        }
×
579
        auto sup = ctx->KW_SUPER();
×
580
        if (sup) {
×
581
                auto s = create_object<HdlValueId>(sup, "super");
×
582
                selected_name = append_expr(ctx, move(selected_name),
×
583
                                subname_access_type, move(s));
×
584
        }
×
585
        assert(selected_name);
×
586
        return selected_name;
×
587
}
588

589
unique_ptr<iHdlExprItem> VerExprParser::visitPackage_or_class_scoped_path(
347,419✔
590
                sv2017Parser::Package_or_class_scoped_pathContext *ctx) {
591
        // // '::' separated
592
        // package_or_class_scoped_path:
593
        //    ( KW_LOCAL DOUBLE_COLON )? (
594
        //                   KW_DOLAR_ROOT
595
        //         | implicit_class_handle
596
        //         | KW_DOLAR_UNIT
597
        //         | package_or_class_scoped_path_item
598
        //         ) ( DOUBLE_COLON package_or_class_scoped_path_item)*;
599
        unique_ptr<iHdlExprItem> res = nullptr;
347,419✔
600
        auto loc = ctx->KW_LOCAL();
347,419✔
601
        if (ctx->KW_LOCAL()) {
347,419✔
602
                res = create_object<HdlValueId>(loc, "local");
×
603
        }
604
        auto r = ctx->KW_DOLAR_ROOT();
347,419✔
605
        if (r) {
347,419✔
606
                res = append_expr(ctx, move(res), HdlOpType::DOUBLE_COLON,
12✔
607
                                create_object<HdlValueId>(r, "$root"));
18✔
608
        } else {
609
                auto _ich = ctx->implicit_class_handle();
347,413✔
610
                if (_ich) {
347,413✔
611
                        res = visitImplicit_class_handle(_ich, move(res),
×
612
                                        HdlOpType::DOUBLE_COLON);
×
613
                } else {
614
                        auto du = ctx->KW_DOLAR_UNIT();
347,413✔
615
                        if (du) {
347,413✔
616
                                auto part = create_object<HdlValueId>(du, "$unit");
2✔
617
                                res = append_expr(ctx, move(res), HdlOpType::DOUBLE_COLON,
4✔
618
                                                move(part));
4✔
619
                        } else {
2✔
620
                                auto pcspi = ctx->package_or_class_scoped_path_item();
347,411✔
621
                                assert(pcspi.size() > 0);
347,411✔
622
                                for (auto i : pcspi) {
694,904✔
623
                                        res = visitPackage_or_class_scoped_path_item(i, move(res),
694,986✔
624
                                                        HdlOpType::DOUBLE_COLON);
347,493✔
625
                                }
626
                                return res;
347,411✔
627
                        }
347,411✔
628
                }
629
        }
630
        auto pcspi = ctx->package_or_class_scoped_path_item();
8✔
631
        for (auto i : pcspi) {
10✔
632
                res = visitPackage_or_class_scoped_path_item(i, move(res),
4✔
633
                                HdlOpType::DOUBLE_COLON);
2✔
634
        }
635
        return res;
8✔
636
}
8✔
637

638
unique_ptr<iHdlExprItem> VerExprParser::visitCond_predicate(
40,472✔
639
                sv2017Parser::Cond_predicateContext *ctx) {
640
        // cond_predicate:
641
        //     expression ( KW_MATCHES pattern )? ( TRIPLE_AND expression ( KW_MATCHES pattern )? )*;
642
        if (ctx->KW_MATCHES().size()) {
40,472✔
643
                NotImplementedLogger::print(
×
644
                                "VerExprParser.visitCond_predicate.KW_MATCHES", ctx);
645
        }
646
        if (ctx->TRIPLE_AND().size()) {
40,472✔
647
                NotImplementedLogger::print(
×
648
                                "VerExprParser.visitCond_predicate.TRIPLE_AND", ctx);
649
        }
650
        return visitExpression(ctx->expression(0));
40,472✔
651
}
652

653
void VerExprParser::visitList_of_arguments(
51,062✔
654
                sv2017Parser::List_of_argumentsContext *ctx,
655
                vector<unique_ptr<iHdlExprItem>> &args) {
656
        // list_of_arguments_named_item: DOT identifier LPAREN ( expression )? RPAREN;
657
        // list_of_arguments:
658
        //     ( list_of_arguments_named_item
659
        //      | COMMA list_of_arguments_named_item
660
        //      | expression ( COMMA ( expression )? )*
661
        //      | ( COMMA ( expression )? )+
662
        //     )
663
        //     ( COMMA list_of_arguments_named_item )*;
664
        VerExprParser ep(this);
51,062✔
665
        bool expecting_value = true;
51,062✔
666
        for (auto c : ctx->children) {
212,388✔
667
                auto t = dynamic_cast<antlr4::tree::TerminalNode*>(c);
161,326✔
668
                bool is_comma = t && t->getSymbol()->getType() == sv2017Parser::COMMA;
161,326✔
669
                if (expecting_value && is_comma) {
161,326✔
670
                        args.push_back(create_object<HdlValueId>(c, "void"));
441✔
671
                }
672
                if (is_comma) {
161,326✔
673
                        expecting_value = true;
55,353✔
674
                } else {
675
                        auto _e = dynamic_cast<sv2017Parser::ExpressionContext*>(c);
105,973✔
676
                        if (_e) {
105,973✔
677
                                auto e = ep.visitExpression(_e);
105,942✔
678
                                args.push_back(move(e));
105,942✔
679
                        } else {
105,942✔
680
                                auto _ni =
681
                                                dynamic_cast<sv2017Parser::List_of_arguments_named_itemContext*>(c);
31✔
682
                                assert(_ni);
31✔
683
                                auto name = ep.visitIdentifier(_ni->identifier());
31✔
684
                                unique_ptr<iHdlExprItem> v = nullptr;
31✔
685
                                auto _v = _ni->expression();
31✔
686
                                if (_v)
31✔
687
                                        v = ep.visitExpression(_v);
27✔
688
                                else
689
                                        v = create_object<HdlValueId>(c, "void");
4✔
690
                                auto e = create_object<HdlOp>(c, move(name),
31✔
691
                                                HdlOpType::MAP_ASSOCIATION, move(v));
31✔
692
                                args.push_back(move(e));
31✔
693
                        }
31✔
694
                        expecting_value = false;
105,973✔
695
                }
696
        }
697
}
51,062✔
698

699
unique_ptr<iHdlExprItem> VerExprParser::visitOperator_assignment(
68,963✔
700
                sv2017Parser::Operator_assignmentContext *ctx) {
701
        // operator_assignment: variable_lvalue assignment_operator expression;
702
        auto vlv = ctx->variable_lvalue();
68,963✔
703
        auto dst = visitVariable_lvalue(vlv);
68,963✔
704
        auto e = ctx->expression();
68,963✔
705
        auto src = visitExpression(e);
68,963✔
706
        auto op = VerLiteralParser::visitAssignment_operator(
68,963✔
707
                        ctx->assignment_operator());
68,963✔
708
        return create_object<HdlOp>(ctx, move(dst), op, move(src));
137,926✔
709
}
68,963✔
710

711
}
712
}
713

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