Skip to content

Commit f3eb41c

Browse files
committed
New IC3: AIG-based IC3/PDR engine using CBMC SAT solvers
Add a new IC3/PDR model checking engine in src/new-ic3/ that operates directly on the AIG netlist from trans-netlist, using CBMC's SAT solvers. Invoked with --new-ic3. The implementation follows the standard IC3/PDR algorithm: - Incremental frame-based invariant learning - Proof obligations with priority queue - MIC generalization (literal dropping) - Frame propagation with convergence check - Dedicated is_inductive check for clause pushing Uses satcheck_no_simplifiert to avoid preprocessing interactions with gate_and encoding. Known limitation: the default netlist encoding (convert_trans_to_netlist) can produce AIGs where some properties appear spuriously 1-inductive. Using --simple-netlist avoids this. Performance is limited by non-incremental SAT solving (new solver per query).
1 parent fa2c2c0 commit f3eb41c

8 files changed

Lines changed: 708 additions & 13 deletions

File tree

src/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
DIRS = ebmc hw-cbmc temporal-logic trans-word-level trans-netlist \
2-
verilog vhdl smvlang ic3 aiger vlindex
2+
verilog vhdl smvlang ic3 aiger vlindex new-ic3
33

44
CPROVER_DIR:=../lib/cbmc/src
55

@@ -15,7 +15,7 @@ $(patsubst %, %.dir, $(DIRS)):
1515
vhdl.dir: cprover.dir
1616

1717
ebmc.dir: trans-word-level.dir trans-netlist.dir verilog.dir vhdl.dir \
18-
smvlang.dir aiger.dir temporal-logic.dir cprover.dir
18+
smvlang.dir aiger.dir temporal-logic.dir cprover.dir new-ic3.dir
1919

2020
ifneq ($(BUILD_ENV),MSVC)
2121
ebmc.dir: ic3.dir

src/ebmc/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ OBJ+= $(CPROVER_DIR)/util/util$(LIBEXT) \
5656
../trans-word-level/trans-word-level$(LIBEXT) \
5757
../aiger/aiger$(LIBEXT) \
5858
../smvlang/smvlang$(LIBEXT) \
59-
../verilog/verilog$(LIBEXT)
59+
../verilog/verilog$(LIBEXT) \
60+
../new-ic3/new-ic3$(LIBEXT)
6061

6162
ifneq ($(BUILD_ENV),MSVC)
6263
OBJ += ../ic3/libic3$(LIBEXT)

src/ebmc/ebmc_parse_options.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ void ebmc_parse_optionst::help()
420420
" {y--constr} \t use constraints specified in 'file.cnstr'\n"
421421
" {y--new-mode} \t new mode is switched on\n"
422422
" {y--aiger} \t print out the instance in aiger format\n"
423+
" {y--new-ic3} \t use new IC3 engine (AIG-based)\n"
423424
" {y--random-traces} \t generate random traces\n"
424425
" {y--traces} {unumber} \t generate the given number of traces\n"
425426
" {y--random-seed} {unumber} \t use the given random seed\n"

src/ebmc/ebmc_parse_options.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Author: Daniel Kroening, kroening@kroening.com
1414

1515
#include "ebmc_version.h"
1616

17-
class ebmc_parse_optionst:public parse_options_baset
17+
class ebmc_parse_optionst : public parse_options_baset
1818
{
1919
public:
2020
virtual int doit();
@@ -38,7 +38,7 @@ class ebmc_parse_optionst:public parse_options_baset
3838
"(reset):(ignore-initial)(initial-zero)"
3939
"(version)(verilog-rtl)(verilog-netlist)"
4040
"(compute-interpolant)(interpolation)(interpolation-vmcai)"
41-
"(ic3)(property):(constr)(h)(new-mode)(aiger)"
41+
"(ic3)(new-ic3)(property):(constr)(h)(new-mode)(aiger)"
4242
"(interpolation-word)(interpolator):(bdd)"
4343
"(ranking-function):"
4444
"(smt2)(bitwuzla)(boolector)(cvc3)(cvc4)(cvc5)(mathsat)(yices)(z3)"
@@ -60,11 +60,13 @@ class ebmc_parse_optionst:public parse_options_baset
6060
{
6161
}
6262

63-
virtual ~ebmc_parse_optionst() { }
64-
63+
virtual ~ebmc_parse_optionst()
64+
{
65+
}
66+
6567
protected:
6668
void register_languages();
67-
69+
6870
ui_message_handlert ui_message_handler;
6971
};
7072

src/ebmc/property_checker.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Author: Daniel Kroening, dkr@amazon.com
1111
#include <util/output_file.h>
1212
#include <util/string2int.h>
1313

14+
#include <new-ic3/new_ic3_engine.h>
1415
#include <solvers/sat/satcheck.h>
1516
#include <trans-netlist/trans_trace_netlist.h>
1617
#include <trans-netlist/unwind_netlist.h>
@@ -368,18 +369,18 @@ property_checker_resultt property_checker(
368369
ebmc_propertiest &properties,
369370
message_handlert &message_handler)
370371
{
371-
bool use_heuristic_engine = !cmdline.isset("bdd") && !cmdline.isset("aig") &&
372-
!cmdline.isset("k-induction") &&
373-
!cmdline.isset("ic3") && !cmdline.isset("bound");
372+
bool use_heuristic_engine =
373+
!cmdline.isset("bdd") && !cmdline.isset("aig") &&
374+
!cmdline.isset("k-induction") && !cmdline.isset("ic3") &&
375+
!cmdline.isset("new-ic3") && !cmdline.isset("bound");
374376

375377
if(cmdline.isset("k-induction") || use_heuristic_engine)
376378
{
377379
// The step case of k-induction can't do $past
378380
instrument_past(transition_system, properties);
379381
}
380382

381-
auto result = [&]() -> property_checker_resultt
382-
{
383+
auto result = [&]() -> property_checker_resultt {
383384
if(cmdline.isset("bdd") || cmdline.isset("show-bdds"))
384385
{
385386
return bdd_engine(
@@ -405,6 +406,11 @@ property_checker_resultt property_checker(
405406
cmdline, transition_system, properties, message_handler);
406407
#endif
407408
}
409+
else if(cmdline.isset("new-ic3"))
410+
{
411+
return new_ic3_engine(
412+
cmdline, transition_system, properties, message_handler);
413+
}
408414
else if(cmdline.isset("bound"))
409415
{
410416
// word-level BMC

src/new-ic3/Makefile

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
SRC = new_ic3_engine.cpp \
2+
#empty line
3+
4+
include ../config.inc
5+
include ../common
6+
7+
all: new-ic3$(LIBEXT)
8+
9+
clean:
10+
$(RM) *.o *.d new-ic3$(LIBEXT)
11+
12+
new-ic3$(LIBEXT): $(OBJ)
13+
$(LINKLIB)

0 commit comments

Comments
 (0)