Skip to content

Commit 7330a08

Browse files
committed
solver-based neural ranking engine
This adds a variant of neural ranking that uses a SAT/SMT solver to compute the weights and biases in the neural network.
1 parent 5906108 commit 7330a08

File tree

14 files changed

+1012
-16
lines changed

14 files changed

+1012
-16
lines changed

examples/Benchmarks/run_solver_nuterm

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
#!/bin/sh
2+
3+
set -e
4+
5+
if false ; then
6+
# ok
7+
ebmc PWM_1.sv --solver-neural-liveness
8+
ebmc PWM_2.sv --solver-neural-liveness
9+
ebmc PWM_3.sv --solver-neural-liveness
10+
ebmc PWM_4.sv --solver-neural-liveness
11+
ebmc PWM_5.sv --solver-neural-liveness
12+
ebmc PWM_6.sv --solver-neural-liveness
13+
ebmc PWM_7.sv --solver-neural-liveness
14+
ebmc PWM_8.sv --solver-neural-liveness
15+
ebmc PWM_9.sv --solver-neural-liveness
16+
fi
17+
18+
if false ; then
19+
# ok
20+
ebmc delay_1.sv --solver-neural-liveness
21+
ebmc delay_2.sv --solver-neural-liveness
22+
ebmc delay_3.sv --solver-neural-liveness
23+
ebmc delay_4.sv --solver-neural-liveness
24+
ebmc delay_5.sv --solver-neural-liveness
25+
ebmc delay_6.sv --solver-neural-liveness
26+
ebmc delay_7.sv --solver-neural-liveness
27+
ebmc delay_8.sv --solver-neural-liveness
28+
ebmc delay_9.sv --solver-neural-liveness
29+
ebmc delay_10.sv --solver-neural-liveness
30+
ebmc delay_11.sv --solver-neural-liveness
31+
ebmc delay_12.sv --solver-neural-liveness
32+
ebmc delay_13.sv --solver-neural-liveness
33+
ebmc delay_14.sv --solver-neural-liveness
34+
ebmc delay_15.sv --solver-neural-liveness
35+
ebmc delay_16.sv --solver-neural-liveness
36+
fi
37+
38+
if false ; then
39+
# ok
40+
ebmc gray_1.sv --solver-neural-liveness
41+
ebmc gray_2.sv --solver-neural-liveness
42+
ebmc gray_3.sv --solver-neural-liveness
43+
ebmc gray_4.sv --solver-neural-liveness
44+
ebmc gray_5.sv --solver-neural-liveness
45+
ebmc gray_6.sv --solver-neural-liveness
46+
ebmc gray_7.sv --solver-neural-liveness
47+
ebmc gray_8.sv --solver-neural-liveness
48+
ebmc gray_9.sv --solver-neural-liveness
49+
ebmc gray_10.sv --solver-neural-liveness
50+
ebmc gray_11.sv --solver-neural-liveness
51+
fi
52+
53+
if false ; then
54+
ebmc i2c_1.sv --solver-neural-liveness
55+
ebmc i2c_2.sv --solver-neural-liveness
56+
ebmc i2c_3.sv --solver-neural-liveness
57+
ebmc i2c_4.sv --solver-neural-liveness
58+
ebmc i2c_5.sv --solver-neural-liveness
59+
ebmc i2c_6.sv --solver-neural-liveness
60+
ebmc i2c_7.sv --solver-neural-liveness
61+
ebmc i2c_8.sv --solver-neural-liveness
62+
ebmc i2c_9.sv --solver-neural-liveness
63+
ebmc i2c_10.sv --solver-neural-liveness
64+
ebmc i2c_11.sv --solver-neural-liveness
65+
ebmc i2c_12.sv --solver-neural-liveness
66+
ebmc i2c_13.sv --solver-neural-liveness
67+
ebmc i2c_14.sv --solver-neural-liveness
68+
ebmc i2c_15.sv --solver-neural-liveness
69+
ebmc i2c_16.sv --solver-neural-liveness
70+
ebmc i2c_17.sv --solver-neural-liveness
71+
ebmc i2c_18.sv --solver-neural-liveness
72+
ebmc i2c_19.sv --solver-neural-liveness
73+
ebmc i2c_20.sv --solver-neural-liveness
74+
fi
75+
76+
if false ; then
77+
ebmc lcd_1.sv --solver-neural-liveness "{3-state,500-cnt}"
78+
ebmc lcd_2.sv --solver-neural-liveness "{3-state,1000-cnt}"
79+
ebmc lcd_3.sv --solver-neural-liveness "{3-state,1500-cnt}"
80+
ebmc lcd_4.sv --solver-neural-liveness "{3-state,2500-cnt}"
81+
ebmc lcd_5.sv --solver-neural-liveness "{3-state,5000-cnt}"
82+
ebmc lcd_6.sv --solver-neural-liveness "{3-state,7500-cnt}"
83+
ebmc lcd_7.sv --solver-neural-liveness "{3-state,10000-cnt}"
84+
ebmc lcd_8.sv --solver-neural-liveness "{3-state,12500-cnt}"
85+
ebmc lcd_9.sv --solver-neural-liveness "{3-state,15000-cnt}"
86+
ebmc lcd_10.sv --solver-neural-liveness "{3-state,17500-cnt}"
87+
ebmc lcd_11.sv --solver-neural-liveness "{3-state,20000-cnt}"
88+
ebmc lcd_12.sv --solver-neural-liveness "{3-state,22500-cnt}"
89+
ebmc lcd_13.sv --solver-neural-liveness "{3-state,90000-cnt}"
90+
ebmc lcd_14.sv --solver-neural-liveness "{3-state,180000-cnt}"
91+
fi
92+
93+
if false ; then
94+
# ok
95+
ebmc seven_seg_1.sv --solver-neural-liveness --property SEVEN.property.p1
96+
ebmc seven_seg_2.sv --solver-neural-liveness --property SEVEN.property.p1
97+
ebmc seven_seg_3.sv --solver-neural-liveness --property SEVEN.property.p1
98+
ebmc seven_seg_4.sv --solver-neural-liveness --property SEVEN.property.p1
99+
ebmc seven_seg_5.sv --solver-neural-liveness --property SEVEN.property.p1
100+
ebmc seven_seg_6.sv --solver-neural-liveness --property SEVEN.property.p1
101+
ebmc seven_seg_7.sv --solver-neural-liveness --property SEVEN.property.p1
102+
ebmc seven_seg_8.sv --solver-neural-liveness --property SEVEN.property.p1
103+
ebmc seven_seg_9.sv --solver-neural-liveness --property SEVEN.property.p1
104+
ebmc seven_seg_10.sv --solver-neural-liveness --property SEVEN.property.p1
105+
ebmc seven_seg_11.sv --solver-neural-liveness --property SEVEN.property.p1
106+
ebmc seven_seg_12.sv --solver-neural-liveness --property SEVEN.property.p1
107+
ebmc seven_seg_16.sv --solver-neural-liveness --property SEVEN.property.p1
108+
ebmc seven_seg_17.sv --solver-neural-liveness --property SEVEN.property.p1
109+
ebmc seven_seg_18.sv --solver-neural-liveness --property SEVEN.property.p1
110+
fi
111+
112+
if false ; then
113+
ebmc thermocouple_1.sv --solver-neural-liveness "{2-state,2**5-cnt}"
114+
ebmc thermocouple_2.sv --solver-neural-liveness "{2-state,2**9-cnt}"
115+
ebmc thermocouple_3.sv --solver-neural-liveness "{2-state,2**10-cnt}"
116+
ebmc thermocouple_4.sv --solver-neural-liveness "{2-state,2**10-cnt}"
117+
ebmc thermocouple_5.sv --solver-neural-liveness "{2-state,2**11-cnt}"
118+
ebmc thermocouple_6.sv --solver-neural-liveness "{2-state,2**11-cnt}"
119+
ebmc thermocouple_7.sv --solver-neural-liveness "{2-state,2**12-cnt}"
120+
ebmc thermocouple_8.sv --solver-neural-liveness "{2-state,2**12-cnt}"
121+
ebmc thermocouple_9.sv --solver-neural-liveness "{2-state,2**13-cnt}"
122+
ebmc thermocouple_10.sv --solver-neural-liveness "{2-state,2**14-cnt}"
123+
ebmc thermocouple_11.sv --solver-neural-liveness "{2-state,2**14-cnt}"
124+
ebmc thermocouple_12.sv --solver-neural-liveness "{2-state,2**14-cnt}"
125+
ebmc thermocouple_13.sv --solver-neural-liveness "{2-state,2**15-cnt}"
126+
ebmc thermocouple_14.sv --solver-neural-liveness "{2-state,2**16-cnt}"
127+
ebmc thermocouple_15.sv --solver-neural-liveness "{2-state,2**17-cnt}"
128+
ebmc thermocouple_16.sv --solver-neural-liveness "{2-state,2**18-cnt}"
129+
ebmc thermocouple_17.sv --solver-neural-liveness "{2-state,2**19-cnt}"
130+
fi
131+
132+
if false ; then
133+
# ok
134+
ebmc uart_transmit_1.sv --solver-neural-liveness
135+
ebmc uart_transmit_2.sv --solver-neural-liveness
136+
ebmc uart_transmit_3.sv --solver-neural-liveness
137+
ebmc uart_transmit_4.sv --solver-neural-liveness
138+
ebmc uart_transmit_5.sv --solver-neural-liveness
139+
ebmc uart_transmit_6.sv --solver-neural-liveness
140+
ebmc uart_transmit_7.sv --solver-neural-liveness
141+
ebmc uart_transmit_8.sv --solver-neural-liveness
142+
ebmc uart_transmit_9.sv --solver-neural-liveness
143+
ebmc uart_transmit_10.sv --solver-neural-liveness
144+
ebmc uart_transmit_11.sv --solver-neural-liveness
145+
ebmc uart_transmit_12.sv --solver-neural-liveness
146+
fi
147+
148+
if false ; then
149+
ebmc vga_1.sv --solver-neural-liveness "{2**5-v_cnt,2**7-h_cnt}"
150+
ebmc vga_2.sv --solver-neural-liveness "{2**6-v_cnt,2**8-h_cnt}"
151+
ebmc vga_3.sv --solver-neural-liveness "{2**6-v_cnt,2**8-h_cnt}"
152+
ebmc vga_4.sv --solver-neural-liveness "{2**7-v_cnt,2**9-h_cnt}"
153+
ebmc vga_5.sv --solver-neural-liveness "{2**8-v_cnt,2**9-h_cnt}"
154+
ebmc vga_6.sv --solver-neural-liveness "{2**8-v_cnt,2**9-h_cnt}"
155+
ebmc vga_7.sv --solver-neural-liveness "{2**8-v_cnt,2**10-h_cnt}"
156+
ebmc vga_8.sv --solver-neural-liveness "{2**9-v_cnt,2**10-h_cnt}"
157+
ebmc vga_9.sv --solver-neural-liveness "{2**9-v_cnt,2**11-h_cnt}"
158+
fi
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
counter1.sv
3+
--traces 1 --solver-neural-liveness
4+
^weight: nn::fc1\.n0\.w0 = 1$
5+
^bias: nn::fc1\.n0\.b = .*$
6+
^\[main\.property\.p0\] always s_eventually main\.counter == 0: PROVED$
7+
^EXIT=0$
8+
^SIGNAL=0$
9+
--
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// count down from 10 to 0
2+
3+
module main(input clk);
4+
5+
reg [7:0] counter;
6+
7+
initial counter = 10;
8+
9+
always @(posedge clk)
10+
if(counter != 0)
11+
counter = counter - 1;
12+
13+
// expected to pass
14+
p0: assert property (s_eventually counter == 0);
15+
16+
endmodule
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
wrap_around1.sv
3+
--traces 1 --solver-neural-liveness
4+
^weight: nn::fc1\.n0\.w0 = -1$
5+
^bias: nn::fc1\.n0\.b = .*$
6+
^\[main\.property\.p0\] always s_eventually main\.counter == 10: PROVED$
7+
^EXIT=0$
8+
^SIGNAL=0$
9+
--
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// count up from 0 to 10
2+
3+
module main(input clk);
4+
5+
reg [7:0] counter;
6+
7+
initial counter = 0;
8+
9+
always @(posedge clk)
10+
if(counter == 10)
11+
counter = 0;
12+
else
13+
counter = counter + 1;
14+
15+
// expected to pass
16+
p0: assert property (s_eventually counter == 10);
17+
18+
endmodule

