1#ifndef CPROVER_ANALYSES_INTERVAL_TEMPLATE_H
2#define CPROVER_ANALYSES_INTERVAL_TEMPLATE_H
58 virtual void set(
bool is_upper,
const T &b)
66 virtual T get(
bool is_upper)
const
82 std::ostringstream oss;
288 auto result = rhs.
empty() ? rhs : lhs;
293 result.
lower.reset();
298 result.upper.reset();
310 result.
lower.reset();
313 result.lower = -(*lhs.
upper);
318 result.upper.reset();
322 result.upper = -(*lhs.
lower);
331 auto result = rhs.
empty() ? rhs : lhs;
336 result.
lower.reset();
341 result.upper.reset();
355 return rhs.
empty() ? rhs : lhs;
363 result.
lower = a0_b0;
364 result.
upper = a0_b0;
366 auto update_value = [&result](
T value) {
388 return rhs.
empty() ? rhs : lhs;
401 result.
lower = a0_b0;
402 result.
upper = a0_b0;
404 auto update_value = [&result](
T value) {
421 if (!
cond.contains(0))
424 if (
cond.singleton())
428 result.
join(false_value);
442 log_debug(
"interval",
"No support for typecasting");
450 log_debug(
"interval",
"No support for mod");
459 log_debug(
"interval",
"No support for bitand");
474 log_debug(
"interval",
"No support for bitor");
489 log_debug(
"interval",
"No support for bitxor");
504 log_debug(
"interval",
"No support for lshr");
520 log_debug(
"interval",
"No support for shl");
535 log_debug(
"interval",
"No support for ashr");
764 if (a.
lower.has_value() != b.
lower.has_value())
766 if (a.
upper.has_value() != b.
upper.has_value())
803 out <<
'[' << *i.
lower;
810 out << *i.
upper <<
']';
This class is used to store intervals in the form of lower <= upper.
Definition interval_template.h:20
friend interval_templatet< T > operator&(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:465
static interval_templatet< T > equality(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:555
static interval_templatet< T > bitnot(const interval_templatet< T > &w)
Definition interval_template.h:548
virtual bool is_top() const
Definition interval_template.h:122
interval_templatet(const type2tc &)
Definition interval_template.h:26
friend interval_templatet< T > operator%(const interval_templatet< T > &, const interval_templatet< T > &)
Definition interval_template.h:448
void dump() const
Definition interval_template.h:80
friend interval_templatet< T > operator/(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:379
T adjust(const T &v) const
Definition interval_template.h:52
static interval_templatet< T > greater_than(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:667
T get_lower() const
Definition interval_template.h:42
friend interval_templatet< T > operator|(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:480
static interval_templatet< T > cast(const interval_templatet< T > &, const type2tc &)
Definition interval_template.h:440
interval_templatet(const T &x)
Definition interval_template.h:30
void set_lower(const T &b)
Definition interval_template.h:75
friend interval_templatet< T > operator-(const interval_templatet< T > &lhs)
Definition interval_template.h:305
void set_upper(const T &b)
Definition interval_template.h:71
static interval_templatet< T > greater_than_equal(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:659
interval_templatet< T > interval_bitor(const interval_templatet< T > &, const interval_templatet< T > &) const
Definition interval_template.h:470
void join(const interval_templatet< T > &i)
Union or disjunction.
Definition interval_template.h:193
static interval_templatet< T > less_than(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:609
interval_templatet< T > interval_left_shift(const interval_templatet< T > &, const interval_templatet< T > &) const
Definition interval_template.h:516
interval_templatet< T > interval_arithmetic_right_shift(const interval_templatet< T > &, const interval_templatet< T > &) const
Definition interval_template.h:531
static interval_templatet< T > invert_bool(const interval_templatet< T > &i)
Definition interval_template.h:578
virtual void make_le_than(const T &v)
Definition interval_template.h:134
void make_sound_le(interval_templatet< T > &v)
Definition interval_template.h:163
static void contract_interval_le(interval_templatet< T > &a, interval_templatet< T > &b)
Computer the contraction of "a" and "b" under a <= b.
Definition interval_template.h:702
static interval_templatet< T > not_equal(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:603
interval_templatet< T > interval_bitxor(const interval_templatet< T > &, const interval_templatet< T > &) const
Definition interval_template.h:485
bool has_changed(const interval_templatet< T > &i)
This is just to check if a value has changed.
Definition interval_template.h:677
virtual void set(bool is_upper, const T &b)
Definition interval_template.h:58
void meet(const interval_templatet< T > &i)
Intersection or conjunction.
Definition interval_template.h:199
void make_lower_interval()
Generates an interval of the form (-infinity, 0].
Definition interval_template.h:689
static interval_templatet< T > arithmetic_right_shift(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:540
virtual void approx_union_with(const interval_templatet &i)
Definition interval_template.h:244
bool is_bottom() const
Definition interval_template.h:117
interval_templatet(const T &l, const T &u)
Definition interval_template.h:34
virtual ~interval_templatet()=default
static interval_templatet< T > left_shift(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:526
bool is_subseteq(const interval_templatet &other) const
Definition interval_template.h:232
interval_templatet< T > interval_logical_right_shift(const interval_templatet< T > &, const interval_templatet< T > &) const
Definition interval_template.h:500
friend interval_templatet< T > operator*(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:349
std::optional< BigInt > upper
Definition interval_template.h:39
static interval_templatet< T > logical_right_shift(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:509
static interval_templatet< T > less_than_equal(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:633
virtual T get(bool is_upper) const
Definition interval_template.h:66
virtual bool contains(const T &e) const
Definition interval_template.h:148
void intersect_with(const interval_templatet &i)
Definition interval_template.h:204
virtual bool empty() const
Checks whether there are values that satisfy the the interval.
Definition interval_template.h:112
friend interval_templatet< T > operator+(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:285
T get_upper() const
Definition interval_template.h:47
bool singleton() const
There is only one value that satisfies.
Definition interval_template.h:128
interval_templatet()=default
static bool is_representable(const type2tc &)
Whether an interval can be built for a value of type t; when it cannot, expressions over such values ...
Definition interval_template.h:434
friend interval_templatet< T > operator-(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:328
type2tc type
Definition interval_template.h:41
std::optional< BigInt > lower
Definition interval_template.h:39
interval_templatet< T > interval_bitand(const interval_templatet< T > &, const interval_templatet< T > &) const
Definition interval_template.h:455
virtual void make_ge_than(const T &v)
Definition interval_template.h:178
friend interval_templatet< T > operator^(const interval_templatet< T > &lhs, const interval_templatet< T > &rhs)
Definition interval_template.h:495
virtual bool is_le_than(const T &a, const T &b) const
Definition interval_template.h:103
static interval_templatet< T > ternary_if(const interval_templatet< T > &cond, const interval_templatet< T > &true_value, const interval_templatet< T > &false_value)
Definition interval_template.h:416
@ TV_UNKNOWN
Definition threeval.h:15
@ other
Definition converter_compare.cpp:887
pthread_cond_t cond
Definition cuda.h:50
#define T
Definition exp2f.c:24
interval_templatet< T > lower_interval(const T &l)
Definition interval_template.h:792
tvt operator<=(const interval_templatet< T > &a, const interval_templatet< T > &b)
Definition interval_template.h:733
tvt operator>(const interval_templatet< T > &a, const interval_templatet< T > &b)
Definition interval_template.h:756
std::ostream & operator<<(std::ostream &out, const interval_templatet< T > &i)
Definition interval_template.h:800
bool operator==(const interval_templatet< T > &a, const interval_templatet< T > &b)
Definition interval_template.h:762
interval_templatet< T > upper_interval(const T &u)
Definition interval_template.h:784
bool operator!=(const interval_templatet< T > &a, const interval_templatet< T > &b)
Definition interval_template.h:778
tvt operator<(const interval_templatet< T > &a, const interval_templatet< T > &b)
Definition interval_template.h:750
tvt operator>=(const interval_templatet< T > &a, const interval_templatet< T > &b)
Definition interval_template.h:744
irep_container< type2t > type2tc
Definition irep2.h:430
#define log_debug(mod, fmt,...)
Definition message.h:104
#define log_status(fmt,...)
Definition message.h:101
const T & max(const T &left, const T &right)
Definition min_max.h:10
const T & min(const T &left, const T &right)
Definition min_max.h:19