1use crate::*;
2
3#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn initial_construct(s: Span) -> IResult<Span, InitialConstruct> {
8 let (s, a) = keyword("initial")(s)?;
9 let (s, b) = statement_or_null(s)?;
10 Ok((s, InitialConstruct { nodes: (a, b) }))
11}
12
13#[tracable_parser]
14#[packrat_parser]
15pub(crate) fn always_construct(s: Span) -> IResult<Span, AlwaysConstruct> {
16 let (s, a) = always_keyword(s)?;
17 let (s, b) = statement(s)?;
18 Ok((s, AlwaysConstruct { nodes: (a, b) }))
19}
20
21#[tracable_parser]
22#[packrat_parser]
23pub(crate) fn always_keyword(s: Span) -> IResult<Span, AlwaysKeyword> {
24 alt((
25 map(keyword("always_comb"), |x| {
26 AlwaysKeyword::AlwaysComb(Box::new(x))
27 }),
28 map(keyword("always_latch"), |x| {
29 AlwaysKeyword::AlwaysLatch(Box::new(x))
30 }),
31 map(keyword("always_ff"), |x| {
32 AlwaysKeyword::AlwaysFf(Box::new(x))
33 }),
34 map(keyword("always"), |x| AlwaysKeyword::Always(Box::new(x))),
35 ))(s)
36}
37
38#[tracable_parser]
39#[packrat_parser]
40pub(crate) fn final_construct(s: Span) -> IResult<Span, FinalConstruct> {
41 let (s, a) = keyword("final")(s)?;
42 let (s, b) = function_statement(s)?;
43 Ok((s, FinalConstruct { nodes: (a, b) }))
44}
45
46#[tracable_parser]
47#[packrat_parser]
48pub(crate) fn blocking_assignment(s: Span) -> IResult<Span, BlockingAssignment> {
49 alt((
50 blocking_assignment_variable,
51 blocking_assignment_nonrange_variable,
52 blocking_assignment_hierarchical_variable,
53 map(operator_assignment, |x| {
54 BlockingAssignment::OperatorAssignment(Box::new(x))
55 }),
56 ))(s)
57}
58
59#[recursive_parser]
60#[tracable_parser]
61#[packrat_parser]
62pub(crate) fn blocking_assignment_variable(s: Span) -> IResult<Span, BlockingAssignment> {
63 let (s, a) = variable_lvalue(s)?;
64 let (s, b) = symbol("=")(s)?;
65 let (s, c) = delay_or_event_control(s)?;
66 let (s, d) = expression(s)?;
67 Ok((
68 s,
69 BlockingAssignment::Variable(Box::new(BlockingAssignmentVariable {
70 nodes: (a, b, c, d),
71 })),
72 ))
73}
74
75#[recursive_parser]
76#[tracable_parser]
77#[packrat_parser]
78pub(crate) fn blocking_assignment_nonrange_variable(s: Span) -> IResult<Span, BlockingAssignment> {
79 let (s, a) = nonrange_variable_lvalue(s)?;
80 let (s, b) = symbol("=")(s)?;
81 let (s, c) = dynamic_array_new(s)?;
82 Ok((
83 s,
84 BlockingAssignment::NonrangeVariable(Box::new(BlockingAssignmentNonrangeVariable {
85 nodes: (a, b, c),
86 })),
87 ))
88}
89
90#[tracable_parser]
91#[packrat_parser]
92pub(crate) fn blocking_assignment_hierarchical_variable(
93 s: Span,
94) -> IResult<Span, BlockingAssignment> {
95 let (s, a) = opt(implicit_class_handle_or_class_scope_or_package_scope)(s)?;
96 let (s, b) = hierarchical_variable_identifier(s)?;
97 let (s, c) = select(s)?;
98 let (s, d) = symbol("=")(s)?;
99 let (s, e) = class_new(s)?;
100 Ok((
101 s,
102 BlockingAssignment::HierarchicalVariable(Box::new(
103 BlockingAssignmentHierarchicalVariable {
104 nodes: (a, b, c, d, e),
105 },
106 )),
107 ))
108}
109
110#[recursive_parser]
111#[tracable_parser]
112#[packrat_parser]
113pub(crate) fn operator_assignment(s: Span) -> IResult<Span, OperatorAssignment> {
114 let (s, a) = variable_lvalue(s)?;
115 let (s, b) = assignment_operator(s)?;
116 let (s, c) = expression(s)?;
117 Ok((s, OperatorAssignment { nodes: (a, b, c) }))
118}
119
120#[tracable_parser]
121#[packrat_parser]
122pub(crate) fn assignment_operator(s: Span) -> IResult<Span, AssignmentOperator> {
123 alt((
124 map(symbol("="), |x| AssignmentOperator { nodes: (x,) }),
125 map(symbol("+="), |x| AssignmentOperator { nodes: (x,) }),
126 map(symbol("-="), |x| AssignmentOperator { nodes: (x,) }),
127 map(symbol("*="), |x| AssignmentOperator { nodes: (x,) }),
128 map(symbol("/="), |x| AssignmentOperator { nodes: (x,) }),
129 map(symbol("%="), |x| AssignmentOperator { nodes: (x,) }),
130 map(symbol("&="), |x| AssignmentOperator { nodes: (x,) }),
131 map(symbol("|="), |x| AssignmentOperator { nodes: (x,) }),
132 map(symbol("^="), |x| AssignmentOperator { nodes: (x,) }),
133 map(symbol("<<<="), |x| AssignmentOperator { nodes: (x,) }),
134 map(symbol(">>>="), |x| AssignmentOperator { nodes: (x,) }),
135 map(symbol("<<="), |x| AssignmentOperator { nodes: (x,) }),
136 map(symbol(">>="), |x| AssignmentOperator { nodes: (x,) }),
137 ))(s)
138}
139
140#[recursive_parser]
141#[tracable_parser]
142#[packrat_parser]
143pub(crate) fn nonblocking_assignment(s: Span) -> IResult<Span, NonblockingAssignment> {
144 let (s, a) = variable_lvalue(s)?;
145 let (s, b) = symbol("<=")(s)?;
146 let (s, c) = opt(delay_or_event_control)(s)?;
147 let (s, d) = expression(s)?;
148 Ok((
149 s,
150 NonblockingAssignment {
151 nodes: (a, b, c, d),
152 },
153 ))
154}
155
156#[tracable_parser]
157#[packrat_parser]
158pub(crate) fn procedural_continuous_assignment(
159 s: Span,
160) -> IResult<Span, ProceduralContinuousAssignment> {
161 alt((
162 procedural_continuous_assignment_assign,
163 procedural_continuous_assignment_deassign,
164 procedural_continuous_assignment_force_variable,
165 procedural_continuous_assignment_force_net,
166 procedural_continuous_assignment_release_variable,
167 procedural_continuous_assignment_release_net,
168 ))(s)
169}
170
171#[tracable_parser]
172#[packrat_parser]
173pub(crate) fn procedural_continuous_assignment_assign(
174 s: Span,
175) -> IResult<Span, ProceduralContinuousAssignment> {
176 let (s, a) = keyword("assign")(s)?;
177 let (s, b) = variable_assignment(s)?;
178 Ok((
179 s,
180 ProceduralContinuousAssignment::Assign(Box::new(ProceduralContinuousAssignmentAssign {
181 nodes: (a, b),
182 })),
183 ))
184}
185
186#[tracable_parser]
187#[packrat_parser]
188pub(crate) fn procedural_continuous_assignment_deassign(
189 s: Span,
190) -> IResult<Span, ProceduralContinuousAssignment> {
191 let (s, a) = keyword("deassign")(s)?;
192 let (s, b) = variable_lvalue(s)?;
193 Ok((
194 s,
195 ProceduralContinuousAssignment::Deassign(Box::new(
196 ProceduralContinuousAssignmentDeassign { nodes: (a, b) },
197 )),
198 ))
199}
200
201#[tracable_parser]
202#[packrat_parser]
203pub(crate) fn procedural_continuous_assignment_force_variable(
204 s: Span,
205) -> IResult<Span, ProceduralContinuousAssignment> {
206 let (s, a) = keyword("force")(s)?;
207 let (s, b) = variable_assignment(s)?;
208 Ok((
209 s,
210 ProceduralContinuousAssignment::ForceVariable(Box::new(
211 ProceduralContinuousAssignmentForceVariable { nodes: (a, b) },
212 )),
213 ))
214}
215
216#[tracable_parser]
217#[packrat_parser]
218pub(crate) fn procedural_continuous_assignment_force_net(
219 s: Span,
220) -> IResult<Span, ProceduralContinuousAssignment> {
221 let (s, a) = keyword("force")(s)?;
222 let (s, b) = net_assignment(s)?;
223 Ok((
224 s,
225 ProceduralContinuousAssignment::ForceNet(Box::new(
226 ProceduralContinuousAssignmentForceNet { nodes: (a, b) },
227 )),
228 ))
229}
230
231#[tracable_parser]
232#[packrat_parser]
233pub(crate) fn procedural_continuous_assignment_release_variable(
234 s: Span,
235) -> IResult<Span, ProceduralContinuousAssignment> {
236 let (s, a) = keyword("release")(s)?;
237 let (s, b) = variable_lvalue(s)?;
238 Ok((
239 s,
240 ProceduralContinuousAssignment::ReleaseVariable(Box::new(
241 ProceduralContinuousAssignmentReleaseVariable { nodes: (a, b) },
242 )),
243 ))
244}
245
246#[tracable_parser]
247#[packrat_parser]
248pub(crate) fn procedural_continuous_assignment_release_net(
249 s: Span,
250) -> IResult<Span, ProceduralContinuousAssignment> {
251 let (s, a) = keyword("release")(s)?;
252 let (s, b) = net_lvalue(s)?;
253 Ok((
254 s,
255 ProceduralContinuousAssignment::ReleaseNet(Box::new(
256 ProceduralContinuousAssignmentReleaseNet { nodes: (a, b) },
257 )),
258 ))
259}
260
261#[recursive_parser]
262#[tracable_parser]
263#[packrat_parser]
264pub(crate) fn variable_assignment(s: Span) -> IResult<Span, VariableAssignment> {
265 let (s, a) = variable_lvalue(s)?;
266 let (s, b) = symbol("=")(s)?;
267 let (s, c) = expression(s)?;
268 Ok((s, VariableAssignment { nodes: (a, b, c) }))
269}