summaryrefslogtreecommitdiffstats
path: root/src/base/abc
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2022-02-03 18:45:11 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2022-02-03 18:45:11 -0800
commit6345832dba505bc60f78e5d165ca29d3842cbbd6 (patch)
tree477709d293afa3818e56cbfb4aedc15ae7fede00 /src/base/abc
parentfaa59472783121b7b8c7e4bd4c361a7f5aaf71ab (diff)
downloadabc-6345832dba505bc60f78e5d165ca29d3842cbbd6.tar.gz
abc-6345832dba505bc60f78e5d165ca29d3842cbbd6.tar.bz2
abc-6345832dba505bc60f78e5d165ca29d3842cbbd6.zip
Improving truth table handling.
Diffstat (limited to 'src/base/abc')
-rw-r--r--src/base/abc/abc.h3
-rw-r--r--src/base/abc/abcNtk.c46
-rw-r--r--src/base/abc/abcSop.c69
3 files changed, 116 insertions, 2 deletions
diff --git a/src/base/abc/abc.h b/src/base/abc/abc.h
index e7f6c0ad..eea66f29 100644
--- a/src/base/abc/abc.h
+++ b/src/base/abc/abc.h
@@ -784,6 +784,7 @@ extern ABC_DLL Abc_Ntk_t * Abc_NtkCreateMffc( Abc_Ntk_t * pNtk, Abc_Obj_t
extern ABC_DLL Abc_Ntk_t * Abc_NtkCreateTarget( Abc_Ntk_t * pNtk, Vec_Ptr_t * vRoots, Vec_Int_t * vValues );
extern ABC_DLL Abc_Ntk_t * Abc_NtkCreateFromNode( Abc_Ntk_t * pNtk, Abc_Obj_t * pNode );
extern ABC_DLL Abc_Ntk_t * Abc_NtkCreateWithNode( char * pSop );
+extern ABC_DLL Abc_Ntk_t * Abc_NtkCreateWithNodes( Vec_Ptr_t * vSops );
extern ABC_DLL void Abc_NtkDelete( Abc_Ntk_t * pNtk );
extern ABC_DLL void Abc_NtkFixNonDrivenNets( Abc_Ntk_t * pNtk );
extern ABC_DLL void Abc_NtkMakeComb( Abc_Ntk_t * pNtk, int fRemoveLatches );
@@ -920,6 +921,8 @@ extern ABC_DLL int Abc_SopIsExorType( char * pSop );
extern ABC_DLL int Abc_SopCheck( char * pSop, int nFanins );
extern ABC_DLL char * Abc_SopFromTruthBin( char * pTruth );
extern ABC_DLL char * Abc_SopFromTruthHex( char * pTruth );
+extern ABC_DLL Vec_Ptr_t * Abc_SopFromTruthsBin( char * pTruth );
+extern ABC_DLL Vec_Ptr_t * Abc_SopFromTruthsHex( char * pTruth );
extern ABC_DLL char * Abc_SopEncoderPos( Mem_Flex_t * pMan, int iValue, int nValues );
extern ABC_DLL char * Abc_SopEncoderLog( Mem_Flex_t * pMan, int iBit, int nValues );
extern ABC_DLL char * Abc_SopDecoderPos( Mem_Flex_t * pMan, int nValues );
diff --git a/src/base/abc/abcNtk.c b/src/base/abc/abcNtk.c
index f8e40b41..63353344 100644
--- a/src/base/abc/abcNtk.c
+++ b/src/base/abc/abcNtk.c
@@ -1272,6 +1272,52 @@ Abc_Ntk_t * Abc_NtkCreateWithNode( char * pSop )
/**Function*************************************************************
+ Synopsis [Creates the network composed of one node with the given SOP.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Abc_Ntk_t * Abc_NtkCreateWithNodes( Vec_Ptr_t * vSop )
+{
+ Abc_Ntk_t * pNtkNew;
+ Abc_Obj_t * pFanin, * pNode, * pNodePo;
+ Vec_Ptr_t * vNames;
+ int i, k, nVars; char Buffer[10];
+ char * pSop = (char *)Vec_PtrEntry(vSop, 0);
+ // start the network
+ pNtkNew = Abc_NtkAlloc( ABC_NTK_LOGIC, ABC_FUNC_SOP, 1 );
+ pNtkNew->pName = Extra_UtilStrsav("ex");
+ // create PIs
+ Vec_PtrPush( pNtkNew->vObjs, NULL );
+ nVars = Abc_SopGetVarNum( pSop );
+ vNames = Abc_NodeGetFakeNames( nVars );
+ for ( i = 0; i < nVars; i++ )
+ Abc_ObjAssignName( Abc_NtkCreatePi(pNtkNew), (char *)Vec_PtrEntry(vNames, i), NULL );
+ Abc_NodeFreeNames( vNames );
+ // create the node, add PIs as fanins, set the function
+ Vec_PtrForEachEntry( char *, vSop, pSop, i )
+ {
+ pNode = Abc_NtkCreateNode( pNtkNew );
+ Abc_NtkForEachPi( pNtkNew, pFanin, k )
+ Abc_ObjAddFanin( pNode, pFanin );
+ pNode->pData = Abc_SopRegister( (Mem_Flex_t *)pNtkNew->pManFunc, pSop );
+ // create the only PO
+ pNodePo = Abc_NtkCreatePo(pNtkNew);
+ Abc_ObjAddFanin( pNodePo, pNode );
+ sprintf( Buffer, "F%d", i );
+ Abc_ObjAssignName( pNodePo, Buffer, NULL );
+ }
+ if ( !Abc_NtkCheck( pNtkNew ) )
+ fprintf( stdout, "Abc_NtkCreateWithNode(): Network check has failed.\n" );
+ return pNtkNew;
+}
+
+/**Function*************************************************************
+
Synopsis [Deletes the Ntk.]
Description []
diff --git a/src/base/abc/abcSop.c b/src/base/abc/abcSop.c
index b91214af..a560a249 100644
--- a/src/base/abc/abcSop.c
+++ b/src/base/abc/abcSop.c
@@ -907,6 +907,41 @@ int Abc_SopCheck( char * pSop, int nFanins )
return 1;
}
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Abc_SopCheckReadTruth( Vec_Ptr_t * vRes, char * pToken, int fHex )
+{
+ char * pBase; int nVars;
+ int Log2 = Abc_Base2Log( strlen(pToken) );
+ if ( (1 << Log2) != (int)strlen(pToken) )
+ {
+ printf( "The truth table length (%d) is not power-of-2.\n", strlen(pToken) );
+ Vec_PtrFreeData( vRes );
+ Vec_PtrShrink( vRes, 0 );
+ return 0;
+ }
+ if ( Vec_PtrSize(vRes) == 0 )
+ return 1;
+ pBase = (char *)Vec_PtrEntry( vRes, 0 );
+ nVars = Abc_SopGetVarNum( pBase );
+ if ( nVars != Log2+2*fHex )
+ {
+ printf( "Truth table #1 has %d vars while truth table #%d has %d vars.\n", nVars, Vec_PtrSize(vRes)+1, Log2+2*fHex );
+ Vec_PtrFreeData( vRes );
+ Vec_PtrShrink( vRes, 0 );
+ return 0;
+ }
+ return 1;
+}
/**Function*************************************************************
@@ -964,8 +999,8 @@ char * Abc_SopFromTruthBin( char * pTruth )
{
pCube = pSopCover + i * (nVars + 3);
for ( b = 0; b < nVars; b++ )
- if ( Mint & (1 << (nVars-1-b)) )
-// if ( Mint & (1 << b) )
+// if ( Mint & (1 << (nVars-1-b)) )
+ if ( Mint & (1 << b) )
pCube[b] = '1';
else
pCube[b] = '0';
@@ -976,6 +1011,21 @@ char * Abc_SopFromTruthBin( char * pTruth )
Vec_IntFree( vMints );
return pSopCover;
}
+Vec_Ptr_t * Abc_SopFromTruthsBin( char * pTruth )
+{
+ Vec_Ptr_t * vRes = Vec_PtrAlloc( 10 );
+ char * pCopy = Abc_UtilStrsav(pTruth);
+ char * pToken = strtok( pCopy, " \r\n\t|" );
+ while ( pToken )
+ {
+ if ( !Abc_SopCheckReadTruth( vRes, pToken, 0 ) )
+ break;
+ Vec_PtrPush( vRes, Abc_SopFromTruthBin(pToken) );
+ pToken = strtok( NULL, " \r\n\t|" );
+ }
+ ABC_FREE( pCopy );
+ return vRes;
+}
/**Function*************************************************************
@@ -1058,6 +1108,21 @@ char * Abc_SopFromTruthHex( char * pTruth )
Vec_IntFree( vMints );
return pSopCover;
}
+Vec_Ptr_t * Abc_SopFromTruthsHex( char * pTruth )
+{
+ Vec_Ptr_t * vRes = Vec_PtrAlloc( 10 );
+ char * pCopy = Abc_UtilStrsav(pTruth);
+ char * pToken = strtok( pCopy, " \r\n\t|" );
+ while ( pToken )
+ {
+ if ( !Abc_SopCheckReadTruth( vRes, pToken, 1 ) )
+ break;
+ Vec_PtrPush( vRes, Abc_SopFromTruthHex(pToken) );
+ pToken = strtok( NULL, " \r\n\t|" );
+ }
+ ABC_FREE( pCopy );
+ return vRes;
+}
/**Function*************************************************************