Skip to content

Commit f0f5fbb

Browse files
committed
Move flatten_byte_* to lowering
The operations in this code are not tied to Boolean flattening and instead do rewrites that are usable within any back-end.
1 parent 94702bb commit f0f5fbb

File tree

8 files changed

+34
-63
lines changed

8 files changed

+34
-63
lines changed

src/solvers/Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,12 @@ SRC = $(BOOLEFORCE_SRC) \
132132
flattening/bv_utils.cpp \
133133
flattening/c_bit_field_replacement_type.cpp \
134134
flattening/equality.cpp \
135-
flattening/flatten_byte_operators.cpp \
136135
flattening/functions.cpp \
137136
flattening/pointer_logic.cpp \
138137
floatbv/float_bv.cpp \
139138
floatbv/float_utils.cpp \
140139
floatbv/float_approximation.cpp \
140+
lowering/byte_operators.cpp \
141141
lowering/popcount.cpp \
142142
miniBDD/miniBDD.cpp \
143143
prop/aig.cpp \

src/solvers/flattening/boolbv_byte_extract.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Author: Daniel Kroening, [email protected]
1515
#include <util/byte_operators.h>
1616
#include <util/endianness_map.h>
1717

18-
#include "flatten_byte_operators.h"
18+
#include <solvers/lowering/expr_lowering.h>
1919

