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

📄 cols.c

📁 主要进行大规模的电路综合
💻 C
字号:
/* * Revision Control Information * * /projects/hsis/CVS/utilities/sparse/cols.c,v * rajeev * 1.2 * 1995/08/08 22:40:54 * */#include <stdio.h>#include "sparse_int.h"/* *  allocate a new col vector  */sm_col *sm_col_alloc(){    register sm_col *pcol;#ifdef FAST_AND_LOOSE    if (sm_col_freelist == NIL(sm_col)) {	pcol = ALLOC(sm_col, 1);    } else {	pcol = sm_col_freelist;	sm_col_freelist = pcol->next_col;    }#else    pcol = ALLOC(sm_col, 1);#endif    pcol->col_num = 0;    pcol->length = 0;    pcol->first_row = pcol->last_row = NIL(sm_element);    pcol->next_col = pcol->prev_col = NIL(sm_col);    pcol->flag = 0;    pcol->user_word = NIL(char);		/* for our user ... */    return pcol;}/* *  free a col vector -- for FAST_AND_LOOSE, this is real cheap for cols; *  however, freeing a rowumn must still walk down the rowumn discarding *  the elements one-by-one; that is the only use for the extra '-DCOLS' *  compile flag ... */voidsm_col_free(pcol)register sm_col *pcol;{#if defined(FAST_AND_LOOSE) && ! defined(COLS)    if (pcol->first_row != NIL(sm_element)) {	/* Add the linked list of col items to the free list */	pcol->last_row->next_row = sm_element_freelist;	sm_element_freelist = pcol->first_row;    }    /* Add the col to the free list of cols */    pcol->next_col = sm_col_freelist;    sm_col_freelist = pcol;#else    register sm_element *p, *pnext;    for(p = pcol->first_row; p != 0; p = pnext) {	pnext = p->next_row;	sm_element_free(p);    }    FREE(pcol);#endif}/* *  duplicate an existing col */sm_col *sm_col_dup(pcol)register sm_col *pcol;{    register sm_col *pnew;    register sm_element *p;    pnew = sm_col_alloc();    for(p = pcol->first_row; p != 0; p = p->next_row) {	(void) sm_col_insert(pnew, p->row_num);    }    return pnew;}/* *  insert an element into a col vector  */sm_element *sm_col_insert(pcol, row)register sm_col *pcol;register int row;{    register sm_element *test, *element;    /* get a new item, save its address */    sm_element_alloc(element);    test = element;    sorted_insert(sm_element, pcol->first_row, pcol->last_row, pcol->length, 		    next_row, prev_row, row_num, row, test);    /* if item was not used, free it */    if (element != test) {	sm_element_free(element);    }    /* either way, return the current new value */    return test;}/* *  remove an element from a col vector  */voidsm_col_remove(pcol, row)register sm_col *pcol;register int row;{    register sm_element *p;    for(p = pcol->first_row; p != 0 && p->row_num < row; p = p->next_row)	;    if (p != 0 && p->row_num == row) {	dll_unlink(p, pcol->first_row, pcol->last_row, 			    next_row, prev_row, pcol->length);	sm_element_free(p);    }}/* *  find an element (if it is in the col vector) */sm_element *sm_col_find(pcol, row)sm_col *pcol;int row;{    register sm_element *p;    for(p = pcol->first_row; p != 0 && p->row_num < row; p = p->next_row)	;    if (p != 0 && p->row_num == row) {	return p;    } else {	return NIL(sm_element);    }}/* *  return 1 if col p2 contains col p1; 0 otherwise */int sm_col_contains(p1, p2)sm_col *p1, *p2;{    register sm_element *q1, *q2;    q1 = p1->first_row;    q2 = p2->first_row;    while (q1 != 0) {	if (q2 == 0 || q1->row_num < q2->row_num) {	    return 0;	} else if (q1->row_num == q2->row_num) {	    q1 = q1->next_row;	    q2 = q2->next_row;	} else {	    q2 = q2->next_row;	}    }    return 1;}/* *  return 1 if col p1 and col p2 share an element in common */int sm_col_intersects(p1, p2)sm_col *p1, *p2;{    register sm_element *q1, *q2;    q1 = p1->first_row;    q2 = p2->first_row;    if (q1 == 0 || q2 == 0) return 0;    for(;;) {	if (q1->row_num < q2->row_num) {	    if ((q1 = q1->next_row) == 0) {		return 0;	    }	} else if (q1->row_num > q2->row_num) {	    if ((q2 = q2->next_row) == 0) {		return 0;	    }	} else {	    return 1;	}    }}/* *  compare two cols, lexical ordering */int sm_col_compare(p1, p2)sm_col *p1, *p2;{    register sm_element *q1, *q2;    q1 = p1->first_row;    q2 = p2->first_row;    while(q1 != 0 && q2 != 0) {	if (q1->row_num != q2->row_num) {	    return q1->row_num - q2->row_num;	}	q1 = q1->next_row;	q2 = q2->next_row;    }    if (q1 != 0) {	return 1;    } else if (q2 != 0) {	return -1;    } else {	return 0;    }}/* *  return the intersection */sm_col *sm_col_and(p1, p2)sm_col *p1, *p2;{    register sm_element *q1, *q2;    register sm_col *result;    result = sm_col_alloc();    q1 = p1->first_row;    q2 = p2->first_row;    if (q1 == 0 || q2 == 0) return result;    for(;;) {	if (q1->row_num < q2->row_num) {	    if ((q1 = q1->next_row) == 0) {		return result;	    }	} else if (q1->row_num > q2->row_num) {	    if ((q2 = q2->next_row) == 0) {		return result;	    }	} else {	    (void) sm_col_insert(result, q1->row_num);	    if ((q1 = q1->next_row) == 0) {		return result;	    }	    if ((q2 = q2->next_row) == 0) {		return result;	    }	}    }}int sm_col_hash(pcol, modulus)sm_col *pcol;int modulus;{    register int sum;    register sm_element *p;    sum = 0;    for(p = pcol->first_row; p != 0; p = p->next_row) {	sum = (sum*17 + p->row_num) % modulus;    }    return sum;}/* *  remove an element from a col vector (given a pointer to the element)  */voidsm_col_remove_element(pcol, p)register sm_col *pcol;register sm_element *p;{    dll_unlink(p, pcol->first_row, pcol->last_row, 			next_row, prev_row, pcol->length);    sm_element_free(p);}voidsm_col_print(fp, pcol)FILE *fp;sm_col *pcol;{    sm_element *p;    for(p = pcol->first_row; p != 0; p = p->next_row) {	(void) fprintf(fp, " %d", p->row_num);    }}

⌨️ 快捷键说明

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