@@ -12,81 +12,77 @@ Author: Daniel Kroening, kroening@kroening.com
1212#include < algorithm>
1313
1414#include < util/arith_tools.h>
15+ #include < util/exception_utils.h>
1516#include < util/std_expr.h>
1617#include < util/std_types.h>
1718
1819literalt boolbvt::convert_extractbit (const extractbit_exprt &expr)
1920{
20- const exprt::operandst &operands=expr.operands ();
21-
22- if (operands.size ()!=2 )
23- throw " extractbit takes two operands" ;
24-
25- const bvt &bv0=convert_bv (operands[0 ]);
21+ const bvt &src_bv = convert_bv (expr.src ());
2622
2723 // constant?
28- if (operands[ 1 ] .is_constant ())
24+ if (expr. index () .is_constant ())
2925 {
30- mp_integer o;
31-
32- if (to_integer (operands[1 ], o))
33- throw " extractbit failed to convert constant index" ;
26+ mp_integer index_as_integer = numeric_cast_v<mp_integer>(expr.index ());
3427
35- if (o< 0 || o>=bv0 .size ())
28+ if (index_as_integer < 0 || index_as_integer >= src_bv .size ())
3629 return prop.new_variable (); // out of range!
3730 else
38- return bv0 [integer2size_t (o )];
31+ return src_bv [integer2size_t (index_as_integer )];
3932 }
4033
41- if (operands[0 ].type ().id ()==ID_verilog_signedbv ||
42- operands[0 ].type ().id ()==ID_verilog_unsignedbv)
34+ if (
35+ expr.src ().type ().id () == ID_verilog_signedbv ||
36+ expr.src ().type ().id () == ID_verilog_unsignedbv)
4337 {
44- // TODO
45- assert (false );
38+ throw unsupported_operation_exceptiont (
39+ " extractbit expression not implemented for verilog integers in "
40+ " flattening solver" );
4641 }
4742 else
4843 {
49- std::size_t width_op0= boolbv_width (operands[ 0 ] .type ());
50- std::size_t width_op1= boolbv_width (operands[ 1 ] .type ());
44+ std::size_t src_bv_width = boolbv_width (expr. src () .type ());
45+ std::size_t index_bv_width = boolbv_width (expr. index () .type ());
5146
52- if (width_op0== 0 || width_op1== 0 )
47+ if (src_bv_width == 0 || index_bv_width == 0 )
5348 return SUB::convert_rest (expr);
5449
55- std::size_t index_width = std::max (address_bits (width_op0), width_op1);
50+ std::size_t index_width =
51+ std::max (address_bits (src_bv_width), index_bv_width);
5652 unsignedbv_typet index_type (index_width);
5753
5854 equal_exprt equality;
59- equality.lhs ()=operands[ 1 ]; // index operand
55+ equality.lhs () = expr. index ();
6056
6157 if (index_type!=equality.lhs ().type ())
6258 equality.lhs ().make_typecast (index_type);
6359
6460 if (prop.has_set_to ())
6561 {
6662 // free variable
67- literalt l= prop.new_variable ();
63+ literalt literal = prop.new_variable ();
6864
6965 // add implications
70- for (std::size_t i= 0 ; i<bv0 .size (); i++)
66+ for (std::size_t i = 0 ; i < src_bv .size (); i++)
7167 {
7268 equality.rhs ()=from_integer (i, index_type);
73- literalt equal= prop.lequal (l, bv0 [i]);
69+ literalt equal = prop.lequal (literal, src_bv [i]);
7470 prop.l_set_to_true (prop.limplies (convert (equality), equal));
7571 }
7672
77- return l ;
73+ return literal ;
7874 }
7975 else
8076 {
81- literalt l= prop.new_variable ();
77+ literalt literal = prop.new_variable ();
8278
83- for (std::size_t i= 0 ; i<bv0 .size (); i++)
79+ for (std::size_t i = 0 ; i < src_bv .size (); i++)
8480 {
8581 equality.rhs ()=from_integer (i, index_type);
86- l= prop.lselect (convert (equality), bv0 [i], l );
82+ literal = prop.lselect (convert (equality), src_bv [i], literal );
8783 }
8884
89- return l ;
85+ return literal ;
9086 }
9187 }
9288
0 commit comments