@@ -184,6 +184,32 @@ expr2smvt::resultt expr2smvt::convert_binary_associative(
184184
185185/* ******************************************************************\
186186
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+
187213Function: expr2smvt::convert_function_application
188214
189215 Inputs:
@@ -712,6 +738,9 @@ expr2smvt::resultt expr2smvt::convert_rec(const exprt &src)
712738 else if (src.id () == ID_smv_unsigned_cast)
713739 return convert_function_application (" unsigned" , src);
714740
741+ else if (src.id () == ID_extractbits)
742+ return convert_extractbits (to_extractbits_expr (src));
743+
715744 else if (src.id () == ID_typecast)
716745 {
717746 return convert_rec (to_typecast_expr (src).op ());
0 commit comments