void boolbvt::convert_with_union( const union_typet &type, const exprt &op1, const exprt &op2, const bvt &prev_bv, bvt &next_bv) { next_bv=prev_bv; const bvt &op2_bv=convert_bv(op2); if(next_bv.size()<op2_bv.size()) { error().source_location=type.source_location(); error() << "convert_with_union: unexpected operand op2 width" << eom; throw 0; } if(config.ansi_c.endianness==configt::ansi_ct::endiannesst::IS_LITTLE_ENDIAN) { for(std::size_t i=0; i<op2_bv.size(); i++) next_bv[i]=op2_bv[i]; } else { assert(config.ansi_c.endianness==configt::ansi_ct::endiannesst::IS_BIG_ENDIAN); endianness_mapt map_u(type, false, ns); endianness_mapt map_op2(op2.type(), false, ns); for(std::size_t i=0; i<op2_bv.size(); i++) next_bv[map_u.map_bit(i)]=op2_bv[map_op2.map_bit(i)]; } }
bvt boolbvt::convert_union(const union_exprt &expr) { std::size_t width=boolbv_width(expr.type()); if(width==0) return conversion_failed(expr); const bvt &op_bv=convert_bv(expr.op()); if(width<op_bv.size()) throw "union: unexpected operand op width"; bvt bv; bv.resize(width); if(config.ansi_c.endianness==configt::ansi_ct::endiannesst::IS_LITTLE_ENDIAN) { for(std::size_t i=0; i<op_bv.size(); i++) bv[i]=op_bv[i]; // pad with nondets for(std::size_t i=op_bv.size(); i<bv.size(); i++) bv[i]=prop.new_variable(); } else { assert( config.ansi_c.endianness==configt::ansi_ct::endiannesst::IS_BIG_ENDIAN); endianness_mapt map_u(expr.type(), false, ns); endianness_mapt map_op(expr.op0().type(), false, ns); for(std::size_t i=0; i<op_bv.size(); i++) bv[map_u.map_bit(i)]=op_bv[map_op.map_bit(i)]; // pad with nondets for(std::size_t i=op_bv.size(); i<bv.size(); i++) bv[map_u.map_bit(i)]=prop.new_variable(); } return bv; }