sv_parser_parser/udp_declaration_and_instantiation/
udp_declaration.rs

1use crate::*;
2
3// -----------------------------------------------------------------------------
4
5#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn udp_nonansi_declaration(s: Span) -> IResult<Span, UdpNonansiDeclaration> {
8    let (s, (a, b)) = many_till(attribute_instance, keyword("primitive"))(s)?;
9    let (s, c) = udp_identifier(s)?;
10    let (s, d) = paren(udp_port_list)(s)?;
11    let (s, e) = symbol(";")(s)?;
12    Ok((
13        s,
14        UdpNonansiDeclaration {
15            nodes: (a, b, c, d, e),
16        },
17    ))
18}
19
20#[tracable_parser]
21#[packrat_parser]
22pub(crate) fn udp_ansi_declaration(s: Span) -> IResult<Span, UdpAnsiDeclaration> {
23    let (s, (a, b)) = many_till(attribute_instance, keyword("primitive"))(s)?;
24    let (s, c) = udp_identifier(s)?;
25    let (s, d) = paren(udp_declaration_port_list)(s)?;
26    let (s, e) = symbol(";")(s)?;
27    Ok((
28        s,
29        UdpAnsiDeclaration {
30            nodes: (a, b, c, d, e),
31        },
32    ))
33}
34
35#[tracable_parser]
36#[packrat_parser]
37pub(crate) fn udp_declaration(s: Span) -> IResult<Span, UdpDeclaration> {
38    alt((
39        udp_declaration_nonansi,
40        udp_declaration_ansi,
41        udp_declaration_extern_nonansi,
42        udp_declaration_extern_ansi,
43        udp_declaration_wildcard,
44    ))(s)
45}
46
47#[tracable_parser]
48#[packrat_parser]
49pub(crate) fn udp_declaration_nonansi(s: Span) -> IResult<Span, UdpDeclaration> {
50    let (s, a) = udp_nonansi_declaration(s)?;
51    let (s, b) = udp_port_declaration(s)?;
52    let (s, c) = many0(udp_port_declaration)(s)?;
53    let (s, d) = udp_body(s)?;
54    let (s, e) = keyword("endprimitive")(s)?;
55    let (s, f) = opt(pair(symbol(":"), udp_identifier))(s)?;
56    Ok((
57        s,
58        UdpDeclaration::Nonansi(Box::new(UdpDeclarationNonansi {
59            nodes: (a, b, c, d, e, f),
60        })),
61    ))
62}
63
64#[tracable_parser]
65#[packrat_parser]
66pub(crate) fn udp_declaration_ansi(s: Span) -> IResult<Span, UdpDeclaration> {
67    let (s, a) = udp_ansi_declaration(s)?;
68    let (s, b) = udp_body(s)?;
69    let (s, c) = keyword("endprimitive")(s)?;
70    let (s, d) = opt(pair(symbol(":"), udp_identifier))(s)?;
71    Ok((
72        s,
73        UdpDeclaration::Ansi(Box::new(UdpDeclarationAnsi {
74            nodes: (a, b, c, d),
75        })),
76    ))
77}
78
79#[tracable_parser]
80#[packrat_parser]
81pub(crate) fn udp_declaration_extern_nonansi(s: Span) -> IResult<Span, UdpDeclaration> {
82    let (s, a) = keyword("extern")(s)?;
83    let (s, b) = udp_nonansi_declaration(s)?;
84    Ok((
85        s,
86        UdpDeclaration::ExternNonansi(Box::new(UdpDeclarationExternNonansi { nodes: (a, b) })),
87    ))
88}
89
90#[tracable_parser]
91#[packrat_parser]
92pub(crate) fn udp_declaration_extern_ansi(s: Span) -> IResult<Span, UdpDeclaration> {
93    let (s, a) = keyword("extern")(s)?;
94    let (s, b) = udp_ansi_declaration(s)?;
95    Ok((
96        s,
97        UdpDeclaration::ExternAnsi(Box::new(UdpDeclarationExternAnsi { nodes: (a, b) })),
98    ))
99}
100
101#[tracable_parser]
102#[packrat_parser]
103pub(crate) fn udp_declaration_wildcard(s: Span) -> IResult<Span, UdpDeclaration> {
104    let (s, (a, b)) = many_till(attribute_instance, keyword("primitive"))(s)?;
105    let (s, c) = udp_identifier(s)?;
106    let (s, d) = paren(symbol(".*"))(s)?;
107    let (s, e) = symbol(";")(s)?;
108    let (s, f) = many0(udp_port_declaration)(s)?;
109    let (s, g) = udp_body(s)?;
110    let (s, h) = keyword("endprimitive")(s)?;
111    let (s, i) = opt(pair(symbol(":"), udp_identifier))(s)?;
112    Ok((
113        s,
114        UdpDeclaration::Wildcard(Box::new(UdpDeclarationWildcard {
115            nodes: (a, b, c, d, e, f, g, h, i),
116        })),
117    ))
118}