summaryrefslogtreecommitdiff
path: root/include/omegatools.hh
diff options
context:
space:
mode:
Diffstat (limited to 'include/omegatools.hh')
-rw-r--r--include/omegatools.hh120
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