Skip to main content

scarf_syntax/behavioral_statements/
clocking_block.rs

1// =======================================================================
2// clocking_block.rs
3// =======================================================================
4//! CST Nodes from 1800-2023 A.6.11
5use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub enum ClockingDeclaration<'a> {
9    Local(
10        Box<(
11            Option<Metadata<'a>>, // default
12            Metadata<'a>,         // clocking
13            Option<ClockingIdentifier<'a>>,
14            ClockingEvent<'a>,
15            Metadata<'a>, // ;
16            Vec<ClockingItem<'a>>,
17            Metadata<'a>, // endclocking
18            Option<(
19                Metadata<'a>, // :
20                ClockingIdentifier<'a>,
21            )>,
22        )>,
23    ),
24    Global(
25        Box<(
26            Metadata<'a>, // global
27            Metadata<'a>, // clocking
28            Option<ClockingIdentifier<'a>>,
29            ClockingEvent<'a>,
30            Metadata<'a>, // ;
31            Vec<ClockingItem<'a>>,
32            Metadata<'a>, // endclocking
33            Option<(
34                Metadata<'a>, // :
35                ClockingIdentifier<'a>,
36            )>,
37        )>,
38    ),
39}
40
41#[derive(Clone, Debug, PartialEq)]
42pub enum ClockingItem<'a> {
43    Default(
44        Box<(
45            Metadata<'a>, // default
46            DefaultSkew<'a>,
47            Metadata<'a>, // ;
48        )>,
49    ),
50    Decl(
51        Box<(
52            ClockingDirection<'a>,
53            ListOfClockingDeclAssign<'a>,
54            Metadata<'a>, // ;
55        )>,
56    ),
57    Assert(Box<(Vec<AttributeInstance<'a>>, AssertionItemDeclaration<'a>)>),
58}
59
60#[derive(Clone, Debug, PartialEq)]
61pub enum DefaultSkew<'a> {
62    Input(
63        Box<(
64            Metadata<'a>, // input
65            ClockingSkew<'a>,
66        )>,
67    ),
68    Output(
69        Box<(
70            Metadata<'a>, // output
71            ClockingSkew<'a>,
72        )>,
73    ),
74    InputOutput(
75        Box<(
76            Metadata<'a>, // input
77            ClockingSkew<'a>,
78            Metadata<'a>, // output
79            ClockingSkew<'a>,
80        )>,
81    ),
82}
83
84#[derive(Clone, Debug, PartialEq)]
85pub enum ClockingDirection<'a> {
86    Input(
87        Box<(
88            Metadata<'a>, // input
89            Option<ClockingSkew<'a>>,
90        )>,
91    ),
92    Output(
93        Box<(
94            Metadata<'a>, // output
95            Option<ClockingSkew<'a>>,
96        )>,
97    ),
98    InputOutput(
99        Box<(
100            Metadata<'a>, // input
101            Option<ClockingSkew<'a>>,
102            Metadata<'a>, // output
103            Option<ClockingSkew<'a>>,
104        )>,
105    ),
106    Inout(
107        Box<
108            Metadata<'a>, // inout
109        >,
110    ),
111}
112
113#[derive(Clone, Debug, PartialEq)]
114pub struct ListOfClockingDeclAssign<'a>(
115    pub ClockingDeclAssign<'a>,
116    pub  Vec<(
117        Metadata<'a>, // ,
118        ClockingDeclAssign<'a>,
119    )>,
120);
121
122#[derive(Clone, Debug, PartialEq)]
123pub struct ClockingDeclAssign<'a>(
124    pub SignalIdentifier<'a>,
125    pub  Option<(
126        Metadata<'a>, // =
127        Expression<'a>,
128    )>,
129);
130
131#[derive(Clone, Debug, PartialEq)]
132pub enum ClockingSkew<'a> {
133    Edge(Box<(EdgeIdentifier<'a>, Option<DelayControl<'a>>)>),
134    Delay(Box<DelayControl<'a>>),
135}
136
137#[derive(Clone, Debug, PartialEq)]
138pub struct ClockingDrive<'a>(
139    pub ClockvarExpression<'a>,
140    pub Metadata<'a>, // <=
141    pub Option<CycleDelay<'a>>,
142    pub Expression<'a>,
143);
144
145#[derive(Clone, Debug, PartialEq)]
146pub enum CycleDelay<'a> {
147    Integral(
148        Box<(
149            Metadata<'a>, // ##
150            IntegralNumber<'a>,
151        )>,
152    ),
153    Identifier(
154        Box<(
155            Metadata<'a>, // ##
156            Identifier<'a>,
157        )>,
158    ),
159    Expression(
160        Box<(
161            Metadata<'a>, // ##
162            Metadata<'a>, // (
163            Expression<'a>,
164            Metadata<'a>, // )
165        )>,
166    ),
167}
168
169#[derive(Clone, Debug, PartialEq)]
170pub struct Clockvar<'a>(pub HierarchicalIdentifier<'a>);
171
172#[derive(Clone, Debug, PartialEq)]
173pub struct ClockvarExpression<'a>(pub Clockvar<'a>, pub Select<'a>);