diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2014-12-10 22:52:34 -0800 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2014-12-10 22:52:34 -0800 |
commit | 4f940de51880c83228b1923fe245af33de1fe346 (patch) | |
tree | f85a0543e8af976baf694c120e3d9f9e9fe9f1ba /src/base/abci | |
parent | b94b7852d7d8b335589cf3eb22de61632e17c55b (diff) | |
download | abc-4f940de51880c83228b1923fe245af33de1fe346.tar.gz abc-4f940de51880c83228b1923fe245af33de1fe346.tar.bz2 abc-4f940de51880c83228b1923fe245af33de1fe346.zip |
Converting AIG with MUXes into a logic network.
Diffstat (limited to 'src/base/abci')
-rw-r--r-- | src/base/abci/abc.c | 2 | ||||
-rw-r--r-- | src/base/abci/abcDar.c | 67 |
2 files changed, 53 insertions, 16 deletions
diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c index ba207359..81092912 100644 --- a/src/base/abci/abc.c +++ b/src/base/abci/abc.c @@ -25821,7 +25821,7 @@ int Abc_CommandAbc9Put( Abc_Frame_t * pAbc, int argc, char ** argv ) Abc_Print( -1, "Empty network.\n" ); return 1; } - if ( Gia_ManHasMapping(pAbc->pGia) ) + if ( Gia_ManHasMapping(pAbc->pGia) || pAbc->pGia->pMuxes ) { extern Abc_Ntk_t * Abc_NtkFromMappedGia( Gia_Man_t * p ); pNtk = Abc_NtkFromMappedGia( pAbc->pGia ); diff --git a/src/base/abci/abcDar.c b/src/base/abci/abcDar.c index e00dcb9e..613f151f 100644 --- a/src/base/abci/abcDar.c +++ b/src/base/abci/abcDar.c @@ -720,8 +720,8 @@ Abc_Ntk_t * Abc_NtkFromMappedGia( Gia_Man_t * p ) Gia_Obj_t * pObj, * pObjLi, * pObjLo; Vec_Ptr_t * vReflect; int i, k, iFan, nDupGates; - assert( Gia_ManHasMapping(p) ); - pNtkNew = Abc_NtkAlloc( ABC_NTK_LOGIC, ABC_FUNC_AIG, 1 ); + assert( Gia_ManHasMapping(p) || p->pMuxes ); + pNtkNew = Abc_NtkAlloc( ABC_NTK_LOGIC, Gia_ManHasMapping(p) ? ABC_FUNC_AIG : ABC_FUNC_SOP, 1 ); // duplicate the name and the spec pNtkNew->pName = Extra_UtilStrsav(p->pName); pNtkNew->pSpec = Extra_UtilStrsav(p->pSpec); @@ -748,23 +748,60 @@ Abc_Ntk_t * Abc_NtkFromMappedGia( Gia_Man_t * p ) Abc_LatchSetInit0( pObjNew ); } // rebuild the AIG - vReflect = Vec_PtrStart( Gia_ManObjNum(p) ); - Gia_ManForEachLut( p, i ) + if ( p->pMuxes ) { - pObj = Gia_ManObj(p, i); - assert( pObj->Value == ~0 ); - if ( Gia_ObjLutSize(p, i) == 0 ) + Gia_ManForEachAnd( p, pObj, i ) { - pObj->Value = Abc_ObjId(pConst0); - continue; + pObjNew = Abc_NtkCreateNode( pNtkNew ); + if ( Gia_ObjIsMuxId(p, i) ) + { + Abc_ObjAddFanin( pObjNew, Abc_NtkObj(pNtkNew, Gia_ObjValue(Gia_ObjFanin2(p, pObj))) ); + Abc_ObjAddFanin( pObjNew, Abc_NtkObj(pNtkNew, Gia_ObjValue(Gia_ObjFanin1(pObj))) ); + Abc_ObjAddFanin( pObjNew, Abc_NtkObj(pNtkNew, Gia_ObjValue(Gia_ObjFanin0(pObj))) ); + pObjNew->pData = Abc_SopCreateMux( (Mem_Flex_t *)pNtkNew->pManFunc ); + if ( Gia_ObjFaninC2(p, pObj) ) Abc_SopComplementVar( (char *)pObjNew->pData, 0 ); + if ( Gia_ObjFaninC1(pObj) ) Abc_SopComplementVar( (char *)pObjNew->pData, 1 ); + if ( Gia_ObjFaninC0(pObj) ) Abc_SopComplementVar( (char *)pObjNew->pData, 2 ); + } + else if ( Gia_ObjIsXor(pObj) ) + { + Abc_ObjAddFanin( pObjNew, Abc_NtkObj(pNtkNew, Gia_ObjValue(Gia_ObjFanin0(pObj))) ); + Abc_ObjAddFanin( pObjNew, Abc_NtkObj(pNtkNew, Gia_ObjValue(Gia_ObjFanin1(pObj))) ); + pObjNew->pData = Abc_SopCreateXor( (Mem_Flex_t *)pNtkNew->pManFunc, 2 ); + if ( Gia_ObjFaninC0(pObj) ) Abc_SopComplementVar( (char *)pObjNew->pData, 0 ); + if ( Gia_ObjFaninC1(pObj) ) Abc_SopComplementVar( (char *)pObjNew->pData, 1 ); + } + else + { + Abc_ObjAddFanin( pObjNew, Abc_NtkObj(pNtkNew, Gia_ObjValue(Gia_ObjFanin0(pObj))) ); + Abc_ObjAddFanin( pObjNew, Abc_NtkObj(pNtkNew, Gia_ObjValue(Gia_ObjFanin1(pObj))) ); + pObjNew->pData = Abc_SopCreateAnd( (Mem_Flex_t *)pNtkNew->pManFunc, 2, NULL ); + if ( Gia_ObjFaninC0(pObj) ) Abc_SopComplementVar( (char *)pObjNew->pData, 0 ); + if ( Gia_ObjFaninC1(pObj) ) Abc_SopComplementVar( (char *)pObjNew->pData, 1 ); + } + pObj->Value = Abc_ObjId( pObjNew ); + } + } + else + { + vReflect = Vec_PtrStart( Gia_ManObjNum(p) ); + Gia_ManForEachLut( p, i ) + { + pObj = Gia_ManObj(p, i); + assert( pObj->Value == ~0 ); + if ( Gia_ObjLutSize(p, i) == 0 ) + { + pObj->Value = Abc_ObjId(pConst0); + continue; + } + pObjNew = Abc_NtkCreateNode( pNtkNew ); + Gia_LutForEachFanin( p, i, iFan, k ) + Abc_ObjAddFanin( pObjNew, Abc_NtkObj(pNtkNew, Gia_ObjValue(Gia_ManObj(p, iFan))) ); + pObjNew->pData = Abc_ObjHopFromGia( (Hop_Man_t *)pNtkNew->pManFunc, p, i, vReflect ); + pObj->Value = Abc_ObjId( pObjNew ); } - pObjNew = Abc_NtkCreateNode( pNtkNew ); - Gia_LutForEachFanin( p, i, iFan, k ) - Abc_ObjAddFanin( pObjNew, Abc_NtkObj(pNtkNew, Gia_ObjValue(Gia_ManObj(p, iFan))) ); - pObjNew->pData = Abc_ObjHopFromGia( (Hop_Man_t *)pNtkNew->pManFunc, p, i, vReflect ); - pObj->Value = Abc_ObjId( pObjNew ); + Vec_PtrFree( vReflect ); } - Vec_PtrFree( vReflect ); // connect the PO nodes Gia_ManForEachCo( p, pObj, i ) { |