#include "mvc.h"
ABC_NAMESPACE_IMPL_START
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;
assert( pCover1->nBits == pCover2->nBits );
Mvc_CoverAllocateMask( pCover1 );
Mvc_CoverAllocateMask( pCover2 );
Mvc_CoverSupport( pCover1, pCover1->pMask );
Mvc_CoverSupport( pCover2, pCover2->pMask );
Mvc_CubeBitDisjoint( CompResult, pCover1->pMask, pCover2->pMask );
if ( !CompResult )
printf( "Mvc_CoverMultiply(): Cover supports are not disjoint!\n" );
pCover = Mvc_CoverClone( pCover1 );
Mvc_CoverForEachCube( pCover1, pCube1 )
Mvc_CoverForEachCube( pCover2, pCube2 )
{
pCube = Mvc_CubeAlloc( pCover );
Mvc_CubeBitOr( pCube, pCube1, pCube2 );
Mvc_CoverAddCubeTail( pCover, pCube );
}
return pCover;
}
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;
assert( pCover1->nBits == pCover2->nBits );
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 )
{
pCube = Mvc_CubeDup( pCover, pCube1 );
Mvc_CoverAddCubeTail( pCover, pCube );
}
}
return pCover;
}
int Mvc_CoverAlgebraicEqual( Mvc_Cover_t * pCover1, Mvc_Cover_t * pCover2 )
{
Mvc_Cube_t * pCube1, * pCube2;
int fFound;
int CompResult;
assert( pCover1->nBits == pCover2->nBits );
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;
}
ABC_NAMESPACE_IMPL_END