blob: da160b39c0509114a57d7ed9891a8b75333d4d0e [file] [log] [blame]
/**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