sv_parser_parser/expressions/
primaries.rs

1use crate::*;
2
3// -----------------------------------------------------------------------------
4
5#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn constant_primary(s: Span) -> IResult<Span, ConstantPrimary> {
8    alt((
9        // BNF-WA
10        map(keyword("$"), |x| ConstantPrimary::Dollar(Box::new(x))),
11        map(keyword("null"), |x| ConstantPrimary::Null(Box::new(x))),
12        map(constant_assignment_pattern_expression, |x| {
13            ConstantPrimary::ConstantAssignmentPatternExpression(Box::new(x))
14        }),
15        map(constant_cast, |x| {
16            ConstantPrimary::ConstantCast(Box::new(x))
17        }),
18        map(primary_literal, |x| {
19            ConstantPrimary::PrimaryLiteral(Box::new(x))
20        }),
21        constant_primary_mintypmax_expression,
22        map(
23            terminated(constant_function_call, peek(not(one_of("[.")))),
24            |x| ConstantPrimary::ConstantFunctionCall(Box::new(x)),
25        ),
26        constant_primary_ps_parameter,
27        constant_primary_specparam,
28        map(genvar_identifier, |x| {
29            ConstantPrimary::GenvarIdentifier(Box::new(x))
30        }),
31        constant_primary_formal_port,
32        constant_primary_enum,
33        constant_primary_concatenation,
34        constant_primary_multiple_concatenation,
35        map(constant_let_expression, |x| {
36            ConstantPrimary::ConstantLetExpression(Box::new(x))
37        }),
38        map(type_reference, |x| {
39            ConstantPrimary::TypeReference(Box::new(x))
40        }),
41    ))(s)
42}
43
44#[tracable_parser]
45#[packrat_parser]
46pub(crate) fn constant_primary_without_cast(s: Span) -> IResult<Span, ConstantPrimary> {
47    alt((
48        // BNF-WA
49        map(keyword("$"), |x| ConstantPrimary::Dollar(Box::new(x))),
50        map(keyword("null"), |x| ConstantPrimary::Null(Box::new(x))),
51        map(constant_assignment_pattern_expression, |x| {
52            ConstantPrimary::ConstantAssignmentPatternExpression(Box::new(x))
53        }),
54        map(primary_literal, |x| {
55            ConstantPrimary::PrimaryLiteral(Box::new(x))
56        }),
57        constant_primary_mintypmax_expression,
58        map(
59            terminated(constant_function_call, peek(not(one_of("[.")))),
60            |x| ConstantPrimary::ConstantFunctionCall(Box::new(x)),
61        ),
62        constant_primary_ps_parameter,
63        constant_primary_specparam,
64        map(genvar_identifier, |x| {
65            ConstantPrimary::GenvarIdentifier(Box::new(x))
66        }),
67        constant_primary_formal_port,
68        constant_primary_enum,
69        constant_primary_concatenation,
70        constant_primary_multiple_concatenation,
71        map(constant_let_expression, |x| {
72            ConstantPrimary::ConstantLetExpression(Box::new(x))
73        }),
74        map(type_reference, |x| {
75            ConstantPrimary::TypeReference(Box::new(x))
76        }),
77    ))(s)
78}
79
80#[tracable_parser]
81#[packrat_parser]
82pub(crate) fn constant_primary_ps_parameter(s: Span) -> IResult<Span, ConstantPrimary> {
83    let (s, a) = ps_parameter_identifier(s)?;
84    let (s, b) = constant_select(s)?;
85    Ok((
86        s,
87        ConstantPrimary::PsParameter(Box::new(ConstantPrimaryPsParameter { nodes: (a, b) })),
88    ))
89}
90
91#[tracable_parser]
92#[packrat_parser]
93pub(crate) fn constant_primary_specparam(s: Span) -> IResult<Span, ConstantPrimary> {
94    let (s, a) = specparam_identifier(s)?;
95    let (s, b) = opt(bracket(constant_range_expression))(s)?;
96    Ok((
97        s,
98        ConstantPrimary::Specparam(Box::new(ConstantPrimarySpecparam { nodes: (a, b) })),
99    ))
100}
101
102#[tracable_parser]
103#[packrat_parser]
104pub(crate) fn constant_primary_formal_port(s: Span) -> IResult<Span, ConstantPrimary> {
105    let (s, a) = formal_port_identifier(s)?;
106    let (s, b) = constant_select(s)?;
107    Ok((
108        s,
109        ConstantPrimary::FormalPort(Box::new(ConstantPrimaryFormalPort { nodes: (a, b) })),
110    ))
111}
112
113#[tracable_parser]
114#[packrat_parser]
115pub(crate) fn constant_primary_enum(s: Span) -> IResult<Span, ConstantPrimary> {
116    let (s, a) = package_scope_or_class_scope(s)?;
117    let (s, b) = enum_identifier(s)?;
118    Ok((
119        s,
120        ConstantPrimary::Enum(Box::new(ConstantPrimaryEnum { nodes: (a, b) })),
121    ))
122}
123
124#[tracable_parser]
125#[packrat_parser]
126pub(crate) fn constant_primary_concatenation(s: Span) -> IResult<Span, ConstantPrimary> {
127    let (s, a) = constant_concatenation(s)?;
128    let (s, b) = opt(bracket(constant_range_expression))(s)?;
129    Ok((
130        s,
131        ConstantPrimary::Concatenation(Box::new(ConstantPrimaryConcatenation { nodes: (a, b) })),
132    ))
133}
134
135#[tracable_parser]
136#[packrat_parser]
137pub(crate) fn constant_primary_multiple_concatenation(s: Span) -> IResult<Span, ConstantPrimary> {
138    let (s, a) = constant_multiple_concatenation(s)?;
139    let (s, b) = opt(bracket(constant_range_expression))(s)?;
140    Ok((
141        s,
142        ConstantPrimary::MultipleConcatenation(Box::new(ConstantPrimaryMultipleConcatenation {
143            nodes: (a, b),
144        })),
145    ))
146}
147
148#[tracable_parser]
149#[packrat_parser]
150pub(crate) fn constant_primary_mintypmax_expression(s: Span) -> IResult<Span, ConstantPrimary> {
151    let (s, a) = paren(constant_mintypmax_expression)(s)?;
152    Ok((
153        s,
154        ConstantPrimary::MintypmaxExpression(Box::new(ConstantPrimaryMintypmaxExpression {
155            nodes: (a,),
156        })),
157    ))
158}
159
160#[tracable_parser]
161#[packrat_parser]
162pub(crate) fn module_path_primary(s: Span) -> IResult<Span, ModulePathPrimary> {
163    alt((
164        map(number, |x| ModulePathPrimary::Number(Box::new(x))),
165        map(identifier, |x| ModulePathPrimary::Identifier(Box::new(x))),
166        map(module_path_concatenation, |x| {
167            ModulePathPrimary::ModulePathConcatenation(Box::new(x))
168        }),
169        map(module_path_multiple_concatenation, |x| {
170            ModulePathPrimary::ModulePathMultipleConcatenation(Box::new(x))
171        }),
172        map(function_subroutine_call, |x| {
173            ModulePathPrimary::FunctionSubroutineCall(Box::new(x))
174        }),
175        module_path_primary_mintypmax_expression,
176    ))(s)
177}
178
179#[tracable_parser]
180#[packrat_parser]
181pub(crate) fn module_path_primary_mintypmax_expression(
182    s: Span,
183) -> IResult<Span, ModulePathPrimary> {
184    let (s, a) = paren(module_path_mintypmax_expression)(s)?;
185    Ok((
186        s,
187        ModulePathPrimary::Mintypmax(Box::new(ModulePathPrimaryMintypmax { nodes: (a,) })),
188    ))
189}
190
191#[tracable_parser]
192#[packrat_parser]
193pub(crate) fn primary(s: Span) -> IResult<Span, Primary> {
194    alt((
195        terminated(
196            primary_hierarchical,
197            peek(not(alt((
198                map(one_of("(.'"), |_| ()),
199                map(keyword("with"), |_| ()),
200            )))),
201        ),
202        map(assignment_pattern_expression, |x| {
203            Primary::AssignmentPatternExpression(Box::new(x))
204        }),
205        map(cast, |x| Primary::Cast(Box::new(x))),
206        map(primary_literal, |x| Primary::PrimaryLiteral(Box::new(x))),
207        map(empty_unpacked_array_concatenation, |x| {
208            Primary::EmptyUnpackedArrayConcatenation(Box::new(x))
209        }),
210        primary_concatenation,
211        primary_multiple_concatenation,
212        map(function_subroutine_call, |x| {
213            Primary::FunctionSubroutineCall(Box::new(x))
214        }),
215        map(let_expression, |x| Primary::LetExpression(Box::new(x))),
216        primary_mintypmax_expression,
217        map(streaming_concatenation, |x| {
218            Primary::StreamingConcatenation(Box::new(x))
219        }),
220        map(sequence_method_call, |x| {
221            Primary::SequenceMethodCall(Box::new(x))
222        }),
223        map(keyword("this"), |x| Primary::This(Box::new(x))),
224        map(keyword("$"), |x| Primary::Dollar(Box::new(x))),
225        map(keyword("null"), |x| Primary::Null(Box::new(x))),
226    ))(s)
227}
228
229#[tracable_parser]
230#[packrat_parser]
231pub(crate) fn primary_hierarchical(s: Span) -> IResult<Span, Primary> {
232    let (s, a) = opt(class_qualifier_or_package_scope)(s)?;
233    let (s, b) = hierarchical_identifier(s)?;
234    let (s, c) = select(s)?;
235    Ok((
236        s,
237        Primary::Hierarchical(Box::new(PrimaryHierarchical { nodes: (a, b, c) })),
238    ))
239}
240
241#[tracable_parser]
242#[packrat_parser]
243pub(crate) fn primary_concatenation(s: Span) -> IResult<Span, Primary> {
244    let (s, a) = concatenation(s)?;
245    let (s, b) = opt(bracket(range_expression))(s)?;
246    Ok((
247        s,
248        Primary::Concatenation(Box::new(PrimaryConcatenation { nodes: (a, b) })),
249    ))
250}
251
252#[tracable_parser]
253#[packrat_parser]
254pub(crate) fn primary_multiple_concatenation(s: Span) -> IResult<Span, Primary> {
255    let (s, a) = multiple_concatenation(s)?;
256    let (s, b) = opt(bracket(range_expression))(s)?;
257    Ok((
258        s,
259        Primary::MultipleConcatenation(Box::new(PrimaryMultipleConcatenation { nodes: (a, b) })),
260    ))
261}
262
263#[tracable_parser]
264#[packrat_parser]
265pub(crate) fn primary_mintypmax_expression(s: Span) -> IResult<Span, Primary> {
266    let (s, a) = paren(mintypmax_expression)(s)?;
267    Ok((
268        s,
269        Primary::MintypmaxExpression(Box::new(PrimaryMintypmaxExpression { nodes: (a,) })),
270    ))
271}
272
273#[tracable_parser]
274#[packrat_parser]
275pub(crate) fn class_qualifier_or_package_scope(
276    s: Span,
277) -> IResult<Span, ClassQualifierOrPackageScope> {
278    alt((
279        map(class_qualifier, |x| {
280            ClassQualifierOrPackageScope::ClassQualifier(Box::new(x))
281        }),
282        map(package_scope, |x| {
283            ClassQualifierOrPackageScope::PackageScope(Box::new(x))
284        }),
285    ))(s)
286}
287
288#[recursive_parser]
289#[tracable_parser]
290#[packrat_parser]
291pub(crate) fn class_qualifier(s: Span) -> IResult<Span, ClassQualifier> {
292    let (s, a) = opt(local)(s)?;
293    let (s, b) = opt(implicit_class_handle_or_class_scope)(s)?;
294    Ok((s, ClassQualifier { nodes: (a, b) }))
295}
296
297#[tracable_parser]
298#[packrat_parser]
299pub(crate) fn range_expression(s: Span) -> IResult<Span, RangeExpression> {
300    alt((
301        map(part_select_range, |x| {
302            RangeExpression::PartSelectRange(Box::new(x))
303        }),
304        map(expression, |x| RangeExpression::Expression(Box::new(x))),
305    ))(s)
306}
307
308#[tracable_parser]
309#[packrat_parser]
310pub(crate) fn primary_literal(s: Span) -> IResult<Span, PrimaryLiteral> {
311    alt((
312        map(time_literal, |x| PrimaryLiteral::TimeLiteral(Box::new(x))),
313        map(number, |x| PrimaryLiteral::Number(Box::new(x))),
314        map(unbased_unsized_literal, |x| {
315            PrimaryLiteral::UnbasedUnsizedLiteral(Box::new(x))
316        }),
317        map(string_literal, |x| {
318            PrimaryLiteral::StringLiteral(Box::new(x))
319        }),
320    ))(s)
321}
322
323#[tracable_parser]
324#[packrat_parser]
325pub(crate) fn time_literal(s: Span) -> IResult<Span, TimeLiteral> {
326    alt((time_literal_unsigned, time_literal_fixed_point))(s)
327}
328
329#[tracable_parser]
330#[packrat_parser]
331pub(crate) fn time_literal_unsigned(s: Span) -> IResult<Span, TimeLiteral> {
332    let (s, a) = unsigned_number_exact(s)?;
333    let (s, b) = time_unit(s)?;
334    Ok((
335        s,
336        TimeLiteral::Unsigned(Box::new(TimeLiteralUnsigned { nodes: (a, b) })),
337    ))
338}
339
340#[tracable_parser]
341#[packrat_parser]
342pub(crate) fn time_literal_fixed_point(s: Span) -> IResult<Span, TimeLiteral> {
343    let (s, a) = fixed_point_number_exact(s)?;
344    let (s, b) = time_unit(s)?;
345    Ok((
346        s,
347        TimeLiteral::FixedPoint(Box::new(TimeLiteralFixedPoint { nodes: (a, b) })),
348    ))
349}
350
351#[tracable_parser]
352#[packrat_parser]
353pub(crate) fn time_unit(s: Span) -> IResult<Span, TimeUnit> {
354    alt((
355        map(keyword("s"), |x| TimeUnit::S(Box::new(x))),
356        map(keyword("ms"), |x| TimeUnit::MS(Box::new(x))),
357        map(keyword("us"), |x| TimeUnit::US(Box::new(x))),
358        map(keyword("ns"), |x| TimeUnit::NS(Box::new(x))),
359        map(keyword("ps"), |x| TimeUnit::PS(Box::new(x))),
360        map(keyword("fs"), |x| TimeUnit::FS(Box::new(x))),
361    ))(s)
362}
363
364#[tracable_parser]
365#[packrat_parser]
366pub(crate) fn implicit_class_handle(s: Span) -> IResult<Span, ImplicitClassHandle> {
367    alt((
368        map(
369            triple(keyword("this"), symbol("."), keyword("super")),
370            |(x, y, z)| ImplicitClassHandle::ThisSuper(Box::new((x, y, z))),
371        ),
372        map(keyword("this"), |x| ImplicitClassHandle::This(Box::new(x))),
373        map(keyword("super"), |x| {
374            ImplicitClassHandle::Super(Box::new(x))
375        }),
376    ))(s)
377}
378
379#[tracable_parser]
380#[packrat_parser]
381pub(crate) fn bit_select(s: Span) -> IResult<Span, BitSelect> {
382    let (s, a) = many0(bracket(expression))(s)?;
383    Ok((s, BitSelect { nodes: (a,) }))
384}
385
386#[tracable_parser]
387#[packrat_parser]
388pub(crate) fn select(s: Span) -> IResult<Span, Select> {
389    let (s, a) = opt(triple(
390        many0(terminated(
391            triple(symbol("."), member_identifier, bit_select),
392            peek(symbol(".")),
393        )),
394        symbol("."),
395        member_identifier,
396    ))(s)?;
397    let (s, b) = bit_select(s)?;
398    let (s, c) = opt(bracket(part_select_range))(s)?;
399    Ok((s, Select { nodes: (a, b, c) }))
400}
401
402#[tracable_parser]
403#[packrat_parser]
404pub(crate) fn nonrange_select(s: Span) -> IResult<Span, NonrangeSelect> {
405    let (s, a) = opt(triple(
406        many0(triple(symbol("."), member_identifier, bit_select)),
407        symbol("."),
408        member_identifier,
409    ))(s)?;
410    let (s, b) = bit_select(s)?;
411    Ok((s, NonrangeSelect { nodes: (a, b) }))
412}
413
414#[tracable_parser]
415#[packrat_parser]
416pub(crate) fn constant_bit_select(s: Span) -> IResult<Span, ConstantBitSelect> {
417    let (s, a) = many0(bracket(constant_expression))(s)?;
418    Ok((s, ConstantBitSelect { nodes: (a,) }))
419}
420
421#[tracable_parser]
422#[packrat_parser]
423pub(crate) fn constant_select(s: Span) -> IResult<Span, ConstantSelect> {
424    let (s, a) = opt(triple(
425        many0(terminated(
426            triple(symbol("."), member_identifier, constant_bit_select),
427            peek(symbol(".")),
428        )),
429        symbol("."),
430        member_identifier,
431    ))(s)?;
432    let (s, b) = constant_bit_select(s)?;
433    let (s, c) = opt(bracket(constant_part_select_range))(s)?;
434    Ok((s, ConstantSelect { nodes: (a, b, c) }))
435}
436
437#[recursive_parser]
438#[tracable_parser]
439#[packrat_parser]
440pub(crate) fn constant_cast(s: Span) -> IResult<Span, ConstantCast> {
441    let (s, a) = constant_casting_type(s)?;
442    let (s, b) = symbol("'")(s)?;
443    let (s, c) = paren(constant_expression)(s)?;
444    Ok((s, ConstantCast { nodes: (a, b, c) }))
445}
446
447#[tracable_parser]
448#[packrat_parser]
449pub(crate) fn constant_let_expression(s: Span) -> IResult<Span, ConstantLetExpression> {
450    let (s, a) = let_expression(s)?;
451    Ok((s, ConstantLetExpression { nodes: (a,) }))
452}
453
454#[recursive_parser]
455#[tracable_parser]
456#[packrat_parser]
457pub(crate) fn cast(s: Span) -> IResult<Span, Cast> {
458    let (s, a) = casting_type(s)?;
459    let (s, b) = symbol("'")(s)?;
460    let (s, c) = paren(expression)(s)?;
461    Ok((s, Cast { nodes: (a, b, c) }))
462}