diff options
Diffstat (limited to 'cloog-core/source/matrix.c')
-rw-r--r-- | cloog-core/source/matrix.c | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/cloog-core/source/matrix.c b/cloog-core/source/matrix.c new file mode 100644 index 0000000..43c2380 --- /dev/null +++ b/cloog-core/source/matrix.c @@ -0,0 +1,213 @@ + /**-------------------------------------------------------------------** + ** CLooG ** + **-------------------------------------------------------------------** + ** cloogmatrix.c ** + **-------------------------------------------------------------------**/ + + +/****************************************************************************** + * CLooG : the Chunky Loop Generator (experimental) * + ****************************************************************************** + * * + * Copyright (C) 2001-2005 Cedric Bastoul * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, * + * Boston, MA 02110-1301 USA * + * * + * CLooG, the Chunky Loop Generator * + * Written by Cedric Bastoul, Cedric.Bastoul@inria.fr * + * * + ******************************************************************************/ + +#include <ctype.h> +#include <stdlib.h> +#include <stdio.h> +#include "../include/cloog/cloog.h" + +/** + * cloog_matrix_alloc: + * Allocate a CloogMatrix data structure with NbRows rows and NbColumns columns. + * All values are initialized to 0. + * This method returns a pointer to the data structure if successful or a NULL + * pointer otherwise. + */ +CloogMatrix *cloog_matrix_alloc(unsigned NbRows, unsigned NbColumns) +{ + CloogMatrix *matrix; + cloog_int_t **p, *q; + int i, j; + + matrix = (CloogMatrix *)malloc(sizeof(CloogMatrix)); + + if (!matrix) + return NULL; + + matrix->NbRows = NbRows; + matrix->NbColumns = NbColumns; + + if (!NbRows || !NbColumns) { + matrix->p = NULL; + matrix->p_Init = NULL; + return matrix; + } + + p = (cloog_int_t **)malloc(NbRows * sizeof(cloog_int_t *)); + + if (p == NULL) { + free (matrix); + return NULL; + } + + q = (cloog_int_t *)malloc(NbRows * NbColumns * sizeof(cloog_int_t)); + + if (q == NULL) { + free (matrix); + free (p); + return NULL; + } + + matrix->p = p; + matrix->p_Init = q; + + for (i = 0; i < NbRows; i++) { + *p++ = q; + for (j = 0; j < NbColumns; j++) { + cloog_int_init(*(q+j)); + cloog_int_set_si(*(q+j), 0); + } + q += NbColumns; + } + + return matrix; +} + +/** + * cloog_matrix_free: + * Free matrix. + */ +void cloog_matrix_free(CloogMatrix * matrix) +{ + int i; + cloog_int_t *p; + int size = matrix->NbRows * matrix->NbColumns; + + p = matrix->p_Init; + + for (i = 0; i < size; i++) + cloog_int_clear(*p++); + + if (matrix) { + free(matrix->p_Init); + free(matrix->p); + free(matrix); + } +} + + +/** + * Print the elements of CloogMatrix M to file, with each row prefixed + * by prefix and suffixed by suffix. + */ +void cloog_matrix_print_structure(FILE *file, CloogMatrix *M, + const char *prefix, const char *suffix) +{ + int i, j; + + for (i = 0; i < M->NbRows; ++i) { + fprintf(file, "%s", prefix); + for (j = 0; j < M->NbColumns; ++j) { + cloog_int_print(file, M->p[i][j]); + fprintf(file, " "); + } + fprintf(file, "%s\n", suffix); + } +} + +/** + * cloog_matrix_print function: + * This function prints the content of a CloogMatrix structure (matrix) into a + * file (foo, possibly stdout). + */ +void cloog_matrix_print(FILE* foo, CloogMatrix* m) +{ + if (!m) + fprintf(foo, "(null)\n"); + + fprintf(foo, "%d %d\n", m->NbRows, m->NbColumns); + cloog_matrix_print_structure(foo, m, "", ""); + fflush(foo); +} + + +static char *next_line(FILE *input, char *line, unsigned len) +{ + char *p; + + do { + if (!(p = fgets(line, len, input))) + return NULL; + while (isspace(*p) && *p != '\n') + ++p; + } while (*p == '#' || *p == '\n'); + + return p; +} + +CloogMatrix *cloog_matrix_read(FILE *input) +{ + unsigned n_row, n_col; + char line[1024]; + + if (!next_line(input, line, sizeof(line))) + cloog_die("Input error.\n"); + if (sscanf(line, "%u %u", &n_row, &n_col) != 2) + cloog_die("Input error.\n"); + + return cloog_matrix_read_of_size(input, n_row, n_col); +} + +/** + * Read a matrix in PolyLib format from input. + */ +CloogMatrix *cloog_matrix_read_of_size(FILE *input, + unsigned n_row, unsigned n_col) +{ + CloogMatrix *M; + int i, j; + char line[1024]; + char val[1024]; + char *p; + + M = cloog_matrix_alloc(n_row, n_col); + if (!M) + cloog_die("memory overflow.\n"); + for (i = 0; i < n_row; ++i) { + int offset; + int n; + + p = next_line(input, line, sizeof(line)); + if (!p) + cloog_die("Input error.\n"); + for (j = 0; j < n_col; ++j) { + n = sscanf(p, "%s%n", val, &offset); + if (!n) + cloog_die("Input error.\n"); + cloog_int_read(M->p[i][j], val); + p += offset; + } + } + + return M; +} |