#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 */