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