⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.c

📁 主要进行大规模的电路综合
💻 C
字号:
/* * Revision Control Information * * /projects/hsis/CVS/utilities/sparse/matrix.c,v * rajeev * 1.2 * 1995/08/08 22:40:58 * */#include <stdio.h>#include "sparse_int.h"/* *  free-lists are only used if 'FAST_AND_LOOSE' is set; this is because *  we lose the debugging capability of libmm_t which trashes objects when *  they are free'd.  However, FAST_AND_LOOSE is much faster if matrices *  are created and freed frequently. */#ifdef FAST_AND_LOOSEsm_element *sm_element_freelist;sm_row *sm_row_freelist;sm_col *sm_col_freelist;#endifsm_matrix *sm_allocate(){    register sm_matrix *A;    A = ALLOC(sm_matrix, 1);    A->rows = NIL(sm_row *);    A->cols = NIL(sm_col *);    A->nrows = A->ncols = 0;    A->rows_size = A->cols_size = 0;    A->first_row = A->last_row = NIL(sm_row);    A->first_col = A->last_col = NIL(sm_col);    A->user_word = NIL(char);		/* for our user ... */    return A;}sm_matrix *sm_alloc_size(row, col)int row, col;{    register sm_matrix *A;    A = sm_alloc();    sm_resize(A, row, col);    return A;}voidsm_free_space(A)sm_matrix *A;{#ifdef FAST_AND_LOOSE    register sm_row *prow;    if (A->first_row != 0) {	for(prow = A->first_row; prow != 0; prow = prow->next_row) {	    /* add the elements to the free list of elements */	    prow->last_col->next_col = sm_element_freelist;	    sm_element_freelist = prow->first_col;	}	/* Add the linked list of rows to the row-free-list */	A->last_row->next_row = sm_row_freelist;	sm_row_freelist = A->first_row;	/* Add the linked list of cols to the col-free-list */	A->last_col->next_col = sm_col_freelist;	sm_col_freelist = A->first_col;    }#else    register sm_row *prow, *pnext_row;    register sm_col *pcol, *pnext_col;    for(prow = A->first_row; prow != 0; prow = pnext_row) {	pnext_row = prow->next_row;	sm_row_free(prow);    }    for(pcol = A->first_col; pcol != 0; pcol = pnext_col) {	pnext_col = pcol->next_col;	pcol->first_row = pcol->last_row = NIL(sm_element);	sm_col_free(pcol);    }#endif    /* Free the arrays to map row/col numbers into pointers */    FREE(A->rows);    FREE(A->cols);    FREE(A);}sm_matrix *sm_dup(A)sm_matrix *A; {    register sm_row *prow;    register sm_element *p;    register sm_matrix *B;    B = sm_alloc();    if (A->last_row != 0) {	sm_resize(B, A->last_row->row_num, A->last_col->col_num);	for(prow = A->first_row; prow != 0; prow = prow->next_row) {	    for(p = prow->first_col; p != 0; p = p->next_col) {		(void) sm_insert(B, p->row_num, p->col_num);	    }	}    }    return B;}void sm_resize(A, row, col)register sm_matrix *A;int row, col;{    register int i, new_size;    if (row >= A->rows_size) {	new_size = MAX(A->rows_size*2, row+1);	A->rows = REALLOC(sm_row *, A->rows, new_size);	for(i = A->rows_size; i < new_size; i++) {	    A->rows[i] = NIL(sm_row);	}	A->rows_size = new_size;    }    if (col >= A->cols_size) {	new_size = MAX(A->cols_size*2, col+1);	A->cols = REALLOC(sm_col *, A->cols, new_size);	for(i = A->cols_size; i < new_size; i++) {	    A->cols[i] = NIL(sm_col);	}	A->cols_size = new_size;    }}/*   *  insert -- insert a value into the matrix */sm_element *sm_insert(A, row, col)register sm_matrix *A;register int row, col;{    register sm_row *prow;    register sm_col *pcol;    register sm_element *element;    sm_element *save_element;    if (row >= A->rows_size || col >= A->cols_size) {	sm_resize(A, row, col);    }    prow = A->rows[row];    if (prow == NIL(sm_row)) {	prow = A->rows[row] = sm_row_alloc();	prow->row_num = row;	sorted_insert(sm_row, A->first_row, A->last_row, A->nrows, 			next_row, prev_row, row_num, row, prow);    }    pcol = A->cols[col];    if (pcol == NIL(sm_col)) {	pcol = A->cols[col] = sm_col_alloc();	pcol->col_num = col;	sorted_insert(sm_col, A->first_col, A->last_col, A->ncols, 			next_col, prev_col, col_num, col, pcol);    }    /* get a new item, save its address */    sm_element_alloc(element);    save_element = element;    /* insert it into the row list */    sorted_insert(sm_element, prow->first_col, prow->last_col, 		prow->length, next_col, prev_col, col_num, col, element);    /* if it was used, also insert it into the column list */    if (element == save_element) {	sorted_insert(sm_element, pcol->first_row, pcol->last_row, 		pcol->length, next_row, prev_row, row_num, row, element);    } else {	/* otherwise, it was already in matrix -- free element we allocated */	sm_element_free(save_element);    }    return element;}sm_element *sm_find(A, rownum, colnum)sm_matrix *A;int rownum, colnum;{    sm_row *prow;    sm_col *pcol;    prow = sm_get_row(A, rownum);    if (prow == NIL(sm_row)) {	return NIL(sm_element);    } else {	pcol = sm_get_col(A, colnum);	if (pcol == NIL(sm_col)) {	    return NIL(sm_element);	}	if (prow->length < pcol->length) {	    return sm_row_find(prow, colnum);	} else {	    return sm_col_find(pcol, rownum);	}    }}voidsm_remove(A, rownum, colnum)sm_matrix *A;int rownum, colnum;{    sm_remove_element(A, sm_find(A, rownum, colnum));}voidsm_remove_element(A, p)register sm_matrix *A; register sm_element *p;{    register sm_row *prow;    register sm_col *pcol;    if (p == 0) return;    /* Unlink the element from its row */    prow = sm_get_row(A, p->row_num);    dll_unlink(p, prow->first_col, prow->last_col, 			next_col, prev_col, prow->length);    /* if no more elements in the row, discard the row header */    if (prow->first_col == NIL(sm_element)) {	sm_delrow(A, p->row_num);    }    /* Unlink the element from its column */    pcol = sm_get_col(A, p->col_num);    dll_unlink(p, pcol->first_row, pcol->last_row, 			next_row, prev_row, pcol->length);    /* if no more elements in the column, discard the column header */    if (pcol->first_row == NIL(sm_element)) {	sm_delcol(A, p->col_num);    }    sm_element_free(p);}void sm_delrow(A, i)sm_matrix *A;int i;{    register sm_element *p, *pnext;    sm_col *pcol;    sm_row *prow;    prow = sm_get_row(A, i);    if (prow != NIL(sm_row)) {	/* walk across the row */	for(p = prow->first_col; p != 0; p = pnext) {	    pnext = p->next_col;	    /* unlink the item from the column (and delete it) */	    pcol = sm_get_col(A, p->col_num);	    sm_col_remove_element(pcol, p);	    /* discard the column if it is now empty */	    if (pcol->first_row == NIL(sm_element)) {		sm_delcol(A, pcol->col_num);	    }	}	/* discard the row -- we already threw away the elements */ 	A->rows[i] = NIL(sm_row);	dll_unlink(prow, A->first_row, A->last_row, 				next_row, prev_row, A->nrows);	prow->first_col = prow->last_col = NIL(sm_element);	sm_row_free(prow);    }}void sm_delcol(A, i)sm_matrix *A;int i;{    register sm_element *p, *pnext;    sm_row *prow;    sm_col *pcol;    pcol = sm_get_col(A, i);    if (pcol != NIL(sm_col)) {	/* walk down the column */	for(p = pcol->first_row; p != 0; p = pnext) {	    pnext = p->next_row;	    /* unlink the element from the row (and delete it) */	    prow = sm_get_row(A, p->row_num);	    sm_row_remove_element(prow, p);	    /* discard the row if it is now empty */	    if (prow->first_col == NIL(sm_element)) {		sm_delrow(A, prow->row_num);	    }	}	/* discard the column -- we already threw away the elements */ 	A->cols[i] = NIL(sm_col);	dll_unlink(pcol, A->first_col, A->last_col, 			    next_col, prev_col, A->ncols);	pcol->first_row = pcol->last_row = NIL(sm_element);	sm_col_free(pcol);    }}voidsm_copy_row(dest, dest_row, prow)register sm_matrix *dest;int dest_row;sm_row *prow;{    register sm_element *p;    for(p = prow->first_col; p != 0; p = p->next_col) {	(void) sm_insert(dest, dest_row, p->col_num);    }}voidsm_copy_col(dest, dest_col, pcol)register sm_matrix *dest;int dest_col;sm_col *pcol;{    register sm_element *p;    for(p = pcol->first_row; p != 0; p = p->next_row) {	(void) sm_insert(dest, dest_col, p->row_num);    }}sm_row *sm_longest_row(A)sm_matrix *A;{    register sm_row *large_row, *prow;    register int max_length;    max_length = 0;    large_row = NIL(sm_row);    for(prow = A->first_row; prow != 0; prow = prow->next_row) {	if (prow->length > max_length) {	    max_length = prow->length;	    large_row = prow;	}    }    return large_row;}sm_col *sm_longest_col(A)sm_matrix *A;{    register sm_col *large_col, *pcol;    register int max_length;    max_length = 0;    large_col = NIL(sm_col);    for(pcol = A->first_col; pcol != 0; pcol = pcol->next_col) {	if (pcol->length > max_length) {	    max_length = pcol->length;	    large_col = pcol;	}    }    return large_col;}intsm_num_elements(A)sm_matrix *A;{    register sm_row *prow;    register int num;    num = 0;    sm_foreach_row(A, prow) {	num += prow->length;    }    return num;}int sm_read(fp, A)FILE *fp;sm_matrix **A;{    int i, j, err;    *A = sm_alloc();    while (! feof(fp)) {	err = fscanf(fp, "%d %d", &i, &j);	if (err == EOF) {	    return 1;	} else if (err != 2) {	    return 0;	}	(void) sm_insert(*A, i, j);    }    return 1;}int sm_read_compressed(fp, A)FILE *fp;sm_matrix **A;{    int i, j, k, nrows, ncols;    unsigned long x;    *A = sm_alloc();    if (fscanf(fp, "%d %d", &nrows, &ncols) != 2) {	return 0;    }    sm_resize(*A, nrows, ncols);    for(i = 0; i < nrows; i++) {	if (fscanf(fp, "%lx", &x) != 1) {	    return 0;	}	for(j = 0; j < ncols; j += 32) {	    if (fscanf(fp, "%lx", &x) != 1) {		return 0;	    }	    for(k = j; x != 0; x >>= 1, k++) {		if (x & 1) {		    (void) sm_insert(*A, i, k);		}	    }	}    }    return 1;}void sm_write(fp, A)FILE *fp;sm_matrix *A;{    register sm_row *prow;    register sm_element *p;    for(prow = A->first_row; prow != 0; prow = prow->next_row) {	for(p = prow->first_col; p != 0; p = p->next_col) {	    (void) fprintf(fp, "%d %d\n", p->row_num, p->col_num);	}    }}void sm_print(fp, A)FILE *fp;sm_matrix *A;{    register sm_row *prow;    register sm_col *pcol;    int c;    if (A->last_col->col_num >= 100) {	(void) fprintf(fp, "    ");	for(pcol = A->first_col; pcol != 0; pcol = pcol->next_col) {	    (void) fprintf(fp, "%d", (pcol->col_num / 100)%10);	}	putc('\n', fp);    }    if (A->last_col->col_num >= 10) {	(void) fprintf(fp, "    ");	for(pcol = A->first_col; pcol != 0; pcol = pcol->next_col) {	    (void) fprintf(fp, "%d", (pcol->col_num / 10)%10);	}	putc('\n', fp);    }    (void) fprintf(fp, "    ");    for(pcol = A->first_col; pcol != 0; pcol = pcol->next_col) {	(void) fprintf(fp, "%d", pcol->col_num % 10);    }    putc('\n', fp);    (void) fprintf(fp, "    ");    for(pcol = A->first_col; pcol != 0; pcol = pcol->next_col) {	(void) fprintf(fp, "-");    }    putc('\n', fp);    for(prow = A->first_row; prow != 0; prow = prow->next_row) {	(void) fprintf(fp, "%3d:", prow->row_num);	for(pcol = A->first_col; pcol != 0; pcol = pcol->next_col) {	    c = sm_row_find(prow, pcol->col_num) ? '1' : '.';	    putc(c, fp);	}	putc('\n', fp);    }}void sm_dump(A, s, max)sm_matrix *A;char *s;int max;{    FILE *fp = stdout;    (void) fprintf(fp, "%s %d rows by %d cols\n", s, A->nrows, A->ncols);    if (A->nrows < max) {	sm_print(fp, A);    }}voidsm_cleanup(){#ifdef FAST_AND_LOOSE    register sm_element *p, *pnext;    register sm_row *prow, *pnextrow;    register sm_col *pcol, *pnextcol;    for(p = sm_element_freelist; p != 0; p = pnext) {	pnext = p->next_col;	FREE(p);    }    sm_element_freelist = 0;    for(prow = sm_row_freelist; prow != 0; prow = pnextrow) {	pnextrow = prow->next_row;	FREE(prow);    }    sm_row_freelist = 0;    for(pcol = sm_col_freelist; pcol != 0; pcol = pnextcol) {	pnextcol = pcol->next_col;	FREE(pcol);    }    sm_col_freelist = 0;#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -