Skip to main content

scarf_syntax/declarations/
task_declarations.rs

1// =======================================================================
2// task_declarations.rs
3// =======================================================================
4// CST Nodes from 1800-2023 A.2.7
5use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub struct TaskDeclaration<'a>(
9    pub Metadata<'a>, // task
10    pub Option<DynamicOverrideSpecifiers<'a>>,
11    pub Option<Lifetime<'a>>,
12    pub TaskBodyDeclaration<'a>,
13);
14
15#[derive(Clone, Debug, PartialEq)]
16pub enum InterfaceIdentifierOrClassScope<'a> {
17    InterfaceIdentifier(
18        Box<(
19            InterfaceIdentifier<'a>,
20            Metadata<'a>, // .
21        )>,
22    ),
23    ClassScope(Box<ClassScope<'a>>),
24}
25
26#[derive(Clone, Debug, PartialEq)]
27pub enum TaskBodyDeclaration<'a> {
28    Tf(
29        Box<(
30            Option<InterfaceIdentifierOrClassScope<'a>>,
31            TaskIdentifier<'a>,
32            Metadata<'a>, // ;
33            Vec<TfItemDeclaration<'a>>,
34            Vec<StatementOrNull<'a>>,
35            Metadata<'a>, // endtask
36            Option<(
37                Metadata<'a>, // :
38                TaskIdentifier<'a>,
39            )>,
40        )>,
41    ),
42    Block(
43        Box<(
44            Option<InterfaceIdentifierOrClassScope<'a>>,
45            TaskIdentifier<'a>,
46            Metadata<'a>, // (
47            Option<TfPortList<'a>>,
48            Metadata<'a>, // )
49            Metadata<'a>, // ;
50            Vec<BlockItemDeclaration<'a>>,
51            Vec<StatementOrNull<'a>>,
52            Metadata<'a>, // endtask
53            Option<(
54                Metadata<'a>, // :
55                TaskIdentifier<'a>,
56            )>,
57        )>,
58    ),
59}
60
61#[derive(Clone, Debug, PartialEq)]
62pub enum TfItemDeclaration<'a> {
63    Block(Box<BlockItemDeclaration<'a>>),
64    Tf(Box<TfPortDeclaration<'a>>),
65}
66
67#[derive(Clone, Debug, PartialEq)]
68pub struct TfPortList<'a>(
69    pub TfPortItem<'a>,
70    pub  Vec<(
71        Metadata<'a>, // ,
72        TfPortItem<'a>,
73    )>,
74);
75
76#[derive(Clone, Debug, PartialEq)]
77pub struct TfPortItem<'a>(
78    pub Vec<AttributeInstance<'a>>,
79    pub Option<TfPortDirection<'a>>,
80    pub Option<Metadata<'a>>, // var
81    pub DataTypeOrImplicit<'a>,
82    pub  Option<(
83        PortIdentifier<'a>,
84        Vec<VariableDimension<'a>>,
85        Option<(
86            Metadata<'a>, // eq
87            Expression<'a>,
88        )>,
89    )>,
90);
91
92#[derive(Clone, Debug, PartialEq)]
93pub enum TfPortDirection<'a> {
94    Port(Box<PortDirection<'a>>),
95    Ref(
96        Box<(
97            Option<Metadata<'a>>, // const
98            Metadata<'a>,         // ref
99            Option<Metadata<'a>>, // static
100        )>,
101    ),
102}
103
104#[derive(Clone, Debug, PartialEq)]
105pub struct TfPortDeclaration<'a>(
106    pub Vec<AttributeInstance<'a>>,
107    pub TfPortDirection<'a>,
108    pub Option<Metadata<'a>>, // var
109    pub DataTypeOrImplicit<'a>,
110    pub ListOfTfVariableIdentifiers<'a>,
111    pub Metadata<'a>, // ;
112);
113
114#[derive(Clone, Debug, PartialEq)]
115pub struct TaskPrototype<'a>(
116    pub Metadata<'a>, // task
117    pub Option<DynamicOverrideSpecifiers<'a>>,
118    pub TaskIdentifier<'a>,
119    pub  Option<(
120        Metadata<'a>, // (
121        Option<TfPortList<'a>>,
122        Metadata<'a>, // )
123    )>,
124);
125
126#[derive(Clone, Debug, PartialEq)]
127pub struct DynamicOverrideSpecifiers<'a>(
128    pub Option<InitialOrExtendsSpecifier<'a>>,
129    pub Option<FinalSpecifier<'a>>,
130);
131
132#[derive(Clone, Debug, PartialEq)]
133pub enum InitialOrExtendsSpecifier<'a> {
134    Initial((Metadata<'a>, Metadata<'a>)),
135    Extends((Metadata<'a>, Metadata<'a>)),
136}
137
138#[derive(Clone, Debug, PartialEq)]
139pub struct FinalSpecifier<'a>(
140    pub Metadata<'a>, // :
141    pub Metadata<'a>, // final
142);