@@ -188,6 +188,32 @@ expr2smvt::resultt expr2smvt::convert_binary_associative(
188188
189189/* ******************************************************************\
190190
191+ Function: expr2smvt::convert_extractbits
192+
193+ Inputs:
194+
195+ Outputs:
196+
197+ Purpose:
198+
199+ \*******************************************************************/
200+
201+ expr2smvt::resultt expr2smvt::convert_extractbits (const extractbits_exprt &expr)
202+ {
203+ // we can do constant indices only
204+ if (!expr.index ().is_constant ())
205+ return convert_norep (expr);
206+
207+ auto op_rec = convert_rec (expr.src ());
208+ auto high_s = integer2string (
209+ numeric_cast_v<mp_integer>(to_constant_expr (expr.index ())) +
210+ to_bitvector_type (expr.type ()).width () - 1 );
211+ auto low_s = convert_rec (expr.index ()).s ;
212+ return {precedencet::INDEX, op_rec.s + ' [' + high_s + ' :' + low_s + ' ]' };
213+ }
214+
215+ /* ******************************************************************\
216+
191217Function: expr2smvt::convert_function_application
192218
193219 Inputs:
@@ -834,6 +860,9 @@ expr2smvt::resultt expr2smvt::convert_rec(const exprt &src)
834860 else if (src.id () == ID_smv_unsigned_cast)
835861 return convert_function_application (" unsigned" , src);
836862
863+ else if (src.id () == ID_extractbits)
864+ return convert_extractbits (to_extractbits_expr (src));
865+
837866 else if (src.id () == ID_typecast)
838867 {
839868 return convert_typecast (to_typecast_expr (src));
0 commit comments