sv_parser_parser/source_text/
program_items.rs1use crate::*;
2
3#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn program_item(s: Span) -> IResult<Span, ProgramItem> {
8 alt((
9 map(pair(port_declaration, symbol(";")), |x| {
10 ProgramItem::PortDeclaration(Box::new(x))
11 }),
12 map(non_port_program_item, |x| {
13 ProgramItem::NonPortProgramItem(Box::new(x))
14 }),
15 ))(s)
16}
17
18#[tracable_parser]
19#[packrat_parser]
20pub(crate) fn non_port_program_item(s: Span) -> IResult<Span, NonPortProgramItem> {
21 alt((
22 non_port_program_item_assign,
23 non_port_program_item_module,
24 non_port_program_item_initial,
25 non_port_program_item_final,
26 non_port_program_item_assertion,
27 map(timeunits_declaration, |x| {
28 NonPortProgramItem::TimeunitsDeclaration(Box::new(x))
29 }),
30 map(program_generate_item, |x| {
31 NonPortProgramItem::ProgramGenerateItem(Box::new(x))
32 }),
33 ))(s)
34}
35
36#[tracable_parser]
37#[packrat_parser]
38pub(crate) fn non_port_program_item_assign(s: Span) -> IResult<Span, NonPortProgramItem> {
39 let (s, a) = many0(attribute_instance)(s)?;
40 let (s, b) = continuous_assign(s)?;
41 Ok((
42 s,
43 NonPortProgramItem::Assign(Box::new(NonPortProgramItemAssign { nodes: (a, b) })),
44 ))
45}
46
47#[recursive_parser]
48#[tracable_parser]
49#[packrat_parser]
50pub(crate) fn non_port_program_item_module(s: Span) -> IResult<Span, NonPortProgramItem> {
51 let (s, a) = many0(attribute_instance)(s)?;
52 let (s, b) = module_or_generate_item_declaration(s)?;
53 Ok((
54 s,
55 NonPortProgramItem::Module(Box::new(NonPortProgramItemModule { nodes: (a, b) })),
56 ))
57}
58
59#[tracable_parser]
60#[packrat_parser]
61pub(crate) fn non_port_program_item_initial(s: Span) -> IResult<Span, NonPortProgramItem> {
62 let (s, a) = many0(attribute_instance)(s)?;
63 let (s, b) = initial_construct(s)?;
64 Ok((
65 s,
66 NonPortProgramItem::Initial(Box::new(NonPortProgramItemInitial { nodes: (a, b) })),
67 ))
68}
69
70#[tracable_parser]
71#[packrat_parser]
72pub(crate) fn non_port_program_item_final(s: Span) -> IResult<Span, NonPortProgramItem> {
73 let (s, a) = many0(attribute_instance)(s)?;
74 let (s, b) = final_construct(s)?;
75 Ok((
76 s,
77 NonPortProgramItem::Final(Box::new(NonPortProgramItemFinal { nodes: (a, b) })),
78 ))
79}
80
81#[tracable_parser]
82#[packrat_parser]
83pub(crate) fn non_port_program_item_assertion(s: Span) -> IResult<Span, NonPortProgramItem> {
84 let (s, a) = many0(attribute_instance)(s)?;
85 let (s, b) = concurrent_assertion_item(s)?;
86 Ok((
87 s,
88 NonPortProgramItem::Assertion(Box::new(NonPortProgramItemAssertion { nodes: (a, b) })),
89 ))
90}
91
92#[tracable_parser]
93#[packrat_parser]
94pub(crate) fn program_generate_item(s: Span) -> IResult<Span, ProgramGenerateItem> {
95 alt((
96 map(loop_generate_construct, |x| {
97 ProgramGenerateItem::LoopGenerateConstruct(Box::new(x))
98 }),
99 map(conditional_generate_construct, |x| {
100 ProgramGenerateItem::ConditionalGenerateConstruct(Box::new(x))
101 }),
102 map(generate_region, |x| {
103 ProgramGenerateItem::GenerateRegion(Box::new(x))
104 }),
105 map(elaboration_system_task, |x| {
106 ProgramGenerateItem::ElaborationSystemTask(Box::new(x))
107 }),
108 ))(s)
109}