sv_parser_parser/source_text/
interface_items.rs1use crate::*;
2
3#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn interface_or_generate_item(s: Span) -> IResult<Span, InterfaceOrGenerateItem> {
8 alt((
9 interface_or_generate_item_module,
10 interface_or_generate_item_extern,
11 ))(s)
12}
13
14#[recursive_parser]
15#[tracable_parser]
16#[packrat_parser]
17pub(crate) fn interface_or_generate_item_module(s: Span) -> IResult<Span, InterfaceOrGenerateItem> {
18 let (s, a) = many0(attribute_instance)(s)?;
19 let (s, b) = module_common_item(s)?;
20 Ok((
21 s,
22 InterfaceOrGenerateItem::Module(Box::new(InterfaceOrGenerateItemModule { nodes: (a, b) })),
23 ))
24}
25
26#[tracable_parser]
27#[packrat_parser]
28pub(crate) fn interface_or_generate_item_extern(s: Span) -> IResult<Span, InterfaceOrGenerateItem> {
29 let (s, a) = many0(attribute_instance)(s)?;
30 let (s, b) = extern_tf_declaration(s)?;
31 Ok((
32 s,
33 InterfaceOrGenerateItem::Extern(Box::new(InterfaceOrGenerateItemExtern { nodes: (a, b) })),
34 ))
35}
36
37#[tracable_parser]
38#[packrat_parser]
39pub(crate) fn extern_tf_declaration(s: Span) -> IResult<Span, ExternTfDeclaration> {
40 alt((extern_tf_declaration_method, extern_tf_declaration_task))(s)
41}
42
43#[tracable_parser]
44#[packrat_parser]
45pub(crate) fn extern_tf_declaration_method(s: Span) -> IResult<Span, ExternTfDeclaration> {
46 let (s, a) = keyword("extern")(s)?;
47 let (s, b) = method_prototype(s)?;
48 let (s, c) = symbol(";")(s)?;
49 Ok((
50 s,
51 ExternTfDeclaration::Method(Box::new(ExternTfDeclarationMethod { nodes: (a, b, c) })),
52 ))
53}
54
55#[tracable_parser]
56#[packrat_parser]
57pub(crate) fn extern_tf_declaration_task(s: Span) -> IResult<Span, ExternTfDeclaration> {
58 let (s, a) = keyword("extern")(s)?;
59 let (s, b) = keyword("forkjoin")(s)?;
60 let (s, c) = task_prototype(s)?;
61 let (s, d) = symbol(";")(s)?;
62 Ok((
63 s,
64 ExternTfDeclaration::Task(Box::new(ExternTfDeclarationTask {
65 nodes: (a, b, c, d),
66 })),
67 ))
68}
69
70#[tracable_parser]
71#[packrat_parser]
72pub(crate) fn interface_item(s: Span) -> IResult<Span, InterfaceItem> {
73 alt((
74 map(pair(port_declaration, symbol(";")), |x| {
75 InterfaceItem::PortDeclaration(Box::new(x))
76 }),
77 map(non_port_interface_item, |x| {
78 InterfaceItem::NonPortInterfaceItem(Box::new(x))
79 }),
80 ))(s)
81}
82
83#[tracable_parser]
84#[packrat_parser]
85pub(crate) fn non_port_interface_item(s: Span) -> IResult<Span, NonPortInterfaceItem> {
86 alt((
87 map(generate_region, |x| {
88 NonPortInterfaceItem::GenerateRegion(Box::new(x))
89 }),
90 map(interface_or_generate_item, |x| {
91 NonPortInterfaceItem::InterfaceOrGenerateItem(Box::new(x))
92 }),
93 map(program_declaration, |x| {
94 NonPortInterfaceItem::ProgramDeclaration(Box::new(x))
95 }),
96 map(modport_declaration, |x| {
97 NonPortInterfaceItem::ModportDeclaration(Box::new(x))
98 }),
99 map(interface_declaration, |x| {
100 NonPortInterfaceItem::InterfaceDeclaration(Box::new(x))
101 }),
102 map(timeunits_declaration, |x| {
103 NonPortInterfaceItem::TimeunitsDeclaration(Box::new(x))
104 }),
105 ))(s)
106}