summaryrefslogtreecommitdiffstats
path: root/src/base/abc/abcUtil.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/abc/abcUtil.c')
-rw-r--r--src/base/abc/abcUtil.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/base/abc/abcUtil.c b/src/base/abc/abcUtil.c
index 77b55bb3..65e5e529 100644
--- a/src/base/abc/abcUtil.c
+++ b/src/base/abc/abcUtil.c
@@ -23,6 +23,7 @@
#include "map/mio/mio.h"
#include "bool/dec/dec.h"
#include "opt/fxu/fxu.h"
+#include "aig/miniaig/ndr.h"
#ifdef ABC_USE_CUDD
#include "bdd/extrab/extraBdd.h"
@@ -3087,6 +3088,59 @@ Abc_Ntk_t * Abc_NtkCreatePropertyMonitorTest( Abc_Ntk_t * p )
return pNtk;
}
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Abc_GateToType( Abc_Obj_t * pObj )
+{
+ char * pGateName = Mio_GateReadName((Mio_Gate_t *)pObj->pData);
+ if ( !strncmp(pGateName, "buf", 3) ) return ABC_OPER_BIT_BUF;
+ if ( !strncmp(pGateName, "inv", 3) ) return ABC_OPER_BIT_INV;
+ if ( !strncmp(pGateName, "and", 3) ) return ABC_OPER_BIT_AND;
+ if ( !strncmp(pGateName, "nand", 4) ) return ABC_OPER_BIT_NAND;
+ if ( !strncmp(pGateName, "or", 2) ) return ABC_OPER_BIT_OR;
+ if ( !strncmp(pGateName, "nor", 3) ) return ABC_OPER_BIT_NOR;
+ if ( !strncmp(pGateName, "xor", 3) ) return ABC_OPER_BIT_XOR;
+ if ( !strncmp(pGateName, "nxor", 4) ) return ABC_OPER_BIT_NXOR;
+ assert( 0 );
+ return -1;
+}
+Vec_Wec_t * Abc_SopSynthesize( Vec_Ptr_t * vSops )
+{
+ Vec_Wec_t * vRes = NULL;
+ Abc_Ntk_t * pNtk = Abc_NtkCreateFromSops( "top", vSops );
+ Abc_Ntk_t * pNtkNew;
+ Abc_Obj_t * pObj, * pFanin;
+ int i, k, iNode = 0;
+ Abc_FrameReplaceCurrentNetwork( Abc_FrameReadGlobalFrame(), pNtk );
+ Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "fx; strash; balance; dc2; map -a" );
+ pNtkNew = Abc_FrameReadNtk( Abc_FrameReadGlobalFrame() );
+ Abc_NtkDelete( pNtk );
+ vRes = Vec_WecStart( Abc_NtkPiNum(pNtkNew) + Abc_NtkNodeNum(pNtkNew) + Abc_NtkPoNum(pNtkNew) );
+ Abc_NtkForEachPi( pNtkNew, pObj, i )
+ pObj->iTemp = iNode++;
+ Abc_NtkForEachNode( pNtkNew, pObj, i )
+ {
+ Vec_Int_t * vNode = Vec_WecEntry(vRes, iNode);
+ Vec_IntPush( vNode, Abc_GateToType(pObj) );
+ Abc_ObjForEachFanin( pObj, pFanin, k )
+ Vec_IntPush( vNode, pFanin->iTemp );
+ pObj->iTemp = iNode++;
+ }
+ Abc_NtkForEachPo( pNtkNew, pObj, i )
+ Vec_IntPushTwo( Vec_WecEntry(vRes, iNode++), ABC_OPER_BIT_BUF, Abc_ObjFanin0(pObj)->iTemp );
+ assert( Vec_WecSize(vRes) == iNode );
+ return vRes;
+}
+
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////