summaryrefslogtreecommitdiffstats
path: root/src/base/abci/abcDar.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2014-12-10 22:52:34 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2014-12-10 22:52:34 -0800
commit4f940de51880c83228b1923fe245af33de1fe346 (patch)
treef85a0543e8af976baf694c120e3d9f9e9fe9f1ba /src/base/abci/abcDar.c
parentb94b7852d7d8b335589cf3eb22de61632e17c55b (diff)
downloadabc-4f940de51880c83228b1923fe245af33de1fe346.tar.gz
abc-4f940de51880c83228b1923fe245af33de1fe346.tar.bz2
abc-4f940de51880c83228b1923fe245af33de1fe346.zip
Converting AIG with MUXes into a logic network.
Diffstat (limited to 'src/base/abci/abcDar.c')
-rw-r--r--src/base/abci/abcDar.c67
1 files changed, 52 insertions, 15 deletions
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 )
{