| /**CFile**************************************************************** |
| |
| FileName [mvcOperAlg.c] |
| |
| PackageName [MVSIS 2.0: Multi-valued logic synthesis system.] |
| |
| Synopsis [Miscellaneous operations on covers.] |
| |
| Author [MVSIS Group] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - February 1, 2003.] |
| |
| Revision [$Id: mvcOpAlg.c,v 1.4 2003/04/26 20:41:36 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "mvc.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Multiplies two disjoint-support covers.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Mvc_Cover_t * Mvc_CoverAlgebraicMultiply( Mvc_Cover_t * pCover1, Mvc_Cover_t * pCover2 ) |
| { |
| Mvc_Cover_t * pCover; |
| Mvc_Cube_t * pCube1, * pCube2, * pCube; |
| int CompResult; |
| |
| // covers should be the same base |
| assert( pCover1->nBits == pCover2->nBits ); |
| // make sure that supports do not overlap |
| Mvc_CoverAllocateMask( pCover1 ); |
| Mvc_CoverAllocateMask( pCover2 ); |
| Mvc_CoverSupport( pCover1, pCover1->pMask ); |
| Mvc_CoverSupport( pCover2, pCover2->pMask ); |
| // check if the cubes are bit-wise disjoint |
| Mvc_CubeBitDisjoint( CompResult, pCover1->pMask, pCover2->pMask ); |
| if ( !CompResult ) |
| printf( "Mvc_CoverMultiply(): Cover supports are not disjoint!\n" ); |
| |
| // iterate through the cubes |
| pCover = Mvc_CoverClone( pCover1 ); |
| Mvc_CoverForEachCube( pCover1, pCube1 ) |
| Mvc_CoverForEachCube( pCover2, pCube2 ) |
| { |
| // create the product cube |
| pCube = Mvc_CubeAlloc( pCover ); |
| // set the product cube equal to the product of the two cubes |
| Mvc_CubeBitOr( pCube, pCube1, pCube2 ); |
| // add the cube to the cover |
| Mvc_CoverAddCubeTail( pCover, pCube ); |
| } |
| return pCover; |
| } |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [Subtracts the second cover from the first.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Mvc_Cover_t * Mvc_CoverAlgebraicSubtract( Mvc_Cover_t * pCover1, Mvc_Cover_t * pCover2 ) |
| { |
| Mvc_Cover_t * pCover; |
| Mvc_Cube_t * pCube1, * pCube2, * pCube; |
| int fFound; |
| int CompResult; |
| |
| // covers should be the same base |
| assert( pCover1->nBits == pCover2->nBits ); |
| |
| // iterate through the cubes |
| pCover = Mvc_CoverClone( pCover1 ); |
| Mvc_CoverForEachCube( pCover1, pCube1 ) |
| { |
| fFound = 0; |
| Mvc_CoverForEachCube( pCover2, pCube2 ) |
| { |
| Mvc_CubeBitEqual( CompResult, pCube1, pCube2 ); |
| if ( CompResult ) |
| { |
| fFound = 1; |
| break; |
| } |
| } |
| if ( !fFound ) |
| { |
| // create the copy of the cube |
| pCube = Mvc_CubeDup( pCover, pCube1 ); |
| // add the cube copy to the cover |
| Mvc_CoverAddCubeTail( pCover, pCube ); |
| } |
| } |
| return pCover; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Mvc_CoverAlgebraicEqual( Mvc_Cover_t * pCover1, Mvc_Cover_t * pCover2 ) |
| { |
| Mvc_Cube_t * pCube1, * pCube2; |
| int fFound; |
| int CompResult; |
| |
| // covers should be the same base |
| assert( pCover1->nBits == pCover2->nBits ); |
| // iterate through the cubes |
| Mvc_CoverForEachCube( pCover1, pCube1 ) |
| { |
| fFound = 0; |
| Mvc_CoverForEachCube( pCover2, pCube2 ) |
| { |
| Mvc_CubeBitEqual( CompResult, pCube1, pCube2 ); |
| if ( CompResult ) |
| { |
| fFound = 1; |
| break; |
| } |
| } |
| if ( !fFound ) |
| return 0; |
| } |
| return 1; |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |