Skip to main content

scarf_syntax/expressions/
subroutine_calls.rs

1// =======================================================================
2// subroutine_calls.rs
3// =======================================================================
4// CST Nodes from 1800-2023 A.8.2
5use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub struct ConstantFunctionCall<'a>(pub FunctionSubroutineCall<'a>);
9
10#[derive(Clone, Debug, PartialEq)]
11pub struct TfCall<'a>(
12    pub PsOrHierarchicalTfIdentifier<'a>,
13    pub Vec<AttributeInstance<'a>>,
14    pub  Option<(
15        Metadata<'a>, // (
16        ListOfArguments<'a>,
17        Metadata<'a>, // )
18    )>,
19);
20
21#[derive(Clone, Debug, PartialEq)]
22pub enum SystemTfCall<'a> {
23    Args(
24        Box<(
25            SystemTfIdentifier<'a>,
26            Option<(
27                Metadata<'a>, // (
28                ListOfArguments<'a>,
29                Metadata<'a>, // )
30            )>,
31        )>,
32    ),
33    Data(
34        Box<(
35            SystemTfIdentifier<'a>,
36            Metadata<'a>, // (
37            DataType<'a>,
38            Option<(
39                Metadata<'a>, // ,
40                Expression<'a>,
41            )>,
42            Metadata<'a>, // )
43        )>,
44    ),
45    Expressions(
46        Box<(
47            SystemTfIdentifier<'a>,
48            Metadata<'a>, // (
49            Expression<'a>,
50            Vec<(
51                Metadata<'a>, // ,
52                Option<Expression<'a>>,
53            )>,
54            Option<(
55                Metadata<'a>, // ,
56                Option<ClockingEvent<'a>>,
57            )>,
58            Metadata<'a>, // )
59        )>,
60    ),
61}
62
63#[derive(Clone, Debug, PartialEq)]
64pub enum SubroutineCall<'a> {
65    Tf(Box<TfCall<'a>>),
66    SystemTf(Box<SystemTfCall<'a>>),
67    Method(Box<MethodCall<'a>>),
68    Randomize(
69        Box<(
70            Option<(
71                Metadata<'a>, // std
72                Metadata<'a>, // ::
73            )>,
74            RandomizeCall<'a>,
75        )>,
76    ),
77}
78
79#[derive(Clone, Debug, PartialEq)]
80pub struct FunctionSubroutineCall<'a>(pub SubroutineCall<'a>);
81
82#[derive(Clone, Debug, PartialEq)]
83pub enum ListOfArguments<'a> {
84    Expressions(
85        Box<(
86            Option<Expression<'a>>,
87            Vec<(
88                Metadata<'a>, // ,
89                Option<Expression<'a>>,
90            )>,
91            Vec<(
92                Metadata<'a>, // ,
93                Metadata<'a>, // .
94                Identifier<'a>,
95                Metadata<'a>, // (
96                Option<Expression<'a>>,
97                Metadata<'a>, // )
98            )>,
99        )>,
100    ),
101    NoExpressions(
102        Box<(
103            Metadata<'a>, // .
104            Identifier<'a>,
105            Metadata<'a>, // (
106            Option<Expression<'a>>,
107            Metadata<'a>, // )
108            Vec<(
109                Metadata<'a>, // ,
110                Metadata<'a>, // .
111                Identifier<'a>,
112                Metadata<'a>, // (
113                Option<Expression<'a>>,
114                Metadata<'a>, // )
115            )>,
116        )>,
117    ),
118}
119
120#[derive(Clone, Debug, PartialEq)]
121pub struct MethodCall<'a>(
122    pub MethodCallRoot<'a>,
123    pub Metadata<'a>, // .
124    pub MethodCallBody<'a>,
125);
126
127#[derive(Clone, Debug, PartialEq)]
128pub enum MethodCallBody<'a> {
129    Custom(
130        Box<(
131            MethodIdentifier<'a>,
132            Vec<AttributeInstance<'a>>,
133            Option<(
134                Metadata<'a>, // (
135                ListOfArguments<'a>,
136                Metadata<'a>, // )
137            )>,
138        )>,
139    ),
140    BuiltIn(Box<BuiltInMethodCall<'a>>),
141}
142
143#[derive(Clone, Debug, PartialEq)]
144pub enum BuiltInMethodCall<'a> {
145    ArrayManip(Box<ArrayManipulationCall<'a>>),
146    Randomize(Box<RandomizeCall<'a>>),
147}
148
149#[derive(Clone, Debug, PartialEq)]
150pub struct ArrayManipulationCall<'a>(
151    pub ArrayMethodName<'a>,
152    pub Vec<AttributeInstance<'a>>,
153    pub  Option<(
154        Metadata<'a>, // (
155        ListOfArguments<'a>,
156        Metadata<'a>, // )
157    )>,
158    pub  Option<(
159        Metadata<'a>, // with
160        Metadata<'a>, // (
161        Expression<'a>,
162        Metadata<'a>, // )
163    )>,
164);
165
166#[derive(Clone, Debug, PartialEq)]
167pub enum VariableIdentifierListOrNull<'a> {
168    VariableIdentifierList(Box<VariableIdentifierList<'a>>),
169    Null(Box<Metadata<'a>>),
170}
171
172#[derive(Clone, Debug, PartialEq)]
173pub struct RandomizeCall<'a>(
174    pub Metadata<'a>, // randomize
175    pub Vec<AttributeInstance<'a>>,
176    pub  Option<(
177        Metadata<'a>, // (
178        Option<VariableIdentifierListOrNull<'a>>,
179        Metadata<'a>, // )
180    )>,
181    pub  Option<(
182        Metadata<'a>, // with
183        Option<(
184            Metadata<'a>, // (
185            Option<IdentifierList<'a>>,
186            Metadata<'a>, // )
187        )>,
188        ConstraintBlock<'a>,
189    )>,
190);
191
192#[derive(Clone, Debug, PartialEq)]
193pub struct VariableIdentifierList<'a>(
194    pub VariableIdentifier<'a>,
195    pub  Vec<(
196        Metadata<'a>, // ,
197        VariableIdentifier<'a>,
198    )>,
199);
200
201#[derive(Clone, Debug, PartialEq)]
202pub struct IdentifierList<'a>(
203    pub Identifier<'a>,
204    pub  Vec<(
205        Metadata<'a>, // ,
206        Identifier<'a>,
207    )>,
208);
209
210#[derive(Clone, Debug, PartialEq)]
211pub enum MethodCallRoot<'a> {
212    Primary(Box<Primary<'a>>),
213    ImplicitClassHandle(Box<ImplicitClassHandle<'a>>),
214}
215
216#[derive(Clone, Debug, PartialEq)]
217pub enum ArrayMethodName<'a> {
218    Method(Box<MethodIdentifier<'a>>),
219    Unique(Box<Metadata<'a>>),
220    And(Box<Metadata<'a>>),
221    Or(Box<Metadata<'a>>),
222    Xor(Box<Metadata<'a>>),
223}