|
VIS
|
#include "imgInt.h"
Include dependency graph for imgTfmUtil.c:Go to the source code of this file.
Functions | |
| static int | SignatureCompare (int *ptrX, int *ptrY) |
| static int | CompareBddPointer (const void *e1, const void *e2) |
| void | ImgVectorConstrain (ImgTfmInfo_t *info, array_t *vector, mdd_t *constraint, array_t *relationArray, array_t **newVector, mdd_t **cube, array_t **newRelationArray, mdd_t **cofactorCube, mdd_t **abstractCube, boolean singleVarFlag) |
| mdd_t * | ImgVectorMinimize (ImgTfmInfo_t *info, array_t *vector, mdd_t *constraint, mdd_t *from, array_t *relationArray, array_t **newVector, mdd_t **cube, array_t **newRelationArray, mdd_t **cofactorCube, mdd_t **abstractCube) |
| void | ImgVectorFree (array_t *vector) |
| int | ImgVectorFunctionSize (array_t *vector) |
| long | ImgVectorBddSize (array_t *vector) |
| array_t * | ImgVectorCopy (ImgTfmInfo_t *info, array_t *vector) |
| ImgComponent_t * | ImgComponentAlloc (ImgTfmInfo_t *info) |
| ImgComponent_t * | ImgComponentCopy (ImgTfmInfo_t *info, ImgComponent_t *comp) |
| void | ImgComponentFree (ImgComponent_t *comp) |
| void | ImgComponentGetSupport (ImgComponent_t *comp) |
| void | ImgSupportCopy (ImgTfmInfo_t *info, char *dsupport, char *ssupport) |
| void | ImgSupportClear (ImgTfmInfo_t *info, char *support) |
| void | ImgSupportPrint (ImgTfmInfo_t *info, char *support) |
| int | ImgSupportCount (ImgTfmInfo_t *info, char *support) |
| array_t * | ImgGetConstrainedRelationArray (ImgTfmInfo_t *info, array_t *relationArray, mdd_t *constraint) |
| array_t * | ImgGetCofactoredRelationArray (array_t *relationArray, mdd_t *func) |
| void | ImgCofactorRelationArray (array_t *relationArray, mdd_t *func) |
| array_t * | ImgGetAbstractedRelationArray (mdd_manager *manager, array_t *relationArray, mdd_t *cube) |
| void | ImgAbstractRelationArray (mdd_manager *manager, array_t *relationArray, mdd_t *cube) |
| array_t * | ImgGetCofactoredAbstractedRelationArray (mdd_manager *manager, array_t *relationArray, mdd_t *cofactorCube, mdd_t *abstractCube) |
| array_t * | ImgGetAbstractedCofactoredRelationArray (mdd_manager *manager, array_t *relationArray, mdd_t *cofactorCube, mdd_t *abstractCube) |
| array_t * | ImgGetConstrainedVector (ImgTfmInfo_t *info, array_t *vector, mdd_t *constraint) |
| array_t * | ImgGetCofactoredVector (ImgTfmInfo_t *info, array_t *vector, mdd_t *func) |
| void | ImgCofactorVector (ImgTfmInfo_t *info, array_t *vector, mdd_t *func) |
| mdd_t * | ImgTfmEliminateDependVars (ImgTfmInfo_t *info, array_t *vector, array_t *relationArray, mdd_t *states, array_t **newVector, mdd_t **dependRelations) |
| int | ImgExistConstIntermediateVar (array_t *vector) |
| mdd_t * | ImgGetComposedFunction (array_t *vector) |
| ImgComponent_t * | ImgGetLatchComponent (array_t *vector) |
| array_t * | ImgComposeConstIntermediateVars (ImgTfmInfo_t *info, array_t *vector, mdd_t *constIntermediate, mdd_t **cofactorCube, mdd_t **abstractCube, mdd_t **and_, mdd_t **from) |
| int | ImgCountBddSupports (mdd_t *func) |
| void | ImgCheckConstConstrain (mdd_t *f1, mdd_t *f2, int *f21p, int *f21n) |
| int | ImgConstConstrain (mdd_t *func, mdd_t *constraint) |
| void | ImgPrintVectorDependency (ImgTfmInfo_t *info, array_t *vector, int verbosity) |
| float | ImgPercentVectorDependency (ImgTfmInfo_t *info, array_t *vector, int length, int *nLongs) |
| void | ImgWriteSupportMatrix (ImgTfmInfo_t *info, array_t *vector, array_t *relationArray, char *string) |
Variables | |
| static char rcsid[] | UNUSED = "$Id: imgTfmUtil.c,v 1.23 2005/04/23 14:30:55 jinh Exp $" |
| static double * | signatures |
| static int CompareBddPointer | ( | const void * | e1, |
| const void * | e2 | ||
| ) | [static] |
Function********************************************************************
Synopsis [Compares two function BDD pointers of components.]
Description [Compares two function BDD pointers of components.]
SideEffects []
Definition at line 2191 of file imgTfmUtil.c.
{
ImgComponent_t *c1, *c2;
unsigned long ptr1, ptr2;
c1 = *((ImgComponent_t **)e1);
c2 = *((ImgComponent_t **)e2);
ptr1 = (unsigned long)bdd_pointer(c1->func);
ptr2 = (unsigned long)bdd_pointer(c2->func);
if (ptr1 > ptr2)
return(1);
else if (ptr1 < ptr2)
return(-1);
else
return(0);
}
Here is the caller graph for this function:| void ImgAbstractRelationArray | ( | mdd_manager * | manager, |
| array_t * | relationArray, | ||
| mdd_t * | cube | ||
| ) |
Function********************************************************************
Synopsis [Smoothes a relation array with respect to a cube.]
Description [Smoothes a relation array with respect to a cube.]
SideEffects []
Definition at line 1041 of file imgTfmUtil.c.
{
int i;
mdd_t *relation, *abstractedRelation;
array_t *varsArray;
if (bdd_is_tautology(cube, 1))
return;
if (bdd_get_package_name() != CUDD)
varsArray = mdd_get_bdd_support_vars(manager, cube);
else /* to remove uninitialized variable warning*/
varsArray = NIL(array_t);
for (i = 0; i < array_n(relationArray); i++) {
relation = array_fetch(mdd_t *, relationArray, i);
if (bdd_get_package_name() == CUDD)
abstractedRelation = bdd_smooth_with_cube(relation, cube);
else
abstractedRelation = bdd_smooth(relation, varsArray);
if (mdd_equal(abstractedRelation, relation))
mdd_free(abstractedRelation);
else {
mdd_free(relation);
array_insert(mdd_t *, relationArray, i, abstractedRelation);
}
}
if (bdd_get_package_name() != CUDD)
mdd_array_free(varsArray);
}
Here is the caller graph for this function:| void ImgCheckConstConstrain | ( | mdd_t * | f1, |
| mdd_t * | f2, | ||
| int * | f21p, | ||
| int * | f21n | ||
| ) |
Function********************************************************************
Synopsis [Quick checking whether the results of constrain between two functions are constant.]
Description [Quick checking whether the results of constrain between two functions are constant. Assumes that 1) f1 != f2 and f1 != f2', and 2) neither f1 nor f2 is constant.]
SideEffects []
Definition at line 1741 of file imgTfmUtil.c.
{
if (mdd_lequal(f1, f2, 1, 1)) { /* f2 > f1 */
*f21p = 1;
*f21n = 2;
} else if (mdd_lequal(f2, f1, 1, 0)) { /* f2&f1=0 -> f2 < f1' */
*f21p = 0;
*f21n = 2;
} else if (mdd_lequal(f1, f2, 0, 1)) { /* f2 > f1' */
*f21p = 2;
*f21n = 1;
} else if (mdd_lequal(f2, f1, 1, 1)) { /* f2&f1'=0 -> f2 < f1 */
*f21p = 2;
*f21n = 0;
} else {
*f21p = 2;
*f21n = 2;
}
}
Here is the caller graph for this function:| void ImgCofactorRelationArray | ( | array_t * | relationArray, |
| mdd_t * | func | ||
| ) |
Function********************************************************************
Synopsis [Cofactors a relation array with respect to a function.]
Description [Cofactors a relation array with respect to a function.]
SideEffects []
Definition at line 965 of file imgTfmUtil.c.
{
int i;
mdd_t *relation, *cofactoredRelation;
if (bdd_is_tautology(func, 1))
return;
for (i = 0; i < array_n(relationArray); i++) {
relation = array_fetch(mdd_t *, relationArray, i);
cofactoredRelation = bdd_cofactor(relation, func);
if (mdd_equal(cofactoredRelation, relation))
mdd_free(cofactoredRelation);
else {
mdd_free(relation);
array_insert(mdd_t *, relationArray, i, cofactoredRelation);
}
}
}
Here is the caller graph for this function:| void ImgCofactorVector | ( | ImgTfmInfo_t * | info, |
| array_t * | vector, | ||
| mdd_t * | func | ||
| ) |
Function********************************************************************
Synopsis [Cofactors a function vector with respect to a function.]
Description [Cofactors a function vector with respect to a function.]
SideEffects []
Definition at line 1244 of file imgTfmUtil.c.
{
int i;
ImgComponent_t *comp;
mdd_t *cofactoredFunc;
if (bdd_is_tautology(func, 1))
return;
for (i = 0; i < array_n(vector); i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
cofactoredFunc = bdd_cofactor(comp->func, func);
if (mdd_equal(cofactoredFunc, comp->func))
mdd_free(cofactoredFunc);
else {
mdd_free(comp->func);
comp->func = cofactoredFunc;
ImgSupportClear(info, comp->support);
ImgComponentGetSupport(comp);
}
}
}
Here is the call graph for this function:| ImgComponent_t* ImgComponentAlloc | ( | ImgTfmInfo_t * | info | ) |
Function********************************************************************
Synopsis [Allocates a component.]
Description [Allocates a component.]
SideEffects []
Definition at line 725 of file imgTfmUtil.c.
{
ImgComponent_t *comp;
comp = ALLOC(ImgComponent_t, 1);
memset(comp, 0, sizeof(ImgComponent_t));
comp->support = ALLOC(char, info->nVars);
ImgSupportClear(info, comp->support);
comp->id = info->nComponents++;
return(comp);
}
Here is the call graph for this function:
Here is the caller graph for this function:| ImgComponent_t* ImgComponentCopy | ( | ImgTfmInfo_t * | info, |
| ImgComponent_t * | comp | ||
| ) |
Function********************************************************************
Synopsis [Copies a component]
Description [Copies a component]
SideEffects []
Definition at line 748 of file imgTfmUtil.c.
{
ImgComponent_t *newComp;
newComp = ImgComponentAlloc(info);
newComp->func = mdd_dup(comp->func);
newComp->var = mdd_dup(comp->var);
ImgSupportCopy(info, newComp->support, comp->support);
newComp->intermediate = comp->intermediate;
return(newComp);
}
Here is the call graph for this function:
Here is the caller graph for this function:| void ImgComponentFree | ( | ImgComponent_t * | comp | ) |
Function********************************************************************
Synopsis [Frees a component.]
Description [Frees a component.]
SideEffects []
Definition at line 771 of file imgTfmUtil.c.
{
if (comp->func)
mdd_free(comp->func);
if (comp->var != NULL)
mdd_free(comp->var);
FREE(comp->support);
FREE(comp);
}
Here is the caller graph for this function:| void ImgComponentGetSupport | ( | ImgComponent_t * | comp | ) |
Function********************************************************************
Synopsis [Gets the supports of a component.]
Description [Gets the supports of a component.]
SideEffects []
Definition at line 792 of file imgTfmUtil.c.
{
int index;
var_set_t *supportVarSet;
supportVarSet = bdd_get_support(comp->func);
for (index = 0; index < supportVarSet->n_elts; index++) {
if (var_set_get_elt(supportVarSet, index) == 1)
comp->support[index] = 1;
}
var_set_free(supportVarSet);
}
Here is the caller graph for this function:| array_t* ImgComposeConstIntermediateVars | ( | ImgTfmInfo_t * | info, |
| array_t * | vector, | ||
| mdd_t * | constIntermediate, | ||
| mdd_t ** | cofactorCube, | ||
| mdd_t ** | abstractCube, | ||
| mdd_t ** | and_, | ||
| mdd_t ** | from | ||
| ) |
Function********************************************************************
Synopsis [Compose the constant intermediate variable functions.]
Description [Compose the constant intermediate variable functions.]
SideEffects []
Definition at line 1529 of file imgTfmUtil.c.
{
int i, n, pos;
array_t *tmpVector, *cofactoredVector;
mdd_t *cofactor, *abstract;
mdd_t *curConstIntermediate, *newConstIntermediate;
mdd_t *tmp, *new_, *func, *varNot, *nsVar;
ImgComponent_t *comp, *comp1;
st_table *equivTable;
int *ptr, *regularPtr;
if (cofactorCube)
cofactor = mdd_one(info->manager);
else
cofactor = NIL(mdd_t);
if (abstractCube)
abstract = mdd_one(info->manager);
else
abstract = NIL(mdd_t);
cofactoredVector = vector;
tmpVector = cofactoredVector;
curConstIntermediate = constIntermediate;
while (!bdd_is_tautology(curConstIntermediate, 1)) {
newConstIntermediate = mdd_one(info->manager);
n = 0;
equivTable = st_init_table(st_ptrcmp, st_ptrhash);
cofactoredVector = array_alloc(ImgComponent_t *, 0);
for (i = 0; i < array_n(tmpVector); i++) {
comp = array_fetch(ImgComponent_t *, tmpVector, i);
func = bdd_cofactor(comp->func, curConstIntermediate);
if (comp->intermediate) {
if (mdd_is_tautology(func, 1)) {
tmp = newConstIntermediate;
newConstIntermediate = mdd_and(tmp, comp->var, 1, 1);
mdd_free(tmp);
mdd_free(func);
continue;
} else if (mdd_is_tautology(func, 0)) {
tmp = newConstIntermediate;
newConstIntermediate = mdd_and(tmp, comp->var, 1, 0);
mdd_free(tmp);
mdd_free(func);
continue;
}
comp1 = ImgComponentAlloc(info);
comp1->var = mdd_dup(comp->var);
comp1->func = func;
comp1->intermediate = 1;
if (mdd_equal(func, comp->func))
ImgSupportCopy(info, comp1->support, comp->support);
else
ImgComponentGetSupport(comp1);
array_insert_last(ImgComponent_t *, cofactoredVector, comp1);
n++;
continue;
}
if (mdd_is_tautology(func, 1)) {
if (cofactor) {
nsVar = ImgSubstitute(comp->var, info->functionData, Img_D2R_c);
tmp = cofactor;
cofactor = mdd_and(tmp, nsVar, 1, 1);
mdd_free(tmp);
mdd_free(nsVar);
}
if (and_) {
tmp = *and_;
*and_ = mdd_and(tmp, comp->var, 1, 1);
mdd_free(tmp);
}
if (from) {
tmp = *from;
*from = bdd_cofactor(tmp, comp->var);
mdd_free(tmp);
}
mdd_free(func);
} else if (mdd_is_tautology(func, 0)) {
if (cofactor) {
nsVar = ImgSubstitute(comp->var, info->functionData, Img_D2R_c);
tmp = cofactor;
cofactor = mdd_and(tmp, nsVar, 1, 0);
mdd_free(tmp);
mdd_free(nsVar);
}
if (and_) {
tmp = *and_;
*and_ = mdd_and(tmp, comp->var, 1, 0);
mdd_free(tmp);
}
if (from) {
tmp = *from;
varNot = bdd_not(comp->var);
*from = bdd_cofactor(tmp, varNot);
mdd_free(tmp);
mdd_free(varNot);
}
mdd_free(func);
} else {
ptr = (int *)bdd_pointer(func);
regularPtr = (int *)((unsigned long)ptr & ~01);
if (st_lookup_int(equivTable, (char *)regularPtr, &pos)) {
comp1 = array_fetch(ImgComponent_t *, cofactoredVector, pos);
if (and_) {
if (mdd_equal(func, comp1->func))
tmp = mdd_xnor(comp->var, comp1->var);
else
tmp = mdd_xor(comp->var, comp1->var);
new_ = mdd_and(tmp, *and_, 1, 1);
mdd_free(tmp);
mdd_free(*and_);
mdd_free(func);
*and_ = new_;
}
if (abstract) {
nsVar = ImgSubstitute(comp->var, info->functionData, Img_D2R_c);
tmp = abstract;
abstract = mdd_and(tmp, nsVar, 1, 1);
mdd_free(tmp);
mdd_free(nsVar);
}
if (from) {
tmp = *from;
*from = bdd_compose(tmp, comp->var, comp1->var);
mdd_free(tmp);
}
} else {
comp1 = ImgComponentAlloc(info);
comp1->var = mdd_dup(comp->var);
comp1->func = func;
if (mdd_equal(func, comp->func))
ImgSupportCopy(info, comp1->support, comp->support);
else
ImgComponentGetSupport(comp1);
array_insert_last(ImgComponent_t *, cofactoredVector, comp1);
st_insert(equivTable, (char *)regularPtr, (char *)(long)n);
n++;
}
}
}
if (curConstIntermediate != constIntermediate)
mdd_free(curConstIntermediate);
curConstIntermediate = newConstIntermediate;
if (cofactor) {
tmp = cofactor;
cofactor = mdd_and(tmp, curConstIntermediate, 1, 1);
mdd_free(tmp);
}
st_free_table(equivTable);
ImgVectorFree(tmpVector);
tmpVector = cofactoredVector;
}
if (curConstIntermediate != constIntermediate)
mdd_free(curConstIntermediate);
if (cofactorCube)
*cofactorCube = cofactor;
if (abstractCube)
*abstractCube = abstract;
return(cofactoredVector);
}
Here is the call graph for this function:
Here is the caller graph for this function:| int ImgConstConstrain | ( | mdd_t * | func, |
| mdd_t * | constraint | ||
| ) |
Function********************************************************************
Synopsis [Checks whether the result of constrain is constant.]
Description [Checks whether the result of constrain is constant.]
SideEffects []
Definition at line 1772 of file imgTfmUtil.c.
{
if (mdd_lequal(constraint, func, 1, 1)) /* func | constraint = 1 */
return(1);
if (mdd_lequal(func, constraint, 1, 0)) /* func | constraint = 0 */
return(0);
return(2); /* non-constant */
}
Here is the caller graph for this function:| int ImgCountBddSupports | ( | mdd_t * | func | ) |
Function********************************************************************
Synopsis [Returns the number of BDD supports in a function.]
Description [Returns the number of BDD supports in a function.]
SideEffects []
Definition at line 1713 of file imgTfmUtil.c.
{
int index, nSupports = 0;
var_set_t *supportVarSet;
supportVarSet = bdd_get_support(func);
for (index = 0; index < supportVarSet->n_elts; index++) {
if (var_set_get_elt(supportVarSet, index) == 1)
nSupports++;
}
var_set_free(supportVarSet);
return(nSupports);
}
Here is the caller graph for this function:| int ImgExistConstIntermediateVar | ( | array_t * | vector | ) |
Function********************************************************************
Synopsis [Checks whether there is a constant function of intermediate variables.]
Description [Checks whether there is a constant function of intermediate variables.]
SideEffects []
Definition at line 1432 of file imgTfmUtil.c.
{
int i;
ImgComponent_t *comp;
for (i = 0; i < array_n(vector); i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
if (comp->intermediate) {
if (mdd_is_tautology(comp->func, 1) || mdd_is_tautology(comp->func, 0))
return(1);
}
}
return(0);
}
Here is the caller graph for this function:| array_t* ImgGetAbstractedCofactoredRelationArray | ( | mdd_manager * | manager, |
| array_t * | relationArray, | ||
| mdd_t * | cofactorCube, | ||
| mdd_t * | abstractCube | ||
| ) |
Function********************************************************************
Synopsis [Smothes and cofactors a relation array.]
Description [Smothes and cofactors a relation array. Returns new relation array.]
SideEffects []
Definition at line 1129 of file imgTfmUtil.c.
{
int i;
array_t *newRelationArray = array_alloc(mdd_t *, 0);
mdd_t *relation, *newRelation, *tmpRelation;
array_t *varsArray;
if (bdd_get_package_name() != CUDD)
varsArray = mdd_get_bdd_support_vars(manager, abstractCube);
else /* to remove uninitialized variable warning*/
varsArray = NIL(array_t);
for (i = 0; i < array_n(relationArray); i++) {
relation = array_fetch(mdd_t *, relationArray, i);
if (bdd_get_package_name() == CUDD)
tmpRelation = bdd_smooth_with_cube(relation, abstractCube);
else
tmpRelation = bdd_smooth(relation, varsArray);
newRelation = bdd_cofactor(tmpRelation, cofactorCube);
mdd_free(tmpRelation);
if (bdd_is_tautology(newRelation, 1))
mdd_free(newRelation);
else
array_insert_last(mdd_t *, newRelationArray, newRelation);
}
if (bdd_get_package_name() != CUDD)
mdd_array_free(varsArray);
return(newRelationArray);
}
| array_t* ImgGetAbstractedRelationArray | ( | mdd_manager * | manager, |
| array_t * | relationArray, | ||
| mdd_t * | cube | ||
| ) |
Function********************************************************************
Synopsis [Smoothes a relation array with respect to a cube.]
Description [Smoothes a relation array with respect to a cube.]
SideEffects []
Definition at line 996 of file imgTfmUtil.c.
{
int i;
array_t *abstractedRelationArray;
mdd_t *relation, *abstractedRelation;
array_t *varsArray;
if (bdd_is_tautology(cube, 1))
return(mdd_array_duplicate(relationArray));
abstractedRelationArray = array_alloc(mdd_t *, 0);
if (bdd_get_package_name() != CUDD)
varsArray = mdd_get_bdd_support_vars(manager, cube);
else /* to remove uninitialized variable warning*/
varsArray = NIL(array_t);
for (i = 0; i < array_n(relationArray); i++) {
relation = array_fetch(mdd_t *, relationArray, i);
if (bdd_get_package_name() == CUDD)
abstractedRelation = bdd_smooth_with_cube(relation, cube);
else
abstractedRelation = bdd_smooth(relation, varsArray);
if (bdd_is_tautology(abstractedRelation, 1))
mdd_free(abstractedRelation);
else
array_insert_last(mdd_t *, abstractedRelationArray, abstractedRelation);
}
if (bdd_get_package_name() != CUDD)
mdd_array_free(varsArray);
return(abstractedRelationArray);
}
Here is the caller graph for this function:| array_t* ImgGetCofactoredAbstractedRelationArray | ( | mdd_manager * | manager, |
| array_t * | relationArray, | ||
| mdd_t * | cofactorCube, | ||
| mdd_t * | abstractCube | ||
| ) |
Function********************************************************************
Synopsis [Cofactors and smooths a relation array.]
Description [Cofactors and smooths a relation array. Returns new relation array.]
SideEffects []
Definition at line 1084 of file imgTfmUtil.c.
{
int i;
array_t *newRelationArray = array_alloc(mdd_t *, 0);
mdd_t *relation, *newRelation, *tmpRelation;
array_t *varsArray;
if (bdd_get_package_name() != CUDD)
varsArray = mdd_get_bdd_support_vars(manager, abstractCube);
else /* to remove uninitialized variable warning*/
varsArray = NIL(array_t);
for (i = 0; i < array_n(relationArray); i++) {
relation = array_fetch(mdd_t *, relationArray, i);
tmpRelation = bdd_cofactor(relation, cofactorCube);
if (bdd_get_package_name() == CUDD)
newRelation = bdd_smooth_with_cube(tmpRelation, abstractCube);
else
newRelation = bdd_smooth(tmpRelation, varsArray);
mdd_free(tmpRelation);
if (bdd_is_tautology(newRelation, 1))
mdd_free(newRelation);
else
array_insert_last(mdd_t *, newRelationArray, newRelation);
}
if (bdd_get_package_name() != CUDD)
mdd_array_free(varsArray);
return(newRelationArray);
}
Here is the caller graph for this function:| array_t* ImgGetCofactoredRelationArray | ( | array_t * | relationArray, |
| mdd_t * | func | ||
| ) |
Function********************************************************************
Synopsis [Cofactors a relation array with respect to a function.]
Description [Cofactors a relation array with respect to a function. Returns new relation array.]
SideEffects []
Definition at line 931 of file imgTfmUtil.c.
{
int i;
array_t *cofactoredRelationArray;
mdd_t *relation, *cofactoredRelation;
if (bdd_is_tautology(func, 1))
return(mdd_array_duplicate(relationArray));
cofactoredRelationArray = array_alloc(mdd_t *, 0);
for (i = 0; i < array_n(relationArray); i++) {
relation = array_fetch(mdd_t *, relationArray, i);
cofactoredRelation = bdd_cofactor(relation, func);
if (bdd_is_tautology(cofactoredRelation, 1))
mdd_free(cofactoredRelation);
else
array_insert_last(mdd_t *, cofactoredRelationArray, cofactoredRelation);
}
return(cofactoredRelationArray);
}
Here is the caller graph for this function:| array_t* ImgGetCofactoredVector | ( | ImgTfmInfo_t * | info, |
| array_t * | vector, | ||
| mdd_t * | func | ||
| ) |
Function********************************************************************
Synopsis [Cofactors a function vector with respect to a function.]
Description [Cofactors a function vector with respect to a function. Returns new function vector.]
SideEffects []
Definition at line 1206 of file imgTfmUtil.c.
{
int i;
array_t *cofactoredVector = array_alloc(ImgComponent_t *, 0);
ImgComponent_t *comp, *cofactoredComp;
mdd_t *cofactoredFunc;
if (bdd_is_tautology(func, 1))
return(ImgVectorCopy(info, vector));
for (i = 0; i < array_n(vector); i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
cofactoredFunc = bdd_cofactor(comp->func, func);
cofactoredComp = ImgComponentAlloc(info);
cofactoredComp->var = mdd_dup(comp->var);
cofactoredComp->func = cofactoredFunc;
cofactoredComp->intermediate = comp->intermediate;
if (mdd_equal(cofactoredFunc, comp->func))
ImgSupportCopy(info, cofactoredComp->support, comp->support);
else
ImgComponentGetSupport(cofactoredComp);
array_insert_last(ImgComponent_t *, cofactoredVector, cofactoredComp);
}
return(cofactoredVector);
}
Here is the call graph for this function:
Here is the caller graph for this function:| mdd_t* ImgGetComposedFunction | ( | array_t * | vector | ) |
Function********************************************************************
Synopsis [Returns a function composed all intermediate variables.]
Description [Returns a function composed all intermediate variables.]
SideEffects []
Definition at line 1458 of file imgTfmUtil.c.
{
ImgComponent_t *comp;
mdd_t *func, *newFunc;
int i;
array_t *varArray, *funcArray;
assert(ImgVectorFunctionSize(vector) == 1);
/* no intermediate variables */
if (array_n(vector) == 1) {
comp = array_fetch(ImgComponent_t *, vector, 0);
newFunc = mdd_dup(comp->func);
return(newFunc);
}
func = NIL(mdd_t);
varArray = array_alloc(mdd_t *, 0);
funcArray = array_alloc(mdd_t *, 0);
for (i = 0; i < array_n(vector); i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
if (comp->intermediate) {
array_insert_last(mdd_t *, varArray, comp->var);
array_insert_last(mdd_t *, funcArray, comp->func);
continue;
}
func = comp->func;
}
newFunc = bdd_vector_compose(func, varArray, funcArray);
array_free(varArray);
array_free(funcArray);
return(newFunc);
}
Here is the call graph for this function:
Here is the caller graph for this function:| array_t* ImgGetConstrainedRelationArray | ( | ImgTfmInfo_t * | info, |
| array_t * | relationArray, | ||
| mdd_t * | constraint | ||
| ) |
Function********************************************************************
Synopsis [Constrains a relation array with respect to a constraint.]
Description [Constrains a relation array with respect to a constraint. Returns new relation array.]
SideEffects []
Definition at line 897 of file imgTfmUtil.c.
{
array_t *constrainedRelationArray;
int dynStatus;
bdd_reorder_type_t dynMethod;
dynStatus = bdd_reordering_status(info->manager, &dynMethod);
if (dynStatus != 0)
bdd_dynamic_reordering_disable(info->manager);
constrainedRelationArray = ImgGetCofactoredRelationArray(relationArray,
constraint);
if (dynStatus != 0) {
bdd_dynamic_reordering(info->manager, dynMethod,
BDD_REORDER_VERBOSITY_DEFAULT);
}
return(constrainedRelationArray);
}
Here is the call graph for this function:
Here is the caller graph for this function:| array_t* ImgGetConstrainedVector | ( | ImgTfmInfo_t * | info, |
| array_t * | vector, | ||
| mdd_t * | constraint | ||
| ) |
Function********************************************************************
Synopsis [Constrains a function vector with respect to a constraint.]
Description [Constrains a function vector with respect to a constraint. Returns new function vector.]
SideEffects []
Definition at line 1174 of file imgTfmUtil.c.
{
array_t *constrainedVector;
int dynStatus;
bdd_reorder_type_t dynMethod;
dynStatus = bdd_reordering_status(info->manager, &dynMethod);
if (dynStatus != 0)
bdd_dynamic_reordering_disable(info->manager);
constrainedVector = ImgGetCofactoredVector(info, vector, constraint);
if (dynStatus != 0) {
bdd_dynamic_reordering(info->manager, dynMethod,
BDD_REORDER_VERBOSITY_DEFAULT);
}
return(constrainedVector);
}
Here is the call graph for this function:
Here is the caller graph for this function:| ImgComponent_t* ImgGetLatchComponent | ( | array_t * | vector | ) |
Function********************************************************************
Synopsis [Returns the first latch component.]
Description [Returns the first latch component.]
SideEffects []
Definition at line 1505 of file imgTfmUtil.c.
{
ImgComponent_t *comp;
int i;
for (i = 0; i < array_n(vector); i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
if (!comp->intermediate)
return(comp);
}
return(NIL(ImgComponent_t));
}
Here is the caller graph for this function:| float ImgPercentVectorDependency | ( | ImgTfmInfo_t * | info, |
| array_t * | vector, | ||
| int | length, | ||
| int * | nLongs | ||
| ) |
Function********************************************************************
Synopsis [Returns the percent of non-zero elements in dependency matrix.]
Description [Returns the percent of non-zero elements in dependency matrix.]
SideEffects []
Definition at line 1918 of file imgTfmUtil.c.
{
int i, j, index, nFuncs, nSupports, nLambdaLatches;
int count, total;
char *support;
ImgComponent_t *comp;
float percent;
int *occurs;
support = ALLOC(char, sizeof(char) * info->nVars);
memset(support, 0, sizeof(char) * info->nVars);
occurs = ALLOC(int, sizeof(int) * info->nVars);
memset(occurs, 0, sizeof(int) * info->nVars);
count = 0;
nFuncs = array_n(vector);
for (i = 0; i < nFuncs; i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
for (j = 0; j < info->nVars; j++) {
if (comp->support[j]) {
support[j] = 1;
count++;
occurs[i]++;
}
}
}
nSupports = 0;
for (i = 0; i < info->nVars; i++) {
if (support[i])
nSupports++;
}
nLambdaLatches = 0;
for (i = 0; i < nFuncs; i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
index = bdd_top_var_id(comp->var);
if (!support[index])
nLambdaLatches++;
}
FREE(support);
*nLongs = 0;
for (i = 0; i < info->nVars; i++) {
if (occurs[i] >= length)
(*nLongs)++;
}
total = (nFuncs - nLambdaLatches) * nSupports;
percent = (float)count / (float)total * 100.0;
return(percent);
}
| void ImgPrintVectorDependency | ( | ImgTfmInfo_t * | info, |
| array_t * | vector, | ||
| int | verbosity | ||
| ) |
Function********************************************************************
Synopsis [Prints vector dependencies with support.]
Description [Prints vector dependencies with support.]
SideEffects []
Definition at line 1792 of file imgTfmUtil.c.
{
int i, j, index, nFuncs, nSupports;
int nLambdaLatches, nConstLatches, nIntermediateVars;
int count, countStates, total;
int start, end;
char *support, line[80];
ImgComponent_t *comp;
if (verbosity == 0 || (!vector))
return;
support = ALLOC(char, sizeof(char) * info->nVars);
memset(support, 0, sizeof(char) * info->nVars);
count = countStates = 0;
nFuncs = array_n(vector);
for (i = 0; i < nFuncs; i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
for (j = 0; j < info->nVars; j++) {
if (comp->support[j]) {
support[j] = 1;
count++;
if (!st_lookup(info->quantifyVarsTable, (char *)(long)j, NIL(char *)))
countStates++;
}
}
}
nSupports = 0;
for (i = 0; i < info->nVars; i++) {
if (support[i])
nSupports++;
}
nLambdaLatches = 0;
nConstLatches = 0;
nIntermediateVars = 0;
for (i = 0; i < nFuncs; i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
index = bdd_top_var_id(comp->var);
if (!support[index])
nLambdaLatches++;
if (ImgSupportCount(info, comp->support) == 0)
nConstLatches++;
if (comp->intermediate)
nIntermediateVars++;
}
fprintf(vis_stdout, "** tfm info: #vars = %d(%d)\n",
info->nVars - nFuncs + nIntermediateVars, info->nVars);
fprintf(vis_stdout, "** tfm info: #input vars = %d\n",
info->nVars - (nFuncs - nIntermediateVars) * 2 - nIntermediateVars);
fprintf(vis_stdout, "** tfm info: #funcs = %d\n", nFuncs);
fprintf(vis_stdout, "** tfm info: #lambda funcs = %d\n", nLambdaLatches);
fprintf(vis_stdout, "** tfm info: #constant funcs = %d\n", nConstLatches);
fprintf(vis_stdout, "** tfm info: #intermediate funcs = %d\n",
nIntermediateVars);
fprintf(vis_stdout,
"Shared size of transition function vector is %10ld BDD nodes\n",
ImgVectorBddSize(vector));
total = nFuncs * nFuncs;
fprintf(vis_stdout,
"** tfm info: support distribution (state variables) = %.2f%%(%d out of %d)\n",
(float)countStates / (float)total * 100.0, countStates, total);
total = nFuncs * nSupports;
fprintf(vis_stdout,
"** tfm info: support distribution (all variables) = %.2f%% (%d out of %d)\n",
(float)count / (float)total * 100.0, count, total);
if (verbosity < 3) {
FREE(support);
return;
}
fprintf(vis_stdout, "*** function list ***\n");
for (i = 0; i < nFuncs; i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
index = bdd_top_var_id(comp->var);
fprintf(vis_stdout, "[%d] index = %d\n", i, index);
}
start = 0;
end = 74;
if (end >= nFuncs)
end = nFuncs - 1;
while (1) {
fprintf(vis_stdout, "========================================");
fprintf(vis_stdout, "========================================\n");
fprintf(vis_stdout, " 1234567890123456789012345678901234567890");
fprintf(vis_stdout, "12345678901234567890123456789012345\n");
fprintf(vis_stdout, "----------------------------------------");
fprintf(vis_stdout, "----------------------------------------\n");
for (i = 0; i < info->nVars; i++) {
if (!support[i])
continue;
if (st_lookup(info->rangeVarsTable, (char *)(long)i, NIL(char *)))
continue;
for (j = start; j <= end; j++) {
comp = array_fetch(ImgComponent_t *, vector, j);
if (comp->support[i])
line[j - start] = '1';
else
line[j - start] = '.';
}
line[j - start] = '\0';
fprintf(vis_stdout, "%4d %s\n", i, line);
}
if (end >= nFuncs - 1)
break;
start += 75;
end += 75;
if (end >= nFuncs)
end = nFuncs - 1;
}
FREE(support);
}
Here is the call graph for this function:
Here is the caller graph for this function:| void ImgSupportClear | ( | ImgTfmInfo_t * | info, |
| char * | support | ||
| ) |
Function********************************************************************
Synopsis [Clears a support array.]
Description [Clears a support array.]
SideEffects []
Definition at line 833 of file imgTfmUtil.c.
{
memset(support, 0, sizeof(char) * info->nVars);
}
Here is the caller graph for this function:| void ImgSupportCopy | ( | ImgTfmInfo_t * | info, |
| char * | dsupport, | ||
| char * | ssupport | ||
| ) |
Function********************************************************************
Synopsis [Copies the supports of a component.]
Description [Copies the supports of a component. Here support is an array of char.]
SideEffects []
Definition at line 817 of file imgTfmUtil.c.
{
memcpy(dsupport, ssupport, sizeof(char) * info->nVars);
}
Here is the caller graph for this function:| int ImgSupportCount | ( | ImgTfmInfo_t * | info, |
| char * | support | ||
| ) |
Function********************************************************************
Synopsis [Returns the number of support of a support array.]
Description [Returns the number of support of a support array.]
SideEffects []
Definition at line 873 of file imgTfmUtil.c.
{
int i, nSupports;
nSupports = 0;
for (i = 0; i < info->nVars; i++) {
if (support[i])
nSupports++;
}
return(nSupports);
}
Here is the caller graph for this function:| void ImgSupportPrint | ( | ImgTfmInfo_t * | info, |
| char * | support | ||
| ) |
Function********************************************************************
Synopsis [Prints a support array.]
Description [Prints a support array.]
SideEffects []
Definition at line 849 of file imgTfmUtil.c.
{
int i;
for (i = 0; i < info->nVars; i++) {
if (support[i])
printf("*");
else
printf(".");
}
printf("\n");
}
| mdd_t* ImgTfmEliminateDependVars | ( | ImgTfmInfo_t * | info, |
| array_t * | vector, | ||
| array_t * | relationArray, | ||
| mdd_t * | states, | ||
| array_t ** | newVector, | ||
| mdd_t ** | dependRelations | ||
| ) |
Function********************************************************************
Synopsis [Eliminates dependent variables from transition function.]
Description [Eliminates dependent variables from a transition function. Returns a simplified copy of the given states if successful; NULL otherwise.]
SideEffects [vector is also modified.]
SeeAlso []
Definition at line 1282 of file imgTfmUtil.c.
{
int i, j;
int howMany = 0;
/* number of latches that can be eliminated */
mdd_t *var, *newStates, *abs, *positive, *phi;
mdd_t *tmp, *relation;
int nVars;
int nSupports; /* vars in the support of the state set */
int *candidates; /* vars to be considered for elimination */
double minStates;
ImgComponent_t *comp, *newComp;
if (dependRelations) {
*dependRelations = mdd_one(info->manager);
*newVector = array_alloc(ImgComponent_t *, 0);
}
newStates = mdd_dup(states);
nVars = info->nVars;
candidates = ALLOC(int, nVars);
if (candidates == NULL)
return(NULL);
comp = ImgComponentAlloc(info);
comp->func = newStates;
ImgComponentGetSupport(comp);
nSupports = 0;
for (i = 0 ; i < nVars; i++) {
if (comp->support[i]) {
candidates[nSupports] = i;
nSupports++;
}
}
comp->func = NIL(mdd_t);
ImgComponentFree(comp);
/* The signatures of the variables in a function are the number
** of minterms of the positive cofactors with respect to the
** variables themselves. */
signatures = bdd_cof_minterm(newStates);
if (signatures == NULL) {
FREE(candidates);
return(NULL);
}
/* We now extract a positive quantity which is higher for those
** variables that are closer to being essential. */
minStates = signatures[nSupports];
for (i = 0; i < nSupports; i++) {
double z = signatures[i] / minStates - 1.0;
signatures[i] = (z < 0.0) ? -z : z; /* make positive */
}
qsort((void *)candidates, nSupports, sizeof(int),
(int (*)(const void *, const void *))SignatureCompare);
FREE(signatures);
/* Now process the candidates in the given order. */
for (i = 0; i < nSupports; i++) {
var = bdd_var_with_index(info->manager, candidates[i]);
if (bdd_var_is_dependent(newStates, var)) {
abs = bdd_smooth_with_cube(newStates, var);
if (abs == NULL)
return(NULL);
positive = bdd_cofactor(newStates, var);
if (positive == NULL)
return(NULL);
phi = Img_MinimizeImage(positive, abs, Img_DefaultMinimizeMethod_c,
TRUE);
if (phi == NULL)
return(NULL);
mdd_free(positive);
if (bdd_size(phi) < IMG_MAX_DEP_SIZE) {
howMany++;
if (dependRelations) {
for (j = 0; j < array_n(vector); j++) {
comp = array_fetch(ImgComponent_t *, vector, j);
if (mdd_equal(comp->var, var))
continue;
newComp = ImgComponentCopy(info, comp);
array_insert_last(ImgComponent_t *, *newVector, newComp);
}
} else {
for (j = 0; j < array_n(vector); j++) {
comp = array_fetch(ImgComponent_t *, vector, j);
tmp = bdd_compose(comp->func, var, phi);
if (tmp == NULL)
return(NULL);
mdd_free(comp->func);
comp->func = tmp;
ImgSupportClear(info, comp->support);
ImgComponentGetSupport(comp);
}
}
if (relationArray) {
for (j = 0; j < array_n(relationArray); j++) {
relation = array_fetch(mdd_t *, relationArray, j);
if (dependRelations)
tmp = bdd_smooth_with_cube(relation, var);
else
tmp = bdd_compose(relation, var, phi);
mdd_free(relation);
array_insert(mdd_t *, relationArray, j, tmp);
}
}
mdd_free(newStates);
newStates = abs;
if (dependRelations) {
relation = mdd_xnor(var, phi);
tmp = mdd_and(*dependRelations, relation, 1, 1);
mdd_free(*dependRelations);
mdd_free(relation);
*dependRelations = tmp;
}
} else {
mdd_free(abs);
}
mdd_free(phi);
}
}
FREE(candidates);
if (howMany) {
if (info->imageVerbosity > 0)
(void)fprintf(vis_stdout, "Eliminated %d vars.\n", howMany);
info->averageFoundDependVars = (info->averageFoundDependVars *
(float)info->nFoundDependVars + (float)howMany) /
(float)(info->nFoundDependVars + 1);
info->nFoundDependVars++;
}
info->nPrevEliminatedFwd = howMany;
return(newStates);
} /* end of TfmEliminateDependVars */
Here is the call graph for this function:
Here is the caller graph for this function:| long ImgVectorBddSize | ( | array_t * | vector | ) |
Function********************************************************************
Synopsis [Returns the shared BDD size of a vector.]
Description [Returns the shared BDD size of a vector.]
SideEffects []
Definition at line 671 of file imgTfmUtil.c.
{
array_t *nodeArray;
ImgComponent_t *comp;
int i, size;
nodeArray = array_alloc(mdd_t *, 0);
for (i = 0; i < array_n(vector); i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
array_insert_last(mdd_t *, nodeArray, comp->func);
}
size = bdd_size_multiple(nodeArray);
array_free(nodeArray);
return(size);
}
Here is the caller graph for this function:| void ImgVectorConstrain | ( | ImgTfmInfo_t * | info, |
| array_t * | vector, | ||
| mdd_t * | constraint, | ||
| array_t * | relationArray, | ||
| array_t ** | newVector, | ||
| mdd_t ** | cube, | ||
| array_t ** | newRelationArray, | ||
| mdd_t ** | cofactorCube, | ||
| mdd_t ** | abstractCube, | ||
| boolean | singleVarFlag | ||
| ) |
AutomaticEnd Function********************************************************************
Synopsis [Constrains a function vector with respect to a constraint.]
Description [Constrains a function vector with respect to a constraint.]
SideEffects []
Definition at line 91 of file imgTfmUtil.c.
{
mdd_t *new_, *res, *old, *tmp;
ImgComponent_t *comp, *comp1;
array_t *vector1;
int i, index;
int dynStatus, dynOff;
bdd_reorder_type_t dynMethod;
st_table *equivTable;
int *ptr, *regularPtr;
int n, pos;
mdd_t *cofactor, *abstract, *nsVar, *constIntermediate;
array_t *tmpRelationArray;
int size;
old = mdd_one(info->manager);
vector1 = array_alloc(ImgComponent_t *, 0);
dynStatus = 0;
if (singleVarFlag)
dynOff = 0;
else
dynOff = 1;
if (dynOff) {
dynStatus = bdd_reordering_status(info->manager, &dynMethod);
if (dynStatus != 0)
bdd_dynamic_reordering_disable(info->manager);
}
if (relationArray) {
cofactor = mdd_one(info->manager);
abstract = mdd_one(info->manager);
} else {
cofactor = NIL(mdd_t);
abstract = NIL(mdd_t);
}
if (info->nIntermediateVars) {
size = ImgVectorFunctionSize(vector);
if (size == array_n(vector))
constIntermediate = NIL(mdd_t);
else
constIntermediate = mdd_one(info->manager);
} else
constIntermediate = NIL(mdd_t);
n = 0;
equivTable = st_init_table(st_ptrcmp, st_ptrhash);
index = (int)bdd_top_var_id(constraint);
for (i = 0; i < array_n(vector); i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
if (!bdd_is_tautology(constraint, 1)) {
if (singleVarFlag) {
if (comp->support[index])
res = bdd_cofactor(comp->func, constraint);
else
res = mdd_dup(comp->func);
} else
res = bdd_cofactor(comp->func, constraint);
} else
res = mdd_dup(comp->func);
if (bdd_is_tautology(res, 1)) {
if (comp->intermediate) {
tmp = constIntermediate;
constIntermediate = mdd_and(tmp, comp->var, 1, 1);
mdd_free(tmp);
mdd_free(res);
continue;
}
new_ = mdd_and(comp->var, old, 1, 1);
mdd_free(old);
mdd_free(res);
old = new_;
if (cofactor) {
nsVar = ImgSubstitute(comp->var, info->functionData, Img_D2R_c);
tmp = cofactor;
cofactor = mdd_and(tmp, nsVar, 1, 1);
mdd_free(tmp);
mdd_free(nsVar);
}
} else if (bdd_is_tautology(res, 0)) {
if (comp->intermediate) {
tmp = constIntermediate;
constIntermediate = mdd_and(tmp, comp->var, 1, 0);
mdd_free(tmp);
mdd_free(res);
continue;
}
new_ = mdd_and(comp->var, old, 0, 1);
mdd_free(old);
mdd_free(res);
old = new_;
if (cofactor) {
nsVar = ImgSubstitute(comp->var, info->functionData, Img_D2R_c);
tmp = cofactor;
cofactor = mdd_and(tmp, nsVar, 1, 0);
mdd_free(tmp);
mdd_free(nsVar);
}
} else {
if (comp->intermediate) {
comp1 = ImgComponentAlloc(info);
comp1->var = mdd_dup(comp->var);
comp1->func = res;
comp1->intermediate = 1;
if (mdd_equal(res, comp->func))
ImgSupportCopy(info, comp1->support, comp->support);
else
ImgComponentGetSupport(comp1);
array_insert_last(ImgComponent_t *, vector1, comp1);
n++;
continue;
}
ptr = (int *)bdd_pointer(res);
regularPtr = (int *)((unsigned long)ptr & ~01);
if (st_lookup_int(equivTable, (char *)regularPtr, &pos)) {
comp1 = array_fetch(ImgComponent_t *, vector1, pos);
if (mdd_equal(res, comp1->func))
tmp = mdd_xnor(comp->var, comp1->var);
else
tmp = mdd_xor(comp->var, comp1->var);
new_ = mdd_and(tmp, old, 1, 1);
mdd_free(tmp);
mdd_free(old);
mdd_free(res);
old = new_;
if (abstract) {
nsVar = ImgSubstitute(comp->var, info->functionData, Img_D2R_c);
tmp = abstract;
abstract = mdd_and(tmp, nsVar, 1, 1);
mdd_free(tmp);
mdd_free(nsVar);
}
} else {
comp1 = ImgComponentAlloc(info);
comp1->var = mdd_dup(comp->var);
comp1->func = res;
if (mdd_equal(res, comp->func))
ImgSupportCopy(info, comp1->support, comp->support);
else
ImgComponentGetSupport(comp1);
array_insert_last(ImgComponent_t *, vector1, comp1);
st_insert(equivTable, (char *)regularPtr, (char *)(long)n);
n++;
}
}
}
st_free_table(equivTable);
if (dynOff && dynStatus != 0) {
bdd_dynamic_reordering(info->manager, dynMethod,
BDD_REORDER_VERBOSITY_DEFAULT);
}
if (constIntermediate) {
if (!bdd_is_tautology(constIntermediate, 1)) {
mdd_t *tmpCofactor, *tmpAbstract;
if (relationArray) {
vector1 = ImgComposeConstIntermediateVars(info, vector1,
constIntermediate,
&tmpCofactor, &tmpAbstract,
&old, NIL(mdd_t *));
if (!bdd_is_tautology(tmpCofactor, 1)) {
tmp = cofactor;
cofactor = mdd_and(tmp, tmpCofactor, 1, 1);
mdd_free(tmp);
}
mdd_free(tmpCofactor);
if (!bdd_is_tautology(tmpAbstract, 1)) {
tmp = abstract;
abstract = mdd_and(tmp, tmpAbstract, 1, 1);
mdd_free(tmp);
}
mdd_free(tmpAbstract);
tmp = cofactor;
cofactor = mdd_and(tmp, constIntermediate, 1, 1);
mdd_free(tmp);
} else {
vector1 = ImgComposeConstIntermediateVars(info, vector1,
constIntermediate,
NIL(mdd_t *), NIL(mdd_t *),
&old, NIL(mdd_t *));
}
}
mdd_free(constIntermediate);
}
if (info->option->sortVectorFlag)
array_sort(vector1, CompareBddPointer);
if (relationArray && newRelationArray) {
if (singleVarFlag) {
*newRelationArray = relationArray;
tmp = cofactor;
cofactor = mdd_and(tmp, constraint, 1, 1);
mdd_free(tmp);
} else
*newRelationArray = ImgGetConstrainedRelationArray(info, relationArray,
constraint);
}
if (cofactorCube && abstractCube) {
if (cofactor)
*cofactorCube = cofactor;
if (abstract)
*abstractCube = abstract;
} else {
if (cofactor) {
if (bdd_is_tautology(cofactor, 1))
mdd_free(cofactor);
else {
tmpRelationArray = *newRelationArray;
*newRelationArray = ImgGetCofactoredRelationArray(tmpRelationArray,
cofactor);
mdd_free(cofactor);
if (tmpRelationArray != relationArray)
mdd_array_free(tmpRelationArray);
}
}
if (abstract) {
if (bdd_is_tautology(abstract, 1))
mdd_free(abstract);
else {
tmpRelationArray = *newRelationArray;
*newRelationArray = ImgGetAbstractedRelationArray(info->manager,
tmpRelationArray,
abstract);
mdd_free(abstract);
if (tmpRelationArray != relationArray)
mdd_array_free(tmpRelationArray);
}
}
}
*newVector = vector1;
*cube = old;
}
Here is the call graph for this function:
Here is the caller graph for this function:| array_t* ImgVectorCopy | ( | ImgTfmInfo_t * | info, |
| array_t * | vector | ||
| ) |
Function********************************************************************
Synopsis [Copies a vector.]
Description [Copies a vector.]
SideEffects []
Definition at line 699 of file imgTfmUtil.c.
{
array_t *newVector;
ImgComponent_t *comp, *newComp;
int i;
newVector = array_alloc(ImgComponent_t *, 0);
for (i = 0; i < array_n(vector); i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
newComp = ImgComponentCopy(info, comp);
array_insert_last(ImgComponent_t *, newVector, newComp);
}
return(newVector);
}
Here is the call graph for this function:
Here is the caller graph for this function:| void ImgVectorFree | ( | array_t * | vector | ) |
Function********************************************************************
Synopsis [Frees a function vector.]
Description [Frees a function vector.]
SideEffects []
Definition at line 621 of file imgTfmUtil.c.
{
int i;
ImgComponent_t *comp;
for (i = 0; i < array_n(vector); i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
ImgComponentFree(comp);
}
array_free(vector);
}
Here is the call graph for this function:
Here is the caller graph for this function:| int ImgVectorFunctionSize | ( | array_t * | vector | ) |
Function********************************************************************
Synopsis [Returns the number of functions in a vector.]
Description [Returns the number of functions in a vector. Excludes the number of intermediate functions.]
SideEffects []
Definition at line 645 of file imgTfmUtil.c.
{
ImgComponent_t *comp;
int i, size;
size = 0;
for (i = 0; i < array_n(vector); i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
if (!comp->intermediate)
size++;
}
return(size);
}
Here is the caller graph for this function:| mdd_t* ImgVectorMinimize | ( | ImgTfmInfo_t * | info, |
| array_t * | vector, | ||
| mdd_t * | constraint, | ||
| mdd_t * | from, | ||
| array_t * | relationArray, | ||
| array_t ** | newVector, | ||
| mdd_t ** | cube, | ||
| array_t ** | newRelationArray, | ||
| mdd_t ** | cofactorCube, | ||
| mdd_t ** | abstractCube | ||
| ) |
Function********************************************************************
Synopsis [Minimizes a function vector and a from set with respect to an essential cube.]
Description [Minimizes a function vector and a from set with respect to an essential cube. This function is called during eliminating dependent variables.]
SideEffects []
Definition at line 346 of file imgTfmUtil.c.
{
mdd_t *new_, *res, *old, *tmp, *newFrom;
ImgComponent_t *comp, *comp1;
array_t *vector1;
int i;
st_table *equivTable;
int *ptr, *regularPtr;
int n, pos;
mdd_t *cofactor, *abstract, *nsVar, *constIntermediate;
array_t *tmpRelationArray;
int size;
if (from)
newFrom = mdd_dup(from);
else
newFrom = NIL(mdd_t);
if (cube)
old = mdd_one(info->manager);
else
old = NIL(mdd_t);
assert(newVector)
vector1 = array_alloc(ImgComponent_t *, 0);
if (relationArray) {
cofactor = mdd_one(info->manager);
abstract = mdd_one(info->manager);
} else {
cofactor = NIL(mdd_t);
abstract = NIL(mdd_t);
}
if (info->nIntermediateVars) {
size = ImgVectorFunctionSize(vector);
if (size == array_n(vector))
constIntermediate = NIL(mdd_t);
else
constIntermediate = mdd_one(info->manager);
} else
constIntermediate = NIL(mdd_t);
n = 0;
equivTable = st_init_table(st_ptrcmp, st_ptrhash);
for (i = 0; i < array_n(vector); i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
res = bdd_minimize(comp->func, constraint);
if (bdd_is_tautology(res, 1)) {
if (comp->intermediate) {
tmp = constIntermediate;
constIntermediate = mdd_and(tmp, comp->var, 1, 1);
mdd_free(tmp);
mdd_free(res);
continue;
}
if (newFrom) {
tmp = newFrom;
newFrom = bdd_cofactor(tmp, comp->var);
mdd_free(tmp);
}
if (old) {
new_ = mdd_and(comp->var, old, 1, 1);
mdd_free(old);
mdd_free(res);
old = new_;
}
if (cofactor) {
nsVar = ImgSubstitute(comp->var, info->functionData, Img_D2R_c);
tmp = cofactor;
cofactor = mdd_and(tmp, nsVar, 1, 1);
mdd_free(tmp);
mdd_free(nsVar);
}
} else if (bdd_is_tautology(res, 0)) {
if (comp->intermediate) {
tmp = constIntermediate;
constIntermediate = mdd_and(tmp, comp->var, 1, 0);
mdd_free(tmp);
mdd_free(res);
continue;
}
if (newFrom) {
tmp = newFrom;
new_ = mdd_not(comp->var);
newFrom = bdd_cofactor(tmp, new_);
mdd_free(tmp);
mdd_free(new_);
}
if (old) {
new_ = mdd_and(comp->var, old, 0, 1);
mdd_free(old);
mdd_free(res);
old = new_;
}
if (cofactor) {
nsVar = ImgSubstitute(comp->var, info->functionData, Img_D2R_c);
tmp = cofactor;
cofactor = mdd_and(tmp, nsVar, 1, 0);
mdd_free(tmp);
mdd_free(nsVar);
}
} else {
if (comp->intermediate) {
comp1 = ImgComponentAlloc(info);
comp1->var = mdd_dup(comp->var);
comp1->func = res;
comp1->intermediate = 1;
if (mdd_equal(res, comp->func))
ImgSupportCopy(info, comp1->support, comp->support);
else
ImgComponentGetSupport(comp1);
array_insert_last(ImgComponent_t *, vector1, comp1);
n++;
continue;
}
ptr = (int *)bdd_pointer(res);
regularPtr = (int *)((unsigned long)ptr & ~01);
if (st_lookup_int(equivTable, (char *)regularPtr, &pos)) {
comp1 = array_fetch(ImgComponent_t *, vector1, pos);
if (newFrom) {
if (mdd_equal(res, comp1->func)) {
tmp = newFrom;
newFrom = bdd_compose(tmp, comp->var, comp1->var);
mdd_free(tmp);
} else {
tmp = newFrom;
new_ = mdd_not(comp1->var);
newFrom = bdd_compose(tmp, comp->var, new_);
mdd_free(tmp);
mdd_free(new_);
}
}
if (old) {
if (mdd_equal(res, comp1->func))
tmp = mdd_xnor(comp->var, comp1->var);
else
tmp = mdd_xor(comp->var, comp1->var);
new_ = mdd_and(tmp, old, 1, 1);
mdd_free(tmp);
mdd_free(old);
old = new_;
}
mdd_free(res);
if (abstract) {
nsVar = ImgSubstitute(comp->var, info->functionData, Img_D2R_c);
tmp = abstract;
abstract = mdd_and(tmp, nsVar, 1, 1);
mdd_free(tmp);
mdd_free(nsVar);
}
} else {
comp1 = ImgComponentAlloc(info);
comp1->var = mdd_dup(comp->var);
comp1->func = res;
if (mdd_equal(res, comp->func))
ImgSupportCopy(info, comp1->support, comp->support);
else
ImgComponentGetSupport(comp1);
array_insert_last(ImgComponent_t *, vector1, comp1);
st_insert(equivTable, (char *)regularPtr, (char *)(long)n);
n++;
}
}
}
st_free_table(equivTable);
if (constIntermediate) {
if (!bdd_is_tautology(constIntermediate, 1)) {
mdd_t *tmpCofactor, *tmpAbstract;
if (relationArray) {
vector1 = ImgComposeConstIntermediateVars(info, vector1,
constIntermediate,
&tmpCofactor, &tmpAbstract,
&old, NIL(mdd_t *));
if (!bdd_is_tautology(tmpCofactor, 1)) {
tmp = cofactor;
cofactor = mdd_and(tmp, tmpCofactor, 1, 1);
mdd_free(tmp);
}
mdd_free(tmpCofactor);
if (!bdd_is_tautology(tmpAbstract, 1)) {
tmp = abstract;
abstract = mdd_and(tmp, tmpAbstract, 1, 1);
mdd_free(tmp);
}
mdd_free(tmpAbstract);
tmp = cofactor;
cofactor = mdd_and(tmp, constIntermediate, 1, 1);
mdd_free(tmp);
} else {
vector1 = ImgComposeConstIntermediateVars(info, vector1,
constIntermediate,
NIL(mdd_t *), NIL(mdd_t *),
&old, NIL(mdd_t *));
}
}
mdd_free(constIntermediate);
}
if (info->option->sortVectorFlag)
array_sort(vector1, CompareBddPointer);
if (newRelationArray)
*newRelationArray = relationArray;
if (cofactorCube && abstractCube) {
if (cofactor) {
if (bdd_is_tautology(cofactor, 1)) {
*cofactorCube = mdd_dup(constraint);
mdd_free(cofactor);
} else {
tmp = cofactor;
cofactor = mdd_and(tmp, constraint, 1, 1);
mdd_free(tmp);
*cofactorCube = cofactor;
}
}
if (abstract)
*abstractCube = abstract;
} else {
if (cofactor) {
if (bdd_is_tautology(cofactor, 1))
mdd_free(cofactor);
else {
tmp = cofactor;
cofactor = mdd_and(tmp, constraint, 1, 1);
mdd_free(tmp);
if (newRelationArray) {
*newRelationArray = ImgGetCofactoredRelationArray(relationArray,
cofactor);
} else
ImgCofactorRelationArray(relationArray, cofactor);
mdd_free(cofactor);
}
}
if (abstract) {
if (bdd_is_tautology(abstract, 1))
mdd_free(abstract);
else {
if (newRelationArray) {
tmpRelationArray = *newRelationArray;
*newRelationArray = ImgGetAbstractedRelationArray(info->manager,
tmpRelationArray,
abstract);
if (tmpRelationArray != relationArray)
mdd_array_free(tmpRelationArray);
} else
ImgAbstractRelationArray(info->manager, relationArray, abstract);
mdd_free(abstract);
}
}
}
if (*newVector == vector)
ImgVectorFree(vector);
*newVector = vector1;
if (cube)
*cube = old;
return(newFrom);
}
Here is the call graph for this function:
Here is the caller graph for this function:| void ImgWriteSupportMatrix | ( | ImgTfmInfo_t * | info, |
| array_t * | vector, | ||
| array_t * | relationArray, | ||
| char * | string | ||
| ) |
Function********************************************************************
Synopsis [Writes a gnuplot file with support matrix.]
Description [Writes a gnuplot file with support matrix.]
SideEffects []
Definition at line 1981 of file imgTfmUtil.c.
{
int i, j, id, nFuncs, nRelations, nRows, nSupports;
int *row, col, varType;
char *support, **relationSupport;
ImgComponent_t *comp;
FILE *fout;
mdd_t *relation, *var;
char *filename;
support = ALLOC(char, sizeof(char) * info->nVars);
memset(support, 0, sizeof(char) * info->nVars);
nRows = 0;
if (vector)
nRows += array_n(vector);
if (relationArray)
nRows += array_n(relationArray);
row = ALLOC(int, sizeof(int) * nRows);
if (string)
filename = string;
else
filename = "support.mat";
fout = fopen(filename, "w");
nRows = 0;
if (vector) {
nFuncs = array_n(vector);
for (i = 0; i < nFuncs; i++) {
comp = array_fetch(ImgComponent_t *, vector, i);
if (ImgSupportCount(info, comp->support) == 0) {
row[i] = -1;
continue;
}
row[i] = nRows;
nRows++;
if (info->option->writeSupportMatrixWithYvars) {
var = ImgSubstitute(comp->var, info->functionData, Img_D2R_c);
id = (int)bdd_top_var_id(var);
support[id] = 1;
mdd_free(var);
}
for (j = 0; j < info->nVars; j++) {
if (comp->support[j])
support[j] = 1;
}
}
} else
nFuncs = 0;
relationSupport = 0;
if (relationArray && array_n(relationArray) > 0) {
comp = ImgComponentAlloc(info);
nRelations = 0;
relationSupport = ALLOC(char *, sizeof(char *) * array_n(relationArray));
for (i = 0; i < array_n(relationArray); i++) {
relation = array_fetch(mdd_t *, relationArray, i);
comp->func = relation;
ImgSupportClear(info, comp->support);
ImgComponentGetSupport(comp);
if (ImgSupportCount(info, comp->support) <= 1) {
row[i + nFuncs] = -1;
relationSupport[i] = NIL(char);
continue;
}
row[i + nFuncs] = nRows;
nRows++;
for (j = 0; j < info->nVars; j++) {
if (comp->support[j])
support[j] = 1;
}
relationSupport[i] = ALLOC(char, sizeof(char) * info->nVars);
memcpy(relationSupport[i], comp->support, sizeof(char) * info->nVars);
nRelations++;
}
comp->func = NIL(mdd_t);
ImgComponentFree(comp);
} else
nRelations = 0;
nSupports = 0;
for (i = 0; i < info->nVars; i++) {
if (support[i]) {
if (!info->option->writeSupportMatrixWithYvars &&
st_lookup(info->rangeVarsTable, (char *)(long)i, NIL(char *))) {
continue;
}
nSupports++;
}
}
col = 0;
for (i = 0; i < info->nVars; i++) {
if (!support[i])
continue;
if (st_lookup(info->rangeVarsTable, (char *)(long)i, NIL(char *))) {
if (info->option->writeSupportMatrixWithYvars)
varType = 3;
else
continue;
} else if (st_lookup(info->quantifyVarsTable, (char *)(long)i, NIL(char *)))
varType = 2;
else
varType = 1;
for (j = 0; j < nFuncs; j++) {
comp = array_fetch(ImgComponent_t *, vector, j);
if (comp->support[i]) {
if (info->option->writeSupportMatrixReverseRow) {
if (info->option->writeSupportMatrixReverseCol) {
fprintf(fout, "%d %d %d\n", nSupports - col, nRows - row[j],
varType);
} else
fprintf(fout, "%d %d %d\n", col + 1, nRows - row[j], varType);
} else {
if (info->option->writeSupportMatrixReverseCol)
fprintf(fout, "%d %d %d\n", nSupports - col, row[j] + 1, varType);
else
fprintf(fout, "%d %d %d\n", col + 1, row[j] + 1, varType);
}
} else if (varType == 3) {
var = ImgSubstitute(comp->var, info->functionData, Img_D2R_c);
id = (int)bdd_top_var_id(var);
mdd_free(var);
if (id == i) {
if (info->option->writeSupportMatrixReverseRow) {
if (info->option->writeSupportMatrixReverseCol)
fprintf(fout, "%d %d 3\n", nSupports - col, nRows - row[j]);
else
fprintf(fout, "%d %d 3\n", col + 1, nRows - row[j]);
} else {
if (info->option->writeSupportMatrixReverseCol)
fprintf(fout, "%d %d 3\n", nSupports - col, row[j] + 1);
else
fprintf(fout, "%d %d 3\n", col + 1, row[j] + 1);
}
}
}
}
if (relationArray) {
for (j = 0; j < array_n(relationArray); j++) {
if (relationSupport[j] && relationSupport[j][i]) {
if (info->option->writeSupportMatrixReverseRow) {
if (info->option->writeSupportMatrixReverseCol) {
fprintf(fout, "%d %d %d\n", nSupports - col,
nRows - row[j + nFuncs], varType);
} else {
fprintf(fout, "%d %d %d\n", col + 1, nRows - row[j + nFuncs],
varType);
}
} else {
if (info->option->writeSupportMatrixReverseCol) {
fprintf(fout, "%d %d %d\n", nSupports - col, row[j + nFuncs] + 1,
varType);
} else {
fprintf(fout, "%d %d %d\n", col + 1, row[j + nFuncs] + 1,
varType);
}
}
}
}
}
col++;
}
fclose(fout);
FREE(support);
FREE(row);
if (nRelations) {
for (i = 0; i < nRelations; i++)
FREE(relationSupport[i]);
FREE(relationSupport);
}
}
Here is the call graph for this function:
Here is the caller graph for this function:| static int SignatureCompare | ( | int * | ptrX, |
| int * | ptrY | ||
| ) | [static] |
AutomaticStart
Function********************************************************************
Synopsis [Comparison function used by qsort.]
Description [Comparison function used by qsort to order the variables according to their signatures.]
SideEffects [None]
Definition at line 2171 of file imgTfmUtil.c.
{
if (signatures[*ptrY] > signatures[*ptrX])
return(1);
if (signatures[*ptrY] < signatures[*ptrX])
return(-1);
return(0);
} /* end of SignatureCompare */
Here is the caller graph for this function:double* signatures [static] |
Definition at line 53 of file imgTfmUtil.c.
char rcsid [] UNUSED = "$Id: imgTfmUtil.c,v 1.23 2005/04/23 14:30:55 jinh Exp $" [static] |
CFile***********************************************************************
FileName [imgTfmUtil.c]
PackageName [img]
Synopsis [Routines for image computation using transition function method.]
SeeAlso []
Author [In-Ho Moon]
Copyright [Copyright (c) 1994-1996 The Regents of the Univ. of Colorado. All rights reserved.
Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose, provided that the above copyright notice and the following two paragraphs appear in all copies of this software.
IN NO EVENT SHALL THE UNIVERSITY OF COLORADO BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF COLORADO HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
THE UNIVERSITY OF COLORADO SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF COLORADO HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.]
Definition at line 35 of file imgTfmUtil.c.