#ifndef CLOOG_CLAST_H
#define CLOOG_CLAST_H
#if defined(__cplusplus)
extern "C"
{
#endif
enum clast_expr_type {
clast_expr_name,
clast_expr_term,
clast_expr_bin,
clast_expr_red
};
struct clast_expr {
enum clast_expr_type type;
};
struct clast_name {
struct clast_expr expr;
const char * name;
};
/* Represents the term
* val * var (if var != NULL)
* or
* val (if var == NULL)
*/
struct clast_term {
struct clast_expr expr;
cloog_int_t val;
struct clast_expr *var;
};
#define CLAST_PARALLEL_NOT 0
#define CLAST_PARALLEL_OMP 1
#define CLAST_PARALLEL_MPI 2
#define CLAST_PARALLEL_VEC 4
enum clast_red_type { clast_red_sum, clast_red_min, clast_red_max };
struct clast_reduction {
struct clast_expr expr;
enum clast_red_type type;
int n;
struct clast_expr* elts[1];
};
enum clast_bin_type { clast_bin_fdiv, clast_bin_cdiv,
clast_bin_div, clast_bin_mod };
struct clast_binary {
struct clast_expr expr;
enum clast_bin_type type;
struct clast_expr* LHS;
cloog_int_t RHS;
};
struct clast_stmt;
struct clast_stmt_op {
void (*free)(struct clast_stmt *);
};
#define CLAST_STMT_IS_A(stmt, type) ((stmt)->op == &(type))
extern const struct clast_stmt_op stmt_root;
extern const struct clast_stmt_op stmt_ass;
extern const struct clast_stmt_op stmt_user;
extern const struct clast_stmt_op stmt_block;
extern const struct clast_stmt_op stmt_for;
extern const struct clast_stmt_op stmt_guard;
struct clast_stmt {
const struct clast_stmt_op *op;
struct clast_stmt *next;
};
struct clast_root {
struct clast_stmt stmt;
CloogNames * names; /**< Names of iterators and parameters. */
};
struct clast_assignment {
struct clast_stmt stmt;
const char * LHS;
struct clast_expr * RHS;
};
struct clast_block {
struct clast_stmt stmt;
struct clast_stmt * body;
};
struct clast_user_stmt {
struct clast_stmt stmt;
CloogDomain * domain;
CloogStatement * statement;
struct clast_stmt * substitutions;
};
struct clast_for {
struct clast_stmt stmt;
CloogDomain * domain;
const char * iterator;
struct clast_expr * LB;
struct clast_expr * UB;
cloog_int_t stride;
struct clast_stmt * body;
int parallel;
/* Comma separated list of loop private variables for OpenMP parallelization */
char *private_vars;
/* Comma separated list of reduction variable/operators for OpenMP parallelization */
char *reduction_vars;
};
struct clast_equation {
struct clast_expr * LHS;
struct clast_expr * RHS;
int sign;
};
struct clast_guard {
struct clast_stmt stmt;
struct clast_stmt * then;
int n;
struct clast_equation eq[1];
};
struct clast_stmt *cloog_clast_create_from_input(CloogInput *input,
CloogOptions *options);
struct clast_stmt *cloog_clast_create(CloogProgram *program,
CloogOptions *options);
void cloog_clast_free(struct clast_stmt *s);
struct clast_name *new_clast_name(const char *name);
struct clast_term *new_clast_term(cloog_int_t c, struct clast_expr *v);
struct clast_binary *new_clast_binary(enum clast_bin_type t,
struct clast_expr *lhs, cloog_int_t rhs);
struct clast_reduction *new_clast_reduction(enum clast_red_type t, int n);
struct clast_root *new_clast_root(CloogNames *names);
struct clast_assignment *new_clast_assignment(const char *lhs,
struct clast_expr *rhs);
struct clast_user_stmt *new_clast_user_stmt(CloogDomain *domain,
CloogStatement *stmt, struct clast_stmt *subs);
struct clast_block *new_clast_block(void);
struct clast_for *new_clast_for(CloogDomain *domain, const char *it,
struct clast_expr *LB, struct clast_expr *UB,
CloogStride *stride);
struct clast_guard *new_clast_guard(int n);
void free_clast_name(struct clast_name *t);
void free_clast_term(struct clast_term *t);
void free_clast_binary(struct clast_binary *b);
void free_clast_reduction(struct clast_reduction *r);
void free_clast_expr(struct clast_expr *e);
void free_clast_stmt(struct clast_stmt *s);
int clast_expr_equal(struct clast_expr *e1, struct clast_expr *e2);
struct clast_expr *clast_bound_from_constraint(CloogConstraint *constraint,
int level, CloogNames *names);
typedef enum filterType {exact, subset} ClastFilterType;
typedef struct clastFilter{
const char *iter;
const int *stmts_filter;
int nstmts_filter;
ClastFilterType filter_type;
} ClastFilter;
void clast_filter(struct clast_stmt *node, ClastFilter filter,
struct clast_for ***loops, int *nloops, int **stmts, int *nstmts);
#if defined(__cplusplus)
}
#endif
#endif /* define _H */