@@ -530,8 +530,17 @@ static obligationst property_obligations_rec(
530
530
// The sequence must not match.
531
531
auto &sequence = to_sva_sequence_property_expr_base (op).sequence ();
532
532
533
+ // clang-format off
534
+ auto semantics =
535
+ op.id () == ID_sva_strong ? sva_sequence_semanticst::STRONG
536
+ : op.id () == ID_sva_weak ? sva_sequence_semanticst::WEAK
537
+ : op.id () == ID_sva_implicit_strong ? sva_sequence_semanticst::STRONG
538
+ : op.id () == ID_sva_implicit_weak ? sva_sequence_semanticst::WEAK
539
+ : sva_sequence_semanticst::WEAK;
540
+ // clang-format on
541
+
533
542
const auto matches =
534
- instantiate_sequence (sequence, current, no_timeframes);
543
+ instantiate_sequence (sequence, semantics, current, no_timeframes);
535
544
536
545
obligationst obligations;
537
546
@@ -577,10 +586,13 @@ static obligationst property_obligations_rec(
577
586
auto &implication = to_binary_expr (property_expr);
578
587
579
588
// The LHS is a sequence, the RHS is a property.
580
- // The implication must hold for _all_ matches on the LHS,
589
+ // The implication must hold for _all_ (strong) matches on the LHS,
581
590
// i.e., each pair of LHS match and RHS obligation yields an obligation.
582
- const auto lhs_match_points =
583
- instantiate_sequence (implication.lhs (), current, no_timeframes);
591
+ const auto lhs_match_points = instantiate_sequence (
592
+ implication.lhs (),
593
+ sva_sequence_semanticst::STRONG,
594
+ current,
595
+ no_timeframes);
584
596
585
597
obligationst result;
586
598
@@ -620,9 +632,12 @@ static obligationst property_obligations_rec(
620
632
// the result is a property expression.
621
633
auto &followed_by = to_sva_followed_by_expr (property_expr);
622
634
623
- // get match points for LHS sequence
624
- auto matches =
625
- instantiate_sequence (followed_by.antecedent (), current, no_timeframes);
635
+ // get (proper) match points for LHS sequence
636
+ auto matches = instantiate_sequence (
637
+ followed_by.antecedent (),
638
+ sva_sequence_semanticst::STRONG,
639
+ current,
640
+ no_timeframes);
626
641
627
642
exprt::operandst disjuncts;
628
643
mp_integer t = current;
@@ -663,9 +678,19 @@ static obligationst property_obligations_rec(
663
678
auto &sequence =
664
679
to_sva_sequence_property_expr_base (property_expr).sequence ();
665
680
681
+ // clang-format off
682
+ auto semantics =
683
+ property_expr.id () == ID_sva_strong ? sva_sequence_semanticst::STRONG
684
+ : property_expr.id () == ID_sva_weak ? sva_sequence_semanticst::WEAK
685
+ : property_expr.id () == ID_sva_implicit_strong ? sva_sequence_semanticst::STRONG
686
+ : property_expr.id () == ID_sva_implicit_weak ? sva_sequence_semanticst::WEAK
687
+ : sva_sequence_semanticst::WEAK;
688
+ // clang-format on
689
+
666
690
// sequence expressions -- these may have multiple potential
667
691
// match points, and evaluate to true if any of them matches
668
- const auto matches = instantiate_sequence (sequence, current, no_timeframes);
692
+ const auto matches =
693
+ instantiate_sequence (sequence, semantics, current, no_timeframes);
669
694
exprt::operandst disjuncts;
670
695
disjuncts.reserve (matches.size ());
671
696
mp_integer max = current;
0 commit comments