@@ -184,6 +184,32 @@ expr2smvt::resultt expr2smvt::convert_binary_associative(
184
184
185
185
/* ******************************************************************\
186
186
187
+ Function: expr2smvt::convert_extractbits
188
+
189
+ Inputs:
190
+
191
+ Outputs:
192
+
193
+ Purpose:
194
+
195
+ \*******************************************************************/
196
+
197
+ expr2smvt::resultt expr2smvt::convert_extractbits (const extractbits_exprt &expr)
198
+ {
199
+ // we can do constant indices only
200
+ if (!expr.index ().is_constant ())
201
+ return convert_norep (expr);
202
+
203
+ auto op_rec = convert_rec (expr.src ());
204
+ auto high_s = integer2string (
205
+ numeric_cast_v<mp_integer>(to_constant_expr (expr.index ())) +
206
+ to_bitvector_type (expr.type ()).width () - 1 );
207
+ auto low_s = convert_rec (expr.index ()).s ;
208
+ return {precedencet::INDEX, op_rec.s + ' [' + high_s + ' :' + low_s + ' ]' };
209
+ }
210
+
211
+ /* ******************************************************************\
212
+
187
213
Function: expr2smvt::convert_function_application
188
214
189
215
Inputs:
@@ -712,6 +738,9 @@ expr2smvt::resultt expr2smvt::convert_rec(const exprt &src)
712
738
else if (src.id () == ID_smv_unsigned_cast)
713
739
return convert_function_application (" unsigned" , src);
714
740
741
+ else if (src.id () == ID_extractbits)
742
+ return convert_extractbits (to_extractbits_expr (src));
743
+
715
744
else if (src.id () == ID_typecast)
716
745
{
717
746
return convert_rec (to_typecast_expr (src).op ());
0 commit comments