diff options
-rw-r--r-- | src/aig/saig/saig.h | 1 | ||||
-rw-r--r-- | src/aig/saig/saigMiter.c | 94 | ||||
-rw-r--r-- | src/base/abci/abc.c | 16 | ||||
-rw-r--r-- | src/base/abci/abcDar.c | 53 |
4 files changed, 158 insertions, 6 deletions
diff --git a/src/aig/saig/saig.h b/src/aig/saig/saig.h index e3de0a6d..af851305 100644 --- a/src/aig/saig/saig.h +++ b/src/aig/saig/saig.h @@ -170,6 +170,7 @@ extern int Saig_ManDemiterSimple( Aig_Man_t * p, Aig_Man_t ** ppAi extern int Saig_ManDemiterSimpleDiff( Aig_Man_t * p, Aig_Man_t ** ppAig0, Aig_Man_t ** ppAig1 ); extern int Saig_ManDemiterDual( Aig_Man_t * p, Aig_Man_t ** ppAig0, Aig_Man_t ** ppAig1 ); extern int Ssw_SecSpecialMiter( Aig_Man_t * p0, Aig_Man_t * p1, int nFrames, int fVerbose ); +extern int Saig_ManDemiterNew( Aig_Man_t * pMan ); /*=== saigOutdec.c ==========================================================*/ extern Aig_Man_t * Saig_ManDecPropertyOutput( Aig_Man_t * pAig, int nLits, int fVerbose ); /*=== saigPhase.c ==========================================================*/ diff --git a/src/aig/saig/saigMiter.c b/src/aig/saig/saigMiter.c index be80f545..4a430a60 100644 --- a/src/aig/saig/saigMiter.c +++ b/src/aig/saig/saigMiter.c @@ -1213,6 +1213,100 @@ int Ssw_SecSpecialMiter( Aig_Man_t * p0, Aig_Man_t * p1, int nFrames, int fVerbo return RetValue; } + + +/**Function************************************************************* + + Synopsis [Performs demitering of the network.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Saig_ManDemiterNew( Aig_Man_t * pMan ) +{ + Vec_Ptr_t * vSuper, * vSupp0, * vSupp1; + Aig_Obj_t * pObj, * pTemp, * pFan0, * pFan1; + int i, k; + vSuper = Vec_PtrAlloc( 100 ); + Saig_ManForEachPo( pMan, pObj, i ) + { + if ( pMan->nConstrs && i >= pMan->nConstrs ) + break; + printf( "Output %3d : ", i ); + if ( Aig_ObjIsConst1(Aig_ObjFanin0(pObj)) ) + { + if ( !Aig_ObjFaninC0(pObj) ) + printf( "Const1\n" ); + else + printf( "Const0\n" ); + continue; + } + if ( !Aig_ObjIsNode(Aig_ObjFanin0(pObj)) ) + { + printf( "Terminal\n" ); + continue; + } + // check AND + if ( !Aig_ObjFaninC0(pObj) ) + { + printf( "AND " ); + if ( Aig_ObjRecognizeExor(Aig_ObjFanin0(pObj), &pFan0, &pFan1) ) + printf( " Yes" ); + else + printf( " No" ); + printf( "\n" ); + continue; + } + // check OR + Aig_ObjCollectSuper( Aig_ObjFanin0(pObj), vSuper ); + printf( "OR with %d inputs ", Vec_PtrSize(vSuper) ); + if ( Vec_PtrSize(vSuper) == 2 ) + { + if ( Aig_ObjRecognizeExor(Aig_ObjFanin0(pObj), &pFan0, &pFan1) ) + { + printf( " Yes" ); + printf( "\n" ); + + vSupp0 = Aig_Support( pMan, Aig_Regular(pFan0) ); + Vec_PtrForEachEntry( Aig_Obj_t *, vSupp0, pTemp, k ) + if ( Saig_ObjIsLo(pMan, pTemp) ) + printf( " %d", Aig_ObjPioNum(pTemp) ); + printf( "\n" ); + Vec_PtrFree( vSupp0 ); + + vSupp1 = Aig_Support( pMan, Aig_Regular(pFan1) ); + Vec_PtrForEachEntry( Aig_Obj_t *, vSupp1, pTemp, k ) + if ( Saig_ObjIsLo(pMan, pTemp) ) + printf( " %d", Aig_ObjPioNum(pTemp) ); + printf( "\n" ); + Vec_PtrFree( vSupp1 ); + } + else + printf( " No" ); + printf( "\n" ); + continue; + } +/* + Vec_PtrForEachEntry( Aig_Obj_t *, vSuper, pTemp, k ) + if ( Aig_ObjRecognizeExor(Aig_Regular(pTemp), &pFan0, &pFan1) ) + { + printf( " Yes" ); + if ( Aig_IsComplement(pTemp) ) + pFan0 = Aig_Not(pFan0); + } + else + printf( " No" ); +*/ + printf( "\n" ); + } + Vec_PtrFree( vSuper ); + return 1; +} + //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index 2cc8d773..209433df 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -5519,6 +5519,8 @@ int Abc_CommandDemiter( Abc_Frame_t * pAbc, int argc, char ** argv ) extern int Abc_NtkDarDemiter( Abc_Ntk_t * pNtk ); extern int Abc_NtkDarDemiterDual( Abc_Ntk_t * pNtk, int fVerbose ); + extern int Abc_NtkDarDemiterNew( Abc_Ntk_t * pNtk ); + // set defaults fDual = 0; fSeq = 1; @@ -5540,7 +5542,7 @@ int Abc_CommandDemiter( Abc_Frame_t * pAbc, int argc, char ** argv ) default: goto usage; } - } + } if ( pNtk == NULL ) { @@ -5554,14 +5556,16 @@ int Abc_CommandDemiter( Abc_Frame_t * pAbc, int argc, char ** argv ) return 1; } - if ( (Abc_NtkPoNum(pNtk) & 1) ) - { - Abc_Print( -1, "The number of POs should be even.\n" ); - return 0; - } +// Abc_NtkDarDemiterNew( pNtk ); +// return 0; if ( fDual ) { + if ( (Abc_NtkPoNum(pNtk) & 1) ) + { + Abc_Print( -1, "The number of POs should be even.\n" ); + return 0; + } if ( !Abc_NtkDarDemiterDual( pNtk, fVerbose ) ) { Abc_Print( -1, "Demitering has failed.\n" ); diff --git a/src/base/abci/abcDar.c b/src/base/abci/abcDar.c index b1fe8bbe..97ee8c42 100644 --- a/src/base/abci/abcDar.c +++ b/src/base/abci/abcDar.c @@ -2063,6 +2063,59 @@ int Abc_NtkDarDemiter( Abc_Ntk_t * pNtk ) SeeAlso [] ***********************************************************************/ +int Abc_NtkDarDemiterNew( Abc_Ntk_t * pNtk ) +{ + char * pFileNameGeneric, pFileName0[1000], pFileName1[1000]; + Aig_Man_t * pMan, * pPart0, * pPart1;//, * pMiter; + // derive the AIG manager + pMan = Abc_NtkToDar( pNtk, 0, 1 ); + if ( pMan == NULL ) + { + printf( "Converting network into AIG has failed.\n" ); + return 0; + } + + Saig_ManDemiterNew( pMan ); + Aig_ManStop( pMan ); + return 1; + +// if ( !Saig_ManDemiterSimple( pMan, &pPart0, &pPart1 ) ) + if ( !Saig_ManDemiterSimpleDiff( pMan, &pPart0, &pPart1 ) ) + { + printf( "Demitering has failed.\n" ); + return 0; + } + // create file names + pFileNameGeneric = Extra_FileNameGeneric( pNtk->pSpec ); + sprintf( pFileName0, "%s%s", pFileNameGeneric, "_part0.aig" ); + sprintf( pFileName1, "%s%s", pFileNameGeneric, "_part1.aig" ); + ABC_FREE( pFileNameGeneric ); + // dump files + Ioa_WriteAiger( pPart0, pFileName0, 0, 0 ); + Ioa_WriteAiger( pPart1, pFileName1, 0, 0 ); + printf( "Demitering produced two files \"%s\" and \"%s\".\n", pFileName0, pFileName1 ); + // create two-level miter +// pMiter = Saig_ManCreateMiterTwo( pPart0, pPart1, 2 ); +// Aig_ManDumpBlif( pMiter, "miter01.blif", NULL, NULL ); +// Aig_ManStop( pMiter ); +// printf( "The new miter is written into file \"%s\".\n", "miter01.blif" ); + Aig_ManStop( pPart0 ); + Aig_ManStop( pPart1 ); + Aig_ManStop( pMan ); + return 1; +} + +/**Function************************************************************* + + Synopsis [Gives the current ABC network to AIG manager for processing.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ int Abc_NtkDarDemiterDual( Abc_Ntk_t * pNtk, int fVerbose ) { char * pFileNameGeneric, pFileName0[1000], pFileName1[1000]; |