Fix include directory for libcloog-isl
[cloog.git] / include / cloog / clast.h
blobfd56dd75aeb9df83001f93a30158ae70f06bea8a
1 #ifndef CLOOG_CLAST_H
2 #define CLOOG_CLAST_H
3 #if defined(__cplusplus)
4 extern "C"
6 #endif
8 enum clast_expr_type {
9 clast_expr_name,
10 clast_expr_term,
11 clast_expr_bin,
12 clast_expr_red
14 struct clast_expr {
15 enum clast_expr_type type;
18 struct clast_name {
19 struct clast_expr expr;
20 const char * name;
23 /* Represents the term
24 * val * var (if var != NULL)
25 * or
26 * val (if var == NULL)
28 struct clast_term {
29 struct clast_expr expr;
30 cloog_int_t val;
31 struct clast_expr *var;
34 #define CLAST_PARALLEL_NOT 0
35 #define CLAST_PARALLEL_OMP 1
36 #define CLAST_PARALLEL_MPI 2
37 #define CLAST_PARALLEL_VEC 4
39 enum clast_red_type { clast_red_sum, clast_red_min, clast_red_max };
40 struct clast_reduction {
41 struct clast_expr expr;
42 enum clast_red_type type;
43 int n;
44 struct clast_expr* elts[1];
47 enum clast_bin_type { clast_bin_fdiv, clast_bin_cdiv,
48 clast_bin_div, clast_bin_mod };
49 struct clast_binary {
50 struct clast_expr expr;
51 enum clast_bin_type type;
52 struct clast_expr* LHS;
53 cloog_int_t RHS;
56 struct clast_stmt;
57 struct clast_stmt_op {
58 void (*free)(struct clast_stmt *);
61 #define CLAST_STMT_IS_A(stmt, type) ((stmt)->op == &(type))
63 extern const struct clast_stmt_op stmt_root;
64 extern const struct clast_stmt_op stmt_ass;
65 extern const struct clast_stmt_op stmt_user;
66 extern const struct clast_stmt_op stmt_block;
67 extern const struct clast_stmt_op stmt_for;
68 extern const struct clast_stmt_op stmt_guard;
70 struct clast_stmt {
71 const struct clast_stmt_op *op;
72 struct clast_stmt *next;
75 struct clast_root {
76 struct clast_stmt stmt;
77 CloogNames * names; /**< Names of iterators and parameters. */
80 struct clast_assignment {
81 struct clast_stmt stmt;
82 const char * LHS;
83 struct clast_expr * RHS;
86 struct clast_block {
87 struct clast_stmt stmt;
88 struct clast_stmt * body;
91 struct clast_user_stmt {
92 struct clast_stmt stmt;
93 CloogDomain * domain;
94 CloogStatement * statement;
95 struct clast_stmt * substitutions;
98 struct 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;
113 struct clast_equation {
114 struct clast_expr * LHS;
115 struct clast_expr * RHS;
116 int sign;
119 struct clast_guard {
120 struct clast_stmt stmt;
121 struct clast_stmt * then;
122 int n;
123 struct clast_equation eq[1];
127 struct clast_stmt *cloog_clast_create_from_input(CloogInput *input,
128 CloogOptions *options);
129 struct clast_stmt *cloog_clast_create(CloogProgram *program,
130 CloogOptions *options);
131 void cloog_clast_free(struct clast_stmt *s);
133 struct clast_name *new_clast_name(const char *name);
134 struct clast_term *new_clast_term(cloog_int_t c, struct clast_expr *v);
135 struct clast_binary *new_clast_binary(enum clast_bin_type t,
136 struct clast_expr *lhs, cloog_int_t rhs);
137 struct clast_reduction *new_clast_reduction(enum clast_red_type t, int n);
138 struct clast_root *new_clast_root(CloogNames *names);
139 struct clast_assignment *new_clast_assignment(const char *lhs,
140 struct clast_expr *rhs);
141 struct clast_user_stmt *new_clast_user_stmt(CloogDomain *domain,
142 CloogStatement *stmt, struct clast_stmt *subs);
143 struct clast_block *new_clast_block(void);
144 struct clast_for *new_clast_for(CloogDomain *domain, const char *it,
145 struct clast_expr *LB, struct clast_expr *UB,
146 CloogStride *stride);
147 struct clast_guard *new_clast_guard(int n);
149 void free_clast_name(struct clast_name *t);
150 void free_clast_term(struct clast_term *t);
151 void free_clast_binary(struct clast_binary *b);
152 void free_clast_reduction(struct clast_reduction *r);
153 void free_clast_expr(struct clast_expr *e);
154 void free_clast_stmt(struct clast_stmt *s);
156 int clast_expr_equal(struct clast_expr *e1, struct clast_expr *e2);
158 struct clast_expr *clast_bound_from_constraint(CloogConstraint *constraint,
159 int level, CloogNames *names);
161 typedef enum filterType {exact, subset} ClastFilterType;
163 typedef struct clastFilter{
164 const char *iter;
165 const int *stmts_filter;
166 int nstmts_filter;
167 ClastFilterType filter_type;
168 } ClastFilter;
170 void clast_filter(struct clast_stmt *node, ClastFilter filter,
171 struct clast_for ***loops, int *nloops, int **stmts, int *nstmts);
173 #if defined(__cplusplus)
175 #endif
176 #endif /* define _H */