src/ebmc/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@ SRC = \
2424
live_signal.cpp \
2525
main.cpp \
2626
netlist.cpp \
27-
neural_liveness.cpp \
27+
neural.cpp \
2828
output_file.cpp \
2929
output_smv_word_level.cpp \
3030
output_verilog.cpp \
3131
property_checker.cpp \
3232
random_traces.cpp \
3333
ranking_function.cpp \
34+
ranking_net.cpp \
3435
report_results.cpp \
3536
show_formula_solver.cpp \
3637
show_properties.cpp \

src/ebmc/ebmc_parse_options.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ Author: Daniel Kroening, [email protected]
2222
#include "instrument_buechi.h"
2323
#include "liveness_to_safety.h"
2424
#include "netlist.h"
25-
#include "neural_liveness.h"
2625
#include "output_file.h"
2726
#include "output_smv_word_level.h"
2827
#include "property_checker.h"
@@ -142,9 +141,6 @@ int ebmc_parse_optionst::doit()
142141
if(cmdline.isset("random-trace") || cmdline.isset("random-waveform"))
143142
return random_trace(cmdline, ui_message_handler);
144143

145-
if(cmdline.isset("neural-liveness"))
146-
return do_neural_liveness(cmdline, ui_message_handler);
147-
148144
if(cmdline.isset("ranking-function"))
149145
return do_ranking_function(cmdline, ui_message_handler);
150146

