diff options
Diffstat (limited to 'include/omegatools.hh')
-rw-r--r-- | include/omegatools.hh | 120 |
1 files changed, 63 insertions, 57 deletions
diff --git a/include/omegatools.hh b/include/omegatools.hh index b51b2bd..2f56971 100644 --- a/include/omegatools.hh +++ b/include/omegatools.hh @@ -1,11 +1,6 @@ #ifndef OMEGATOOLS_HH #define OMEGATOOLS_HH -/*! - * \file - * \brief Useful tools involving Omega manipulation. - */ - #include <string> #include <omega.h> #include "dep.hh" @@ -13,81 +8,92 @@ std::string tmp_e(); -//! Convert expression tree to omega relation. -/*! - * \param destroy shallow deallocation of "repr", not freeing the actual code inside. - */ -void exp2formula(IR_Code *ir, omega::Relation &r, omega::F_And *f_root, +void exp2formula(IR_Code *ir, + omega::Relation &r, + omega::F_And *f_root, std::vector<omega::Free_Var_Decl *> &freevars, - omega::CG_outputRepr *repr, omega::Variable_ID lhs, char side, - IR_CONDITION_TYPE rel, bool destroy); + omega::CG_outputRepr *repr, + omega::Variable_ID lhs, + char side, + IR_CONDITION_TYPE rel, + bool destroy, + std::map<std::string, std::vector<omega::CG_outputRepr * > > &uninterpreted_symbols, + std::map<std::string, std::vector<omega::CG_outputRepr * > > &uninterpreted_symbols_stringrepr); -//! Build dependence relation for two array references. omega::Relation arrays2relation(IR_Code *ir, std::vector<omega::Free_Var_Decl*> &freevars, const IR_ArrayRef *ref_src, const omega::Relation &IS_w, - const IR_ArrayRef *ref_dst, const omega::Relation &IS_r); -//! Convert array dependence relation into set of dependence vectors -/*! - * assuming ref_w is lexicographically before ref_r in the source code. - */ + const IR_ArrayRef *ref_dst, const omega::Relation &IS_r, + std::map<std::string, std::vector<omega::CG_outputRepr * > > &uninterpreted_symbols, + std::map<std::string, std::vector<omega::CG_outputRepr * > > &uninterpreted_symbols_stringrepr); + std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relation2dependences( - const IR_ArrayRef *ref_src, const IR_ArrayRef *ref_dst, const omega::Relation &r); + const IR_ArrayRef *ref_src, const IR_ArrayRef *ref_dst, const omega::Relation &r); -//! Convert a boolean expression to omega relation. -/*! - * \param destroy shallow deallocation of "repr", not freeing the actual code inside. - */ void exp2constraint(IR_Code *ir, omega::Relation &r, omega::F_And *f_root, std::vector<omega::Free_Var_Decl *> &freevars, - omega::CG_outputRepr *repr, bool destroy); + omega::CG_outputRepr *repr, bool destroy, + std::map<std::string, std::vector<omega::CG_outputRepr * > > &uninterpreted_symbols, + std::map<std::string, std::vector<omega::CG_outputRepr * > > &uninterpreted_symbols_stringrepr); + bool is_single_iteration(const omega::Relation &r, int dim); -//! Set/get the value of a variable which is know to be constant. void assign_const(omega::Relation &r, int dim, int val); - int get_const(const omega::Relation &r, int dim, omega::Var_Kind type); - -//! Find the position index variable in a Relation by name. omega::Variable_ID find_index(omega::Relation &r, const std::string &s, char side); - -//! Generate mapping relation for permuation. omega::Relation permute_relation(const std::vector<int> &pi); - omega::Relation get_loop_bound(const omega::Relation &r, int dim); - -//! Determine whether the loop (starting from 0) in the iteration space has only one iteration. bool is_single_loop_iteration(const omega::Relation &r, int level, const omega::Relation &known); -//! Get the bound for a specific loop. omega::Relation get_loop_bound(const omega::Relation &r, int level, const omega::Relation &known); omega::Relation get_max_loop_bound(const std::vector<omega::Relation> &r, int dim); omega::Relation get_min_loop_bound(const std::vector<omega::Relation> &r, int dim); - -//! Add strident to a loop. -/*! - * Issues: - * - * * Don't work with relations with multiple disjuncts. - * * Omega's dealing with max lower bound is awkward. - */ void add_loop_stride(omega::Relation &r, const omega::Relation &bound, int dim, int stride); bool is_inner_loop_depend_on_level(const omega::Relation &r, int level, const omega::Relation &known); -/*! - * Suppose loop dim is i. Replace i with i+adjustment in loop bounds. - * - * ~~~ - * do i = 1, n - * do j = i, n - * ~~~ - * - * after call with dim = 0 and adjustment = 1: - * - * ~~~ - * do i = 1, n - * do j = i+1, n - * ~~~ - */ +// void adjust_loop_bound(omega::Relation &r, int dim, int adjustment, std::vector<omega::Free_Var_Decl *> globals = std::vector<omega::Free_Var_Decl *>()); omega::Relation adjust_loop_bound(const omega::Relation &r, int level, int adjustment); +bool lowerBoundIsZero(const omega::Relation &bound, int dim); +omega::Relation and_with_relation_and_replace_var(const omega::Relation &R, omega::Variable_ID v1, + omega::Relation &g); +omega::Relation replicate_IS_and_add_at_pos(const omega::Relation &R, int level, omega::Relation &bound); +omega::Relation replicate_IS_and_add_bound(const omega::Relation &R, int level, omega::Relation &bound) ; + +omega::CG_outputRepr * construct_int_floor(omega::CG_outputBuilder * ocg, const omega::Relation &R, const omega::GEQ_Handle &h, omega::Variable_ID v,const std::vector<std::pair<omega::CG_outputRepr *, int> > &assigned_on_the_fly, + std::map<std::string, std::vector<omega::CG_outputRepr *> > unin); +//omega::CG_outputRepr * modified_output_subs_repr(omega::CG_outputBuilder * ocg, const omega::Relation &R, const omega::EQ_Handle &h, omega::Variable_ID v,const std::vector<std::pair<omega::CG_outputRepr *, int> > &assigned_on_the_fly, +// std::map<std::string, std::vector<omega::CG_outputRepr *> > unin); +std::pair<omega::Relation, bool> replace_set_var_as_existential(const omega::Relation &R,int pos, std::vector<omega::Relation> &bound); +omega::Relation replace_set_var_as_Global(const omega::Relation &R,int pos,std::vector<omega::Relation> &bound); +omega::Relation replace_set_var_as_another_set_var(const omega::Relation &old_relation, const omega::Relation &new_relation, int old_pos, int new_pos); +omega::Relation extract_upper_bound(const omega::Relation &R, omega::Variable_ID v1); + +// void adjust_loop_bound(Relation &r, int dim, int adjustment); +// void adjust_loop_bound(Relation &r, int dim, Free_Var_Decl *global_var, int adjustment); +// boolean is_private_statement(const omega::Relation &r, int dim); + +// coef_t mod(const Relation &r, Variable_ID v, int dividend); + enum LexicalOrderType {LEX_MATCH, LEX_BEFORE, LEX_AFTER, LEX_UNKNOWN}; +// template <typename T> +// LexicalOrderType lexical_order(const std::vector<T> &a, const std::vector<T> &b) { +// int size = min(a.size(), b.size()); +// for (int i = 0; i < size; i++) { +// if (a[i] < b[i]) +// return LEX_BEFORE; +// else if (b[i] < a[i]) +// return LEX_AFTER; +// } +// if (a.size() < b.size()) +// return LEX_BEFORE; +// else if (b.size() < a.size()) +// return LEX_AFTER; +// else +// return LEX_MATCH; +// } + +// struct LoopException { +// std::string descr; +// LoopException(const std::string &s): descr(s) {}; +// }; + #endif |