| /**CFile**************************************************************** |
| |
| FileName [bmcExpand.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [SAT-based bounded model checking.] |
| |
| Synopsis [Expanding cubes against the offset.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 20, 2005.] |
| |
| Revision [$Id: bmcExpand.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "bmc.h" |
| #include "sat/cnf/cnf.h" |
| #include "sat/bsat/satStore.h" |
| #include "base/abc/abc.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| // iterator thought the cubes |
| #define Bmc_SopForEachCube( pSop, nVars, pCube ) for ( pCube = (pSop); *pCube; pCube += (nVars) + 3 ) |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Expands cubes against the offset given as an AIG.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Abc_ObjExpandCubesTry( Vec_Str_t * vSop, sat_solver * pSat, Vec_Int_t * vVars ) |
| { |
| extern int Bmc_CollapseExpandRound( sat_solver * pSat, sat_solver * pSatOn, Vec_Int_t * vLits, Vec_Int_t * vNums, Vec_Int_t * vTemp, int nBTLimit, int fCanon, int fOnOffSetLit ); |
| |
| char * pCube, * pSop = Vec_StrArray(vSop); |
| int nCubes = Abc_SopGetCubeNum(pSop); |
| int nVars = Abc_SopGetVarNum(pSop); |
| |
| Vec_Int_t * vLits = Vec_IntAlloc( nVars ); |
| Vec_Int_t * vTemp = Vec_IntAlloc( nVars ); |
| |
| assert( nVars == Vec_IntSize(vVars) ); |
| assert( Vec_StrSize(vSop) == nCubes * (nVars + 3) + 1 ); |
| Bmc_SopForEachCube( pSop, nVars, pCube ) |
| { |
| int k, Entry; |
| // collect literals and clean cube |
| Vec_IntFill( vLits, nVars, -1 ); |
| for ( k = 0; k < nVars; k++ ) |
| { |
| if ( pCube[k] == '-' ) |
| continue; |
| Vec_IntWriteEntry( vLits, k, Abc_Var2Lit(Vec_IntEntry(vVars, k), pCube[k] == '0') ); |
| pCube[k] = '-'; |
| } |
| // expand cube |
| Bmc_CollapseExpandRound( pSat, NULL, vLits, NULL, vTemp, 0, 0, -1 ); |
| // insert literals |
| Vec_IntForEachEntry( vLits, Entry, k ) |
| if ( Entry != -1 ) |
| pCube[k] = '1' - Abc_LitIsCompl(Entry); |
| } |
| |
| Vec_IntFree( vLits ); |
| Vec_IntFree( vTemp ); |
| return nCubes; |
| } |
| int Abc_ObjExpandCubes( Vec_Str_t * vSop, Gia_Man_t * p, int nVars ) |
| { |
| extern int Bmc_CollapseIrredundantFull( Vec_Str_t * vSop, int nCubes, int nVars ); |
| |
| int fReverse = 0; |
| Vec_Int_t * vVars = Vec_IntAlloc( nVars ); |
| Cnf_Dat_t * pCnf = (Cnf_Dat_t *)Mf_ManGenerateCnf( p, 8, 0, 0, 0, 0 ); |
| sat_solver * pSat = (sat_solver *)Cnf_DataWriteIntoSolver(pCnf, 1, 0); |
| int v, n, iLit, status, nCubesNew, iCiVarBeg = sat_solver_nvars(pSat) - nVars; |
| |
| // check that on-set/off-set is sat |
| int iOutVar = 1; |
| for ( n = 0; n < 2; n++ ) |
| { |
| iLit = Abc_Var2Lit( iOutVar, n ); // n=0 => F=1 n=1 => F=0 |
| status = sat_solver_solve( pSat, &iLit, &iLit + 1, 0, 0, 0, 0 ); |
| if ( status == l_False ) |
| { |
| Vec_StrClear( vSop ); |
| Vec_StrPrintStr( vSop, n ? " 1\n" : " 0\n" ); |
| Vec_StrPush( vSop, '\0' ); |
| return 1; |
| } |
| } |
| |
| // add literals to the solver |
| iLit = Abc_Var2Lit( iOutVar, 1 ); |
| status = sat_solver_addclause( pSat, &iLit, &iLit + 1 ); |
| assert( status ); |
| |
| // collect variables |
| if ( fReverse ) |
| for ( v = nVars - 1; v >= 0; v-- ) |
| Vec_IntPush( vVars, iCiVarBeg + v ); |
| else |
| for ( v = 0; v < nVars; v++ ) |
| Vec_IntPush( vVars, iCiVarBeg + v ); |
| |
| nCubesNew = Abc_ObjExpandCubesTry( vSop, pSat, vVars ); |
| |
| sat_solver_delete( pSat ); |
| Cnf_DataFree( pCnf ); |
| Vec_IntFree( vVars ); |
| if ( nCubesNew > 1 ) |
| Bmc_CollapseIrredundantFull( vSop, nCubesNew, nVars ); |
| return 0; |
| } |
| void Abc_NtkExpandCubes( Abc_Ntk_t * pNtk, Gia_Man_t * pGia, int fVerbose ) |
| { |
| Gia_Man_t * pNew; |
| Abc_Obj_t * pObj; int i; |
| Vec_Str_t * vSop = Vec_StrAlloc( 1000 ); |
| assert( Abc_NtkIsSopLogic(pNtk) ); |
| assert( Abc_NtkCiNum(pNtk) == Gia_ManCiNum(pGia) ); |
| assert( Abc_NtkCoNum(pNtk) == Gia_ManCoNum(pGia) ); |
| Abc_NtkForEachCo( pNtk, pObj, i ) |
| { |
| pObj = Abc_ObjFanin0(pObj); |
| if ( !Abc_ObjIsNode(pObj) || Abc_ObjFaninNum(pObj) == 0 ) |
| continue; |
| assert( Abc_ObjFaninNum(pObj) == Gia_ManCiNum(pGia) ); |
| |
| Vec_StrClear( vSop ); |
| Vec_StrAppend( vSop, (char *)pObj->pData ); |
| Vec_StrPush( vSop, '\0' ); |
| |
| pNew = Gia_ManDupCones( pGia, &i, 1, 0 ); |
| assert( Gia_ManCiNum(pNew) == Gia_ManCiNum(pGia) ); |
| if ( Abc_ObjExpandCubes( vSop, pNew, Abc_ObjFaninNum(pObj) ) ) |
| Vec_IntClear( &pObj->vFanins ); |
| Gia_ManStop( pNew ); |
| |
| pObj->pData = Abc_SopRegister( (Mem_Flex_t *)pNtk->pManFunc, Vec_StrArray(vSop) ); |
| } |
| Vec_StrFree( vSop ); |
| Abc_NtkSortSops( pNtk ); |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |