1use crate::*;
2
3#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn constant_primary(s: Span) -> IResult<Span, ConstantPrimary> {
8 alt((
9 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 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}