From 88185a02e2e3cfb23891f14a59bb58d452da1935 Mon Sep 17 00:00:00 2001 From: Heinz Riener Date: Fri, 25 May 2018 13:44:34 +0200 Subject: &exorcism: read ESOP-PLA from file. --- src/base/abci/abc.c | 78 ++++++++++++++++++++++++++++++++++++++-------------- src/base/exor/exor.c | 64 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 21 deletions(-) (limited to 'src/base') 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 \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, " : 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] \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, " : 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; +} /////////////////////////////////////////////////////////////////// -- cgit v1.2.3