@@ -165,24 +165,50 @@ void ic3_enginet::ebmc_form_latches()
165
165
166
166
for (var_mapt::mapt::const_iterator it=vm.map .begin ();
167
167
it!=vm.map .end (); it++) {
168
- const var_mapt::vart &var=it->second ;
168
+ const var_mapt::vart &var=it->second ;
169
+
170
+ if (var.vartype ==var_mapt::vart::vartypet::NONDET) {
171
+ assert (var.bits .size () > 0 );
172
+ int val = (var.bits .size () == 1 )?1 :2 ;
173
+ for (size_t i=0 ; i < var.bits .size (); i++) {
174
+ literalt lit = var.bits [i].current ;
175
+ int var_num = lit.var_no ();
176
+ Nondet_vars[var_num] = val;
177
+ }
178
+ continue ;
179
+ }
180
+
169
181
if (var.vartype !=var_mapt::vart::vartypet::LATCH)
170
182
continue ;
171
183
172
184
for (size_t j=0 ; j < var.bits .size (); j++) {
173
185
literalt lit =var.bits [j].current ;
174
- Latch_val[lit.var_no ()] = 2 ; // set the value of the latch to a don't care
186
+ int var_num = lit.var_no ();
187
+ Latch_val[var_num] = 2 ; // set the value of the latch to a don't care
188
+ // printf("latch val: %d\n",var_num);
175
189
}
176
190
}
177
191
192
+ if (Latch_val.size () == 0 ) {
193
+ printf (" there are no latches\n " );
194
+ // printf("Nondet_vars.size() = %d\n",(int) Nondet_vars.size());
195
+ exit (100 );
196
+ }
178
197
// set initial values
179
198
bvt Ist_lits;
180
199
gen_ist_lits (Ist_lits);
181
200
182
201
for (size_t i=0 ; i < Ist_lits.size (); i++) {
183
202
literalt &lit = Ist_lits[i];
184
203
int var_num = lit.var_no ();
185
- assert (Latch_val.find (var_num) != Latch_val.end ());
204
+ if (Latch_val.find (var_num) == Latch_val.end ()) {
205
+ p ();
206
+ printf (" Latch %d is not found\n " ,var_num);
207
+ printf (" Latch_val.size() = %zu\n " ,Latch_val.size ());
208
+ printf (" Ist_lits.size() = %zu\n " ,Ist_lits.size ());
209
+ printf (" i = %zu\n " ,i);
210
+ exit (100 );
211
+ }
186
212
if (lit.sign ()) Latch_val[var_num] = 0 ;
187
213
else Latch_val[var_num] = 1 ;
188
214
}
@@ -208,15 +234,24 @@ void ic3_enginet::gen_ist_lits(bvt &Ist_lits)
208
234
while (stack.size () > 0 ) {
209
235
210
236
literalt lit = stack.back ();
237
+ assert (lit.is_constant () == false );
211
238
size_t var_num = lit.var_no ();
212
239
stack.pop_back ();
213
240
if (Visited.find (lit) != Visited.end ())
214
241
continue ;
215
- assert (var_num < Nodes.size ());
242
+ if (var_num >= Nodes.size ()) {
243
+ p ();
244
+ printf (" var_num = %d\n " ,var_num);
245
+ printf (" Nodes.size() = %zu\n " ,Nodes.size ());
246
+ exit (100 );
247
+ }
216
248
aigt::nodet &Nd = Nodes[var_num];
217
249
218
250
if (Nd.is_var ()) {
219
251
Ist_lits.push_back (lit);
252
+ // literalt gt_lit(var_num,false);
253
+ // unsigned lit_val = gt_lit.get();
254
+ // printf("init st: lit_val = %u\n",lit_val);
220
255
continue ;
221
256
}
222
257
0 commit comments