sv_parser_parser/behavioral_statements/
assertion_statements.rs1use crate::*;
2
3#[tracable_parser]
6#[packrat_parser]
7pub(crate) fn assertion_item(s: Span) -> IResult<Span, AssertionItem> {
8 alt((
9 map(concurrent_assertion_item, |x| {
10 AssertionItem::Concurrent(Box::new(x))
11 }),
12 map(deferred_immediate_assertion_item, |x| {
13 AssertionItem::Immediate(Box::new(x))
14 }),
15 ))(s)
16}
17
18#[tracable_parser]
19#[packrat_parser]
20pub(crate) fn deferred_immediate_assertion_item(
21 s: Span,
22) -> IResult<Span, DeferredImmediateAssertionItem> {
23 let (s, a) = opt(pair(block_identifier, symbol(":")))(s)?;
24 let (s, b) = deferred_immediate_assertion_statement(s)?;
25 Ok((s, DeferredImmediateAssertionItem { nodes: (a, b) }))
26}
27
28#[tracable_parser]
29#[packrat_parser]
30pub(crate) fn procedural_assertion_statement(
31 s: Span,
32) -> IResult<Span, ProceduralAssertionStatement> {
33 alt((
34 map(concurrent_assertion_statement, |x| {
35 ProceduralAssertionStatement::Concurrent(Box::new(x))
36 }),
37 map(immediate_assertion_statement, |x| {
38 ProceduralAssertionStatement::Immediate(Box::new(x))
39 }),
40 map(checker_instantiation, |x| {
41 ProceduralAssertionStatement::Checker(Box::new(x))
42 }),
43 ))(s)
44}
45
46#[tracable_parser]
47#[packrat_parser]
48pub(crate) fn immediate_assertion_statement(s: Span) -> IResult<Span, ImmediateAssertionStatement> {
49 alt((
50 map(simple_immediate_assertion_statement, |x| {
51 ImmediateAssertionStatement::Simple(Box::new(x))
52 }),
53 map(deferred_immediate_assertion_statement, |x| {
54 ImmediateAssertionStatement::Deferred(Box::new(x))
55 }),
56 ))(s)
57}
58
59#[tracable_parser]
60#[packrat_parser]
61pub(crate) fn simple_immediate_assertion_statement(
62 s: Span,
63) -> IResult<Span, SimpleImmediateAssertionStatement> {
64 alt((
65 map(simple_immediate_assert_statement, |x| {
66 SimpleImmediateAssertionStatement::Assert(Box::new(x))
67 }),
68 map(simple_immediate_assume_statement, |x| {
69 SimpleImmediateAssertionStatement::Assume(Box::new(x))
70 }),
71 map(simple_immediate_cover_statement, |x| {
72 SimpleImmediateAssertionStatement::Cover(Box::new(x))
73 }),
74 ))(s)
75}
76
77#[tracable_parser]
78#[packrat_parser]
79pub(crate) fn simple_immediate_assert_statement(
80 s: Span,
81) -> IResult<Span, SimpleImmediateAssertStatement> {
82 let (s, a) = keyword("assert")(s)?;
83 let (s, b) = paren(expression)(s)?;
84 let (s, c) = action_block(s)?;
85 Ok((s, SimpleImmediateAssertStatement { nodes: (a, b, c) }))
86}
87
88#[tracable_parser]
89#[packrat_parser]
90pub(crate) fn simple_immediate_assume_statement(
91 s: Span,
92) -> IResult<Span, SimpleImmediateAssumeStatement> {
93 let (s, a) = keyword("assume")(s)?;
94 let (s, b) = paren(expression)(s)?;
95 let (s, c) = action_block(s)?;
96 Ok((s, SimpleImmediateAssumeStatement { nodes: (a, b, c) }))
97}
98
99#[tracable_parser]
100#[packrat_parser]
101pub(crate) fn simple_immediate_cover_statement(
102 s: Span,
103) -> IResult<Span, SimpleImmediateCoverStatement> {
104 let (s, a) = keyword("cover")(s)?;
105 let (s, b) = paren(expression)(s)?;
106 let (s, c) = statement_or_null(s)?;
107 Ok((s, SimpleImmediateCoverStatement { nodes: (a, b, c) }))
108}
109
110#[tracable_parser]
111#[packrat_parser]
112pub(crate) fn deferred_immediate_assertion_statement(
113 s: Span,
114) -> IResult<Span, DeferredImmediateAssertionStatement> {
115 alt((
116 map(deferred_immediate_assert_statement, |x| {
117 DeferredImmediateAssertionStatement::Assert(Box::new(x))
118 }),
119 map(deferred_immediate_assume_statement, |x| {
120 DeferredImmediateAssertionStatement::Assume(Box::new(x))
121 }),
122 map(deferred_immediate_cover_statement, |x| {
123 DeferredImmediateAssertionStatement::Cover(Box::new(x))
124 }),
125 ))(s)
126}
127
128#[tracable_parser]
129#[packrat_parser]
130pub(crate) fn deferred_immediate_assert_statement(
131 s: Span,
132) -> IResult<Span, DeferredImmediateAssertStatement> {
133 let (s, a) = keyword("assert")(s)?;
134 let (s, b) = assert_timing(s)?;
135 let (s, c) = paren(expression)(s)?;
136 let (s, d) = action_block(s)?;
137 Ok((
138 s,
139 DeferredImmediateAssertStatement {
140 nodes: (a, b, c, d),
141 },
142 ))
143}
144
145#[tracable_parser]
146#[packrat_parser]
147pub(crate) fn deferred_immediate_assume_statement(
148 s: Span,
149) -> IResult<Span, DeferredImmediateAssumeStatement> {
150 let (s, a) = keyword("assume")(s)?;
151 let (s, b) = assert_timing(s)?;
152 let (s, c) = paren(expression)(s)?;
153 let (s, d) = action_block(s)?;
154 Ok((
155 s,
156 DeferredImmediateAssumeStatement {
157 nodes: (a, b, c, d),
158 },
159 ))
160}
161
162#[tracable_parser]
163#[packrat_parser]
164pub(crate) fn deferred_immediate_cover_statement(
165 s: Span,
166) -> IResult<Span, DeferredImmediateCoverStatement> {
167 let (s, a) = keyword("cover")(s)?;
168 let (s, b) = assert_timing(s)?;
169 let (s, c) = paren(expression)(s)?;
170 let (s, d) = statement_or_null(s)?;
171 Ok((
172 s,
173 DeferredImmediateCoverStatement {
174 nodes: (a, b, c, d),
175 },
176 ))
177}
178
179#[tracable_parser]
180#[packrat_parser]
181pub(crate) fn assert_timing(s: Span) -> IResult<Span, AssertTiming> {
182 alt((
183 map(symbol("#0"), |x| AssertTiming::Zero(Box::new(x))),
184 map(keyword("final"), |x| AssertTiming::Final(Box::new(x))),
185 ))(s)
186}