@@ -224,7 +220,11 @@ int ebmc_parse_optionst::doit()
224220

225221
// LTL/SVA to Buechi?
226222
if(cmdline.isset("buechi"))
223+
{
224+
if(cmdline.isset("neural"))
225+
throw ebmc_errort() << "The neural engine does not work with --buechi";
227226
instrument_buechi(transition_system, properties, ui_message_handler);
227+
}
228228

229229
// possibly apply liveness-to-safety
230230
if(cmdline.isset("liveness-to-safety"))
@@ -412,9 +412,8 @@ void ebmc_parse_optionst::help()
412412
" {y--trace-steps} {unumber} \t set the number of random transitions (default: 10 steps)\n"
413413
" {y--ranking-function} {uf} \t prove a liveness property using given ranking funnction (experimental)\n"
414414
" {y--property} {uid} \t the liveness property to prove\n"
415-
" {y--neural-liveness} \t check liveness properties using neural "
415+
" {y--neural} \t check properties using neural "
416416
"inference (experimental)\n"
417-
" {y--neural-engine} {ucmd} \t the neural engine to use\n"
418417

419418
//" --interpolation \t use bit-level interpolants\n"
420419
//" --interpolation-word \t use word-level interpolants\n"

src/ebmc/ebmc_parse_options.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ class ebmc_parse_optionst:public parse_options_baset
3434
"(po)(cegar)(k-induction)(2pi)(bound2):"
3535
"(outfile):(xml-ui)(verbosity):(gui)"
3636
"(json-modules):(json-properties):(json-result):"
37-
"(neural-liveness)(neural-engine):"
37+
"(neural)"
3838
"(reset):(ignore-initial)"
39+
"(solver-neural-liveness)"
3940
"(version)(verilog-rtl)(verilog-netlist)"
4041
"(compute-interpolant)(interpolation)(interpolation-vmcai)"
4142
"(ic3)(property):(constr)(h)(new-mode)(aiger)"

0 commit comments

Comments
 (0)