Skip to content

Commit 409e8f5

Browse files
authored
Merge pull request #1032 from diffblue/SVA-antecedent-consequent
SVA: antecedent/consequent methods
2 parents 63e322d + 7508e5c commit 409e8f5

File tree

3 files changed

+70
-33
lines changed

3 files changed

+70
-33
lines changed

src/temporal-logic/nnf.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,16 +130,17 @@ std::optional<exprt> negate_property_node(const exprt &expr)
130130
// 1800 2017 16.12.9
131131
// !(a #-# b) ---> a |-> !b
132132
auto &followed_by = to_sva_followed_by_expr(expr);
133-
auto not_b = not_exprt{followed_by.property()};
134-
return sva_overlapped_implication_exprt{followed_by.lhs(), not_b};
133+
auto not_b = not_exprt{followed_by.consequent()};
134+
return sva_overlapped_implication_exprt{followed_by.antecedent(), not_b};
135135
}
136136
else if(expr.id() == ID_sva_nonoverlapped_followed_by)
137137
{
138138
// 1800 2017 16.12.9
139139
// !(a #=# b) ---> a |=> !b
140140
auto &followed_by = to_sva_followed_by_expr(expr);
141-
auto not_b = not_exprt{followed_by.property()};
142-
return sva_non_overlapped_implication_exprt{followed_by.lhs(), not_b};
141+
auto not_b = not_exprt{followed_by.consequent()};
142+
return sva_non_overlapped_implication_exprt{
143+
followed_by.antecedent(), not_b};
143144
}
144145
else
145146
return {};

src/trans-word-level/property.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ static obligationst property_obligations_rec(
586586

587587
// get match points for LHS sequence
588588
auto match_points =
589-
instantiate_sequence(followed_by.sequence(), current, no_timeframes);
589+
instantiate_sequence(followed_by.antecedent(), current, no_timeframes);
590590

591591
exprt::operandst disjuncts;
592592
mp_integer t = current;
@@ -610,7 +610,7 @@ static obligationst property_obligations_rec(
610610
{
611611
auto obligations_rec =
612612
property_obligations_rec(
613-
followed_by.property(), property_start, no_timeframes)
613+
followed_by.consequent(), property_start, no_timeframes)
614614
.conjunction();
615615

616616
disjuncts.push_back(

src/verilog/sva_expr.h

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -635,14 +635,55 @@ static inline sva_s_until_with_exprt &to_sva_s_until_with_expr(exprt &expr)
635635
return static_cast<sva_s_until_with_exprt &>(expr);
636636
}
637637

638-
class sva_overlapped_implication_exprt : public binary_predicate_exprt
638+
/// base class for |->, |=>, #-#, #=#
639+
class sva_implication_base_exprt : public binary_predicate_exprt
639640
{
640641
public:
641-
explicit sva_overlapped_implication_exprt(exprt op0, exprt op1)
642+
explicit sva_implication_base_exprt(
643+
exprt __antecedent,
644+
irep_idt __id,
645+
exprt __consequent)
642646
: binary_predicate_exprt(
643-
std::move(op0),
647+
std::move(__antecedent),
648+
__id,
649+
std::move(__consequent))
650+
{
651+
}
652+
653+
// a sequence
654+
const exprt &antecedent() const
655+
{
656+
return lhs();
657+
}
658+
659+
exprt &antecedent()
660+
{
661+
return lhs();
662+
}
663+
664+
// a property
665+
const exprt &consequent() const
666+
{
667+
return rhs();
668+
}
669+
670+
exprt &consequent()
671+
{
672+
return rhs();
673+
}
674+
};
675+
676+
/// |->
677+
class sva_overlapped_implication_exprt : public sva_implication_base_exprt
678+
{
679+
public:
680+
explicit sva_overlapped_implication_exprt(
681+
exprt __antecedent,
682+
exprt __consequent)
683+
: sva_implication_base_exprt(
684+
std::move(__antecedent),
644685
ID_sva_overlapped_implication,
645-
std::move(op1))
686+
std::move(__consequent))
646687
{
647688
}
648689
};
@@ -663,14 +704,17 @@ to_sva_overlapped_implication_expr(exprt &expr)
663704
return static_cast<sva_overlapped_implication_exprt &>(expr);
664705
}
665706

666-
class sva_non_overlapped_implication_exprt : public binary_predicate_exprt
707+
/// |=>
708+
class sva_non_overlapped_implication_exprt : public sva_implication_base_exprt
667709
{
668710
public:
669-
explicit sva_non_overlapped_implication_exprt(exprt op0, exprt op1)
670-
: binary_predicate_exprt(
671-
std::move(op0),
711+
explicit sva_non_overlapped_implication_exprt(
712+
exprt __antecedent,
713+
exprt __consequent)
714+
: sva_implication_base_exprt(
715+
std::move(__antecedent),
672716
ID_sva_non_overlapped_implication,
673-
std::move(op1))
717+
std::move(__consequent))
674718
{
675719
}
676720
};
@@ -834,27 +878,19 @@ static inline sva_or_exprt &to_sva_or_expr(exprt &expr)
834878
return static_cast<sva_or_exprt &>(expr);
835879
}
836880

837-
class sva_followed_by_exprt : public binary_predicate_exprt
881+
// #-#, #=#
882+
class sva_followed_by_exprt : public sva_implication_base_exprt
838883
{
839884
public:
840-
const exprt &sequence() const
841-
{
842-
return op0();
843-
}
844-
845-
exprt &sequence()
846-
{
847-
return op0();
848-
}
849-
850-
const exprt &property() const
851-
{
852-
return op1();
853-
}
854-
855-
exprt &property()
885+
explicit sva_followed_by_exprt(
886+
exprt __antecedent,
887+
irep_idt __id,
888+
exprt __consequent)
889+
: sva_implication_base_exprt(
890+
std::move(__antecedent),
891+
__id,
892+
std::move(__consequent))
856893
{
857-
return op1();
858894
}
859895
};
860896

0 commit comments

Comments
 (0)