/**CFile**************************************************************** FileName [mvcCompare.c] PackageName [MVSIS 2.0: Multi-valued logic synthesis system.] Synopsis [Various cube comparison functions.] Author [MVSIS Group] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - February 1, 2003.] Revision [$Id: mvcCompare.c,v 1.5 2003/04/03 23:25:41 alanmi Exp $] ***********************************************************************/ #include "mvc.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Compares two cubes according to their integer value.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Mvc_CubeCompareInt( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask ) { if ( Mvc_Cube1Words(pC1) ) { if ( pC1->pData[0] < pC2->pData[0] ) return -1; if ( pC1->pData[0] > pC2->pData[0] ) return 1; return 0; } else if ( Mvc_Cube2Words(pC1) ) { if ( pC1->pData[1] < pC2->pData[1] ) return -1; if ( pC1->pData[1] > pC2->pData[1] ) return 1; if ( pC1->pData[0] < pC2->pData[0] ) return -1; if ( pC1->pData[0] > pC2->pData[0] ) return 1; return 0; } else { int i = Mvc_CubeReadLast(pC1); for(; i >= 0; i--) { if ( pC1->pData[i] < pC2->pData[i] ) return -1; if ( pC1->pData[i] > pC2->pData[i] ) return 1; } return 0; } } /**Function************************************************************* Synopsis [Compares the cubes (1) by size, (2) by integer value.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Mvc_CubeCompareSizeAndInt( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask ) { // compare the cubes by size if ( Mvc_CubeReadSize( pC1 ) < Mvc_CubeReadSize( pC2 ) ) return 1; if ( Mvc_CubeReadSize( pC1 ) > Mvc_CubeReadSize( pC2 ) ) return -1; // the cubes have the same size // compare the cubes as integers if ( Mvc_Cube1Words( pC1 ) ) { if ( pC1->pData[0] < pC2->pData[0] ) return -1; if ( pC1->pData[0] > pC2->pData[0] ) return 1; return 0; } else if ( Mvc_Cube2Words( pC1 ) ) { if ( pC1->pData[1] < pC2->pData[1] ) return -1; if ( pC1->pData[1] > pC2->pData[1] ) return 1; if ( pC1->pData[0] < pC2->pData[0] ) return -1; if ( pC1->pData[0] > pC2->pData[0] ) return 1; return 0; } else { int i = Mvc_CubeReadLast( pC1 ); for(; i >= 0; i--) { if ( pC1->pData[i] < pC2->pData[i] ) return -1; if ( pC1->pData[i] > pC2->pData[i] ) return 1; } return 0; } } /**Function************************************************************* Synopsis [Compares two cubes under the mask.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Mvc_CubeCompareIntUnderMask( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask ) { unsigned uBits1, uBits2; // compare the cubes under the mask if ( Mvc_Cube1Words(pC1) ) { uBits1 = pC1->pData[0] & pMask->pData[0]; uBits2 = pC2->pData[0] & pMask->pData[0]; if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; // cubes are equal return 0; } else if ( Mvc_Cube2Words(pC1) ) { uBits1 = pC1->pData[1] & pMask->pData[1]; uBits2 = pC2->pData[1] & pMask->pData[1]; if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; uBits1 = pC1->pData[0] & pMask->pData[0]; uBits2 = pC2->pData[0] & pMask->pData[0]; if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; return 0; } else { int i = Mvc_CubeReadLast(pC1); for(; i >= 0; i--) { uBits1 = pC1->pData[i] & pMask->pData[i]; uBits2 = pC2->pData[i] & pMask->pData[i]; if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; } return 0; } } /**Function************************************************************* Synopsis [Compares two cubes under the mask.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Mvc_CubeCompareIntOutsideMask( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask ) { unsigned uBits1, uBits2; // compare the cubes under the mask if ( Mvc_Cube1Words(pC1) ) { uBits1 = pC1->pData[0] | pMask->pData[0]; uBits2 = pC2->pData[0] | pMask->pData[0]; if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; // cubes are equal return 0; } else if ( Mvc_Cube2Words(pC1) ) { uBits1 = pC1->pData[1] | pMask->pData[1]; uBits2 = pC2->pData[1] | pMask->pData[1]; if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; uBits1 = pC1->pData[0] | pMask->pData[0]; uBits2 = pC2->pData[0] | pMask->pData[0]; if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; return 0; } else { int i = Mvc_CubeReadLast(pC1); for(; i >= 0; i--) { uBits1 = pC1->pData[i] | pMask->pData[i]; uBits2 = pC2->pData[i] | pMask->pData[i]; if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; } return 0; } } /**Function************************************************************* Synopsis [Compares the cubes (1) outside the mask, (2) under the mask.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int Mvc_CubeCompareIntOutsideAndUnderMask( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask ) { unsigned uBits1, uBits2; if ( Mvc_Cube1Words(pC1) ) { // compare the cubes outside the mask uBits1 = pC1->pData[0] & ~(pMask->pData[0]); uBits2 = pC2->pData[0] & ~(pMask->pData[0]); if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; // compare the cubes under the mask uBits1 = pC1->pData[0] & pMask->pData[0]; uBits2 = pC2->pData[0] & pMask->pData[0]; if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; // cubes are equal // should never happen assert( 0 ); return 0; } else if ( Mvc_Cube2Words(pC1) ) { // compare the cubes outside the mask uBits1 = pC1->pData[1] & ~(pMask->pData[1]); uBits2 = pC2->pData[1] & ~(pMask->pData[1]); if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; uBits1 = pC1->pData[0] & ~(pMask->pData[0]); uBits2 = pC2->pData[0] & ~(pMask->pData[0]); if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; // compare the cubes under the mask uBits1 = pC1->pData[1] & pMask->pData[1]; uBits2 = pC2->pData[1] & pMask->pData[1]; if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; uBits1 = pC1->pData[0] & pMask->pData[0]; uBits2 = pC2->pData[0] & pMask->pData[0]; if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; // cubes are equal // should never happen assert( 0 ); return 0; } else { int i; // compare the cubes outside the mask for( i = Mvc_CubeReadLast(pC1); i >= 0; i-- ) { uBits1 = pC1->pData[i] & ~(pMask->pData[i]); uBits2 = pC2->pData[i] & ~(pMask->pData[i]); if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; } // compare the cubes under the mask for( i = Mvc_CubeReadLast(pC1); i >= 0; i-- ) { uBits1 = pC1->pData[i] & pMask->pData[i]; uBits2 = pC2->pData[i] & pMask->pData[i]; if ( uBits1 < uBits2 ) return -1; if ( uBits1 > uBits2 ) return 1; } /* { Mvc_Cover_t * pCover; pCover = Mvc_CoverAlloc( NULL, 96 ); Mvc_CubePrint( pCover, pC1 ); Mvc_CubePrint( pCover, pC2 ); Mvc_CubePrint( pCover, pMask ); } */ // cubes are equal // should never happen assert( 0 ); return 0; } } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END