/* Used by libpluto interface */ static int extract_stmt(__isl_take isl_set *set, void *user) { int r; Stmt **stmts; int id, i; stmts = (Stmt **) user; int dim = isl_set_dim(set, isl_dim_all); int npar = isl_set_dim(set, isl_dim_param); PlutoMatrix *trans = pluto_matrix_alloc(dim-npar, dim+1); pluto_matrix_set(trans, 0); trans->nrows = 0; /* A statement's domain (isl_set) should be named S_%d */ const char *name = isl_set_get_tuple_name(set); assert(name); assert(strlen(name) >= 3); assert(name[0] == 'S'); assert(name[1] == '_'); assert(isdigit(name[2])); id = atoi(isl_set_get_tuple_name(set)+2); stmts[id] = pluto_stmt_alloc(dim-npar, NULL, trans); Stmt *stmt = stmts[id]; stmt->type = ORIG; stmt->id = id; for (i=0; i<stmt->dim; i++) { char *iter = malloc(5); sprintf(iter, "i%d", i); stmt->iterators[i] = iter; } struct pluto_extra_stmt_info info = {stmts, id}; r = isl_set_foreach_basic_set(set, &extract_basic_set, &info); pluto_constraints_set_names_range(stmt->domain, stmt->iterators, 0, 0, stmt->dim); for (i=0; i<npar; i++) { char *param = malloc(5); sprintf(param, "p%d", i); stmt->domain->names[stmt->dim+i] = param; } pluto_matrix_free(trans); int j; for (j=0; j<stmt->dim; j++) { stmt->is_orig_loop[j] = true; } isl_set_free(set); return r; }
/* Return an identity matrix of size: size x size */ PlutoMatrix *pluto_matrix_identity(int size) { int i; PlutoMatrix *mat = pluto_matrix_alloc(size, size); pluto_matrix_set(mat, 0); for (i=0; i<size; i++) { mat->val[i][i] = 1; } return mat; }