1 #ifndef CLOOG_CLAST_H
2 #define CLOOG_CLAST_H
3 #if defined(__cplusplus)
4 extern "C"
5   {
6 #endif
7 
8 enum clast_expr_type {
9     clast_expr_name,
10     clast_expr_term,
11     clast_expr_bin,
12     clast_expr_red
13 };
14 struct clast_expr {
15     enum clast_expr_type type;
16 };
17 
18 struct 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  */
28 struct 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 
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];
45 };
46 
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;
54 };
55 
56 struct clast_stmt;
57 struct clast_stmt_op {
58     void (*free)(struct clast_stmt *);
59 };
60 
61 #define CLAST_STMT_IS_A(stmt, type) ((stmt)->op == &(type))
62 
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;
69 
70 struct clast_stmt {
71     const struct clast_stmt_op    *op;
72     struct clast_stmt	*next;
73 };
74 
75 struct clast_root {
76     struct clast_stmt	stmt;
77     CloogNames *	names;       /**< Names of iterators and parameters. */
78 };
79 
80 struct clast_assignment {
81     struct clast_stmt	stmt;
82     const char *	LHS;
83     struct clast_expr *	RHS;
84 };
85 
86 struct clast_block {
87     struct clast_stmt	stmt;
88     struct clast_stmt *	body;
89 };
90 
91 struct clast_user_stmt {
92     struct clast_stmt	stmt;
93     CloogDomain *	domain;
94     CloogStatement *	statement;
95     struct clast_stmt *	substitutions;
96 };
97 
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;
111 };
112 
113 struct clast_equation {
114     struct clast_expr *	LHS;
115     struct clast_expr *	RHS;
116     int			sign;
117 };
118 
119 struct clast_guard {
120     struct clast_stmt	stmt;
121     struct clast_stmt *	then;
122     int			n;
123     struct clast_equation	eq[1];
124 };
125 
126 
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);
132 
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);
148 
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);
155 
156 int clast_expr_equal(struct clast_expr *e1, struct clast_expr *e2);
157 
158 struct clast_expr *clast_bound_from_constraint(CloogConstraint *constraint,
159 					       int level, CloogNames *names);
160 
161 typedef enum filterType {exact, subset} ClastFilterType;
162 
163 typedef struct clastFilter{
164     const char *iter;
165     const int *stmts_filter;
166     int nstmts_filter;
167     ClastFilterType filter_type;
168 } ClastFilter;
169 
170 void 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