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