@@ -143,7 +143,8 @@ void bv_decl_plugin::finalize() {
143
143
DEC_REF (m_ext_rotate_right);
144
144
145
145
DEC_REF (m_int2bv);
146
- DEC_REF (m_bv2int);
146
+ DEC_REF (m_ubv2int);
147
+ DEC_REF (m_sbv2int);
147
148
for (auto & ds : m_bit2bool)
148
149
DEC_REF (ds);
149
150
DEC_REF (m_mkbv);
@@ -228,36 +229,54 @@ func_decl * bv_decl_plugin::mk_int2bv(unsigned bv_size, unsigned num_parameters,
228
229
force_ptr_array_size (m_int2bv, bv_size + 1 );
229
230
230
231
if (arity != 1 ) {
231
- m_manager->raise_exception (" expecting one argument to int2bv " );
232
+ m_manager->raise_exception (" expecting one argument to int_to_bv " );
232
233
return nullptr ;
233
234
}
234
235
235
236
if (m_int2bv[bv_size] == 0 ) {
236
237
sort * s = get_bv_sort (bv_size);
237
- m_int2bv[bv_size] = m_manager->mk_func_decl (symbol (" int2bv " ), domain[0 ], s,
238
+ m_int2bv[bv_size] = m_manager->mk_func_decl (symbol (" int_to_bv " ), domain[0 ], s,
238
239
func_decl_info (m_family_id, OP_INT2BV, num_parameters, parameters));
239
240
m_manager->inc_ref (m_int2bv[bv_size]);
240
241
}
241
242
242
243
return m_int2bv[bv_size];
243
244
}
244
245
245
- func_decl * bv_decl_plugin::mk_bv2int (unsigned bv_size, unsigned num_parameters, parameter const * parameters,
246
+ func_decl * bv_decl_plugin::mk_ubv2int (unsigned bv_size, unsigned num_parameters, parameter const * parameters,
246
247
unsigned arity, sort * const * domain) {
247
- force_ptr_array_size (m_bv2int , bv_size + 1 );
248
+ force_ptr_array_size (m_ubv2int , bv_size + 1 );
248
249
249
250
if (arity != 1 ) {
250
- m_manager->raise_exception (" expecting one argument to bv2int " );
251
+ m_manager->raise_exception (" expecting one argument to ubv_to_int " );
251
252
return nullptr ;
252
253
}
253
254
254
- if (m_bv2int [bv_size] == 0 ) {
255
- m_bv2int [bv_size] = m_manager->mk_func_decl (symbol (" bv2int " ), domain[0 ], m_int_sort,
256
- func_decl_info (m_family_id, OP_BV2INT ));
257
- m_manager->inc_ref (m_bv2int [bv_size]);
255
+ if (m_ubv2int [bv_size] == 0 ) {
256
+ m_ubv2int [bv_size] = m_manager->mk_func_decl (symbol (" ubv_to_int " ), domain[0 ], m_int_sort,
257
+ func_decl_info (m_family_id, OP_UBV2INT ));
258
+ m_manager->inc_ref (m_ubv2int [bv_size]);
258
259
}
259
260
260
- return m_bv2int[bv_size];
261
+ return m_ubv2int[bv_size];
262
+ }
263
+
264
+ func_decl * bv_decl_plugin::mk_sbv2int (unsigned bv_size, unsigned num_parameters, parameter const * parameters,
265
+ unsigned arity, sort * const * domain) {
266
+ force_ptr_array_size (m_sbv2int, bv_size + 1 );
267
+
268
+ if (arity != 1 ) {
269
+ m_manager->raise_exception (" expecting one argument to sbv_to_int" );
270
+ return nullptr ;
271
+ }
272
+
273
+ if (m_sbv2int[bv_size] == 0 ) {
274
+ m_sbv2int[bv_size] = m_manager->mk_func_decl (symbol (" sbv_to_int" ), domain[0 ], m_int_sort,
275
+ func_decl_info (m_family_id, OP_SBV2INT));
276
+ m_manager->inc_ref (m_sbv2int[bv_size]);
277
+ }
278
+
279
+ return m_sbv2int[bv_size];
261
280
}
262
281
263
282
func_decl * bv_decl_plugin::mk_unary_pred (ptr_vector<func_decl> & decls, decl_kind k, char const * name, unsigned bv_size) {
@@ -552,8 +571,10 @@ func_decl * bv_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters, p
552
571
return mk_bit2bool (bv_size, num_parameters, parameters, arity, domain);
553
572
case OP_INT2BV:
554
573
return mk_int2bv (bv_size, num_parameters, parameters, arity, domain);
555
- case OP_BV2INT:
556
- return mk_bv2int (bv_size, num_parameters, parameters, arity, domain);
574
+ case OP_UBV2INT:
575
+ return mk_ubv2int (bv_size, num_parameters, parameters, arity, domain);
576
+ case OP_SBV2INT:
577
+ return mk_sbv2int (bv_size, num_parameters, parameters, arity, domain);
557
578
case OP_CONCAT:
558
579
if (!get_concat_size (arity, domain, r_size))
559
580
m_manager->raise_exception (" invalid concat application" );
@@ -780,8 +801,11 @@ void bv_decl_plugin::get_op_names(svector<builtin_name> & op_names, symbol const
780
801
op_names.push_back (builtin_name (" ext_rotate_left" ,OP_EXT_ROTATE_LEFT));
781
802
op_names.push_back (builtin_name (" ext_rotate_right" ,OP_EXT_ROTATE_RIGHT));
782
803
op_names.push_back (builtin_name (" int2bv" ,OP_INT2BV));
783
- op_names.push_back (builtin_name (" bv2int" ,OP_BV2INT));
784
- op_names.push_back (builtin_name (" bv2nat" ,OP_BV2INT));
804
+ op_names.push_back (builtin_name (" int_to_bv" ,OP_INT2BV));
805
+ op_names.push_back (builtin_name (" bv2int" ,OP_UBV2INT));
806
+ op_names.push_back (builtin_name (" bv2nat" ,OP_UBV2INT));
807
+ op_names.push_back (builtin_name (" ubv_to_int" ,OP_UBV2INT));
808
+ op_names.push_back (builtin_name (" sbv_to_int" ,OP_SBV2INT));
785
809
op_names.push_back (builtin_name (" mkbv" ,OP_MKBV));
786
810
}
787
811
}
@@ -878,10 +902,8 @@ bool bv_recognizers::is_repeat(expr const * e, expr*& arg, unsigned& n) const {
878
902
}
879
903
880
904
881
- bool bv_recognizers::is_bv2int (expr const * e, expr*& r) const {
882
- if (!is_bv2int (e)) return false ;
883
- r = to_app (e)->get_arg (0 );
884
- return true ;
905
+ bool bv_recognizers::is_ubv2int (expr const * e, expr*& r) const {
906
+ return is_ubv2int (e) && (r = to_app (e)->get_arg (0 ), true );
885
907
}
886
908
887
909
bool bv_recognizers::is_bit2bool (expr* e, expr*& bv, unsigned & idx) const {
@@ -934,10 +956,28 @@ unsigned bv_util::get_int2bv_size(parameter const& p) {
934
956
return static_cast <unsigned >(sz);
935
957
}
936
958
937
- app * bv_util::mk_bv2int (expr* e) const {
959
+ app * bv_util::mk_ubv2int (expr* e) const {
960
+ sort* s = m_manager.mk_sort (m_manager.mk_family_id (" arith" ), INT_SORT);
961
+ parameter p (s);
962
+ return m_manager.mk_app (get_fid (), OP_UBV2INT, 1 , &p, 1 , &e);
963
+ }
964
+
965
+ app * bv_util::mk_sbv2int (expr* e) const {
938
966
sort* s = m_manager.mk_sort (m_manager.mk_family_id (" arith" ), INT_SORT);
939
967
parameter p (s);
940
- return m_manager.mk_app (get_fid (), OP_BV2INT, 1 , &p, 1 , &e);
968
+ return m_manager.mk_app (get_fid (), OP_SBV2INT, 1 , &p, 1 , &e);
969
+ }
970
+
971
+ app* bv_util::mk_sbv2int_as_ubv2int (expr* e) {
972
+ // if e <_s 0 then ubv2int(e) - 2^n else ubv2int(e)
973
+ app* r = mk_ubv2int (e);
974
+ arith_util autil (m_manager);
975
+ unsigned sz = get_bv_size (e);
976
+ expr_ref zero (mk_numeral (rational::zero (), sz), m_manager);
977
+ r = m_manager.mk_ite (mk_slt (e, zero),
978
+ autil.mk_sub (r, autil.mk_numeral (rational::power_of_two (sz), true )),
979
+ r);
980
+ return r;
941
981
}
942
982
943
983
app* bv_util::mk_int2bv (unsigned sz, expr* e) const {
0 commit comments