@@ -188,6 +188,32 @@ expr2smvt::resultt expr2smvt::convert_binary_associative(
188
188
189
189
/* ******************************************************************\
190
190
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
+
191
217
Function: expr2smvt::convert_function_application
192
218
193
219
Inputs:
@@ -834,6 +860,9 @@ expr2smvt::resultt expr2smvt::convert_rec(const exprt &src)
834
860
else if (src.id () == ID_smv_unsigned_cast)
835
861
return convert_function_application (" unsigned" , src);
836
862
863
+ else if (src.id () == ID_extractbits)
864
+ return convert_extractbits (to_extractbits_expr (src));
865
+
837
866
else if (src.id () == ID_typecast)
838
867
{
839
868
return convert_typecast (to_typecast_expr (src));
0 commit comments