2020
bvt map_bv(const endianness_mapt &map, const bvt &src)
2121
{
@@ -42,7 +42,7 @@ bvt boolbvt::convert_byte_extract(const byte_extract_exprt &expr)
4242
// if we extract from an unbounded array, call the flattening code
4343
if(is_unbounded_array(expr.op().type()))
4444
{
45-
exprt tmp=flatten_byte_extract(expr, ns);
45+
exprt tmp = lower_byte_extract(expr, ns);
4646
return convert_bv(tmp);
4747
}
4848

src/solvers/flattening/boolbv_equality.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Author: Daniel Kroening, [email protected]
1212
#include <util/base_type.h>
1313
#include <util/invariant.h>
1414

15-
#include "flatten_byte_operators.h"
15+
#include <solvers/lowering/expr_lowering.h>
1616

1717
literalt boolbvt::convert_equality(const equal_exprt &expr)
1818
{
@@ -30,7 +30,7 @@ literalt boolbvt::convert_equality(const equal_exprt &expr)
3030

3131
if(has_byte_operator(expr))
3232
{
33-
exprt tmp=flatten_byte_operators(expr, ns);
33+
exprt tmp = lower_byte_operators(expr, ns);
3434
return record_array_equality(to_equal_expr(tmp));
3535
}
3636

src/solvers/flattening/flatten_byte_operators.h

-32
This file was deleted.

src/solvers/flattening/flatten_byte_operators.cpp renamed to src/solvers/lowering/byte_operators.cpp

+18-22
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Author: Daniel Kroening, [email protected]
1717
#include <util/replace_symbol.h>
1818
#include <util/simplify_expr.h>
1919

20-
#include "flatten_byte_operators.h"
20+
#include "expr_lowering.h"
2121

2222
/// rewrite an object into its individual bytes
2323
/// \par parameters: src object to unpack
@@ -144,9 +144,7 @@ static exprt unpack_rec(
144144

145145
/// rewrite byte extraction from an array to byte extraction from a
146146
/// concatenation of array index expressions
147-
exprt flatten_byte_extract(
148-
const byte_extract_exprt &src,
149-
const namespacet &ns)
147+
exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns)
150148
{
151149
// General notes about endianness and the bit-vector conversion:
152150
// A single byte with value 0b10001000 is stored (in irept) as
@@ -244,7 +242,7 @@ exprt flatten_byte_extract(
244242
tmp.type()=subtype;
245243
tmp.offset()=new_offset;
246244

247-
array.copy_to_operands(flatten_byte_extract(tmp, ns));
245+
array.copy_to_operands(lower_byte_extract(tmp, ns));
248246
}
249247

250248
return simplify_expr(array, ns);
@@ -337,7 +335,7 @@ exprt flatten_byte_extract(
337335
}
338336
}
339337

340-
exprt flatten_byte_update(
338+
static exprt lower_byte_update(
341339
const byte_update_exprt &src,
342340
const namespacet &ns,
343341
bool negative_offset)
@@ -393,13 +391,13 @@ exprt flatten_byte_update(
393391
ID_byte_extract_little_endian:
394392
src.id()==ID_byte_update_big_endian?
395393
ID_byte_extract_big_endian:
396-
throw "unexpected src.id() in flatten_byte_update",
394+
throw "unexpected src.id() in lower_byte_update",
397395
subtype);
398396

399397
byte_extract_expr.op()=src.op2();
400398
byte_extract_expr.offset()=i_expr;
401399

402-
new_value=flatten_byte_extract(byte_extract_expr, ns);
400+
new_value=lower_byte_extract(byte_extract_expr, ns);
403401
}
404402

405403
const plus_exprt where(src.op1(), i_expr);
@@ -462,15 +460,15 @@ exprt flatten_byte_update(
462460
ID_byte_extract_little_endian :
463461
src.id()==ID_byte_update_big_endian ?
464462
ID_byte_extract_big_endian :
465-
throw "unexpected src.id() in flatten_byte_update";
463+
throw "unexpected src.id() in lower_byte_update";
466464
byte_extract_exprt byte_extract_expr(
467465
extract_opcode,
468466
element_size<sub_size ? src.op2().type() : subtype);
469467

470468
byte_extract_expr.op()=src.op2();
471469
byte_extract_expr.offset()=stored_value_offset;
472470

473-
new_value=flatten_byte_extract(byte_extract_expr, ns);
471+
new_value=lower_byte_extract(byte_extract_expr, ns);
474472
}
475473

476474
// Where does the value we just extracted align in this cell?
@@ -501,7 +499,7 @@ exprt flatten_byte_update(
501499
// Call recursively, the array is gone!
502500
// The last parameter indicates that the
503501
exprt flattened_byte_update_expr=
504-
flatten_byte_update(byte_update_expr, ns, is_last_cell);
502+
lower_byte_update(byte_update_expr, ns, is_last_cell);
505503

506504
with_exprt with_expr(
507505
result, cell_index, flattened_byte_update_expr);
@@ -515,7 +513,7 @@ exprt flatten_byte_update(
515513
else
516514
{
517515
throw
518-
"flatten_byte_update can only do arrays of scalars right now, "
516+
"lower_byte_update can only do arrays of scalars right now, "
519517
"but got "+subtype.id_string();
520518
}
521519
}
@@ -531,7 +529,7 @@ exprt flatten_byte_update(
531529
std::size_t width=integer2size_t(type_width);
532530

533531
if(element_size*8>width)
534-
throw "flatten_byte_update to update element that is too large";
532+
throw "lower_byte_update to update element that is too large";
535533

536534
// build mask
537535
exprt mask=
@@ -584,16 +582,16 @@ exprt flatten_byte_update(
584582
}
585583
else
586584
{
587-
throw "flatten_byte_update can only do array and scalars "
585+
throw "lower_byte_update can only do array and scalars "
588586
"right now, but got "+t.id_string();
589587
}
590588
}
591589

592-
exprt flatten_byte_update(
590+
static exprt lower_byte_update(
593591
const byte_update_exprt &src,
594592
const namespacet &ns)
595593
{
596-
return flatten_byte_update(src, ns, false);
594+
return lower_byte_update(src, ns, false);
597595
}
598596

599597
bool has_byte_operator(const exprt &src)
@@ -611,25 +609,23 @@ bool has_byte_operator(const exprt &src)
611609
return false;
612610
}
613611

614-
exprt flatten_byte_operators(
615-
const exprt &src,
616-
const namespacet &ns)
612+
exprt lower_byte_operators(const exprt &src, const namespacet &ns)
617613
{
618614
exprt tmp=src;
619615

620616
// destroys any sharing, should use hash table
621617
Forall_operands(it, tmp)
622618
{
623-
exprt tmp=flatten_byte_operators(*it, ns);
619+
exprt tmp=lower_byte_operators(*it, ns);
624620
it->swap(tmp);
625621
}
626622

627623
if(src.id()==ID_byte_update_little_endian ||
628624
src.id()==ID_byte_update_big_endian)
629-
return flatten_byte_update(to_byte_update_expr(tmp), ns);
625+
return lower_byte_update(to_byte_update_expr(tmp), ns);
630626
else if(src.id()==ID_byte_extract_little_endian ||
631627
src.id()==ID_byte_extract_big_endian)
632-
return flatten_byte_extract(to_byte_extract_expr(tmp), ns);
628+
return lower_byte_extract(to_byte_extract_expr(tmp), ns);
633629
else
634630
return tmp;
635631
}

src/solvers/lowering/expr_lowering.h

+7
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,16 @@ Author: Michael Tautschnig
1111

1212
#include <util/expr.h>
1313

14+
class byte_extract_exprt;
1415
class namespacet;
1516
class popcount_exprt;
1617

18+
exprt lower_byte_extract(const byte_extract_exprt &src, const namespacet &ns);
19+
20+
exprt lower_byte_operators(const exprt &src, const namespacet &ns);
21+
22+
bool has_byte_operator(const exprt &src);
23+
1724
/// Lower a popcount_exprt to arithmetic and logic expressions
1825
/// \param expr Input expression to be translated
1926
/// \param ns Namespace for type lookups

src/solvers/smt1/smt1_conv.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ Author: Daniel Kroening, [email protected]
2727

2828
#include <solvers/flattening/boolbv_width.h>
2929
#include <solvers/flattening/pointer_logic.h>
30-
#include <solvers/flattening/flatten_byte_operators.h>
3130
#include <solvers/flattening/c_bit_field_replacement_type.h>
31+
#include <solvers/lowering/expr_lowering.h>
3232

3333
void smt1_convt::print_assignment(std::ostream &out) const
3434
{
@@ -356,7 +356,7 @@ void smt1_convt::convert_byte_extract(
356356
bool bool_as_bv)
357357
{
358358
// we just run the flattener
359-
exprt flattened_expr=flatten_byte_extract(expr, ns);
359+
exprt flattened_expr = lower_byte_extract(expr, ns);
360360
convert_expr(flattened_expr, bool_as_bv);
361361
}
362362

src/solvers/smt2/smt2_conv.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ Author: Daniel Kroening, [email protected]
2929
#include <util/string_constant.h>
3030

3131
#include <solvers/flattening/boolbv_width.h>
32-
#include <solvers/flattening/flatten_byte_operators.h>
3332
#include <solvers/flattening/c_bit_field_replacement_type.h>
3433
#include <solvers/floatbv/float_bv.h>
34+
#include <solvers/lowering/expr_lowering.h>
3535

3636
// Mark different kinds of error condition
3737
// General
@@ -598,7 +598,7 @@ void smt2_convt::convert_address_of_rec(
598598
void smt2_convt::convert_byte_extract(const byte_extract_exprt &expr)
599599
{
600600
// we just run the flattener
601-
exprt flattened_expr=flatten_byte_extract(expr, ns);
601+
exprt flattened_expr = lower_byte_extract(expr, ns);
602602
unflatten(wheret::BEGIN, expr.type());
603603
convert_expr(flattened_expr);
604604
unflatten(wheret::END, expr.type());

0 commit comments

Comments
 (0)