@@ -93,33 +93,37 @@ func.func @test_lec(%arg0: !smt.bv<1>) -> (i1, i1, i1) {
93
93
// CHECK: smt.push 1
94
94
// CHECK: [[F0:%.+]] = smt.declare_fun : !smt.bv<32>
95
95
// CHECK: [[F1:%.+]] = smt.declare_fun : !smt.bv<32>
96
+ // CHECK: [[C42_BV32:%.+]] = smt.bv.constant #smt.bv<42> : !smt.bv<32>
97
+ // CHECK: [[ARRAYFUN:%.+]] = smt.declare_fun : !smt.array<[!smt.bv<1> -> !smt.bv<32>]>
96
98
// CHECK: [[C0_I32:%.+]] = arith.constant 0 : i32
97
99
// CHECK: [[C1_I32:%.+]] = arith.constant 1 : i32
98
100
// CHECK: [[C10_I32:%.+]] = arith.constant 10 : i32
99
101
// CHECK: [[FALSE:%.+]] = arith.constant false
100
102
// CHECK: [[TRUE:%.+]] = arith.constant true
101
- // CHECK: [[FOR:%.+]]:5 = scf.for [[ARG0:%.+]] = [[C0_I32]] to [[C10_I32]] step [[C1_I32]] iter_args([[ARG1:%.+]] = [[INIT]]#0, [[ARG2:%.+]] = [[F0]], [[ARG3:%.+]] = [[F1]], [[ARG4:%.+]] = [[INIT]]#1, [[ARG5 :%.+]] = [[FALSE]])
103
+ // CHECK: [[FOR:%.+]]:7 = scf.for [[ARG0:%.+]] = [[C0_I32]] to [[C10_I32]] step [[C1_I32]] iter_args([[ARG1:%.+]] = [[INIT]]#0, [[ARG2:%.+]] = [[F0]], [[ARG3:%.+]] = [[F1]], [[ARG4:%.+]] = [[C42_BV32]], [[ARG5:%.+]] = [[ARRAYFUN]], [[ARG6:%.+]] = [[ INIT]]#1, [[ARG7 :%.+]] = [[FALSE]])
102
104
// CHECK: smt.pop 1
103
105
// CHECK: smt.push 1
104
- // CHECK: [[CIRCUIT:%.+]]:2 = func.call @bmc_circuit([[ARG1]], [[ARG2]], [[ARG3]])
106
+ // CHECK: [[CIRCUIT:%.+]]:4 = func.call @bmc_circuit([[ARG1]], [[ARG2]], [[ARG3]], [[ARG4]], [[ARG5 ]])
105
107
// CHECK: [[SMTCHECK:%.+]] = smt.check sat {
106
108
// CHECK: smt.yield [[TRUE]]
107
109
// CHECK: } unknown {
108
110
// CHECK: smt.yield [[TRUE]]
109
111
// CHECK: } unsat {
110
112
// CHECK: smt.yield [[FALSE]]
111
113
// CHECK: }
112
- // CHECK: [[ORI:%.+]] = arith.ori [[SMTCHECK]], [[ARG5 ]]
113
- // CHECK: [[LOOP:%.+]]:2 = func.call @bmc_loop([[ARG1]], [[ARG4 ]])
114
+ // CHECK: [[ORI:%.+]] = arith.ori [[SMTCHECK]], [[ARG7 ]]
115
+ // CHECK: [[LOOP:%.+]]:2 = func.call @bmc_loop([[ARG1]], [[ARG6 ]])
114
116
// CHECK: [[F2:%.+]] = smt.declare_fun : !smt.bv<32>
115
117
// CHECK: [[OLDCLOCKLOW:%.+]] = smt.bv.not [[ARG1]]
116
118
// CHECK: [[BVPOSEDGE:%.+]] = smt.bv.and [[OLDCLOCKLOW]], [[LOOP]]#0
117
119
// CHECK: [[BVTRUE:%.+]] = smt.bv.constant #smt.bv<-1> : !smt.bv<1>
118
120
// CHECK: [[BOOLPOSEDGE:%.+]] = smt.eq [[BVPOSEDGE]], [[BVTRUE]]
119
- // CHECK: [[NEWREG:%.+]] = smt.ite [[BOOLPOSEDGE]], [[CIRCUIT]]#1, [[ARG3]]
120
- // CHECK: scf.yield [[LOOP]]#0, [[F2]], [[NEWREG]], [[LOOP]]#1, [[ORI]]
121
+ // CHECK: [[NEWREG1:%.+]] = smt.ite [[BOOLPOSEDGE]], [[CIRCUIT]]#1, [[ARG3]]
122
+ // CHECK: [[NEWREG2:%.+]] = smt.ite [[BOOLPOSEDGE]], [[CIRCUIT]]#2, [[ARG4]]
123
+ // CHECK: [[NEWREG3:%.+]] = smt.ite [[BOOLPOSEDGE]], [[CIRCUIT]]#3, [[ARG5]]
124
+ // CHECK: scf.yield [[LOOP]]#0, [[F2]], [[NEWREG1]], [[NEWREG2]], [[NEWREG3]], [[LOOP]]#1, [[ORI]]
121
125
// CHECK: }
122
- // CHECK: [[XORI:%.+]] = arith.xori [[FOR]]#4 , [[TRUE]]
126
+ // CHECK: [[XORI:%.+]] = arith.xori [[FOR]]#6 , [[TRUE]]
123
127
// CHECK: smt.yield [[XORI]]
124
128
// CHECK: }
125
129
// CHECK: return [[BMC]]
@@ -143,19 +147,19 @@ func.func @test_lec(%arg0: !smt.bv<1>) -> (i1, i1, i1) {
143
147
// CHECK: [[C5:%.+]] = builtin.unrealized_conversion_cast [[NARG]] : i1 to !smt.bv<1>
144
148
// CHECK: return [[C4]], [[C5]]
145
149
// CHECK: }
146
- // CHECK: func.func @bmc_circuit([[ARGO:%.+]]: !smt.bv<1>, [[ARG1:%.+]]: !smt.bv<32>, [[ARG2:%.+]]: !smt.bv<32>)
150
+ // CHECK: func.func @bmc_circuit([[ARGO:%.+]]: !smt.bv<1>, [[ARG1:%.+]]: !smt.bv<32>, [[ARG2:%.+]]: !smt.bv<32>, [[ARG3:%.+]]: !smt.bv<32>, [[ARG4:%.+]]: !smt.array<[!smt.bv<1> -> !smt.bv<32>]> )
147
151
// CHECK: [[C6:%.+]] = builtin.unrealized_conversion_cast [[ARG2]] : !smt.bv<32> to i32
148
152
// CHECK: [[C7:%.+]] = builtin.unrealized_conversion_cast [[ARG1]] : !smt.bv<32> to i32
149
153
// CHECK: [[CN1_I32:%.+]] = hw.constant -1 : i32
150
154
// CHECK: [[ADD:%.+]] = comb.add [[C7]], [[C6]]
151
155
// CHECK: [[XOR:%.+]] = comb.xor [[C6]], [[CN1_I32]]
152
156
// CHECK: [[C9:%.+]] = builtin.unrealized_conversion_cast [[XOR]] : i32 to !smt.bv<32>
153
157
// CHECK: [[C10:%.+]] = builtin.unrealized_conversion_cast [[ADD]] : i32 to !smt.bv<32>
154
- // CHECK: return [[C9]], [[C10]]
158
+ // CHECK: return [[C9]], [[C10]], [[ARG3]], [[ARG4]]
155
159
// CHECK: }
156
160
157
161
func.func @test_bmc () -> (i1 ) {
158
- %bmc = verif.bmc bound 10 num_regs 1 initial_values [unit ]
162
+ %bmc = verif.bmc bound 10 num_regs 3 initial_values [unit , 42 , unit ]
159
163
init {
160
164
%c0_i1 = hw.constant 0 : i1
161
165
%clk = seq.to_clock %c0_i1
@@ -171,12 +175,12 @@ func.func @test_bmc() -> (i1) {
171
175
verif.yield %newclk , %newStateArg : !seq.clock , i1
172
176
}
173
177
circuit {
174
- ^bb0 (%clk: !seq.clock , %arg0: i32 , %state0: i32 ):
178
+ ^bb0 (%clk: !seq.clock , %arg0: i32 , %state0: i32 , %state1: i32 , %state2: !hw.array < 2 x i32 > ):
175
179
%c -1 _i32 = hw.constant -1 : i32
176
180
%0 = comb.add %arg0 , %state0 : i32
177
181
// %state0 is the result of a seq.compreg taking %0 as input
178
182
%2 = comb.xor %state0 , %c -1 _i32 : i32
179
- verif.yield %2 , %0 : i32 , i32
183
+ verif.yield %2 , %0 , %state1 , %state2 : i32 , i32 , i32 , !hw.array < 2 x i32 >
180
184
}
181
185
func.return %bmc : i1
182
186
}
0 commit comments