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

📄 irred.c

📁 主要进行大规模的电路综合
💻 C
字号:
/* * Revision Control Information * * $Source: /projects/mvsis/Repository/mvsis-1.3/src/sis/espresso/irred.c,v $ * $Author: wjiang $ * $Revision: 1.1.1.1 $ * $Date: 2003/02/24 22:24:08 $ * */#include "espresso.h"static void fcube_is_covered();static void ftautology();static bool ftaut_special_cases();static int Rp_current;/* *   irredundant -- Return a minimal subset of F */pcoverirredundant(F, D)pcover F, D;{    mark_irredundant(F, D);    return sf_inactive(F);}/* *   mark_irredundant -- find redundant cubes, and mark them "INACTIVE" */voidmark_irredundant(F, D)pcover F, D;{    pcover E, Rt, Rp;    pset p, p1, last;    sm_matrix *table;    sm_row *cover;    sm_element *pe;    /* extract a minimum cover */    irred_split_cover(F, D, &E, &Rt, &Rp);    table = irred_derive_table(D, E, Rp);    cover = sm_minimum_cover(table, NIL(int), /* heuristic */ 1, /* debug */ 0);    /* mark the cubes for the result */    foreach_set(F, last, p) {	RESET(p, ACTIVE);	RESET(p, RELESSEN);    }    foreach_set(E, last, p) {	p1 = GETSET(F, SIZE(p));	assert(setp_equal(p1, p));	SET(p1, ACTIVE);	SET(p1, RELESSEN);		/* for essen(), mark as rel. ess. */    }    sm_foreach_row_element(cover, pe) {	p1 = GETSET(F, pe->col_num);	SET(p1, ACTIVE);    }    if (debug & IRRED) {	(void) printf("# IRRED: F=%d E=%d R=%d Rt=%d Rp=%d Rc=%d Final=%d Bound=%d\n",	    F->count, E->count, Rt->count+Rp->count, Rt->count, Rp->count,	    cover->length, E->count + cover->length, 0);    }    free_cover(E);    free_cover(Rt);    free_cover(Rp);    sm_free(table);    sm_row_free(cover);}/* *  irred_split_cover -- find E, Rt, and Rp from the cover F, D * *	E  -- relatively essential cubes *	Rt  -- totally redundant cubes *	Rp  -- partially redundant cubes */voidirred_split_cover(F, D, E, Rt, Rp)pcover F, D;pcover *E, *Rt, *Rp;{    register pcube p, last;    register int index;    pcover R;    pcube *FD, *ED;    /* number the cubes of F -- these numbers track into E, Rp, Rt, etc. */    index = 0;    foreach_set(F, last, p) {	PUTSIZE(p, index);	index++;    }    *E = new_cover(10);    *Rt = new_cover(10);    *Rp = new_cover(10);    R = new_cover(10);    /* Split F into E and R */    FD = cube2list(F, D);    foreach_set(F, last, p) {	if (cube_is_covered(FD, p)) {	    R = sf_addset(R, p);	} else {	    *E = sf_addset(*E, p);	}	if (debug & IRRED1) {	    (void) printf("IRRED1: zr=%d ze=%d to-go=%d time=%s\n",		R->count, (*E)->count, F->count - (R->count + (*E)->count),		print_time(ptime()));	}    }    free_cubelist(FD);    /* Split R into Rt and Rp */    ED = cube2list(*E, D);    foreach_set(R, last, p) {	if (cube_is_covered(ED, p)) {	    *Rt = sf_addset(*Rt, p);	} else {	    *Rp = sf_addset(*Rp, p);	}	if (debug & IRRED1) {	    (void) printf("IRRED1: zr=%d zrt=%d to-go=%d time=%s\n",		(*Rp)->count, (*Rt)->count,		R->count - ((*Rp)->count +(*Rt)->count), print_time(ptime()));	}    }    free_cubelist(ED);    free_cover(R);}/* *  irred_derive_table -- given the covers D, E and the set of *  partially redundant primes Rp, build a covering table showing *  possible selections of primes to cover Rp. */sm_matrix *irred_derive_table(D, E, Rp)pcover D, E, Rp;{    register pcube last, p, *list;    sm_matrix *table;    int size_last_dominance, i;    /* Mark each cube in DE as not part of the redundant set */    foreach_set(D, last, p) {	RESET(p, REDUND);    }    foreach_set(E, last, p) {	RESET(p, REDUND);    }    /* Mark each cube in Rp as partially redundant */    foreach_set(Rp, last, p) {	SET(p, REDUND);             /* belongs to redundant set */    }    /* For each cube in Rp, find ways to cover its minterms */    list = cube3list(D, E, Rp);    table = sm_alloc();    size_last_dominance = 0;    i = 0;    foreach_set(Rp, last, p) {	Rp_current = SIZE(p);	fcube_is_covered(list, p, table);	RESET(p, REDUND);	/* can now consider this cube redundant */	if (debug & IRRED1) {	    (void) printf("IRRED1: %d of %d to-go=%d, table=%dx%d time=%s\n",		i, Rp->count, Rp->count - i,		table->nrows, table->ncols, print_time(ptime()));	}	/* try to keep memory limits down by reducing table as we go along */	if (table->nrows - size_last_dominance > 1000) {	    (void) sm_row_dominance(table);	    size_last_dominance = table->nrows;	    if (debug & IRRED1) {		(void) printf("IRRED1: delete redundant rows, now %dx%d\n",		    table->nrows, table->ncols);	    }	}	i++;    }    free_cubelist(list);    return table;}/* cube_is_covered -- determine if a cubelist "covers" a single cube */boolcube_is_covered(T, c)pcube *T, c;{    return tautology(cofactor(T,c));}/* tautology -- answer the tautology question for T */booltautology(T)pcube *T;         /* T will be disposed of */{    register pcube cl, cr;    register int best, result;    static int taut_level = 0;    if (debug & TAUT) {	debug_print(T, "TAUTOLOGY", taut_level++);    }    if ((result = taut_special_cases(T)) == MAYBE) {	cl = new_cube();	cr = new_cube();	best = binate_split_select(T, cl, cr, TAUT);	result = tautology(scofactor(T, cl, best)) &&		 tautology(scofactor(T, cr, best));	free_cubelist(T);	free_cube(cl);	free_cube(cr);    }    if (debug & TAUT) {	(void) printf("exit TAUTOLOGY[%d]: %s\n", --taut_level, print_bool(result));    }    return result;}/* *  taut_special_cases -- check special cases for tautology */booltaut_special_cases(T)pcube *T;			/* will be disposed if answer is determined */{    register pcube *T1, *Tsave, p, ceil=cube.temp[0], temp=cube.temp[1];    pcube *A, *B;    int var;    /* Check for a row of all 1's which implies tautology */    for(T1 = T+2; (p = *T1++) != NULL; ) {	if (full_row(p, T[0])) {	    free_cubelist(T);	    return TRUE;	}    }    /* Check for a column of all 0's which implies no tautology */start:    INLINEset_copy(ceil, T[0]);    for(T1 = T+2; (p = *T1++) != NULL; ) {	INLINEset_or(ceil, ceil, p);    }    if (! setp_equal(ceil, cube.fullset)) {	free_cubelist(T);	return FALSE;    }    /* Collect column counts, determine unate variables, etc. */    massive_count(T);    /* If function is unate (and no row of all 1's), then no tautology */    if (cdata.vars_unate == cdata.vars_active) {	free_cubelist(T);	return FALSE;    /* If active in a single variable (and no column of 0's) then tautology */    } else if (cdata.vars_active == 1) {	free_cubelist(T);	return TRUE;    /* Check for unate variables, and reduce cover if there are any */    } else if (cdata.vars_unate != 0) {	/* Form a cube "ceil" with full variables in the unate variables */	(void) set_copy(ceil, cube.emptyset);	for(var = 0; var < cube.num_vars; var++) {	    if (cdata.is_unate[var]) {		INLINEset_or(ceil, ceil, cube.var_mask[var]);	    }	}	/* Save only those cubes that are "full" in all unate variables */	for(Tsave = T1 = T+2; (p = *T1++) != 0; ) {	    if (setp_implies(ceil, set_or(temp, p, T[0]))) {		*Tsave++ = p;	    }	}	*Tsave++ = NULL;	T[1] = (pcube) Tsave;	if (debug & TAUT) {	    (void) printf("UNATE_REDUCTION: %d unate variables, reduced to %d\n",		cdata.vars_unate, CUBELISTSIZE(T));	}	goto start;    /* Check for component reduction */    } else if (cdata.var_zeros[cdata.best] < CUBELISTSIZE(T) / 2) {	if (cubelist_partition(T, &A, &B, debug & TAUT) == 0) {	    return MAYBE;	} else {	    free_cubelist(T);	    if (tautology(A)) {		free_cubelist(B);		return TRUE;	    } else {		return tautology(B);	    }	}    }    /* We tried as hard as we could, but must recurse from here on */    return MAYBE;}/* fcube_is_covered -- determine exactly how a cubelist "covers" a cube */static voidfcube_is_covered(T, c, table)pcube *T, c;sm_matrix *table;{    ftautology(cofactor(T,c), table);}/* ftautology -- find ways to make a tautology */static voidftautology(T, table)pcube *T;         	/* T will be disposed of */sm_matrix *table;{    register pcube cl, cr;    register int best;    static int ftaut_level = 0;    if (debug & TAUT) {	debug_print(T, "FIND_TAUTOLOGY", ftaut_level++);    }    if (ftaut_special_cases(T, table) == MAYBE) {	cl = new_cube();	cr = new_cube();	best = binate_split_select(T, cl, cr, TAUT);	ftautology(scofactor(T, cl, best), table);	ftautology(scofactor(T, cr, best), table);	free_cubelist(T);	free_cube(cl);	free_cube(cr);    }    if (debug & TAUT) {	(void) printf("exit FIND_TAUTOLOGY[%d]: table is %d by %d\n",	    --ftaut_level, table->nrows, table->ncols);    }}static boolftaut_special_cases(T, table)pcube *T;                 /* will be disposed if answer is determined */sm_matrix *table;{    register pcube *T1, *Tsave, p, temp = cube.temp[0], ceil = cube.temp[1];    int var, rownum;    /* Check for a row of all 1's in the essential cubes */    for(T1 = T+2; (p = *T1++) != 0; ) {	if (! TESTP(p, REDUND)) {	    if (full_row(p, T[0])) {		/* subspace is covered by essentials -- no new rows for table */		free_cubelist(T);		return TRUE;	    }	}    }    /* Collect column counts, determine unate variables, etc. */start:    massive_count(T);    /* If function is unate, find the rows of all 1's */    if (cdata.vars_unate == cdata.vars_active) {	/* find which nonessentials cover this subspace */	rownum = table->last_row ? table->last_row->row_num+1 : 0;	(void) sm_insert(table, rownum, Rp_current);	for(T1 = T+2; (p = *T1++) != 0; ) {	    if (TESTP(p, REDUND)) {		/* See if a redundant cube covers this leaf */		if (full_row(p, T[0])) {		    (void) sm_insert(table, rownum, (int) SIZE(p));		}	    }	}	free_cubelist(T);	return TRUE;    /* Perform unate reduction if there are any unate variables */    } else if (cdata.vars_unate != 0) {	/* Form a cube "ceil" with full variables in the unate variables */	(void) set_copy(ceil, cube.emptyset);	for(var = 0; var < cube.num_vars; var++) {	    if (cdata.is_unate[var]) {		INLINEset_or(ceil, ceil, cube.var_mask[var]);	    }	}	/* Save only those cubes that are "full" in all unate variables */	for(Tsave = T1 = T+2; (p = *T1++) != 0; ) {	    if (setp_implies(ceil, set_or(temp, p, T[0]))) {		*Tsave++ = p;	    }	}	*Tsave++ = 0;	T[1] = (pcube) Tsave;	if (debug & TAUT) {	    (void) printf("UNATE_REDUCTION: %d unate variables, reduced to %d\n",		cdata.vars_unate, CUBELISTSIZE(T));	}	goto start;    }    /* Not much we can do about it */    return MAYBE;}

⌨️ 快捷键说明

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