Skip to content

Commit a98f5e7

Browse files
committed
Unit tests for trivial_sva(...)
This adds unit tests for the trivial_sva(expr) simplification.
1 parent 05da013 commit a98f5e7

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

unit/Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ SRC += smvlang/expr2smv.cpp \
88
temporal-logic/ltl_sva_to_string.cpp \
99
temporal-logic/sva_sequence_match.cpp \
1010
temporal-logic/nnf.cpp \
11+
temporal-logic/trivial_sva.cpp \
1112
# Empty last line
1213

1314
INCLUDES= -I ../src/ -I . -I $(CPROVER_DIR)/unit -I $(CPROVER_DIR)/src
@@ -20,7 +21,8 @@ include $(CPROVER_DIR)/src/common
2021
CXXFLAGS += -D'LOCAL_IREP_IDS=<hw_cbmc_irep_ids.h>'
2122

2223
OBJ += ../src/smvlang/smvlang$(LIBEXT) \
23-
../src/temporal-logic/temporal-logic$(LIBEXT)
24+
../src/temporal-logic/temporal-logic$(LIBEXT) \
25+
../src/verilog/verilog$(LIBEXT)
2426

2527
cprover.dir:
2628
$(MAKE) $(MAKEARGS) -C ../src

unit/temporal-logic/trivial_sva.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*******************************************************************\
2+
3+
Module: Trivial SVA
4+
5+
Author: Daniel Kroening, [email protected]
6+
7+
\*******************************************************************/
8+
9+
#include <temporal-logic/trivial_sva.h>
10+
#include <testing-utils/use_catch.h>
11+
#include <verilog/sva_expr.h>
12+
13+
SCENARIO("Simplifying a trivial SVA formula")
14+
{
15+
auto p = symbol_exprt{"p", bool_typet{}};
16+
auto q = symbol_exprt{"q", bool_typet{}};
17+
auto r = symbol_exprt{"r", bool_typet{}};
18+
19+
GIVEN("A trivial SVA formula with properties")
20+
{
21+
auto prop = [](exprt expr) {
22+
return sva_boolean_exprt{std::move(expr), bool_typet{}};
23+
};
24+
25+
REQUIRE(trivial_sva(sva_not_exprt{prop(p)}) == not_exprt{prop(p)});
26+
REQUIRE(
27+
trivial_sva(
28+
sva_not_exprt{sva_and_exprt{prop(p), prop(q), bool_typet{}}}) ==
29+
not_exprt{and_exprt{prop(p), prop(q)}});
30+
REQUIRE(
31+
trivial_sva(
32+
sva_and_exprt{sva_not_exprt{prop(p)}, prop(q), bool_typet{}}) ==
33+
and_exprt{not_exprt{prop(p)}, prop(q)});
34+
REQUIRE(
35+
trivial_sva(sva_and_exprt{
36+
sva_or_exprt{prop(p), prop(q), bool_typet{}}, prop(r), bool_typet{}}) ==
37+
and_exprt{or_exprt{prop(p), prop(q)}, prop(r)});
38+
}
39+
40+
GIVEN("A trivial SVA formula with sequences")
41+
{
42+
auto sequence_type = verilog_sva_sequence_typet{};
43+
auto seq = [](exprt expr) {
44+
return sva_boolean_exprt{std::move(expr), verilog_sva_sequence_typet{}};
45+
};
46+
47+
auto weak = [](const exprt &expr) {
48+
return sva_weak_exprt{ID_sva_weak, expr};
49+
};
50+
51+
REQUIRE(trivial_sva(weak(seq(p))) == p);
52+
53+
REQUIRE(
54+
trivial_sva(weak(sva_and_exprt{
55+
sva_and_exprt{seq(p), seq(q), sequence_type}})) == and_exprt{p, q});
56+
57+
// The below fails
58+
// REQUIRE(trivial_sva(weak(sva_and_exprt{sva_and_exprt{p_seq, sva_or_exprt{q_seq, r_seq, sequence_type}, sequence_type}})) == and_exprt{p, or_exprt{q, r}});
59+
}
60+
}

0 commit comments

Comments
 (0)