1#ifndef CLOOG_CLAST_H 2#define CLOOG_CLAST_H 3#if defined(__cplusplus) 4extern "C" 5 { 6#endif 7 8enum clast_expr_type { 9 clast_expr_name, 10 clast_expr_term, 11 clast_expr_bin, 12 clast_expr_red 13}; 14struct clast_expr { 15 enum clast_expr_type type; 16}; 17 18struct clast_name { 19 struct clast_expr expr; 20 const char * name; 21}; 22 23/* Represents the term 24 * val * var (if var != NULL) 25 * or 26 * val (if var == NULL) 27 */ 28struct clast_term { 29 struct clast_expr expr; 30 cloog_int_t val; 31 struct clast_expr *var; 32}; 33 34#define CLAST_PARALLEL_NOT 0 35#define CLAST_PARALLEL_OMP 1 36#define CLAST_PARALLEL_MPI 2 37#define CLAST_PARALLEL_VEC 4 38 39enum clast_red_type { clast_red_sum, clast_red_min, clast_red_max }; 40struct clast_reduction { 41 struct clast_expr expr; 42 enum clast_red_type type; 43 int n; 44 struct clast_expr* elts[1]; 45}; 46 47enum clast_bin_type { clast_bin_fdiv, clast_bin_cdiv, 48 clast_bin_div, clast_bin_mod }; 49struct clast_binary { 50 struct clast_expr expr; 51 enum clast_bin_type type; 52 struct clast_expr* LHS; 53 cloog_int_t RHS; 54}; 55 56struct clast_stmt; 57struct clast_stmt_op { 58 void (*free)(struct clast_stmt *); 59}; 60 61#define CLAST_STMT_IS_A(stmt, type) ((stmt)->op == &(type)) 62 63extern const struct clast_stmt_op stmt_root; 64extern const struct clast_stmt_op stmt_ass; 65extern const struct clast_stmt_op stmt_user; 66extern const struct clast_stmt_op stmt_block; 67extern const struct clast_stmt_op stmt_for; 68extern const struct clast_stmt_op stmt_guard; 69 70struct clast_stmt { 71 const struct clast_stmt_op *op; 72 struct clast_stmt *next; 73}; 74 75struct clast_root { 76 struct clast_stmt stmt; 77 CloogNames * names; /**< Names of iterators and parameters. */ 78}; 79 80struct clast_assignment { 81 struct clast_stmt stmt; 82 const char * LHS; 83 struct clast_expr * RHS; 84}; 85 86struct clast_block { 87 struct clast_stmt stmt; 88 struct clast_stmt * body; 89}; 90 91struct clast_user_stmt { 92 struct clast_stmt stmt; 93 CloogDomain * domain; 94 CloogStatement * statement; 95 struct clast_stmt * substitutions; 96}; 97 98struct clast_for { 99 struct clast_stmt stmt; 100 CloogDomain * domain; 101 const char * iterator; 102 struct clast_expr * LB; 103 struct clast_expr * UB; 104 cloog_int_t stride; 105 struct clast_stmt * body; 106 int parallel; 107 /* Comma separated list of loop private variables for OpenMP parallelization */ 108 char *private_vars; 109 /* Comma separated list of reduction variable/operators for OpenMP parallelization */ 110 char *reduction_vars; 111}; 112 113struct clast_equation { 114 struct clast_expr * LHS; 115 struct clast_expr * RHS; 116 int sign; 117}; 118 119struct clast_guard { 120 struct clast_stmt stmt; 121 struct clast_stmt * then; 122 int n; 123 struct clast_equation eq[1]; 124}; 125 126 127struct clast_stmt *cloog_clast_create_from_input(CloogInput *input, 128 CloogOptions *options); 129struct clast_stmt *cloog_clast_create(CloogProgram *program, 130 CloogOptions *options); 131void cloog_clast_free(struct clast_stmt *s); 132 133struct clast_name *new_clast_name(const char *name); 134struct clast_term *new_clast_term(cloog_int_t c, struct clast_expr *v); 135struct clast_binary *new_clast_binary(enum clast_bin_type t, 136 struct clast_expr *lhs, cloog_int_t rhs); 137struct clast_reduction *new_clast_reduction(enum clast_red_type t, int n); 138struct clast_root *new_clast_root(CloogNames *names); 139struct clast_assignment *new_clast_assignment(const char *lhs, 140 struct clast_expr *rhs); 141struct clast_user_stmt *new_clast_user_stmt(CloogDomain *domain, 142 CloogStatement *stmt, struct clast_stmt *subs); 143struct clast_block *new_clast_block(void); 144struct clast_for *new_clast_for(CloogDomain *domain, const char *it, 145 struct clast_expr *LB, struct clast_expr *UB, 146 CloogStride *stride); 147struct clast_guard *new_clast_guard(int n); 148 149void free_clast_name(struct clast_name *t); 150void free_clast_term(struct clast_term *t); 151void free_clast_binary(struct clast_binary *b); 152void free_clast_reduction(struct clast_reduction *r); 153void free_clast_expr(struct clast_expr *e); 154void free_clast_stmt(struct clast_stmt *s); 155 156int clast_expr_equal(struct clast_expr *e1, struct clast_expr *e2); 157 158struct clast_expr *clast_bound_from_constraint(CloogConstraint *constraint, 159 int level, CloogNames *names); 160 161typedef enum filterType {exact, subset} ClastFilterType; 162 163typedef struct clastFilter{ 164 const char *iter; 165 const int *stmts_filter; 166 int nstmts_filter; 167 ClastFilterType filter_type; 168} ClastFilter; 169 170void clast_filter(struct clast_stmt *node, ClastFilter filter, 171 struct clast_for ***loops, int *nloops, int **stmts, int *nstmts); 172 173#if defined(__cplusplus) 174 } 175#endif 176#endif /* define _H */ 177