sv_parser_parser/instantiations/
module_instantiation.rs

1use crate::*;
2
3// -----------------------------------------------------------------------------
4
5#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn module_instantiation(s: Span) -> IResult<Span, ModuleInstantiation> {
8    let (s, a) = module_identifier(s)?;
9    let (s, b) = opt(parameter_value_assignment)(s)?;
10    let (s, c) = list(symbol(","), hierarchical_instance)(s)?;
11    let (s, d) = symbol(";")(s)?;
12    Ok((
13        s,
14        ModuleInstantiation {
15            nodes: (a, b, c, d),
16        },
17    ))
18}
19
20#[tracable_parser]
21#[packrat_parser]
22pub(crate) fn parameter_value_assignment(s: Span) -> IResult<Span, ParameterValueAssignment> {
23    let (s, a) = symbol("#")(s)?;
24    let (s, b) = paren(opt(list_of_parameter_assignments))(s)?;
25    Ok((s, ParameterValueAssignment { nodes: (a, b) }))
26}
27
28#[tracable_parser]
29#[packrat_parser]
30pub(crate) fn list_of_parameter_assignments(s: Span) -> IResult<Span, ListOfParameterAssignments> {
31    alt((
32        list_of_parameter_assignments_named,
33        list_of_parameter_assignments_ordered,
34    ))(s)
35}
36
37#[recursive_parser]
38#[tracable_parser]
39#[packrat_parser]
40pub(crate) fn list_of_parameter_assignments_ordered(
41    s: Span,
42) -> IResult<Span, ListOfParameterAssignments> {
43    let (s, a) = list(symbol(","), ordered_parameter_assignment)(s)?;
44    Ok((
45        s,
46        ListOfParameterAssignments::Ordered(Box::new(ListOfParameterAssignmentsOrdered {
47            nodes: (a,),
48        })),
49    ))
50}
51
52#[tracable_parser]
53#[packrat_parser]
54pub(crate) fn list_of_parameter_assignments_named(
55    s: Span,
56) -> IResult<Span, ListOfParameterAssignments> {
57    let (s, a) = list(symbol(","), named_parameter_assignment)(s)?;
58    Ok((
59        s,
60        ListOfParameterAssignments::Named(Box::new(ListOfParameterAssignmentsNamed {
61            nodes: (a,),
62        })),
63    ))
64}
65
66#[tracable_parser]
67#[packrat_parser]
68pub(crate) fn ordered_parameter_assignment(s: Span) -> IResult<Span, OrderedParameterAssignment> {
69    let (s, x) = param_expression(s)?;
70    Ok((s, OrderedParameterAssignment { nodes: (x,) }))
71}
72
73#[tracable_parser]
74#[packrat_parser]
75pub(crate) fn named_parameter_assignment(s: Span) -> IResult<Span, NamedParameterAssignment> {
76    let (s, a) = symbol(".")(s)?;
77    let (s, b) = parameter_identifier(s)?;
78    let (s, c) = paren(opt(param_expression))(s)?;
79    Ok((s, NamedParameterAssignment { nodes: (a, b, c) }))
80}
81
82#[tracable_parser]
83#[packrat_parser]
84pub(crate) fn hierarchical_instance(s: Span) -> IResult<Span, HierarchicalInstance> {
85    let (s, a) = name_of_instance(s)?;
86    let (s, b) = paren(opt(list_of_port_connections))(s)?;
87    Ok((s, HierarchicalInstance { nodes: (a, b) }))
88}
89
90#[tracable_parser]
91#[packrat_parser]
92pub(crate) fn name_of_instance(s: Span) -> IResult<Span, NameOfInstance> {
93    let (s, x) = instance_identifier(s)?;
94    let (s, y) = many0(unpacked_dimension)(s)?;
95    Ok((s, NameOfInstance { nodes: (x, y) }))
96}
97
98#[tracable_parser]
99#[packrat_parser]
100pub(crate) fn list_of_port_connections(s: Span) -> IResult<Span, ListOfPortConnections> {
101    alt((
102        list_of_port_connections_named,
103        list_of_port_connections_ordered,
104    ))(s)
105}
106
107#[recursive_parser]
108#[tracable_parser]
109#[packrat_parser]
110pub(crate) fn list_of_port_connections_ordered(s: Span) -> IResult<Span, ListOfPortConnections> {
111    let (s, a) = list(symbol(","), ordered_port_connection)(s)?;
112    Ok((
113        s,
114        ListOfPortConnections::Ordered(Box::new(ListOfPortConnectionsOrdered { nodes: (a,) })),
115    ))
116}
117
118#[tracable_parser]
119#[packrat_parser]
120pub(crate) fn list_of_port_connections_named(s: Span) -> IResult<Span, ListOfPortConnections> {
121    let (s, a) = list(symbol(","), named_port_connection)(s)?;
122    Ok((
123        s,
124        ListOfPortConnections::Named(Box::new(ListOfPortConnectionsNamed { nodes: (a,) })),
125    ))
126}
127
128#[recursive_parser]
129#[tracable_parser]
130#[packrat_parser]
131pub(crate) fn ordered_port_connection(s: Span) -> IResult<Span, OrderedPortConnection> {
132    let (s, x) = many0(attribute_instance)(s)?;
133    let (s, y) = opt(expression)(s)?;
134    Ok((s, OrderedPortConnection { nodes: (x, y) }))
135}
136
137#[tracable_parser]
138#[packrat_parser]
139pub(crate) fn named_port_connection(s: Span) -> IResult<Span, NamedPortConnection> {
140    alt((
141        named_port_connection_identifier,
142        named_port_connection_asterisk,
143    ))(s)
144}
145
146#[tracable_parser]
147#[packrat_parser]
148pub(crate) fn named_port_connection_identifier(s: Span) -> IResult<Span, NamedPortConnection> {
149    let (s, (a, b)) = many_till(attribute_instance, symbol("."))(s)?;
150    let (s, c) = port_identifier(s)?;
151    let (s, d) = opt(paren(opt(expression)))(s)?;
152    Ok((
153        s,
154        NamedPortConnection::Identifier(Box::new(NamedPortConnectionIdentifier {
155            nodes: (a, b, c, d),
156        })),
157    ))
158}
159
160#[tracable_parser]
161#[packrat_parser]
162pub(crate) fn named_port_connection_asterisk(s: Span) -> IResult<Span, NamedPortConnection> {
163    let (s, (a, b)) = many_till(attribute_instance, symbol(".*"))(s)?;
164    Ok((
165        s,
166        NamedPortConnection::Asterisk(Box::new(NamedPortConnectionAsterisk { nodes: (a, b) })),
167    ))
168}