@@ -159,37 +159,53 @@ void theory_user_propagator::new_fixed_eh(theory_var v, expr* value, unsigned nu
159159void theory_user_propagator::decide (bool_var& var, bool & is_pos) {
160160
161161 const bool_var_data& d = ctx.get_bdata (var);
162-
163- if (!d.is_theory_atom ())
162+
163+ if (!d.is_enode () && !d. is_theory_atom ())
164164 return ;
165-
166- theory* th = ctx.get_theory (d.get_theory ());
167-
168- bv_util bv (m);
169- enode* original_enode = nullptr ;
165+
166+ enode* original_enode = nullptr ;
170167 unsigned original_bit = 0 ;
171-
172- if (d.is_enode () && th->get_family_id () == get_family_id ()) {
173- // variable is just a registered expression
168+ bv_util bv (m);
169+ theory* th = nullptr ;
170+ theory_var v = null_theory_var;
171+
172+ // get the associated theory
173+ if (!d.is_enode ()) {
174+ // it might be a value that does not have an enode
175+ th = ctx.get_theory (d.get_theory ());
176+ }
177+ else {
174178 original_enode = ctx.bool_var2enode (var);
179+ v = original_enode->get_th_var (get_family_id ());
180+ if (v == null_theory_var) {
181+ // it is not a registered boolean expression
182+ th = ctx.get_theory (d.get_theory ());
183+ }
175184 }
176- else if (th->get_family_id () == bv.get_fid ()) {
177- // it might be a registered bit-vector
178- auto registered_bv = ((theory_bv*)th)->get_bv_with_theory (var, get_family_id ());
179- if (!registered_bv.first )
180- // there is no registered bv associated with the bit
185+
186+ if (!th && v == null_theory_var)
187+ return ;
188+
189+ if (v == null_theory_var) {
190+ if (th->get_family_id () == bv.get_fid ()) {
191+ // it is not a registered boolean value but it is a bitvector
192+ auto registered_bv = ((theory_bv*)th)->get_bv_with_theory (var, get_family_id ());
193+ if (!registered_bv.first )
194+ // there is no registered bv associated with the bit
195+ return ;
196+ original_enode = registered_bv.first ;
197+ original_bit = registered_bv.second ;
198+ v = original_enode->get_th_var (get_family_id ());
199+ }
200+ else
181201 return ;
182- original_enode = registered_bv.first ;
183- original_bit = registered_bv.second ;
184202 }
185- else
186- return ;
187203
188204 // call the registered callback
189205 unsigned new_bit = original_bit;
190206 lbool phase = is_pos ? l_true : l_false;
191-
192- expr* e = var2expr (original_enode-> get_th_var ( get_family_id ()) );
207+
208+ expr* e = var2expr (v );
193209 m_decide_eh (m_user_context, this , &e, &new_bit, &phase);
194210 enode* new_enode = ctx.get_enode (e);
195211
@@ -201,7 +217,6 @@ void theory_user_propagator::decide(bool_var& var, bool& is_pos) {
201217 return ;
202218 }
203219
204- bool_var old_var = var;
205220 if (new_enode->is_bool ()) {
206221 // expression was set to a boolean
207222 bool_var new_var = ctx.enode2bool_var (new_enode);
0 commit comments