Skip to main content

scarf_syntax/behavioral_statements/
timing_control_statements.rs

1// =======================================================================
2// timing_control_statements.rs
3// =======================================================================
4//! CST Nodes from 1800-2023 A.6.5
5use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub struct ProceduralTimingControlStatement<'a>(
9    pub ProceduralTimingControl<'a>,
10    pub StatementOrNull<'a>,
11);
12
13#[derive(Clone, Debug, PartialEq)]
14pub enum DelayOrEventControl<'a> {
15    Delay(Box<DelayControl<'a>>),
16    Event(Box<EventControl<'a>>),
17    Repeat(
18        Box<(
19            Metadata<'a>, // repeat
20            Metadata<'a>, // (
21            Expression<'a>,
22            Metadata<'a>, // )
23            EventControl<'a>,
24        )>,
25    ),
26}
27
28#[derive(Clone, Debug, PartialEq)]
29pub enum DelayControl<'a> {
30    Value(
31        Box<(
32            Metadata<'a>, // #
33            DelayValue<'a>,
34        )>,
35    ),
36    Mintypmax(
37        Box<(
38            Metadata<'a>, // #
39            Metadata<'a>, // (
40            MintypmaxExpression<'a>,
41            Metadata<'a>, // )
42        )>,
43    ),
44}
45
46#[derive(Clone, Debug, PartialEq)]
47pub enum EventControl<'a> {
48    Clocking(Box<ClockingEvent<'a>>),
49    Wildcard(
50        Box<(
51            Metadata<'a>, // @
52            Metadata<'a>, // *
53        )>,
54    ),
55    ParenWildcard(
56        Box<(
57            Metadata<'a>, // @
58            Metadata<'a>, // (
59            Metadata<'a>, // *
60            Metadata<'a>, // )
61        )>,
62    ),
63}
64
65#[derive(Clone, Debug, PartialEq)]
66pub enum ClockingEvent<'a> {
67    Ps(
68        Box<(
69            Metadata<'a>, // @
70            PsIdentifier<'a>,
71        )>,
72    ),
73    Hierarchical(
74        Box<(
75            Metadata<'a>, // @
76            HierarchicalIdentifier<'a>,
77        )>,
78    ),
79    Expression(
80        Box<(
81            Metadata<'a>, // @
82            Metadata<'a>, // (
83            EventExpression<'a>,
84            Metadata<'a>, // )
85        )>,
86    ),
87}
88
89#[derive(Clone, Debug, PartialEq)]
90pub enum EventExpression<'a> {
91    Trigger(
92        Box<(
93            Option<EdgeIdentifier<'a>>,
94            Expression<'a>,
95            Option<(
96                Metadata<'a>, // iff
97                Expression<'a>,
98            )>,
99        )>,
100    ),
101    Sequence(
102        Box<(
103            SequenceInstance<'a>,
104            Option<(
105                Metadata<'a>, // iff
106                Expression<'a>,
107            )>,
108        )>,
109    ),
110    Or(
111        Box<(
112            EventExpression<'a>,
113            Metadata<'a>, // or
114            EventExpression<'a>,
115        )>,
116    ),
117    Comma(
118        Box<(
119            EventExpression<'a>,
120            Metadata<'a>, // ,
121            EventExpression<'a>,
122        )>,
123    ),
124    Paren(
125        Box<(
126            Metadata<'a>, // (
127            EventExpression<'a>,
128            Metadata<'a>, // )
129        )>,
130    ),
131}
132
133#[derive(Clone, Debug, PartialEq)]
134pub enum ProceduralTimingControl<'a> {
135    Delay(Box<DelayControl<'a>>),
136    Event(Box<EventControl<'a>>),
137    Cycle(Box<CycleDelay<'a>>),
138}
139
140#[derive(Clone, Debug, PartialEq)]
141pub enum JumpStatement<'a> {
142    Return(
143        Box<(
144            Metadata<'a>, // return
145            Option<Expression<'a>>,
146            Metadata<'a>, // ;
147        )>,
148    ),
149    Break(
150        Box<(
151            Metadata<'a>, // break
152            Metadata<'a>, // ;
153        )>,
154    ),
155    Continue(
156        Box<(
157            Metadata<'a>, // continue
158            Metadata<'a>, // ;
159        )>,
160    ),
161}
162
163#[derive(Clone, Debug, PartialEq)]
164pub enum WaitStatement<'a> {
165    Expression(
166        Box<(
167            Metadata<'a>, // wait
168            Metadata<'a>, // (
169            Expression<'a>,
170            Metadata<'a>, // )
171            StatementOrNull<'a>,
172        )>,
173    ),
174    Fork(
175        Box<(
176            Metadata<'a>, // wait
177            Metadata<'a>, // fork
178            Metadata<'a>, // ;
179        )>,
180    ),
181    Order(
182        Box<(
183            Metadata<'a>, // wait_order
184            Metadata<'a>, // (
185            HierarchicalIdentifier<'a>,
186            Vec<(
187                Metadata<'a>, // ,
188                HierarchicalIdentifier<'a>,
189            )>,
190            Metadata<'a>, // )
191            ActionBlock<'a>,
192        )>,
193    ),
194}
195
196#[derive(Clone, Debug, PartialEq)]
197pub enum EventTrigger<'a> {
198    Blocking(
199        Box<(
200            Metadata<'a>, // ->
201            HierarchicalEventIdentifier<'a>,
202            NonrangeSelect<'a>,
203            Metadata<'a>, // ;
204        )>,
205    ),
206    Nonblocking(
207        Box<(
208            Metadata<'a>, // ->>
209            Option<DelayOrEventControl<'a>>,
210            HierarchicalEventIdentifier<'a>,
211            NonrangeSelect<'a>,
212            Metadata<'a>, // ;
213        )>,
214    ),
215}
216
217#[derive(Clone, Debug, PartialEq)]
218pub enum DisableStatement<'a> {
219    Task(
220        Box<(
221            Metadata<'a>, // disable
222            HierarchicalTaskIdentifier<'a>,
223            Metadata<'a>, // ;
224        )>,
225    ),
226    Block(
227        Box<(
228            Metadata<'a>, // disable
229            HierarchicalBlockIdentifier<'a>,
230            Metadata<'a>, // ;
231        )>,
232    ),
233    Fork(
234        Box<(
235            Metadata<'a>, // disable
236            Metadata<'a>, // fork
237            Metadata<'a>, // ;
238        )>,
239    ),
240}