65 assert( Abc_NtkIsStrash(pNtk) );
69 p->fUseEsop = fUseEsop;
74 Abc_NtkCovCovers(
p, pNtk, fVerbose );
90 printf(
"Abc_NtkCov: The network check has failed.\n" );
127 printf(
"Iter %d : ", i+1 );
128 if ( Abc_NtkCovCoversOne(
p, pNtk, fVerbose) )
138ABC_PRT(
"Total", Abc_Clock() - clk );
164 vBoundary = Vec_PtrAlloc( 100 );
170 Extra_ProgressBarUpdate( pProgress, i, NULL );
172 pObj = Abc_ObjFanin0(pObj);
180 if ( Abc_ObjGetSupp(pObj) == NULL )
181 Abc_NtkCovCovers_rec(
p, pObj, vBoundary );
184 if ( Abc_ObjGetSupp(pObj) == NULL )
218 Vec_PtrFree( vBoundary );
222 printf(
"Outs = %4d (%4d) Node = %6d (%6d) Max = %6d Bound = %4d ",
223 Counter, Abc_NtkCoNum(pNtk),
p->nSupps, Abc_NtkNodeNum(pNtk),
p->nSuppsMax,
p->nBoundary );
224ABC_PRT(
"T", Abc_Clock() - clk );
249 pObj0 = Abc_ObjFanin0(pObj);
250 pObj1 = Abc_ObjFanin1(pObj);
252 Abc_NtkCovCovers_rec(
p, pObj0, vBoundary );
253 Abc_NtkCovCovers_rec(
p, pObj1, vBoundary );
255 if ( (!pObj0->
fMarkA && !Abc_ObjGetSupp(pObj0)) ||
256 (!pObj1->
fMarkA && !Abc_ObjGetSupp(pObj1)) ||
257 !Abc_NodeCovPropagate(
p, pObj ) )
260 if ( !pObj0->
fMarkA && Abc_ObjGetSupp(pObj0) )
261 Vec_PtrPush( vBoundary, pObj0 );
262 if ( !pObj1->
fMarkA && Abc_ObjGetSupp(pObj1) )
263 Vec_PtrPush( vBoundary, pObj1 );
287 assert( vSupp0 && vSupp1 );
288 Vec_IntFill(
p->vComTo0, vSupp0->nSize + vSupp1->nSize, -1 );
289 Vec_IntFill(
p->vComTo1, vSupp0->nSize + vSupp1->nSize, -1 );
290 Vec_IntClear(
p->vPairs0 );
291 Vec_IntClear(
p->vPairs1 );
293 vSupp = Vec_IntAlloc( vSupp0->nSize + vSupp1->nSize );
294 for ( k0 = k1 = 0; k0 < vSupp0->nSize && k1 < vSupp1->nSize; )
296 if ( vSupp0->pArray[k0] == vSupp1->pArray[k1] )
298 Vec_IntWriteEntry(
p->vComTo0, vSupp->nSize, k0 );
299 Vec_IntWriteEntry(
p->vComTo1, vSupp->nSize, k1 );
300 Vec_IntPush(
p->vPairs0, k0 );
301 Vec_IntPush(
p->vPairs1, k1 );
302 Vec_IntPush( vSupp, vSupp0->pArray[k0] );
305 else if ( vSupp0->pArray[k0] < vSupp1->pArray[k1] )
307 Vec_IntWriteEntry(
p->vComTo0, vSupp->nSize, k0 );
308 Vec_IntPush( vSupp, vSupp0->pArray[k0] );
313 Vec_IntWriteEntry(
p->vComTo1, vSupp->nSize, k1 );
314 Vec_IntPush( vSupp, vSupp1->pArray[k1] );
318 for ( ; k0 < vSupp0->nSize; k0++ )
320 Vec_IntWriteEntry(
p->vComTo0, vSupp->nSize, k0 );
321 Vec_IntPush( vSupp, vSupp0->pArray[k0] );
323 for ( ; k1 < vSupp1->nSize; k1++ )
325 Vec_IntWriteEntry(
p->vComTo1, vSupp->nSize, k1 );
326 Vec_IntPush( vSupp, vSupp1->pArray[k1] );
361 Min_Cube_t * pCoverP = NULL, * pCoverN = NULL, * pCoverX = NULL;
362 Min_Cube_t * pCov0, * pCov1, * pCover0, * pCover1;
365 int fCompl0, fCompl1;
367 pObj0 = Abc_ObjFanin0( pObj );
368 pObj1 = Abc_ObjFanin1( pObj );
370 if ( pObj0->
fMarkA ) Vec_IntWriteEntry(
p->vTriv0, 0, pObj0->
Id );
371 if ( pObj1->
fMarkA ) Vec_IntWriteEntry(
p->vTriv1, 0, pObj1->
Id );
374 vSupp0 = pObj0->
fMarkA?
p->vTriv0 : Abc_ObjGetSupp(pObj0);
375 vSupp1 = pObj1->
fMarkA?
p->vTriv1 : Abc_ObjGetSupp(pObj1);
379 if ( vSupp->nSize >
p->nFaninMax )
381 Vec_IntFree( vSupp );
386 fCompl0 = Abc_ObjFaninC0( pObj );
387 fCompl1 = Abc_ObjFaninC1( pObj );
393 pCov0 = pObj0->
fMarkA?
p->pManMin->pTriv0[0] : Abc_ObjGetCover2(pObj0);
394 pCov1 = pObj1->
fMarkA?
p->pManMin->pTriv1[0] : Abc_ObjGetCover2(pObj1);
395 if ( pCov0 && pCov1 )
400 else if ( pCov0 && pCov0->
nLits == 0 )
401 pCover0 = pCov0->
pNext;
403 pCover0 =
p->pManMin->pOne0,
p->pManMin->pOne0->pNext = pCov0;
408 else if ( pCov1 && pCov1->
nLits == 0 )
409 pCover1 = pCov1->
pNext;
411 pCover1 =
p->pManMin->pOne1,
p->pManMin->pOne1->pNext = pCov1;
414 pCoverX = Abc_NodeCovProduct(
p, pCover0, pCover1, 1, vSupp->nSize );
421 pCover0 = pObj0->
fMarkA?
p->pManMin->pTriv0[fCompl0] : Abc_ObjGetCover(pObj0, fCompl0);
422 pCover1 = pObj1->
fMarkA?
p->pManMin->pTriv1[fCompl1] : Abc_ObjGetCover(pObj1, fCompl1);
424 if ( pCover0 && pCover1 )
425 pCoverP = Abc_NodeCovProduct(
p, pCover0, pCover1, 0, vSupp->nSize );
428 pCover0 = pObj0->
fMarkA?
p->pManMin->pTriv0[!fCompl0] : Abc_ObjGetCover(pObj0, !fCompl0);
429 pCover1 = pObj1->
fMarkA?
p->pManMin->pTriv1[!fCompl1] : Abc_ObjGetCover(pObj1, !fCompl1);
431 if ( pCover0 && pCover1 )
432 pCoverN = Abc_NodeCovSum(
p, pCover0, pCover1, 0, vSupp->nSize );
436 if ( !pCoverX && !pCoverP && !pCoverN )
438 Vec_IntFree( vSupp );
443 assert( Abc_ObjGetSupp(pObj) == NULL );
444 Abc_ObjSetSupp( pObj, vSupp );
445 Abc_ObjSetCover( pObj, pCoverP, 0 );
446 Abc_ObjSetCover( pObj, pCoverN, 1 );
447 Abc_ObjSetCover2( pObj, pCoverX );
452 p->nSuppsMax = Abc_MaxInt(
p->nSuppsMax,
p->nSupps );
474 assert( pCover0 && pCover1 );
483 for ( i = 0; i <
p->vPairs0->nSize; i++ )
485 Val0 = Min_CubeGetVar( pCube0,
p->vPairs0->pArray[i] );
486 Val1 = Min_CubeGetVar( pCube1,
p->vPairs1->pArray[i] );
487 if ( (Val0 & Val1) == 0 )
491 if ( i < p->vPairs0->nSize )
494 if (
p->pManMin->nCubes >
p->nCubesMax )
498 Min_CoverRecycle(
p->pManMin, pCover );
503 pCube = Min_CubeAlloc(
p->pManMin );
507 for ( i = 0; i < nSupp; i++ )
509 if (
p->vComTo0->pArray[i] == -1 )
512 Val0 = Min_CubeGetVar( pCube0,
p->vComTo0->pArray[i] );
514 if (
p->vComTo1->pArray[i] == -1 )
517 Val1 = Min_CubeGetVar( pCube1,
p->vComTo1->pArray[i] );
519 if ( (Val0 & Val1) == 3 )
522 Min_CubeXorVar( pCube, i, (Val0 & Val1) ^ 3 );
540 if ( Min_CoverCountCubes(pCover) >
p->nFaninMax )
556 Min_CoverRecycle(
p->pManMin, pCover );
578 assert( pCover0 && pCover1 );
585 pCube = Min_CubeAlloc(
p->pManMin );
587 for ( i = 0; i <
p->vComTo0->nSize; i++ )
589 if (
p->vComTo0->pArray[i] == -1 )
591 Val0 = Min_CubeGetVar( pCube0,
p->vComTo0->pArray[i] );
594 Min_CubeXorVar( pCube, i, Val0 ^ 3 );
597 if (
p->pManMin->nCubes >
p->nCubesMax )
600 Min_CoverRecycle(
p->pManMin, pCover );
612 pCube = Min_CubeAlloc(
p->pManMin );
614 for ( i = 0; i <
p->vComTo1->nSize; i++ )
616 if (
p->vComTo1->pArray[i] == -1 )
618 Val1 = Min_CubeGetVar( pCube1,
p->vComTo1->pArray[i] );
621 Min_CubeXorVar( pCube, i, Val1 ^ 3 );
624 if (
p->pManMin->nCubes >
p->nCubesMax )
627 Min_CoverRecycle(
p->pManMin, pCover );
645 if ( Min_CoverCountCubes(pCover) >
p->nFaninMax )
647 Min_CoverRecycle(
p->pManMin, pCover );
676 Min_Cube_t * pCover, * pCover0, * pCover1, * pCov0, * pCov1;
679 if ( pObj0->
fMarkA ) Vec_IntWriteEntry(
p->vTriv0, 0, pObj0->
Id );
680 if ( pObj1->
fMarkA ) Vec_IntWriteEntry(
p->vTriv1, 0, pObj1->
Id );
683 vSupp0 = pObj0->
fMarkA?
p->vTriv0 : Abc_ObjGetSupp(pObj0);
684 vSupp1 = pObj1->
fMarkA?
p->vTriv1 : Abc_ObjGetSupp(pObj1);
688 if ( vSupp->nSize >
p->nFaninMax )
690 Vec_IntFree( vSupp );
695 pCov0 = pObj0->
fMarkA?
p->pManMin->pTriv0[0] : Abc_ObjGetCover2(pObj0);
696 pCov1 = pObj1->
fMarkA?
p->pManMin->pTriv1[0] : Abc_ObjGetCover2(pObj1);
699 if ( !Abc_ObjFaninC0(pObj) )
701 else if ( pCov0 && pCov0->
nLits == 0 )
702 pCover0 = pCov0->
pNext;
704 pCover0 =
p->pManMin->pOne0,
p->pManMin->pOne0->pNext = pCov0;
707 if ( !Abc_ObjFaninC1(pObj) )
709 else if ( pCov1 && pCov1->
nLits == 0 )
710 pCover1 = pCov1->
pNext;
712 pCover1 =
p->pManMin->pOne1,
p->pManMin->pOne1->pNext = pCov1;
715 if ( !Abc_NodeCovProductEsop(
p, pCover0, pCover1, vSupp->nSize ) )
718 Min_CoverRecycle(
p->pManMin, pCover );
719 Vec_IntFree( vSupp );
728 if ( Min_CoverCountCubes(pCover) >
p->nFaninMax )
730 Min_CoverRecycle(
p->pManMin, pCover );
731 Vec_IntFree( vSupp );
737 p->nSuppsMax = Abc_MaxInt(
p->nSuppsMax,
p->nSupps );
740 assert( Abc_ObjGetSupp(pObj) == NULL );
741 Abc_ObjSetSupp( pObj, vSupp );
742 Abc_ObjSetCover2( pObj, pCover );
759 Min_Cube_t * pCoverP, * pCoverN, * pCover0, * pCover1;
761 int fCompl0, fCompl1;
763 if ( pObj0->
fMarkA ) Vec_IntWriteEntry(
p->vTriv0, 0, pObj0->
Id );
764 if ( pObj1->
fMarkA ) Vec_IntWriteEntry(
p->vTriv1, 0, pObj1->
Id );
767 vSupp0 = pObj0->
fMarkA?
p->vTriv0 : Abc_ObjGetSupp(pObj0);
768 vSupp1 = pObj1->
fMarkA?
p->vTriv1 : Abc_ObjGetSupp(pObj1);
772 if ( vSupp->nSize >
p->nFaninMax )
774 Vec_IntFree( vSupp );
779 fCompl0 = Abc_ObjFaninC0(pObj);
780 fCompl1 = Abc_ObjFaninC1(pObj);
783 pCover0 = pObj0->
fMarkA?
p->pManMin->pTriv0[fCompl0] : Abc_ObjGetCover(pObj0, fCompl0);
784 pCover1 = pObj1->
fMarkA?
p->pManMin->pTriv1[fCompl1] : Abc_ObjGetCover(pObj1, fCompl1);
787 if ( !pCover0 || !pCover1 )
789 else if ( !Abc_NodeCovProductSop(
p, pCover0, pCover1, vSupp->nSize ) )
792 Min_CoverRecycle(
p->pManMin, pCoverP );
800 if ( Min_CoverCountCubes(pCoverP) >
p->nFaninMax )
802 Min_CoverRecycle(
p->pManMin, pCoverP );
808 pCover0 = pObj0->
fMarkA?
p->pManMin->pTriv0[!fCompl0] : Abc_ObjGetCover(pObj0, !fCompl0);
809 pCover1 = pObj1->
fMarkA?
p->pManMin->pTriv1[!fCompl1] : Abc_ObjGetCover(pObj1, !fCompl1);
812 if ( !pCover0 || !pCover1 )
814 else if ( !Abc_NodeCovUnionSop(
p, pCover0, pCover1, vSupp->nSize ) )
817 Min_CoverRecycle(
p->pManMin, pCoverN );
825 if ( Min_CoverCountCubes(pCoverN) >
p->nFaninMax )
827 Min_CoverRecycle(
p->pManMin, pCoverN );
832 if ( pCoverP == NULL && pCoverN == NULL )
834 Vec_IntFree( vSupp );
840 p->nSuppsMax = Abc_MaxInt(
p->nSuppsMax,
p->nSupps );
843 assert( Abc_ObjGetSupp(pObj) == NULL );
844 Abc_ObjSetSupp( pObj, vSupp );
845 Abc_ObjSetCover( pObj, pCoverP, 0 );
846 Abc_ObjSetCover( pObj, pCoverN, 1 );
869 if ( pCover0 == NULL || pCover1 == NULL )
877 for ( i = 0; i <
p->vPairs0->nSize; i++ )
879 Val0 = Min_CubeGetVar( pCube0,
p->vPairs0->pArray[i] );
880 Val1 = Min_CubeGetVar( pCube1,
p->vPairs1->pArray[i] );
881 if ( (Val0 & Val1) == 0 )
885 if ( i < p->vPairs0->nSize )
888 if (
p->pManMin->nCubes >=
p->nCubesMax )
892 pCube = Min_CubeAlloc(
p->pManMin );
896 for ( i = 0; i < nSupp; i++ )
898 if (
p->vComTo0->pArray[i] == -1 )
901 Val0 = Min_CubeGetVar( pCube0,
p->vComTo0->pArray[i] );
903 if (
p->vComTo1->pArray[i] == -1 )
906 Val1 = Min_CubeGetVar( pCube1,
p->vComTo1->pArray[i] );
908 if ( (Val0 & Val1) == 3 )
911 Min_CubeXorVar( pCube, i, (Val0 & Val1) ^ 3 );
961 pCube = Min_CubeAlloc(
p->pManMin );
963 for ( i = 0; i <
p->vComTo0->nSize; i++ )
965 if (
p->vComTo0->pArray[i] == -1 )
967 Val0 = Min_CubeGetVar( pCube0,
p->vComTo0->pArray[i] );
970 Min_CubeXorVar( pCube, i, Val0 ^ 3 );
973 if (
p->pManMin->nCubes >=
p->nCubesMax )
984 pCube = Min_CubeAlloc(
p->pManMin );
986 for ( i = 0; i <
p->vComTo1->nSize; i++ )
988 if (
p->vComTo1->pArray[i] == -1 )
990 Val1 = Min_CubeGetVar( pCube1,
p->vComTo1->pArray[i] );
993 Min_CubeXorVar( pCube, i, Val1 ^ 3 );
996 if (
p->pManMin->nCubes >=
p->nCubesMax )
struct Abc_Obj_t_ Abc_Obj_t
#define Abc_NtkForEachCo(pNtk, pCo, i)
ABC_DLL int Abc_NtkCheck(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
#define Abc_NtkForEachObj(pNtk, pObj, i)
ITERATORS ///.
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL Vec_Int_t * Abc_NtkFanoutCounts(Abc_Ntk_t *pNtk)
#define Abc_NtkForEachCi(pNtk, pCi, i)
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
ABC_DLL Abc_Obj_t * Abc_AigConst1(Abc_Ntk_t *pNtk)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
ABC_NAMESPACE_IMPL_START typedef char ProgressBar
Vec_Int_t * Abc_NodeCovSupport(Cov_Man_t *p, Vec_Int_t *vSupp0, Vec_Int_t *vSupp1)
Abc_Ntk_t * Abc_NtkSopEsopCover(Abc_Ntk_t *pNtk, int nFaninMax, int nCubesMax, int fUseEsop, int fUseSop, int fUseInvs, int fVerbose)
FUNCTION DEFINITIONS ///.
Min_Cube_t * Min_CoverCollect(Min_Man_t *p, int nSuppSize)
struct Min_Cube_t_ Min_Cube_t
#define Min_CoverForEachCube(pCover, pCube)
void Min_ManClean(Min_Man_t *p, int nSupp)
void Min_EsopAddCube(Min_Man_t *p, Min_Cube_t *pCube)
void Min_SopMinimize(Min_Man_t *p)
FUNCTION DEFINITIONS ///.
void Min_SopAddCube(Min_Man_t *p, Min_Cube_t *pCube)
void Min_EsopMinimize(Min_Man_t *p)
FUNCTION DEFINITIONS ///.
void Cov_ManFree(Cov_Man_t *p)
Abc_Ntk_t * Abc_NtkCovDeriveRegular(Cov_Man_t *p, Abc_Ntk_t *pNtk)
typedefABC_NAMESPACE_HEADER_START struct Cov_Man_t_ Cov_Man_t
DECLARATIONS ///.
Cov_Man_t * Cov_ManAlloc(Abc_Ntk_t *pNtk, int nFaninMax, int nCubesMax)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.