cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
qdimacs_core.cpp
Go to the documentation of this file.
1
/*******************************************************************\
2
3
Module:
4
5
Author: CM Wintersteiger
6
7
\*******************************************************************/
8
9
#include "
qdimacs_core.h
"
10
11
#include <
util/bitvector_expr.h
>
12
#include <
util/std_expr.h
>
13
14
#include <set>
15
16
void
qdimacs_coret::simplify_extractbits
(
exprt
&expr)
const
17
{
18
if
(expr.
id
()==ID_and)
19
{
20
typedef
std::map<exprt, std::set<exprt> > used_bits_mapt;
21
used_bits_mapt used_bits_map;
22
23
for
(
const
auto
&op : expr.
operands
())
24
{
25
if
(op.id() == ID_extractbit)
26
{
27
const
auto
&extractbit_expr =
to_extractbit_expr
(op);
28
if
(extractbit_expr.op1().is_constant())
29
used_bits_map[extractbit_expr.src()].insert(extractbit_expr.index());
30
}
31
else
if
(op.id() == ID_not &&
to_not_expr
(op).op().
id
() == ID_extractbit)
32
{
33
const
auto
&extractbit_expr =
to_extractbit_expr
(
to_not_expr
(op).op());
34
if
(extractbit_expr.op1().is_constant())
35
used_bits_map[extractbit_expr.src()].insert(extractbit_expr.index());
36
}
37
}
38
39
// clang-format off
40
// this is unmaintained code, don't try to reformat it
41
for
(used_bits_mapt::const_iterator it=used_bits_map.begin();
42
it!=used_bits_map.end();
43
it++)
44
{
45
#if 0
46
unsigned
width;
47
boolbv_get_width(it->first.type(), width);
48
49
std::string value_string;
50
value_string.resize(width,
'0'
);
51
52
if
(it->second.size()==width)
// all bits extracted from this one!
53
{
54
const
irep_idt
&ident=it->first.get(ID_identifier);
55
const
exprt::operandst
&old_operands=expr.
operands
();
56
exprt::operandst
new_operands;
57
58
for
(exprt::operandst::const_iterator oit=old_operands.begin();
59
oit!=old_operands.end();
60
oit++)
61
{
62
if
(oit->id()==ID_extractbit &&
63
oit->op1().is_constant())
64
{
65
if
(oit->op0().get(ID_identifier)==ident)
66
{
67
const
exprt
&val_expr=oit->
op1
();
68
const
std::size_t value =
numeric_cast_v<std::size_t>
(val_expr);
69
value_string[value]=
'1'
;
70
71
#if 0
72
std::cout <<
"["
<< value <<
"]=1\n"
;
73
#endif
74
75
continue
;
76
}
77
}
78
else
if
(oit->id()==ID_not &&
79
oit->op0().id()==ID_extractbit &&
80
oit->op0().op1().is_constant())
81
{
82
if
(oit->op0().op0().get(ID_identifier)==ident)
83
{
84
// just kick it; the bit in value_string is 0 anyways
85
continue
;
86
}
87
}
88
89
new_operands.push_back(*oit);
90
}
91
92
const
constant_exprt
new_value(value_string, it->first.type());
93
new_operands.push_back(equality_exprt(it->first, new_value));
94
95
#if 0
96
std::cout <<
"FINAL: "
<< value_string <<
'\n'
;
97
#endif
98
99
expr.
operands
()=new_operands;
100
}
101
#endif
102
}
103
// clang-format on
104
}
105
}
numeric_cast_v
Target numeric_cast_v(const mp_integer &arg)
Convert an mp_integer to integral type Target An invariant will fail if the conversion is not possibl...
Definition
arith_tools.h:135
bitvector_expr.h
API to expression classes for bitvectors.
to_extractbit_expr
const extractbit_exprt & to_extractbit_expr(const exprt &expr)
Cast an exprt to an extractbit_exprt.
Definition
bitvector_expr.h:620
constant_exprt
A constant literal expression.
Definition
std_expr.h:2997
exprt
Base class for all expressions.
Definition
expr.h:57
exprt::operandst
std::vector< exprt > operandst
Definition
expr.h:59
exprt::op1
exprt & op1()
Definition
expr.h:137
exprt::operands
operandst & operands()
Definition
expr.h:95
irept::id
const irep_idt & id() const
Definition
irep.h:388
qdimacs_coret::simplify_extractbits
void simplify_extractbits(exprt &expr) const
Definition
qdimacs_core.cpp:16
qdimacs_core.h
std_expr.h
API to expression classes.
to_not_expr
const not_exprt & to_not_expr(const exprt &expr)
Cast an exprt to an not_exprt.
Definition
std_expr.h:2398
irep_idt
dstringt irep_idt
Definition
verification_result.h:16
solvers
qbf
qdimacs_core.cpp
Generated by
1.17.0