summaryrefslogtreecommitdiffstats
path: root/src/aig/gia/giaSimBase.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/aig/gia/giaSimBase.c')
-rw-r--r--src/aig/gia/giaSimBase.c488
1 files changed, 486 insertions, 2 deletions
diff --git a/src/aig/gia/giaSimBase.c b/src/aig/gia/giaSimBase.c
index 002f6bc2..75a6d653 100644
--- a/src/aig/gia/giaSimBase.c
+++ b/src/aig/gia/giaSimBase.c
@@ -22,6 +22,7 @@
#include "misc/util/utilTruth.h"
#include "misc/extra/extra.h"
//#include <immintrin.h>
+#include "aig/miniaig/miniaig.h"
ABC_NAMESPACE_IMPL_START
@@ -2717,13 +2718,89 @@ Vec_Ptr_t * Gia_ManPtrWrdReadBin( char * pFileName, int fVerbose )
SeeAlso []
***********************************************************************/
+Vec_Int_t * Gia_ManProcessBuffs( Gia_Man_t * pHie, Vec_Wrd_t * vSimsH, int nWords, Vec_Mem_t * vStore, Vec_Int_t * vLabels )
+{
+ Vec_Int_t * vPoSigs = Vec_IntAlloc( Gia_ManBufNum(pHie) );
+ Vec_Int_t * vMap;
+ Vec_Wec_t * vNodes = Vec_WecStart( Gia_ManBufNum(pHie) );
+ Gia_Obj_t * pObj; int i, Sig, Value;
+ Gia_ManForEachBuf( pHie, pObj, i )
+ {
+ word * pSim = Vec_WrdEntryP(vSimsH, Gia_ObjId(pHie, pObj)*nWords);
+ int fCompl = pSim[0] & 1;
+ if ( fCompl )
+ Abc_TtNot( pSim, nWords );
+ Vec_IntPush( vPoSigs, Vec_MemHashInsert(vStore, pSim) );
+ if ( fCompl )
+ Abc_TtNot( pSim, nWords );
+ }
+ Vec_IntPrint( vPoSigs );
+ vMap = Vec_IntStartFull( Vec_MemEntryNum(vStore) );
+ Vec_IntForEachEntry( vPoSigs, Sig, i )
+ {
+ assert( Vec_IntEntry(vMap, Sig) == -1 );
+ Vec_IntWriteEntry( vMap, Sig, i );
+ }
+ Vec_IntForEachEntry( vLabels, Sig, i )
+ {
+ if ( Sig < 0 )
+ continue;
+ Value = Vec_IntEntry(vMap, Sig);
+ if ( Value == -1 )
+ continue;
+ assert( Value >= 0 && Value < Gia_ManBufNum(pHie) );
+ Vec_WecPush( vNodes, Value, i );
+ }
+ Vec_WecPrint( vNodes, 0 );
+ Vec_WecFree( vNodes );
+ Vec_IntFree( vMap );
+ Vec_IntFree( vPoSigs );
+ return NULL;
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Gia_ManUpdateCoPhase( Gia_Man_t * pNew, Gia_Man_t * pOld )
+{
+ Gia_Obj_t * pObj; int i;
+ Gia_ManSetPhase( pNew );
+ Gia_ManSetPhase( pOld );
+ Gia_ManForEachCo( pNew, pObj, i )
+ if ( pObj->fPhase ^ Gia_ManCo(pOld, i)->fPhase )
+ {
+ printf( "Updating out %d.\n", i );
+ Gia_ObjFlipFaninC0( pObj );
+ }
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
void Gia_ManCompareSims( Gia_Man_t * pHie, Gia_Man_t * pFlat, int nWords, int fVerbose )
{
abctime clk = Abc_Clock();
Vec_Wrd_t * vSims = pFlat->vSimsPi = pHie->vSimsPi = Vec_WrdStartRandom( Gia_ManCiNum(pFlat) * nWords );
Vec_Wrd_t * vSims0 = Gia_ManSimPatSim( pFlat );
Vec_Wrd_t * vSims1 = Gia_ManSimPatSim( pHie );
- Gia_Obj_t * pObj; int * pSpot, * pSpot2, i, nC0s = 0, nC1s = 0, nUnique = 0, nFound[3] = {0}, nBoundary = 0, nMatched = 0;
+ Vec_Int_t * vLabels = Vec_IntStartFull( Gia_ManObjNum(pFlat) );
+ Gia_Obj_t * pObj; int fCompl, Value, * pSpot, * pSpot2, i, nC0s = 0, nC1s = 0, nUnique = 0, nFound[3] = {0}, nBoundary = 0, nMatched = 0;
Vec_Mem_t * vStore = Vec_MemAlloc( nWords, 12 ); // 2^12 N-word entries per page
pFlat->vSimsPi = NULL;
pHie->vSimsPi = NULL;
@@ -2739,7 +2816,13 @@ void Gia_ManCompareSims( Gia_Man_t * pHie, Gia_Man_t * pFlat, int nWords, int fV
word * pSim = Vec_WrdEntryP(vSims0, i*nWords);
nC0s += Abc_TtIsConst0(pSim, nWords);
nC1s += Abc_TtIsConst1(pSim, nWords);
- Vec_MemHashInsert( vStore, pSim );
+ fCompl = pSim[0] & 1;
+ if ( fCompl )
+ Abc_TtNot( pSim, nWords );
+ Value = Vec_MemHashInsert( vStore, pSim );
+ if ( fCompl )
+ Abc_TtNot( pSim, nWords );
+ Vec_IntWriteEntry( vLabels, i, Value );
}
nUnique = Vec_MemEntryNum( vStore );
printf( "Simulating %d patterns through the second (flat) AIG leads to %d unique objects (%.2f %% out of %d). Const0 = %d. Const1 = %d.\n",
@@ -2765,10 +2848,12 @@ void Gia_ManCompareSims( Gia_Man_t * pHie, Gia_Man_t * pFlat, int nWords, int fV
//if ( Gia_ObjIsBuf(pObj) )
// printf( "%d(%d) ", i, nBoundary-1 );
}
+ Gia_ManProcessBuffs( pHie, vSims1, nWords, vStore, vLabels );
Vec_MemHashFree( vStore );
Vec_MemFree( vStore );
Vec_WrdFree( vSims0 );
Vec_WrdFree( vSims1 );
+ Vec_IntFree( vLabels );
printf( "The first (hierarchical) AIG has %d (%.2f %%) matches, %d (%.2f %%) mismatches, including %d (%.2f %%) on the boundary. ",
nMatched, 100.0*nMatched /Abc_MaxInt(1, Gia_ManCandNum(pHie)),
@@ -2777,6 +2862,405 @@ void Gia_ManCompareSims( Gia_Man_t * pHie, Gia_Man_t * pFlat, int nWords, int fV
Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
}
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Vec_Wec_t * Gia_ManRelTfos( Gia_Man_t * p, Vec_Int_t * vObjs )
+{
+ Gia_Obj_t * pObj;
+ Vec_Wec_t * vNodes = Vec_WecStart( Vec_IntSize(vObjs)+1 );
+ Vec_Int_t * vSigns = Vec_IntStart( Gia_ManObjNum(p) );
+ int n, k, i, iObj, * pSigns = Vec_IntArray(vSigns);
+ assert( Vec_IntSize(vObjs) < 32 );
+ Vec_IntForEachEntry( vObjs, iObj, i )
+ pSigns[iObj] |= 1 << i;
+ Gia_ManForEachAnd( p, pObj, i )
+ {
+ if ( pSigns[i] == 0 )
+ for ( n = 0; n < 2; n++ )
+ pSigns[i] |= pSigns[Gia_ObjFaninId(pObj, i, n)];
+ if ( pSigns[i] == 0 )
+ continue;
+ Vec_WecPush( vNodes, Vec_IntSize(vObjs), i );
+ for ( k = 0; k < Vec_IntSize(vObjs); k++ )
+ if ( (pSigns[i] >> k) & 1 )
+ Vec_WecPush( vNodes, k, i );
+ }
+ Vec_IntFree( vSigns );
+ return vNodes;
+}
+Vec_Wrd_t * Gia_ManRelDerive( Gia_Man_t * p, Vec_Int_t * vObjs, Vec_Wrd_t * vSims )
+{
+ int nWords = Vec_WrdSize(p->vSimsPi) / Gia_ManCiNum(p); Gia_Obj_t * pObj;
+ int i, m, iVar, iMint = 0, nMints = 1 << Vec_IntSize(vObjs);
+ Vec_Wrd_t * vCopy = Vec_WrdDup(vSims); Vec_Int_t * vLevel;
+ Vec_Wrd_t * vRel = Vec_WrdStart( Gia_ManCoNum(p) * nWords * nMints );
+ Vec_Wec_t * vNodes = Gia_ManRelTfos( p, vObjs );
+ Vec_WecPrint( vNodes, 0 );
+ Gia_ManForEachAnd( p, pObj, i )
+ assert( pObj->fPhase == 0 );
+ Gia_ManForEachObjVec( vObjs, p, pObj, i )
+ pObj->fPhase = 1;
+ vLevel = Vec_WecEntry( vNodes, Vec_IntSize(vObjs) );
+ Gia_ManForEachObjVec( vLevel, p, pObj, i )
+ if ( pObj->fPhase )
+ Abc_TtClear( Vec_WrdEntryP(vCopy, Gia_ObjId(p, pObj)*nWords), nWords );
+ else
+ Gia_ManSimPatSimAnd( p, Gia_ObjId(p, pObj), pObj, nWords, vCopy );
+ for ( m = 0; m < nMints; m++ )
+ {
+ Gia_ManForEachCo( p, pObj, i )
+ {
+ word * pSimO = Vec_WrdEntryP(vCopy, Gia_ObjId(p, pObj)*nWords);
+ word * pSimF = Vec_WrdEntryP(vCopy, Gia_ObjFaninId0p(p, pObj)*nWords);
+ word * pSimR = Vec_WrdEntryP(vRel, (iMint*Gia_ManCoNum(p) + i)*nWords);
+ Abc_TtXor( pSimR, pSimF, pSimO, nWords, Gia_ObjFaninC0(pObj) );
+ }
+ if ( m == nMints-1 )
+ break;
+ iVar = Abc_TtSuppFindFirst( (m+1) ^ ((m+1) >> 1) ^ (m) ^ ((m) >> 1) );
+ vLevel = Vec_WecEntry( vNodes, iVar );
+ assert( Vec_IntEntry(vLevel, 0) == Vec_IntEntry(vObjs, iVar) );
+ Abc_TtNot( Vec_WrdEntryP(vCopy, Vec_IntEntry(vObjs, iVar)*nWords), nWords );
+ Gia_ManForEachObjVec( vLevel, p, pObj, i )
+ if ( !pObj->fPhase )
+ Gia_ManSimPatSimAnd( p, Gia_ObjId(p, pObj), pObj, nWords, vCopy );
+ iMint ^= 1 << iVar;
+ }
+ Gia_ManForEachObjVec( vObjs, p, pObj, i )
+ pObj->fPhase = 0;
+ Vec_WrdFree( vCopy );
+ Vec_WecFree( vNodes );
+ return vRel;
+}
+Vec_Wrd_t * Gia_ManRelDerive2( Gia_Man_t * p, Vec_Int_t * vObjs, Vec_Wrd_t * vSims )
+{
+ int nWords = Vec_WrdSize(p->vSimsPi) / Gia_ManCiNum(p); Gia_Obj_t * pObj;
+ int i, Id, m, Index, nMints = 1 << Vec_IntSize(vObjs);
+ Vec_Wrd_t * vPos, * vRel = Vec_WrdStart( Gia_ManCoNum(p) * nWords * nMints );
+ for ( m = 0; m < nMints; m++ )
+ {
+ Gia_Man_t * pNew = Gia_ManDup( p );
+ Gia_ManForEachAnd( pNew, pObj, i )
+ {
+ if ( (Index = Vec_IntFind(vObjs, Gia_ObjFaninId0(pObj, i))) >= 0 )
+ pObj->iDiff0 = i, pObj->fCompl0 ^= (m >> Index) & 1;
+ if ( (Index = Vec_IntFind(vObjs, Gia_ObjFaninId1(pObj, i))) >= 0 )
+ pObj->iDiff1 = i, pObj->fCompl1 ^= (m >> Index) & 1;
+ }
+ vPos = Gia_ManSimPatSimOut( pNew, p->vSimsPi, 1 );
+ Gia_ManForEachCoId( p, Id, i )
+ Abc_TtXor( Vec_WrdEntryP(vRel, (m*Gia_ManCoNum(p) + i)*nWords), Vec_WrdEntryP(vPos, i*nWords), Vec_WrdEntryP(vSims, Id*nWords), nWords, 0 );
+ Vec_WrdFree( vPos );
+ Gia_ManStop( pNew );
+ }
+ return vRel;
+}
+void Gia_ManRelPrint( Gia_Man_t * p, Vec_Int_t * vObjs, Vec_Wrd_t * vSims, Vec_Wrd_t * vRel )
+{
+ int w, nWords = Vec_WrdSize(p->vSimsPi) / Gia_ManCiNum(p);
+ int i, Id, m, nMints = 1 << Vec_IntSize(vObjs);
+ printf( "Relation has %d inputs and %d outputs:\n", Gia_ManCiNum(p), Vec_IntSize(vObjs) );
+ for ( w = 0; w < 64*nWords; w++ )
+ {
+ Gia_ManForEachCiId( p, Id, i )
+ printf( "%d", Abc_TtGetBit(Vec_WrdEntryP(vSims, Id*nWords), w) );
+ printf( " " );
+ Vec_IntForEachEntry( vObjs, Id, i )
+ printf( "%d", Abc_TtGetBit(Vec_WrdEntryP(vSims, Id*nWords), w) );
+ printf( " " );
+ Gia_ManForEachCoId( p, Id, i )
+ printf( "%d", Abc_TtGetBit(Vec_WrdEntryP(vSims, Id*nWords), w) );
+ printf( " " );
+ for ( m = 0; m < nMints; m++ )
+ {
+ printf( " " );
+ for ( i = 0; i < Vec_IntSize(vObjs); i++ )
+ printf( "%d", (m >> i) & 1 );
+ printf( "=" );
+ Gia_ManForEachCoId( p, Id, i )
+ printf( "%d", Abc_TtGetBit(Vec_WrdEntryP(vRel, (m*Gia_ManCoNum(p)+i)*nWords), w) );
+ }
+ printf( "\n" );
+ }
+}
+void Gia_ManRelPrint2( Gia_Man_t * p, Vec_Int_t * vObjs, Vec_Wrd_t * vSims, Vec_Wrd_t * vRel )
+{
+ int w, nWords = Vec_WrdSize(p->vSimsPi) / Gia_ManCiNum(p);
+ int i, Id, m, nMints = 1 << Vec_IntSize(vObjs);
+ int nWordsM = Abc_Truth6WordNum(Vec_IntSize(vObjs));
+ Vec_Wrd_t * vRes = Vec_WrdStart( 64*nWords * nWordsM );
+ printf( "Relation has %d inputs and %d outputs:\n", Gia_ManCiNum(p), Vec_IntSize(vObjs) );
+ for ( w = 0; w < 64*nWords; w++ )
+ {
+ int iMint = 0;
+ int nValid = 0;
+ Gia_ManForEachCiId( p, Id, i )
+ printf( "%d", Abc_TtGetBit(Vec_WrdEntryP(vSims, Id*nWords), w) );
+ printf( " " );
+ Vec_IntForEachEntry( vObjs, Id, i )
+ {
+ printf( "%d", Abc_TtGetBit(Vec_WrdEntryP(vSims, Id*nWords), w) );
+ if ( Abc_TtGetBit(Vec_WrdEntryP(vSims, Id*nWords), w) )
+ iMint |= 1 << i;
+ }
+ printf( " " );
+ Gia_ManForEachCoId( p, Id, i )
+ printf( "%d", Abc_TtGetBit(Vec_WrdEntryP(vSims, Id*nWords), w) );
+ printf( " " );
+ for ( m = 0; m < nMints; m++ )
+ {
+ int Count = 0;
+ Gia_ManForEachCoId( p, Id, i )
+ Count += Abc_TtGetBit(Vec_WrdEntryP(vRel, (m*Gia_ManCoNum(p)+i)*nWords), w);
+ printf( "%d", Count == 0 );
+ nValid += Count > 0;
+ if ( Count == 0 )
+ Abc_TtSetBit( Vec_WrdEntryP(vRes, w*nWordsM), m );
+ }
+ printf( " " );
+ for ( m = 0; m < nMints; m++ )
+ printf( "%d", Abc_TtGetBit(Vec_WrdEntryP(vRes, w*nWordsM), m) );
+ printf( " " );
+ assert( Abc_TtGetBit(Vec_WrdEntryP(vRes, w*nWordsM), iMint) );
+ for ( i = 0; i < Vec_IntSize(vObjs); i++ )
+ if ( Abc_TtGetBit(Vec_WrdEntryP(vRes, w*nWordsM), iMint ^ (1 << i)) )
+ printf( "-" );
+ else
+ printf( "%d", (iMint >> i) & 1 );
+ printf( " %d", nMints-nValid );
+ printf( "\n" );
+ }
+ Vec_WrdFree( vRes );
+}
+Vec_Int_t * Gia_ManRelInitObjs()
+{
+ Vec_Int_t * vRes = Vec_IntAlloc( 10 );
+ /*
+ Vec_IntPush( vRes, 33 );
+ Vec_IntPush( vRes, 52 );
+ Vec_IntPush( vRes, 53 );
+ Vec_IntPush( vRes, 65 );
+ Vec_IntPush( vRes, 79 );
+ Vec_IntPush( vRes, 81 );
+ */
+ /*
+ Vec_IntPush( vRes, 60 );
+ Vec_IntPush( vRes, 61 );
+ Vec_IntPush( vRes, 71 );
+ Vec_IntPush( vRes, 72 );
+ */
+ /*
+ Vec_IntPush( vRes, 65 );
+ Vec_IntPush( vRes, 79 );
+ Vec_IntPush( vRes, 81 );
+ */
+ Vec_IntPush( vRes, 52 );
+ Vec_IntPush( vRes, 54 );
+ Vec_IntPrint( vRes );
+ return vRes;
+}
+void Gia_ManRelDeriveTest2( Gia_Man_t * p )
+{
+ Vec_Int_t * vObjs = Gia_ManRelInitObjs();
+ Vec_Wrd_t * vSims, * vRel, * vRel2; int nWords;
+ Vec_WrdFreeP( &p->vSimsPi );
+ p->vSimsPi = Vec_WrdStartTruthTables( Gia_ManCiNum(p) );
+ nWords = Vec_WrdSize(p->vSimsPi) / Gia_ManCiNum(p);
+ vSims = Gia_ManSimPatSim( p );
+ vRel = Gia_ManRelDerive( p, vObjs, vSims );
+ vRel2 = Gia_ManRelDerive2( p, vObjs, vSims );
+ //assert( !memcmp(vRel2->pArray, vRel->pArray, sizeof(word)*Vec_WrdSize(vRel)) );
+ Gia_ManRelPrint2( p, vObjs, vSims, vRel );
+ Vec_WrdFree( vRel2 );
+ Vec_WrdFree( vRel );
+ Vec_WrdFree( vSims );
+ Vec_IntFree( vObjs );
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Vec_Int_t * Gia_ManRelInitIns()
+{
+ Vec_Int_t * vRes = Vec_IntAlloc( 10 );
+ Vec_IntPush( vRes, 12 );
+ Vec_IntPush( vRes, 18 );
+ Vec_IntPush( vRes, 21 );
+ Vec_IntPush( vRes, 34 );
+ Vec_IntPush( vRes, 45 );
+ Vec_IntPush( vRes, 59 );
+ return vRes;
+}
+Vec_Int_t * Gia_ManRelInitOuts()
+{
+ Vec_Int_t * vRes = Vec_IntAlloc( 10 );
+ Vec_IntPush( vRes, 65 );
+ Vec_IntPush( vRes, 66 );
+ return vRes;
+}
+Vec_Int_t * Gia_ManRelInitMffc( Gia_Man_t * p, Vec_Int_t * vOuts )
+{
+ Gia_Obj_t * pObj; int i;
+ Vec_Int_t * vRes = Vec_IntAlloc( 100 );
+ Vec_IntSort( vOuts, 0 );
+ Gia_ManIncrementTravId( p );
+ Gia_ManForEachObjVec( vOuts, p, pObj, i )
+ Gia_ObjSetTravIdCurrent( p, pObj );
+ Gia_ManIncrementTravId( p );
+ Gia_ManForEachCo( p, pObj, i )
+ if ( !Gia_ObjIsTravIdPrevious(p, Gia_ObjFanin0(pObj)) )
+ Gia_ObjSetTravIdCurrent( p, Gia_ObjFanin0(pObj) );
+ Gia_ManForEachAndReverse( p, pObj, i )
+ if ( Gia_ObjIsTravIdPrevious(p, pObj) )
+ continue;
+ else if ( Gia_ObjIsTravIdCurrent(p, pObj) )
+ {
+ if ( !Gia_ObjIsTravIdPrevious(p, Gia_ObjFanin0(pObj)) )
+ Gia_ObjSetTravIdCurrent( p, Gia_ObjFanin0(pObj) );
+ if ( !Gia_ObjIsTravIdPrevious(p, Gia_ObjFanin1(pObj)) )
+ Gia_ObjSetTravIdCurrent( p, Gia_ObjFanin1(pObj) );
+ }
+ Gia_ManForEachAnd( p, pObj, i )
+ if ( !Gia_ObjIsTravIdCurrent(p, pObj) )
+ Vec_IntPush( vRes, i );
+ printf( "MFFC: " );
+ Vec_IntPrint( vRes );
+ return vRes;
+}
+Vec_Int_t * Gia_ManRelInitDivs( Gia_Man_t * p, Vec_Int_t * vIns, Vec_Int_t * vOuts )
+{
+ Gia_Obj_t * pObj; int i;
+ Vec_Int_t * vMffc = Gia_ManRelInitMffc( p, vOuts );
+ Vec_Int_t * vRes = Vec_IntAlloc( 100 );
+ Vec_IntSort( vIns, 0 );
+
+ Gia_ManIncrementTravId( p );
+ Gia_ManForEachObjVec( vMffc, p, pObj, i )
+ Gia_ObjSetTravIdCurrent( p, pObj );
+ Vec_IntFree( vMffc );
+
+ Vec_IntPush( vRes, 0 );
+ Vec_IntAppend( vRes, vIns );
+
+ Gia_ManIncrementTravId( p );
+ Gia_ManForEachObjVec( vIns, p, pObj, i )
+ Gia_ObjSetTravIdCurrent( p, pObj );
+
+ Gia_ManForEachAnd( p, pObj, i )
+ if ( Gia_ObjIsTravIdCurrent(p, pObj) )
+ continue;
+ else if ( Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin0(pObj)) && Gia_ObjIsTravIdCurrent(p, Gia_ObjFanin1(pObj)) )
+ {
+ if ( !Gia_ObjIsTravIdPrevious(p, pObj) )
+ Vec_IntPush( vRes, i );
+ Gia_ObjSetTravIdCurrent( p, pObj );
+ }
+ printf( "Divisors: " );
+ Vec_IntPrint( vRes );
+ return vRes;
+}
+
+Vec_Int_t * Gia_ManRelDeriveSimple( Gia_Man_t * p, Vec_Wrd_t * vSims, Vec_Int_t * vIns, Vec_Int_t * vOuts )
+{
+ Vec_Int_t * vRes = Vec_IntStartFull( 1 << Vec_IntSize(vIns) );
+ int w, nWords = Vec_WrdSize(p->vSimsPi) / Gia_ManCiNum(p);
+ for ( w = 0; w < 64*nWords; w++ )
+ {
+ int i, iObj, iMint = 0, iMint2 = 0;
+ Vec_IntForEachEntry( vIns, iObj, i )
+ if ( Abc_TtGetBit(Vec_WrdEntryP(vSims, iObj*nWords), w) )
+ iMint |= 1 << i;
+ if ( Vec_IntEntry(vRes, iMint) >= 0 )
+ continue;
+ Vec_IntForEachEntry( vOuts, iObj, i )
+ if ( Abc_TtGetBit(Vec_WrdEntryP(vSims, iObj*nWords), w) )
+ iMint2 |= 1 << i;
+ Vec_IntWriteEntry( vRes, iMint, iMint2 );
+ }
+ return vRes;
+}
+
+void Gia_ManRelSolve( Gia_Man_t * p, Vec_Wrd_t * vSims, Vec_Int_t * vIns, Vec_Int_t * vOuts, Vec_Int_t * vRel, Vec_Int_t * vDivs )
+{
+ extern Mini_Aig_t * Exa4_ManGenTest( Vec_Wrd_t * vSimsIn, Vec_Wrd_t * vSimsOut, int nIns, int nDivs, int nOuts, int nNodes, int TimeOut, int fOnlyAnd, int fFancy, int fOrderNodes, int fUniqFans, int fVerbose );
+
+ int i, m, iObj, Entry, iMint = 0, nMints = Vec_IntSize(vRel) - Vec_IntCountEntry(vRel, -1);
+ Vec_Wrd_t * vSimsIn = Vec_WrdStart( nMints );
+ Vec_Wrd_t * vSimsOut = Vec_WrdStart( nMints );
+ int Entry0 = Vec_IntEntry( vRel, 0 );
+
+ word Value, Phase = 0;
+ int nWords = Vec_WrdSize(p->vSimsPi) / Gia_ManCiNum(p);
+ Vec_IntForEachEntry( vDivs, iObj, i )
+ if ( Vec_WrdEntry(vSims, iObj*nWords) & 1 )
+ Phase |= 1 << i;
+
+ assert( Entry0 >= 0 );
+ printf( "Entry0 = %d\n", Entry0 );
+ Entry0 ^= 1;
+// for ( m = 0; m < nMints; m++ )
+ Vec_IntForEachEntry( vRel, Entry, m )
+ {
+ if ( Entry == -1 )
+ continue;
+ Abc_TtSetBit( Vec_WrdEntryP(vSimsOut, iMint), Entry0 ^ Entry );
+
+ Value = 0;
+ Vec_IntForEachEntry( vDivs, iObj, i )
+ if ( Abc_TtGetBit(Vec_WrdEntryP(vSims, iObj*nWords), m) )
+ Abc_TtSetBit( &Value, i );
+ Vec_WrdEntryP(vSimsOut, iMint)[0] = Value ^ Phase;
+
+ iMint++;
+ }
+ assert( iMint == nMints );
+ printf( "Created %d minterms.\n", iMint );
+ Exa4_ManGenTest( vSimsIn, vSimsOut, Vec_IntSize(vIns), Vec_IntSize(vDivs), Vec_IntSize(vOuts), 10, 0, 0, 0, 0, 0, 1 );
+ Vec_WrdFree( vSimsIn );
+ Vec_WrdFree( vSimsOut );
+}
+void Gia_ManRelDeriveTest( Gia_Man_t * p )
+{
+ Vec_Int_t * vIns = Gia_ManRelInitIns();
+ Vec_Int_t * vOuts = Gia_ManRelInitOuts();
+ Vec_Wrd_t * vSims; Vec_Int_t * vRel, * vDivs; int nWords;
+ Vec_WrdFreeP( &p->vSimsPi );
+ p->vSimsPi = Vec_WrdStartTruthTables( Gia_ManCiNum(p) );
+ nWords = Vec_WrdSize(p->vSimsPi) / Gia_ManCiNum(p);
+ vSims = Gia_ManSimPatSim( p );
+ vRel = Gia_ManRelDeriveSimple( p, vSims, vIns, vOuts );
+ vDivs = Gia_ManRelInitDivs( p, vIns, vOuts );
+ //printf( "Neg = %d\n", Vec_IntCountEntry(vRel, -1) );
+
+ Gia_ManRelSolve( p, vSims, vIns, vOuts, vRel, vDivs );
+
+ Vec_IntFree( vDivs );
+ Vec_IntPrint( vRel );
+ Vec_IntFree( vRel );
+ Vec_WrdFree( vSims );
+ Vec_IntFree( vIns );
+ Vec_IntFree( vOuts );
+}
+
+
+
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////