summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHeinz Riener <heinz.riener@gmail.com>2018-05-25 13:44:34 +0200
committerHeinz Riener <heinz.riener@gmail.com>2018-05-25 13:44:34 +0200
commit88185a02e2e3cfb23891f14a59bb58d452da1935 (patch)
treeee1a87266cf3ca3bddca3c01bd7bc810caf0407b /src
parent6df13962739353022cc365b6b4c6a72014e05a35 (diff)
downloadabc-88185a02e2e3cfb23891f14a59bb58d452da1935.tar.gz
abc-88185a02e2e3cfb23891f14a59bb58d452da1935.tar.bz2
abc-88185a02e2e3cfb23891f14a59bb58d452da1935.zip
&exorcism: read ESOP-PLA from file.
Diffstat (limited to 'src')
-rw-r--r--src/base/abci/abc.c78
-rw-r--r--src/base/exor/exor.c64
2 files changed, 121 insertions, 21 deletions
diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c
index a22e02c1..90ba1bf0 100644
--- a/src/base/abci/abc.c
+++ b/src/base/abci/abc.c
@@ -43091,10 +43091,16 @@ usage:
int Abc_CommandAbc9Exorcism( Abc_Frame_t * pAbc, int argc, char ** argv )
{
extern int Abc_ExorcismMain( Vec_Wec_t * vEsop, int nIns, int nOuts, char * pFileNameOut, int Quality, int Verbosity, int nCubesMax, int fUseQCost );
+ extern Vec_Wec_t * Abc_ExorcismNtk2Esop( Abc_Ntk_t * pNtk );
+
extern Gia_Man_t * Eso_ManCompute( Gia_Man_t * pGia, int fVerbose, Vec_Wec_t ** pvRes );
Vec_Wec_t * vEsop = NULL;
+ Abc_Ntk_t * pNtk = NULL;
+ char * pFileNameIn = NULL;
char * pFileNameOut = NULL;
int c, Quality = 2, Verbosity = 0, nCubesMax = 20000, fUseQCost = 0, fVerbose = 0;
+ int nInputs, nOutputs;
+
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "QVCqvh" ) ) != EOF )
{
@@ -43145,30 +43151,60 @@ int Abc_CommandAbc9Exorcism( Abc_Frame_t * pAbc, int argc, char ** argv )
goto usage;
}
}
- if ( pAbc->pGia == NULL )
+
+ if ( argc == globalUtilOptind + 2 )
{
- Abc_Print( -1, "Abc_CommandAbc9Exorcism(): There is no AIG.\n" );
- return 0;
+ pFileNameIn = argv[globalUtilOptind];
+ pFileNameOut = argv[globalUtilOptind + 1];
}
- // get the output file name
- if ( argc == globalUtilOptind + 1 )
+ else if ( argc == globalUtilOptind + 1 )
+ {
pFileNameOut = argv[globalUtilOptind];
- // generate starting cover and run minimization
- Eso_ManCompute( pAbc->pGia, fVerbose, &vEsop );
- Abc_ExorcismMain( vEsop, Gia_ManCiNum(pAbc->pGia), Gia_ManCoNum(pAbc->pGia), pFileNameOut, Quality, Verbosity, nCubesMax, fUseQCost );
- Vec_WecFree( vEsop );
- return 0;
-
-usage:
- Abc_Print( -2, "usage: &exorcism [-Q N] [-V N] [-C N] -q <file>\n" );
- Abc_Print( -2, " performs heuristic exclusive sum-of-project minimization\n" );
- Abc_Print( -2, " -Q N : minimization quality [default = %d]\n", Quality);
- Abc_Print( -2, " increasing this number improves quality and adds to runtime\n");
- Abc_Print( -2, " -V N : verbosity level [default = %d]\n", Verbosity);
- Abc_Print( -2, " 0 = no output; 1 = outline; 2 = verbose\n");
- Abc_Print( -2, " -C N : maximum number of cubes in startign cover [default = %d]\n", nCubesMax );
- Abc_Print( -2, " -q : toggle using quantum cost [default = %s]\n", fUseQCost? "yes": "no" );
- Abc_Print( -2, " <file>: the output file name in ESOP-PLA format\n");
+ }
+ else
+ {
+ Abc_Print( -1, "Abc_CommandAbc9Exorcism(): Argument error.\n" );
+ goto usage;
+ }
+
+ if ( pAbc->pGia == NULL && pFileNameIn == NULL )
+ {
+ Abc_Print( -1, "Abc_CommandAbc9Exorcism(): There is neither an AIG nor an ESOP-PLA file.\n" );
+ return 0;
+ }
+
+ if ( pFileNameIn )
+ {
+ pNtk = Io_ReadPla( pFileNameIn, 0, 0, 0, /* no preprocessing = */1, /* check = */1 );
+ nInputs = Abc_NtkCiNum( pNtk );
+ nOutputs = Abc_NtkCoNum( pNtk );
+ vEsop = Abc_ExorcismNtk2Esop( pNtk );
+ }
+ else if ( pAbc->pGia )
+ {
+ // generate starting cover and run minimization
+ nInputs = Gia_ManCiNum( pAbc->pGia );
+ nOutputs = Gia_ManCoNum( pAbc->pGia );
+ Eso_ManCompute( pAbc->pGia, fVerbose, &vEsop );
+ }
+
+ if ( vEsop )
+ {
+ Abc_ExorcismMain( vEsop, nInputs, nOutputs, pFileNameOut, Quality, Verbosity, nCubesMax, fUseQCost );
+ Vec_WecFree( vEsop );
+ }
+ return 0;
+
+usage:
+ Abc_Print( -2, "usage: &exorcism [-Q N] [-V N] [-C N] -q [file_in] <file_out>\n" );
+ Abc_Print( -2, " performs heuristic exclusive sum-of-project minimization\n" );
+ Abc_Print( -2, " -Q N : minimization quality [default = %d]\n", Quality);
+ Abc_Print( -2, " increasing this number improves quality and adds to runtime\n");
+ Abc_Print( -2, " -V N : verbosity level [default = %d]\n", Verbosity);
+ Abc_Print( -2, " 0 = no output; 1 = outline; 2 = verbose\n");
+ Abc_Print( -2, " -C N : maximum number of cubes in startign cover [default = %d]\n", nCubesMax );
+ Abc_Print( -2, " -q : toggle using quantum cost [default = %s]\n", fUseQCost? "yes": "no" );
+ Abc_Print( -2, " <file> : the output file name in ESOP-PLA format\n");
Abc_Print( -2, "\n" );
return 1;
}
diff --git a/src/base/exor/exor.c b/src/base/exor/exor.c
index 2310de5f..75cd9e3f 100644
--- a/src/base/exor/exor.c
+++ b/src/base/exor/exor.c
@@ -46,6 +46,7 @@
////////////////////////////////////////////////////////////////////////
#include "exor.h"
+#include "base/abc/abc.h"
ABC_NAMESPACE_IMPL_START
@@ -947,6 +948,69 @@ int Abc_ExorcismMain( Vec_Wec_t * vEsop, int nIns, int nOuts, char * pFileNameOu
return 1;
}
+Vec_Wec_t * Abc_ExorcismNtk2Esop( Abc_Ntk_t * pNtk )
+{
+ Vec_Wec_t * vEsop = NULL;
+ Abc_Obj_t * pNode, * pFanin, * pDriver;
+ char * pCube;
+ int nIns, nOuts, nProducts, nFanins, i, k;
+
+ nIns = Abc_NtkCiNum( pNtk );
+ nOuts = Abc_NtkCoNum( pNtk );
+
+ nProducts = 0;
+ Abc_NtkForEachCo( pNtk, pNode, i )
+ {
+ pDriver = Abc_ObjFanin0Ntk( Abc_ObjFanin0(pNode) );
+ if ( !Abc_ObjIsNode(pDriver) )
+ {
+ nProducts++;
+ continue;
+ }
+ if ( Abc_NodeIsConst(pDriver) )
+ {
+ if ( Abc_NodeIsConst1(pDriver) )
+ nProducts++;
+ continue;
+ }
+ nProducts += Abc_SopGetCubeNum((char *)pDriver->pData);
+ }
+
+ Abc_NtkForEachCi( pNtk, pNode, i )
+ pNode->pCopy = (Abc_Obj_t *)(ABC_PTRUINT_T)i;
+
+ vEsop = Vec_WecAlloc( nProducts+1 );
+
+ Abc_NtkForEachCo( pNtk, pNode, i )
+ {
+ pDriver = Abc_ObjFanin0Ntk( Abc_ObjFanin0(pNode) );
+ if ( Abc_NodeIsConst(pDriver) ) continue;
+
+ nFanins = Abc_ObjFaninNum(pDriver);
+ Abc_SopForEachCube( (char *)pDriver->pData, nFanins, pCube )
+ {
+ Vec_Int_t *vCubeIn = Vec_WecPushLevel( vEsop );
+ Vec_IntGrow( vCubeIn, nIns+2 );
+
+ Abc_ObjForEachFanin( pDriver, pFanin, k )
+ {
+ pFanin = Abc_ObjFanin0Ntk(pFanin);
+ assert( (int)(ABC_PTRUINT_T)pFanin->pCopy < nIns );
+ if ( pCube[k] == '0' )
+ {
+ Vec_IntPush( vCubeIn, 2*k + 1 );
+ }
+ else if ( pCube[k] == '1' )
+ {
+ Vec_IntPush( vCubeIn, 2*k );
+ }
+ }
+ Vec_IntPush( vCubeIn, -1 );
+ }
+ }
+
+ return vEsop;
+}
///////////////////////////////////////////////////////////////////