1use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub enum ConcurrentAssertionItem<'a> {
9 Assertion(
10 Box<(
11 Option<(
12 BlockIdentifier<'a>,
13 Metadata<'a>, )>,
15 ConcurrentAssertionStatement<'a>,
16 )>,
17 ),
18 Checker(Box<CheckerInstantiation<'a>>),
19}
20
21#[derive(Clone, Debug, PartialEq)]
22pub enum ConcurrentAssertionStatement<'a> {
23 AssertProp(Box<AssertPropertyStatement<'a>>),
24 AssumeProp(Box<AssumePropertyStatement<'a>>),
25 CoverProp(Box<CoverPropertyStatement<'a>>),
26 CoverSeq(Box<CoverSequenceStatement<'a>>),
27 RestrictProp(Box<RestrictPropertyStatement<'a>>),
28}
29
30#[derive(Clone, Debug, PartialEq)]
31pub struct AssertPropertyStatement<'a>(
32 pub Metadata<'a>, pub Metadata<'a>, pub Metadata<'a>, pub PropertySpec<'a>,
36 pub Metadata<'a>, pub ActionBlock<'a>,
38);
39
40#[derive(Clone, Debug, PartialEq)]
41pub struct AssumePropertyStatement<'a>(
42 pub Metadata<'a>, pub Metadata<'a>, pub Metadata<'a>, pub PropertySpec<'a>,
46 pub Metadata<'a>, pub ActionBlock<'a>,
48);
49
50#[derive(Clone, Debug, PartialEq)]
51pub struct CoverPropertyStatement<'a>(
52 pub Metadata<'a>, pub Metadata<'a>, pub Metadata<'a>, pub PropertySpec<'a>,
56 pub Metadata<'a>, pub StatementOrNull<'a>,
58);
59
60#[derive(Clone, Debug, PartialEq)]
61pub struct ExpectPropertyStatement<'a>(
62 pub Metadata<'a>, pub Metadata<'a>, pub PropertySpec<'a>,
65 pub Metadata<'a>, pub ActionBlock<'a>,
67);
68
69#[derive(Clone, Debug, PartialEq)]
70pub struct CoverSequenceStatement<'a>(
71 pub Metadata<'a>, pub Metadata<'a>, pub Metadata<'a>, pub Option<ClockingEvent<'a>>,
75 pub Option<(
76 Metadata<'a>, Metadata<'a>, Metadata<'a>, ExpressionOrDist<'a>,
80 Metadata<'a>, )>,
82 pub SequenceExpr<'a>,
83 pub Metadata<'a>, pub StatementOrNull<'a>,
85);
86
87#[derive(Clone, Debug, PartialEq)]
88pub struct RestrictPropertyStatement<'a>(
89 pub Metadata<'a>, pub Metadata<'a>, pub Metadata<'a>, pub PropertySpec<'a>,
93 pub Metadata<'a>, pub Metadata<'a>, );
96
97#[derive(Clone, Debug, PartialEq)]
98pub struct PropertyInstance<'a>(
99 pub PsOrHierarchicalPropertyIdentifier<'a>,
100 pub Option<(
101 Metadata<'a>, Option<PropertyListOfArguments<'a>>,
103 Metadata<'a>, )>,
105);
106
107#[derive(Clone, Debug, PartialEq)]
108pub enum PropertyListOfArguments<'a> {
109 PartialIdentifier(
110 Box<(
111 Option<PropertyActualArg<'a>>,
112 Vec<(
113 Metadata<'a>, Option<PropertyActualArg<'a>>,
115 )>,
116 Vec<(
117 Metadata<'a>, Metadata<'a>, Identifier<'a>,
120 Metadata<'a>, Option<PropertyActualArg<'a>>,
122 Metadata<'a>, )>,
124 )>,
125 ),
126 Identifier(
127 Box<(
128 Metadata<'a>, Identifier<'a>,
130 Metadata<'a>, Option<PropertyActualArg<'a>>,
132 Metadata<'a>, Vec<(
134 Metadata<'a>, Metadata<'a>, Identifier<'a>,
137 Metadata<'a>, Option<PropertyActualArg<'a>>,
139 Metadata<'a>, )>,
141 )>,
142 ),
143}
144
145#[derive(Clone, Debug, PartialEq)]
146pub enum PropertyActualArg<'a> {
147 Property(Box<PropertyExpr<'a>>),
148 Sequence(Box<SequenceActualArg<'a>>),
149}
150
151#[derive(Clone, Debug, PartialEq)]
152pub enum AssertionItemDeclaration<'a> {
153 Property(Box<PropertyDeclaration<'a>>),
154 Sequence(Box<SequenceDeclaration<'a>>),
155 Let(Box<LetDeclaration<'a>>),
156}
157
158#[derive(Clone, Debug, PartialEq)]
159pub struct PropertyDeclaration<'a>(
160 pub Metadata<'a>, pub PropertyIdentifier<'a>,
162 pub Option<(
163 Metadata<'a>, Option<PropertyPortList<'a>>,
165 Metadata<'a>, )>,
167 pub Metadata<'a>, pub Vec<AssertionVariableDeclaration<'a>>,
169 pub PropertySpec<'a>,
170 pub Option<Metadata<'a>>, pub Metadata<'a>, pub Option<(
173 Metadata<'a>, PropertyIdentifier<'a>,
175 )>,
176);
177
178#[derive(Clone, Debug, PartialEq)]
179pub struct PropertyPortList<'a>(
180 pub PropertyPortItem<'a>,
181 pub Vec<(
182 Metadata<'a>, PropertyPortItem<'a>,
184 )>,
185);
186
187#[derive(Clone, Debug, PartialEq)]
188pub struct PropertyPortItem<'a>(
189 pub Vec<AttributeInstance<'a>>,
190 pub Option<(
191 Metadata<'a>, Option<PropertyLvarPortDirection<'a>>,
193 )>,
194 pub PropertyFormalType<'a>,
195 pub FormalPortIdentifier<'a>,
196 pub Vec<VariableDimension<'a>>,
197 pub Option<(
198 Metadata<'a>, PropertyActualArg<'a>,
200 )>,
201);
202
203#[derive(Clone, Debug, PartialEq)]
204pub struct PropertyLvarPortDirection<'a>(
205 pub Metadata<'a>, );
207
208#[derive(Clone, Debug, PartialEq)]
209pub enum PropertyFormalType<'a> {
210 Sequence(Box<SequenceFormalType<'a>>),
211 Property(Box<Metadata<'a>>),
212}
213
214#[derive(Clone, Debug, PartialEq)]
215pub struct PropertySpec<'a>(
216 pub Option<ClockingEvent<'a>>,
217 pub Option<(
218 Metadata<'a>, Metadata<'a>, Metadata<'a>, ExpressionOrDist<'a>,
222 Metadata<'a>, )>,
224 pub PropertyExpr<'a>,
225);
226
227#[derive(Clone, Debug, PartialEq)]
228pub enum PropertyExpr<'a> {
229 SeqExpr(Box<SequenceExpr<'a>>),
230 Strong(
231 Box<(
232 Metadata<'a>, Metadata<'a>, SequenceExpr<'a>,
235 Metadata<'a>, )>,
237 ),
238 Weak(
239 Box<(
240 Metadata<'a>, Metadata<'a>, SequenceExpr<'a>,
243 Metadata<'a>, )>,
245 ),
246 Paren(
247 Box<(
248 Metadata<'a>, PropertyExpr<'a>,
250 Metadata<'a>, )>,
252 ),
253 Not(
254 Box<(
255 Metadata<'a>, PropertyExpr<'a>,
257 )>,
258 ),
259 Or(
260 Box<(
261 PropertyExpr<'a>,
262 Metadata<'a>, PropertyExpr<'a>,
264 )>,
265 ),
266 And(
267 Box<(
268 PropertyExpr<'a>,
269 Metadata<'a>, PropertyExpr<'a>,
271 )>,
272 ),
273 OverlapImpl(
274 Box<(
275 SequenceExpr<'a>,
276 Metadata<'a>, PropertyExpr<'a>,
278 )>,
279 ),
280 NonoverlapImpl(
281 Box<(
282 SequenceExpr<'a>,
283 Metadata<'a>, PropertyExpr<'a>,
285 )>,
286 ),
287 Conditional(
288 Box<(
289 Metadata<'a>, Metadata<'a>, ExpressionOrDist<'a>,
292 Metadata<'a>, PropertyExpr<'a>,
294 Option<(
295 Metadata<'a>, PropertyExpr<'a>,
297 )>,
298 )>,
299 ),
300 Case(
301 Box<(
302 Metadata<'a>, Metadata<'a>, ExpressionOrDist<'a>,
305 Metadata<'a>, PropertyCaseItem<'a>,
307 Vec<PropertyCaseItem<'a>>,
308 Metadata<'a>, )>,
310 ),
311 OverlapFollowedBy(
312 Box<(
313 SequenceExpr<'a>,
314 Metadata<'a>, PropertyExpr<'a>,
316 )>,
317 ),
318 NonoverlapFollowedBy(
319 Box<(
320 SequenceExpr<'a>,
321 Metadata<'a>, PropertyExpr<'a>,
323 )>,
324 ),
325 Nexttime(
326 Box<(
327 Metadata<'a>, PropertyExpr<'a>,
329 )>,
330 ),
331 NexttimeExpr(
332 Box<(
333 Metadata<'a>, Metadata<'a>, ConstantExpression<'a>,
336 Metadata<'a>, PropertyExpr<'a>,
338 )>,
339 ),
340 SNexttime(
341 Box<(
342 Metadata<'a>, PropertyExpr<'a>,
344 )>,
345 ),
346 SNexttimeExpr(
347 Box<(
348 Metadata<'a>, Metadata<'a>, ConstantExpression<'a>,
351 Metadata<'a>, PropertyExpr<'a>,
353 )>,
354 ),
355 Always(
356 Box<(
357 Metadata<'a>, PropertyExpr<'a>,
359 )>,
360 ),
361 AlwaysRange(
362 Box<(
363 Metadata<'a>, Metadata<'a>, CycleDelayConstRangeExpression<'a>,
366 Metadata<'a>, PropertyExpr<'a>,
368 )>,
369 ),
370 SAlways(
371 Box<(
372 Metadata<'a>, Metadata<'a>, ConstantRange<'a>,
375 Metadata<'a>, PropertyExpr<'a>,
377 )>,
378 ),
379 SEventually(
380 Box<(
381 Metadata<'a>, PropertyExpr<'a>,
383 )>,
384 ),
385 Eventually(
386 Box<(
387 Metadata<'a>, Metadata<'a>, ConstantRange<'a>,
390 Metadata<'a>, PropertyExpr<'a>,
392 )>,
393 ),
394 SEventuallyRange(
395 Box<(
396 Metadata<'a>, Metadata<'a>, CycleDelayConstRangeExpression<'a>,
399 Metadata<'a>, PropertyExpr<'a>,
401 )>,
402 ),
403 Until(
404 Box<(
405 PropertyExpr<'a>,
406 Metadata<'a>, PropertyExpr<'a>,
408 )>,
409 ),
410 SUntil(
411 Box<(
412 PropertyExpr<'a>,
413 Metadata<'a>, PropertyExpr<'a>,
415 )>,
416 ),
417 UntilWith(
418 Box<(
419 PropertyExpr<'a>,
420 Metadata<'a>, PropertyExpr<'a>,
422 )>,
423 ),
424 SUntilWith(
425 Box<(
426 PropertyExpr<'a>,
427 Metadata<'a>, PropertyExpr<'a>,
429 )>,
430 ),
431 Implies(
432 Box<(
433 PropertyExpr<'a>,
434 Metadata<'a>, PropertyExpr<'a>,
436 )>,
437 ),
438 Iff(
439 Box<(
440 PropertyExpr<'a>,
441 Metadata<'a>, PropertyExpr<'a>,
443 )>,
444 ),
445 AcceptOn(
446 Box<(
447 Metadata<'a>, Metadata<'a>, ExpressionOrDist<'a>,
450 Metadata<'a>, PropertyExpr<'a>,
452 )>,
453 ),
454 RejectOn(
455 Box<(
456 Metadata<'a>, Metadata<'a>, ExpressionOrDist<'a>,
459 Metadata<'a>, PropertyExpr<'a>,
461 )>,
462 ),
463 SyncAcceptOn(
464 Box<(
465 Metadata<'a>, Metadata<'a>, ExpressionOrDist<'a>,
468 Metadata<'a>, PropertyExpr<'a>,
470 )>,
471 ),
472 SyncRejectOn(
473 Box<(
474 Metadata<'a>, Metadata<'a>, ExpressionOrDist<'a>,
477 Metadata<'a>, PropertyExpr<'a>,
479 )>,
480 ),
481 Instance(Box<PropertyInstance<'a>>),
482 Clocking(Box<(ClockingEvent<'a>, PropertyExpr<'a>)>),
483}
484
485#[derive(Clone, Debug, PartialEq)]
486pub enum PropertyCaseItem<'a> {
487 Expr(
488 Box<(
489 ExpressionOrDist<'a>,
490 Vec<(
491 Metadata<'a>, ExpressionOrDist<'a>,
493 )>,
494 Metadata<'a>, PropertyExpr<'a>,
496 Metadata<'a>, )>,
498 ),
499 Default(
500 Box<(
501 Metadata<'a>, Option<Metadata<'a>>, PropertyExpr<'a>,
504 Metadata<'a>, )>,
506 ),
507}
508
509#[derive(Clone, Debug, PartialEq)]
510pub struct SequenceDeclaration<'a>(
511 pub Metadata<'a>, pub SequenceIdentifier<'a>,
513 pub Option<(
514 Metadata<'a>, Option<SequencePortList<'a>>,
516 Metadata<'a>, )>,
518 pub Metadata<'a>, pub Vec<AssertionVariableDeclaration<'a>>,
520 pub SequenceExpr<'a>,
521 pub Option<Metadata<'a>>, pub Metadata<'a>, pub Option<(
524 Metadata<'a>, SequenceIdentifier<'a>,
526 )>,
527);
528
529#[derive(Clone, Debug, PartialEq)]
530pub struct SequencePortList<'a>(
531 pub SequencePortItem<'a>,
532 pub Vec<(
533 Metadata<'a>, SequencePortItem<'a>,
535 )>,
536);
537
538#[derive(Clone, Debug, PartialEq)]
539pub struct SequencePortItem<'a>(
540 pub Vec<AttributeInstance<'a>>,
541 pub Option<(
542 Metadata<'a>, Option<SequenceLvarPortDirection<'a>>,
544 )>,
545 pub SequenceFormalType<'a>,
546 pub FormalPortIdentifier<'a>,
547 pub Vec<VariableDimension<'a>>,
548 pub Option<(
549 Metadata<'a>, SequenceActualArg<'a>,
551 )>,
552);
553
554#[derive(Clone, Debug, PartialEq)]
555pub enum SequenceLvarPortDirection<'a> {
556 Input(Metadata<'a>),
557 Inout(Metadata<'a>),
558 Output(Metadata<'a>),
559}
560
561#[derive(Clone, Debug, PartialEq)]
562pub enum SequenceFormalType<'a> {
563 DataTypeOrImplicit(Box<DataTypeOrImplicit<'a>>),
564 Sequence(Box<Metadata<'a>>),
565 Untyped(Box<Metadata<'a>>),
566}
567
568#[derive(Clone, Debug, PartialEq)]
569pub enum SequenceExpr<'a> {
570 StartDelay(
571 Box<(
572 CycleDelayRange<'a>,
573 SequenceExpr<'a>,
574 Vec<(CycleDelayRange<'a>, SequenceExpr<'a>)>,
575 )>,
576 ),
577 Delay(
578 Box<(
579 SequenceExpr<'a>,
580 CycleDelayRange<'a>,
581 SequenceExpr<'a>,
582 Vec<(CycleDelayRange<'a>, SequenceExpr<'a>)>,
583 )>,
584 ),
585 Expr(Box<(ExpressionOrDist<'a>, Option<BooleanAbbrev<'a>>)>),
586 Inst(Box<(SequenceInstance<'a>, Option<SequenceAbbrev<'a>>)>),
587 Paren(
588 Box<(
589 Metadata<'a>, SequenceExpr<'a>,
591 Vec<(
592 Metadata<'a>, SequenceMatchItem<'a>,
594 )>,
595 Metadata<'a>, Option<SequenceAbbrev<'a>>,
597 )>,
598 ),
599 And(
600 Box<(
601 SequenceExpr<'a>,
602 Metadata<'a>, SequenceExpr<'a>,
604 )>,
605 ),
606 Intersect(
607 Box<(
608 SequenceExpr<'a>,
609 Metadata<'a>, SequenceExpr<'a>,
611 )>,
612 ),
613 Or(
614 Box<(
615 SequenceExpr<'a>,
616 Metadata<'a>, SequenceExpr<'a>,
618 )>,
619 ),
620 FirstMatch(
621 Box<(
622 Metadata<'a>, Metadata<'a>, SequenceExpr<'a>,
625 Vec<(
626 Metadata<'a>, SequenceMatchItem<'a>,
628 )>,
629 Metadata<'a>, )>,
631 ),
632 Throughout(
633 Box<(
634 ExpressionOrDist<'a>,
635 Metadata<'a>, SequenceExpr<'a>,
637 )>,
638 ),
639 Within(
640 Box<(
641 SequenceExpr<'a>,
642 Metadata<'a>, SequenceExpr<'a>,
644 )>,
645 ),
646 Clocking(Box<(ClockingEvent<'a>, SequenceExpr<'a>)>),
647}
648
649#[derive(Clone, Debug, PartialEq)]
650pub enum CycleDelayRange<'a> {
651 Primary(
652 Box<(
653 Metadata<'a>, ConstantPrimary<'a>,
655 )>,
656 ),
657 Range(
658 Box<(
659 Metadata<'a>, Metadata<'a>, CycleDelayConstRangeExpression<'a>,
662 Metadata<'a>, )>,
664 ),
665 Star(
666 Box<(
667 Metadata<'a>, Metadata<'a>, Metadata<'a>, Metadata<'a>, )>,
672 ),
673 Plus(
674 Box<(
675 Metadata<'a>, Metadata<'a>, Metadata<'a>, Metadata<'a>, )>,
680 ),
681}
682
683#[derive(Clone, Debug, PartialEq)]
684pub struct SequenceMethodCall<'a>(
685 pub SequenceInstance<'a>,
686 pub Metadata<'a>, pub MethodIdentifier<'a>,
688);
689
690#[derive(Clone, Debug, PartialEq)]
691pub enum SequenceMatchItem<'a> {
692 Operator(Box<OperatorAssignment<'a>>),
693 IncOrDec(Box<IncOrDecExpression<'a>>),
694 Subroutine(Box<SubroutineCall<'a>>),
695}
696
697#[derive(Clone, Debug, PartialEq)]
698pub struct SequenceInstance<'a>(
699 pub PsOrHierarchicalSequenceIdentifier<'a>,
700 pub Option<(
701 Metadata<'a>, Option<SequenceListOfArguments<'a>>,
703 Metadata<'a>, )>,
705);
706
707#[derive(Clone, Debug, PartialEq)]
708pub enum SequenceListOfArguments<'a> {
709 PartialIdentifier(
710 Box<(
711 Option<SequenceActualArg<'a>>,
712 Vec<(
713 Metadata<'a>, Option<SequenceActualArg<'a>>,
715 )>,
716 Vec<(
717 Metadata<'a>, Metadata<'a>, Identifier<'a>,
720 Metadata<'a>, Option<SequenceActualArg<'a>>,
722 Metadata<'a>, )>,
724 )>,
725 ),
726 Identifier(
727 Box<(
728 Metadata<'a>, Identifier<'a>,
730 Metadata<'a>, Option<SequenceActualArg<'a>>,
732 Metadata<'a>, Vec<(
734 Metadata<'a>, Metadata<'a>, Identifier<'a>,
737 Metadata<'a>, Option<SequenceActualArg<'a>>,
739 Metadata<'a>, )>,
741 )>,
742 ),
743}
744
745#[derive(Clone, Debug, PartialEq)]
746pub enum SequenceActualArg<'a> {
747 Event(Box<EventExpression<'a>>),
748 Sequence(Box<SequenceExpr<'a>>),
749 Dollar(Box<Metadata<'a>>),
750}
751
752#[derive(Clone, Debug, PartialEq)]
753pub enum BooleanAbbrev<'a> {
754 Consecutive(Box<ConsecutiveRepetition<'a>>),
755 Nonconsecutive(Box<NonconsecutiveRepetition<'a>>),
756 Goto(Box<GotoRepetition<'a>>),
757}
758
759#[derive(Clone, Debug, PartialEq)]
760pub struct SequenceAbbrev<'a>(pub ConsecutiveRepetition<'a>);
761
762#[derive(Clone, Debug, PartialEq)]
763pub enum ConsecutiveRepetition<'a> {
764 Expr(
765 Box<(
766 Metadata<'a>, Metadata<'a>, ConstOrRangeExpression<'a>,
769 Metadata<'a>, )>,
771 ),
772 Star(
773 Box<(
774 Metadata<'a>, Metadata<'a>, Metadata<'a>, )>,
778 ),
779 Plus(
780 Box<(
781 Metadata<'a>, Metadata<'a>, Metadata<'a>, )>,
785 ),
786}
787
788#[derive(Clone, Debug, PartialEq)]
789pub struct NonconsecutiveRepetition<'a>(
790 pub Metadata<'a>, pub Metadata<'a>, pub ConstOrRangeExpression<'a>,
793 pub Metadata<'a>, );
795
796#[derive(Clone, Debug, PartialEq)]
797pub struct GotoRepetition<'a>(
798 pub Metadata<'a>, pub Metadata<'a>, pub ConstOrRangeExpression<'a>,
801 pub Metadata<'a>, );
803
804#[derive(Clone, Debug, PartialEq)]
805pub enum ConstOrRangeExpression<'a> {
806 Expr(Box<ConstantExpression<'a>>),
807 Range(Box<CycleDelayConstRangeExpression<'a>>),
808}
809
810#[derive(Clone, Debug, PartialEq)]
811pub enum CycleDelayConstRangeExpression<'a> {
812 Bounded(
813 Box<(
814 ConstantExpression<'a>,
815 Metadata<'a>, ConstantExpression<'a>,
817 )>,
818 ),
819 Unbounded(
820 Box<(
821 ConstantExpression<'a>,
822 Metadata<'a>, Metadata<'a>, )>,
825 ),
826}
827
828#[derive(Clone, Debug, PartialEq)]
829pub struct AssertionVariableDeclaration<'a>(
830 pub VarDataType<'a>,
831 pub ListOfVariableDeclAssignments<'a>,
832 pub Metadata<'a>, );