Skip to content

Commit 47d6974

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

File tree

2 files changed

+73
-1
lines changed

2 files changed

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

0 commit comments

Comments
 (0)