ESBMC
Efficient SMT-based Context-Bounded Model Checker
Loading...
Searching...
No Matches
expr.h
Go to the documentation of this file.
1#ifndef CPROVER_EXPR_H
2#define CPROVER_EXPR_H
3
5#include <util/irep/type.h>
6
7#define forall_operands(it, expr) \
8 if ((expr).has_operands()) \
9 for (exprt::operandst::const_iterator it = (expr).operands().begin(); \
10 it != (expr).operands().end(); \
11 it++)
12
13#define Forall_operands(it, expr) \
14 if ((expr).has_operands()) \
15 for (exprt::operandst::iterator it = (expr).operands().begin(); \
16 it != (expr).operands().end(); \
17 it++)
18
19#define forall_expr(it, expr) \
20 for (exprt::operandst::const_iterator it = (expr).begin(); \
21 it != (expr).end(); \
22 it++)
23
24#define Forall_expr(it, expr) \
25 for (exprt::operandst::iterator it = (expr).begin(); it != (expr).end(); it++)
26
27#define forall_expr_list(it, expr) \
28 for (expr_listt::const_iterator it = (expr).begin(); it != (expr).end(); it++)
29
30#define Forall_expr_list(it, expr) \
31 for (expr_listt::iterator it = (expr).begin(); it != (expr).end(); it++)
32
33class exprt : public irept
34{
35public:
36#ifdef USE_LIST
37 typedef std::list<exprt> operandst;
38#else
39 typedef std::vector<exprt> operandst;
40#endif
41
42 // constructors
43 exprt() = default;
44 explicit exprt(const irep_idt &_id) : irept(_id)
45 {
46 }
47 exprt(const irep_idt &_id, const typet &_type) : irept(_id)
48 {
49 type() = _type;
50 }
51
52 bool has_operands() const
53 {
54 return !find(o_operands).is_nil();
55 }
56
58 {
59 return (operandst &)(add(o_operands).get_sub());
60 }
61
62 const operandst &operands() const
63 {
64 return (const operandst &)(find(o_operands).get_sub());
65 }
66
67 const irep_idt &value() const
68 {
69 return get(a_value);
70 }
71
72 void value(irep_idt val)
73 {
74 set(a_value, val);
75 };
76
78 {
79 return operands().front();
80 }
81
83#ifdef USE_LIST
84 {
85 return *(++operands().begin());
86 }
87#else
88 {
89 return operands()[1];
90 }
91#endif
92
94#ifdef USE_LIST
95 {
96 return *(++ ++operands().begin());
97 }
98#else
99 {
100 return operands()[2];
101 }
102#endif
103
105#ifdef USE_LIST
106 {
107 return *(++ ++ ++operands().begin());
108 }
109#else
110 {
111 return operands()[3];
112 }
113#endif
114
115 const exprt &op0() const
116 {
117 return operands().front();
118 }
119
120 const exprt &op1() const
121#ifdef USE_LIST
122 {
123 return *(++operands().begin());
124 }
125#else
126 {
127 return operands()[1];
128 }
129#endif
130
131 const exprt &op2() const
132#ifdef USE_LIST
133 {
134 return *(++ ++operands().begin());
135 }
136#else
137 {
138 return operands()[2];
139 }
140#endif
141
142 const exprt &op3() const
143#ifdef USE_LIST
144 {
145 return *(++ ++ ++operands().begin());
146 }
147#else
148 {
149 return operands()[3];
150 }
151#endif
152
153 void reserve_operands(unsigned n)
154#ifdef USE_LIST
155 {
156 }
157#else
158 {
159 operands().reserve(n);
160 }
161#endif
162
163 void move_to_operands(exprt &expr); // destroys expr
164 void move_to_operands(exprt &e1, exprt &e2); // destroys e1, e2
165 void move_to_operands(exprt &e1, exprt &e2, exprt &e3); // destroys e1, e2, e3
166 void copy_to_operands(const exprt &expr); // does not destroy expr
167 void
168 copy_to_operands(const exprt &e1, const exprt &e2); // does not destroy expr
169 void copy_to_operands(
170 const exprt &e1,
171 const exprt &e2,
172 const exprt &e3); // does not destroy expr
173
174 void make_typecast(const typet &_type);
175 void make_not();
176
177 void make_true();
178 void make_false();
179 void make_bool(bool value);
180 void negate();
181 bool sum(const exprt &expr);
182 bool mul(const exprt &expr);
183 bool subtract(const exprt &expr);
184
185 bool is_constant() const;
186 bool is_true() const;
187 bool is_false() const;
188 bool is_zero() const;
189 bool is_one() const;
190 bool is_boolean() const;
191
192 friend bool operator<(const exprt &X, const exprt &Y);
193
194 const locationt &find_location() const;
195
196 const locationt &location() const
197 {
198 return static_cast<const locationt &>(cmt_location());
199 }
200
202 {
203 return static_cast<locationt &>(add(o_location));
204 }
205
206 exprt &add_expr(const std::string &name)
207 {
208 return static_cast<exprt &>(add(name));
209 }
210
211 const exprt &find_expr(const std::string &name) const
212 {
213 return static_cast<const exprt &>(find(name));
214 }
215
216 // Actual expression nodes
222 static irep_idt div;
223 static irep_idt mod;
261 static irep_idt abs;
263
264 // Expression attributes
266
267 // Other foo
268protected:
271};
272
273typedef std::list<exprt> expr_listt;
274
275#endif
static irep_idt i_bitnot
Definition expr.h:257
exprt & op3()
Definition expr.h:104
static irep_idt symbol
Definition expr.h:218
static irep_idt i_ashr
Definition expr.h:258
std::vector< exprt > operandst
Definition expr.h:39
void move_to_operands(exprt &expr)
Definition expr.cpp:8
static irep_idt implies
Definition expr.h:231
void make_false()
Definition expr.cpp:132
static irep_idt i_true
Definition expr.h:247
static irep_idt i_gt
Definition expr.h:250
bool is_one() const
Definition expr.cpp:191
static irep_idt with
Definition expr.h:239
static irep_idt i_if
Definition expr.h:238
bool has_operands() const
Definition expr.h:52
static irep_idt equality
Definition expr.h:224
static irep_idt i_ge
Definition expr.h:252
static irep_idt i_not
Definition expr.h:235
static irep_idt i_and
Definition expr.h:232
bool is_true() const
Definition expr.cpp:110
static irep_idt objdesc
Definition expr.h:228
static irep_idt addrof
Definition expr.h:236
void make_bool(bool value)
Definition expr.cpp:120
static irep_idt arrayof
Definition expr.h:227
static irep_idt member_ref
Definition expr.h:241
void copy_to_operands(const exprt &expr)
Definition expr.cpp:41
static irep_idt mod
Definition expr.h:223
void make_true()
Definition expr.cpp:126
static irep_idt isnan
Definition expr.h:243
static irep_idt o_location
Definition expr.h:270
static irep_idt mult
Definition expr.h:221
static irep_idt minus
Definition expr.h:220
void make_typecast(const typet &_type)
Definition expr.cpp:67
static irep_idt i_lt
Definition expr.h:249
static irep_idt plus
Definition expr.h:219
static irep_idt i_lshr
Definition expr.h:259
bool is_boolean() const
Definition expr.cpp:153
static irep_idt i_bitand
Definition expr.h:254
static irep_idt constant
Definition expr.h:246
static irep_idt deref
Definition expr.h:237
static irep_idt notequal
Definition expr.h:225
bool is_false() const
Definition expr.cpp:115
exprt(const irep_idt &_id, const typet &_type)
Definition expr.h:47
locationt & location()
Definition expr.h:201
static irep_idt ptr_mem
Definition expr.h:242
static irep_idt o_operands
Definition expr.h:269
bool is_zero() const
Definition expr.cpp:158
static irep_idt i_cmp_three_way
Definition expr.h:253
void reserve_operands(unsigned n)
Definition expr.h:153
static irep_idt a_value
Definition expr.h:265
static irep_idt i_xor
Definition expr.h:233
const exprt & op0() const
Definition expr.h:115
exprt & op0()
Definition expr.h:77
exprt & op1()
Definition expr.h:82
bool is_constant() const
Definition expr.cpp:105
const locationt & location() const
Definition expr.h:196
const exprt & find_expr(const std::string &name) const
Definition expr.h:211
static irep_idt typecast
Definition expr.h:230
exprt(const irep_idt &_id)
Definition expr.h:44
bool mul(const exprt &expr)
Definition expr.cpp:256
void value(irep_idt val)
Definition expr.h:72
static irep_idt ieee_floateq
Definition expr.h:244
operandst & operands()
Definition expr.h:57
const operandst & operands() const
Definition expr.h:62
static irep_idt i_shl
Definition expr.h:260
static irep_idt argument
Definition expr.h:262
const locationt & find_location() const
Definition expr.cpp:331
void negate()
Definition expr.cpp:143
exprt()=default
static irep_idt trans
Definition expr.h:217
exprt & op2()
Definition expr.h:93
static irep_idt abs
Definition expr.h:261
exprt & add_expr(const std::string &name)
Definition expr.h:206
static irep_idt dynobj
Definition expr.h:229
static irep_idt i_false
Definition expr.h:248
bool subtract(const exprt &expr)
Definition expr.cpp:293
void make_not()
Definition expr.cpp:77
static irep_idt i_or
Definition expr.h:234
static irep_idt i_bitxor
Definition expr.h:256
const exprt & op3() const
Definition expr.h:142
static irep_idt index
Definition expr.h:226
static irep_idt i_type
Definition expr.h:245
static irep_idt div
Definition expr.h:222
bool sum(const exprt &expr)
Definition expr.cpp:219
const exprt & op2() const
Definition expr.h:131
const irep_idt & value() const
Definition expr.h:67
static irep_idt i_le
Definition expr.h:251
const exprt & op1() const
Definition expr.h:120
friend bool operator<(const exprt &X, const exprt &Y)
Definition expr.cpp:138
static irep_idt member
Definition expr.h:240
static irep_idt i_bitor
Definition expr.h:255
Definition irep_idt.h:12
const irept & find(const irep_idt &name) const
Definition irep.cpp:167
const irep_idt & get(const irep_idt &name) const
Definition irep.cpp:127
irept(const irep_idt &_id)
Definition irep.cpp:31
void set(const irep_idt &name, const irep_idt &value)
Definition irep.h:141
subt & get_sub()
Definition irep.h:1242
typet & type()
Definition irep.h:153
const irept & cmt_location() const
Definition irep.h:432
irept & add(const irep_idt &name)
Definition irep.cpp:179
bool is_nil() const
Definition irep.h:46
const irep_idt & name() const
Definition irep.h:182
Definition location.h:7
Definition type.h:9
std::list< exprt > expr_listt
Definition expr.h:273