@@ -4691,20 +4691,22 @@ void smt2_convt::flatten2bv(const exprt &expr)
4691
4691
mp_integer size =
4692
4692
numeric_cast_v<mp_integer>(to_constant_expr (array_type.size ()));
4693
4693
4694
- out << " (let ((?aflop " ;
4695
- convert_expr (expr);
4696
- out << " )) " ;
4694
+ // SMT-LIB 2 concat is binary only
4695
+ std::size_t n_concat = 0 ;
4696
+ for (mp_integer i = size; i > 1 ; --i)
4697
+ {
4698
+ ++n_concat;
4699
+ out << " (concat " ;
4697
4700
4698
- out << " (concat" ;
4701
+ flatten2bv (
4702
+ index_exprt{expr, from_integer (i - 1 , array_type.index_type ())});
4699
4703
4700
- for (mp_integer i = 0 ; i != size; ++i)
4701
- {
4702
- out << " (select ?aflop " ;
4703
- convert_expr (from_integer (i, array_type.index_type ()));
4704
- out << ' )' ;
4704
+ out << " " ;
4705
4705
}
4706
4706
4707
- out << " ))" ; // concat, let
4707
+ flatten2bv (index_exprt{expr, from_integer (0 , array_type.index_type ())});
4708
+
4709
+ out << std::string (n_concat, ' )' ); // concat
4708
4710
}
4709
4711
else
4710
4712
convert_expr (expr);
@@ -4713,15 +4715,9 @@ void smt2_convt::flatten2bv(const exprt &expr)
4713
4715
{
4714
4716
if (use_datatypes)
4715
4717
{
4716
- const std::string &smt_typename = datatype_map.at (type);
4717
-
4718
4718
// concatenate elements
4719
4719
const struct_typet &struct_type = to_struct_type (ns.follow (type));
4720
4720
4721
- out << " (let ((?sflop " ;
4722
- convert_expr (expr);
4723
- out << " )) " ;
4724
-
4725
4721
const struct_typet::componentst &components=
4726
4722
struct_type.components ();
4727
4723
@@ -4737,21 +4733,17 @@ void smt2_convt::flatten2bv(const exprt &expr)
4737
4733
out << " (concat " ;
4738
4734
}
4739
4735
4740
- out << " (" << smt_typename << " ." << components[i - 1 ].get_name ()
4741
- << " ?sflop)" ;
4736
+ flatten2bv (member_exprt{expr, components[i - 1 ]});
4742
4737
4743
4738
out << " " ;
4744
4739
}
4745
4740
4746
4741
if (!is_zero_width (components[0 ].type (), ns))
4747
4742
{
4748
- out << " (" << smt_typename << " ." << components[0 ].get_name ()
4749
- << " ?sflop)" ;
4743
+ flatten2bv (member_exprt{expr, components[0 ]});
4750
4744
}
4751
4745
4752
4746
out << std::string (n_concat, ' )' ); // concat
4753
-
4754
- out << " )" ; // let
4755
4747
}
4756
4748
else
4757
4749
convert_expr (expr);
0 commit comments