1#ifndef ESBMC_GOTO_CONTRACTOR_H
2#define ESBMC_GOTO_CONTRACTOR_H
16#include <ibex/ibex_Interval.h>
17#include <ibex/ibex_Expr.h>
18#include <ibex/ibex_Ctc.h>
34 ibex::Interval interval;
38 bool interval_changed;
43 vart(
const string &varName,
const expr2tc &symbol,
const size_t &index);
56 unsigned int location;
69 inner = get_complement_contractor(c);
80 for (
auto it = vector_ctc.rbegin(); it != vector_ctc.rend(); ++it)
82 for (
auto it = vector_nc.rbegin(); it != vector_nc.rend(); ++it)
84 for (
auto it = vector_f.rbegin(); it != vector_f.rend(); ++it)
90 Contractor::outer = outer;
94 Contractor::inner = inner;
98 Contractor::location = location;
115 std::vector<ibex::Function *> vector_f;
116 std::vector<ibex::NumConstraint *> vector_nc;
117 std::vector<ibex::Ctc *> vector_ctc;
119 ibex::Ctc *get_complement_contractor(ibex::Ctc *c)
121 if (
auto ctc_compo =
dynamic_cast<ibex::CtcCompo *
>(c))
123 ibex::Array<ibex::Ctc> list_of_contractors;
124 for (
auto &it : ctc_compo->list)
125 list_of_contractors.add(*get_complement_contractor(&it));
126 auto ctc_union =
new ibex::CtcUnion(list_of_contractors);
127 vector_ctc.push_back(ctc_union);
130 else if (
auto ctc_union =
dynamic_cast<ibex::CtcUnion *
>(c))
132 ibex::Array<ibex::Ctc> list_of_contractors;
133 for (
auto &it : ctc_union->list)
134 list_of_contractors.add(*get_complement_contractor(&it));
135 auto ctc_compo =
new ibex::CtcCompo(list_of_contractors);
136 vector_ctc.push_back(ctc_compo);
139 else if (
auto fwdbwd =
dynamic_cast<ibex::CtcFwdBwd *
>(c))
141 ibex::NumConstraint *ctr;
142 ibex::CtcFwdBwd *contractor;
143 switch (fwdbwd->ctr.op)
146 ctr =
new ibex::NumConstraint(fwdbwd->ctr.f, ibex::LT);
147 vector_nc.push_back(ctr);
148 contractor =
new ibex::CtcFwdBwd(*ctr);
149 vector_ctc.push_back(contractor);
152 ctr =
new ibex::NumConstraint(fwdbwd->ctr.f, ibex::LEQ);
153 vector_nc.push_back(ctr);
154 contractor =
new ibex::CtcFwdBwd(*ctr);
155 vector_ctc.push_back(contractor);
158 ctr =
new ibex::NumConstraint(fwdbwd->ctr.f, ibex::GT);
159 vector_nc.push_back(ctr);
160 contractor =
new ibex::CtcFwdBwd(*ctr);
161 vector_ctc.push_back(contractor);
164 ctr =
new ibex::NumConstraint(fwdbwd->ctr.f, ibex::GEQ);
165 vector_nc.push_back(ctr);
166 contractor =
new ibex::CtcFwdBwd(*ctr);
167 vector_ctc.push_back(contractor);
170 ctr =
new ibex::NumConstraint(fwdbwd->ctr.f, ibex::GT);
171 auto ctr2 =
new ibex::NumConstraint(fwdbwd->ctr.f, ibex::LT);
172 auto *side1 =
new ibex::CtcFwdBwd(*ctr);
173 auto *side2 =
new ibex::CtcFwdBwd(*ctr2);
174 auto ctc_union =
new ibex::CtcUnion(*side1, *side2);
176 vector_nc.push_back(ctr);
177 vector_nc.push_back(ctr2);
178 vector_ctc.push_back(side1);
179 vector_ctc.push_back(side2);
180 vector_ctc.push_back(ctc_union);
187 log_debug(
"contractor",
"Contractors: Unsupported Ctc type");
197 std::list<Contractor *> contractors;
208 if (c->get_outer() !=
nullptr)
209 delete (c->get_outer());
210 if (c->get_inner() !=
nullptr)
211 delete (c->get_inner());
214 for (
auto cont : contractors)
221 auto size = contractors.size();
222 ibex::Array<ibex::Ctc> outer[size];
223 ibex::Array<ibex::Ctc> inner[size];
224 for (
auto const &ctc : contractors)
225 if (ctc->get_location() < loc)
227 outer->add(*(ctc->get_outer()));
228 inner->add(*(ctc->get_inner()));
231 c->set_outer(
new ibex::CtcCompo(*outer));
232 c->set_inner(
new ibex::CtcUnion(*inner));
241 auto size = contractors.size();
242 ibex::Array<ibex::Ctc> outer[size];
243 ibex::Array<ibex::Ctc> inner[size];
244 for (
auto const &ctc : contractors)
246 outer->add(*(ctc->get_outer()));
247 inner->add(*(ctc->get_inner()));
249 c->set_outer(
new ibex::CtcCompo(*outer));
250 c->set_inner(
new ibex::CtcUnion(*inner));
257 std::ostringstream oss;
259 for (
auto const &c : contractors)
261 oss <<
"outer :" <<
to_oss(c->get_outer()).str() <<
"\n";
262 oss <<
"inner :" <<
to_oss(c->get_inner()).str() <<
"\n";
263 oss <<
"location :" << c->get_location() <<
"\n";
265 log_debug(
"contractor",
"{}", oss.str());
267 std::ostringstream
list_to_oss(ibex::Array<ibex::Ctc> *list,
bool is_compo)
269 std::ostringstream oss;
270 auto it = list->begin();
271 oss <<
"( " <<
to_oss(&*it).str();
273 while (it != list->end())
275 oss << (is_compo ?
" && " :
" || ") <<
to_oss(&*it).str();
283 std::ostringstream oss;
284 if (
auto ctc_compo =
dynamic_cast<ibex::CtcCompo *
>(c))
286 else if (
auto ctc_union =
dynamic_cast<ibex::CtcUnion *
>(c))
288 else if (
auto fwdbwd =
dynamic_cast<ibex::CtcFwdBwd *
>(c))
299 contractors.insert(contractors.end(), c);
304 return contractors.empty();
330 vart var(name, symbol, n);
331 var_map.insert(std::make_pair(name, var));
335 return find->second.getIndex();
343 ibex::Interval X(lb,
find->second.getInterval().ub());
344 find->second.setInterval(X);
351 ibex::Interval X(
find->second.getInterval().lb(), ub);
352 find->second.setInterval(X);
354 int find(
const std::string &name)
359 return find->second.getIndex();
368 if (this->is_empty_vector)
369 return ibex::IntervalVector::empty(
var_map.size());
371 ibex::IntervalVector X(
var_map.size());
372 for (
auto const &var :
var_map)
373 X[var.second.getIndex()] = var.second.getInterval();
381 if (vector.is_empty())
383 is_empty_vector =
true;
389 if (var.second.getInterval() != vector[var.second.getIndex()])
391 var.second.setInterval(vector[var.second.getIndex()]);
392 var.second.setIntervalChanged(
true);
399 bool is_empty_vector =
false;
404 return is_empty_vector;
408 std::ostringstream oss;
409 oss <<
"This map has : " << this->n;
412 oss <<
"empty vector";
418 for (
const auto &var :
var_map)
430 ibex::Variable *vars =
nullptr;
433 std::vector<ibex::Function *> vector_f;
434 std::vector<ibex::NumConstraint *> vector_nc;
435 std::vector<ibex::Ctc *> vector_ctc;
437 static bool is_constraint_operator(
const expr2tc &);
438 static bool is_unsupported_operator_in_constraint(
const expr2tc &);
439 ibex::Ctc *create_contractor_from_expr2t(
const expr2tc &);
447 ibex::NumConstraint *create_constraint_from_expr2t(
const expr2tc &);
455 ibex::Ctc *create_contractor_from_expr2t_not(
const expr2tc &);
456 ibex::NumConstraint *create_constraint_from_expr2t_not(
const expr2tc &);
458 ibex::Function *create_function_from_expr2t(
const expr2tc &);
459 int create_variable_from_expr2t(
const expr2tc &);
460 void parse_error(
const expr2tc &);
461 bool is_constraint_operator_not(
const expr2tc &expr);
462 bool is_unsupported_operator_in_constraint_not(
const expr2tc &expr);
473 return create_contractor_from_expr2t(expr);
478 for (
auto it = vector_ctc.rbegin(); it != vector_ctc.rend(); ++it)
480 for (
auto it = vector_nc.rbegin(); it != vector_nc.rend(); ++it)
482 for (
auto it = vector_f.rbegin(); it != vector_f.rend(); ++it)
512 vars = new ibex::Variable(CspMap::MAX_VAR);
513 goto_contractor_condition(ns, options);
517 initialize_main_function_loops();
518 if (!function_loops.empty())
520 vars = new ibex::Variable(CspMap::MAX_VAR);
521 parser = expr_to_ibex_parser(&map, vars);
523 "contractor",
"1/4 - Parsing asserts to create CSP Constraints.");
524 get_contractors(_goto_functions);
525 if (contractors.is_empty())
529 "Contractors: expression not supported, No Contractors were "
536 "2/4 - Parsing assumes to set values for variables intervals.");
537 get_intervals(_goto_functions, ns);
539 log_debug(
"contractor",
"3/4 - Applying contractor.");
542 log_debug(
"contractor",
"4/4 - Inserting assumes.");
543 insert_assume(_goto_functions);
552 ibex::IntervalVector domains;
554 ibex::Variable *vars;
562 unsigned number_of_functions = 0;
564 typedef std::list<loopst> function_loopst;
565 function_loopst function_loops;
591 void apply_contractor();
598 ibex::CmpOp get_complement(ibex::CmpOp);
613 void parse_intervals(
const expr2tc &orig_expr);
615 bool initialize_main_function_loops();
617 void insert_assume_at(
644 auto t_0 = std::chrono::steady_clock::now();
645 ibex::Ctc *c =
parser.parse(guard);
647 std::chrono::duration<double>(std::chrono::steady_clock::now() - t_0)
652 else if (map.var_map.size() == 0)
665 void dump(
bool is_timed);
670 const std::optional<BigInt> &
lower,
671 const std::optional<BigInt> &upper,
672 const std::string &name)
675 map.update_lb_interval(
lower->to_int64(), name);
677 map.update_ub_interval(upper->to_int64(), name);
681 const std::optional<double> &
lower,
682 const std::optional<double> &upper,
683 const std::string &name)
686 map.update_lb_interval(*
lower, name);
688 map.update_ub_interval(*upper, name);
692 ibex::IntervalVector domains;
694 ibex::Variable *vars;
705 std::ostringstream oss;
707 oss <<
"constraint :" << to_oss(c.get_outer()).str();
708 log_debug(
"contractor",
"{}", oss.str());
710 std::ostringstream list_to_oss(ibex::Array<ibex::Ctc> *list,
bool is_compo)
712 std::ostringstream oss;
713 auto it = list->begin();
714 oss <<
"( " << to_oss(&*it).str();
716 while (it != list->end())
718 oss << (is_compo ?
" && " :
" || ") << to_oss(&*it).str();
724 std::ostringstream to_oss(ibex::Ctc *c)
726 std::ostringstream oss;
727 if (
auto ctc_compo =
dynamic_cast<ibex::CtcCompo *
>(c))
728 oss = list_to_oss(&ctc_compo->list,
true);
729 else if (
auto ctc_union =
dynamic_cast<ibex::CtcUnion *
>(c))
730 oss = list_to_oss(&ctc_union->list,
false);
731 else if (
auto fwdbwd =
dynamic_cast<ibex::CtcFwdBwd *
>(c))
Definition goto_contractor.h:53
~Contractor()
Definition goto_contractor.h:77
Contractor(ibex::Ctc *c)
Definition goto_contractor.h:71
ibex::Ctc * get_inner() const
Definition goto_contractor.h:104
ibex::Ctc * get_outer() const
Definition goto_contractor.h:100
Contractor()
Definition goto_contractor.h:59
Contractor(ibex::Ctc *c, unsigned int loc)
Definition goto_contractor.h:65
void set_outer(ibex::Ctc *outer)
Definition goto_contractor.h:88
void set_inner(ibex::Ctc *inner)
Definition goto_contractor.h:92
void set_location(unsigned int location)
Definition goto_contractor.h:96
unsigned int get_location() const
Definition goto_contractor.h:108
Definition goto_contractor.h:194
void dump()
Definition goto_contractor.h:255
std::ostringstream to_oss(ibex::Ctc *c)
Definition goto_contractor.h:281
Contractor * get_contractors_up_to_loc(unsigned int loc)
Definition goto_contractor.h:217
void add_contractor(ibex::Ctc *ctc, unsigned int loc)
Definition goto_contractor.h:294
std::ostringstream list_to_oss(ibex::Array< ibex::Ctc > *list, bool is_compo)
Definition goto_contractor.h:267
~Contractors()
Definition goto_contractor.h:204
bool is_empty()
Definition goto_contractor.h:302
Contractors()
Definition goto_contractor.h:200
Contractor * get_contractors()
Definition goto_contractor.h:237
This class is for mapping the variables with their names and intervals.
Definition goto_contractor.h:315
int find(const std::string &name)
Definition goto_contractor.h:354
void update_ub_interval(double ub, const std::string &name)
Definition goto_contractor.h:346
void update_lb_interval(double lb, const std::string &name)
Definition goto_contractor.h:338
ibex::IntervalVector create_interval_vector()
Definition goto_contractor.h:366
void update_intervals(ibex::IntervalVector vector)
Definition goto_contractor.h:377
static constexpr int MAX_VAR
Definition goto_contractor.h:317
static constexpr int NOT_FOUND
Definition goto_contractor.h:318
std::map< std::string, vart > var_map
Definition goto_contractor.h:321
bool is_empty_set() const
Definition goto_contractor.h:402
static constexpr int IGNORE
Definition goto_contractor.h:319
size_t size() const
Definition goto_contractor.h:361
size_t add_var(const std::string &name, const expr2tc &symbol)
Definition goto_contractor.h:325
void dump()
Definition goto_contractor.h:406
This class will parse ESBMC expressions to ibex expressions:
Definition goto_contractor.h:427
~expr_to_ibex_parser()
Definition goto_contractor.h:475
ibex::Ctc * parse(irep_container< expr2t > expr)
Definition goto_contractor.h:471
expr_to_ibex_parser()=default
expr_to_ibex_parser(CspMap *map, ibex::Variable *vars)
Definition goto_contractor.h:465
void goto_contractor_condition(const namespacet &namespacet, const optionst &optionst)
Definition goto_contractor.cpp:305
goto_contractort(goto_functionst &_goto_functions, const namespacet &ns, const optionst &options)
This constructor will run the goto-contractor procedure.
Definition goto_contractor.h:504
goto_functionst & goto_functions
Definition goto_contractor.h:549
goto_functions_algorithm(bool sideffect)
Definition goto_functions_algorithm.h:13
Definition goto_functions.h:56
Definition goto_functions.h:23
instructionst::iterator targett
Definition goto_program.h:590
Definition host_rounding_mode.h:13
void interval_to_domain(const std::optional< BigInt > &lower, const std::optional< BigInt > &upper, const std::string &name)
Definition goto_contractor.h:669
bool parse_guard(expr2tc &guard)
Definition goto_contractor.h:642
~interval_analysis_ibex_contractor()
Definition goto_contractor.h:637
void dump(bool is_timed)
Definition goto_contractor.cpp:1061
void apply_contractor()
Definition goto_contractor.cpp:966
void modularize_intervals()
Definition goto_contractor.cpp:1086
double cpy_time
Definition goto_contractor.h:629
double parse_time
Definition goto_contractor.h:629
void interval_to_domain(const std::optional< double > &lower, const std::optional< double > &upper, const std::string &name)
Definition goto_contractor.h:680
double apply_time
Definition goto_contractor.h:629
interval_analysis_ibex_contractor()
Definition goto_contractor.h:631
expr2tc result_of_outer()
Definition goto_contractor.cpp:992
double mod_time
Definition goto_contractor.h:629
Reference counted container for irep2 nodes.
Definition irep2.h:144
Definition namespace.h:10
bool get_bool_option(const std::string &option) const
Definition options.cpp:29
Definition goto_contractor.h:32
bool isIntervalChanged() const
Definition goto_contractor.cpp:468
size_t getIndex() const
Definition goto_contractor.cpp:450
const ibex::Interval & getInterval() const
Definition goto_contractor.cpp:445
void setIntervalChanged(bool intervalChanged)
Definition goto_contractor.cpp:473
void dump() const
Definition goto_contractor.cpp:487
vart()
Definition goto_contractor.cpp:483
void setInterval(const ibex::Interval &interval)
Definition goto_contractor.cpp:463
const expr2tc & getSymbol() const
Definition goto_contractor.cpp:478
void goto_contractor(goto_functionst &goto_functions, const namespacet &namespacet, const optionst &options)
Definition goto_contractor.cpp:5
Classes and definitions for non-stringy internal representation.
irep_container< expr2t > expr2tc
Definition irep2.h:431
#define log_debug(mod, fmt,...)
Definition message.h:104
#define log_status(fmt,...)
Definition message.h:101
static std::string lower(std::string s)
Definition st_fb_translator.cpp:95
#define true
Definition stdbool.h:11