diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2018-01-27 14:33:49 -0800 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2018-01-27 14:33:49 -0800 |
commit | f826956b07706f8459986a6aa466e20c263fc6cc (patch) | |
tree | 74483cc01480021fa6468f854ad02796d33a06cf /src/aig/gia | |
parent | 99c4dda767eba4da21171f208428b7ade8cf1d5f (diff) | |
download | abc-f826956b07706f8459986a6aa466e20c263fc6cc.tar.gz abc-f826956b07706f8459986a6aa466e20c263fc6cc.tar.bz2 abc-f826956b07706f8459986a6aa466e20c263fc6cc.zip |
Experiments with circuit-based SAT.
Diffstat (limited to 'src/aig/gia')
-rw-r--r-- | src/aig/gia/giaCSat2.c | 69 |
1 files changed, 38 insertions, 31 deletions
diff --git a/src/aig/gia/giaCSat2.c b/src/aig/gia/giaCSat2.c index 5970261b..935f2f68 100644 --- a/src/aig/gia/giaCSat2.c +++ b/src/aig/gia/giaCSat2.c @@ -70,7 +70,7 @@ struct Cbs2_Man_t_ int * pIter; // iterator through clause vars //Vec_Int_t * vLevReas; // levels and decisions Vec_Int_t * vModel; // satisfying assignment - Vec_Ptr_t * vTemp; // temporary storage + Vec_Int_t * vTemp; // temporary storage // internal data Vec_Str_t vAssign; Vec_Str_t vValue; @@ -95,11 +95,18 @@ struct Cbs2_Man_t_ static inline int Cbs2_VarUnused( Cbs2_Man_t * p, int iVar ) { return Vec_IntEntry(&p->vLevReason, 3*iVar) == -1; } static inline void Cbs2_VarSetUnused( Cbs2_Man_t * p, int iVar ) { Vec_IntWriteEntry(&p->vLevReason, 3*iVar, -1); } -static inline int Cbs2_VarIsAssigned( Cbs2_Man_t * p, Gia_Obj_t * pVar ) { return pVar->fMark0; } -static inline void Cbs2_VarAssign( Cbs2_Man_t * p, Gia_Obj_t * pVar ) { assert(!pVar->fMark0); pVar->fMark0 = 1; } -static inline void Cbs2_VarUnassign( Cbs2_Man_t * p, Gia_Obj_t * pVar ) { assert(pVar->fMark0); pVar->fMark0 = 0; pVar->fMark1 = 0; Cbs2_VarSetUnused(p, Gia_ObjId(p->pAig, pVar)); } -static inline int Cbs2_VarValue( Cbs2_Man_t * p, Gia_Obj_t * pVar ) { assert(pVar->fMark0); return pVar->fMark1; } -static inline void Cbs2_VarSetValue( Cbs2_Man_t * p, Gia_Obj_t * pVar, int v ) { assert(pVar->fMark0); pVar->fMark1 = v; } +static inline int Cbs2_VarMark0( Cbs2_Man_t * p, int iVar ) { return Vec_StrEntry(&p->vAssign, iVar); } +static inline void Cbs2_VarSetMark0( Cbs2_Man_t * p, int iVar, int Value ) { Vec_StrWriteEntry(&p->vAssign, iVar, (char)Value); } + +static inline int Cbs2_VarMark1( Cbs2_Man_t * p, int iVar ) { return Vec_StrEntry(&p->vValue, iVar); } +static inline void Cbs2_VarSetMark1( Cbs2_Man_t * p, int iVar, int Value ) { Vec_StrWriteEntry(&p->vValue, iVar, (char)Value); } + +static inline int Cbs2_VarIsAssigned( Cbs2_Man_t * p, Gia_Obj_t * pVar ) { return Cbs2_VarMark0(p, Gia_ObjId(p->pAig, pVar)); } +static inline void Cbs2_VarAssign( Cbs2_Man_t * p, Gia_Obj_t * pVar ) { assert(!Cbs2_VarIsAssigned(p, pVar)); Cbs2_VarSetMark0(p, Gia_ObjId(p->pAig, pVar), 1); } +static inline void Cbs2_VarUnassign( Cbs2_Man_t * p, Gia_Obj_t * pVar ) { assert(Cbs2_VarIsAssigned(p, pVar)); Cbs2_VarSetMark0(p, Gia_ObjId(p->pAig, pVar), 0); Cbs2_VarSetUnused(p, Gia_ObjId(p->pAig, pVar)); } +static inline int Cbs2_VarValue( Cbs2_Man_t * p, Gia_Obj_t * pVar ) { assert(Cbs2_VarIsAssigned(p, pVar)); return Cbs2_VarMark1(p, Gia_ObjId(p->pAig, pVar)); } +static inline void Cbs2_VarSetValue( Cbs2_Man_t * p, Gia_Obj_t * pVar, int v ) { assert(Cbs2_VarIsAssigned(p, pVar)); Cbs2_VarSetMark1(p, Gia_ObjId(p->pAig, pVar), v); } + static inline int Cbs2_VarIsJust( Cbs2_Man_t * p, Gia_Obj_t * pVar ) { return Gia_ObjIsAnd(pVar) && !Cbs2_VarIsAssigned(p, Gia_ObjFanin0(pVar)) && !Cbs2_VarIsAssigned(p, Gia_ObjFanin1(pVar)); } static inline int Cbs2_VarFanin0Value( Cbs2_Man_t * p, Gia_Obj_t * pVar ) { return !Cbs2_VarIsAssigned(p, Gia_ObjFanin0(pVar)) ? 2 : (Cbs2_VarValue(p, Gia_ObjFanin0(pVar)) ^ Gia_ObjFaninC0(pVar)); } static inline int Cbs2_VarFanin1Value( Cbs2_Man_t * p, Gia_Obj_t * pVar ) { return !Cbs2_VarIsAssigned(p, Gia_ObjFanin1(pVar)) ? 2 : (Cbs2_VarValue(p, Gia_ObjFanin1(pVar)) ^ Gia_ObjFaninC1(pVar)); } @@ -169,7 +176,7 @@ Cbs2_Man_t * Cbs2_ManAlloc( Gia_Man_t * pGia ) p->pClauses.iHead = p->pClauses.iTail = 1; p->vModel = Vec_IntAlloc( 1000 ); //p->vLevReas = Vec_IntAlloc( 1000 ); - p->vTemp = Vec_PtrAlloc( 1000 ); + p->vTemp = Vec_IntAlloc( 1000 ); p->pAig = pGia; Cbs2_SetDefaultParams( &p->Pars ); Vec_StrFill( &p->vAssign, Gia_ManObjNum(pGia), 0 ); @@ -198,7 +205,7 @@ void Cbs2_ManStop( Cbs2_Man_t * p ) Vec_IntErase( &p->vIndex ); //Vec_IntFree( p->vLevReas ); Vec_IntFree( p->vModel ); - Vec_PtrFree( p->vTemp ); + Vec_IntFree( p->vTemp ); ABC_FREE( p->pClauses.pData ); ABC_FREE( p->pProp.pData ); ABC_FREE( p->pJust.pData ); @@ -529,17 +536,11 @@ static inline void Cbs2_ManAssign( Cbs2_Man_t * p, Gia_Obj_t * pObj, int Level, Gia_Obj_t * pObjR = Gia_Regular(pObj); int iObj = Gia_ObjId(p->pAig, pObjR); assert( Gia_ObjIsCand(pObjR) ); + assert( Cbs2_VarUnused(p, iObj) ); assert( !Cbs2_VarIsAssigned(p, pObjR) ); Cbs2_VarAssign(p, pObjR ); Cbs2_VarSetValue(p, pObjR, !Gia_IsComplement(pObj) ); Cbs2_QuePush( &p->pProp, iObj ); - //assert( pObjR->Value == ~0 ); - //pObjR->Value = p->pProp.iTail; - assert( Cbs2_VarUnused(p, iObj) ); -// Vec_IntPush( p->vLevReas, Level ); -// Vec_IntPush( p->vLevReas, pRes0 ? pRes0-pObjR : 0 ); -// Vec_IntPush( p->vLevReas, pRes1 ? pRes1-pObjR : 0 ); -// assert( Vec_IntSize(p->vLevReas) == 3 * p->pProp.iTail ); Vec_IntWriteEntry( &p->vLevReason, 3*iObj, Level ); Vec_IntWriteEntry( &p->vLevReason, 3*iObj+1, pRes0 ? Gia_ObjId(p->pAig, pRes0) : iObj ); Vec_IntWriteEntry( &p->vLevReason, 3*iObj+2, pRes1 ? Gia_ObjId(p->pAig, pRes1) : iObj ); @@ -635,16 +636,18 @@ static inline void Cbs2_ManDeriveReason( Cbs2_Man_t * p, int Level ) } */ // compact literals - Vec_PtrClear( p->vTemp ); + Vec_IntClear( p->vTemp ); for ( i = k = pQue->iHead + 1; i < pQue->iTail; i++ ) { iObj = pQue->pData[i]; pObj = Gia_ManObj(p->pAig, iObj); - if ( !pObj->fMark0 ) // unassigned - seen again + //if ( !pObj->fMark0 ) // unassigned - seen again + if ( !Cbs2_VarMark0(p, iObj) ) continue; // assigned - seen first time - pObj->fMark0 = 0; - Vec_PtrPush( p->vTemp, pObj ); + //pObj->fMark0 = 0; + Cbs2_VarSetMark0(p, iObj, 0); + Vec_IntPush( p->vTemp, iObj ); // check decision level iLitLevel = Cbs2_VarDecLevel( p, iObj ); if ( iLitLevel < Level ) @@ -668,8 +671,9 @@ static inline void Cbs2_ManDeriveReason( Cbs2_Man_t * p, int Level ) assert( pQue->pData[pQue->iHead] != 0 ); pQue->iTail = k; // clear the marks - Vec_PtrForEachEntry( Gia_Obj_t *, p->vTemp, pObj, i ) - pObj->fMark0 = 1; + Vec_IntForEachEntry( p->vTemp, iObj, i ) + //pObj->fMark0 = 1; + Cbs2_VarSetMark0(p, iObj, 1); } /**Function************************************************************* @@ -729,10 +733,12 @@ static inline int Cbs2_ManResolve( Cbs2_Man_t * p, int Level, int hClause0, int for ( i = hClause0 + 1; (iObj = pQue->pData[i]); i++ ) { pObj = Gia_ManObj(p->pAig, iObj); - if ( !pObj->fMark0 ) // unassigned - seen again + //if ( !pObj->fMark0 ) // unassigned - seen again + if ( !Cbs2_VarMark0(p, iObj) ) continue; // assigned - seen first time - pObj->fMark0 = 0; + //pObj->fMark0 = 0; + Cbs2_VarSetMark0(p, iObj, 0); Cbs2_QuePush( pQue, iObj ); LevelCur = Cbs2_VarDecLevel( p, iObj ); if ( LevelMax < LevelCur ) @@ -741,17 +747,20 @@ static inline int Cbs2_ManResolve( Cbs2_Man_t * p, int Level, int hClause0, int for ( i = hClause1 + 1; (iObj = pQue->pData[i]); i++ ) { pObj = Gia_ManObj(p->pAig, iObj); - if ( !pObj->fMark0 ) // unassigned - seen again + //if ( !pObj->fMark0 ) // unassigned - seen again + if ( !Cbs2_VarMark0(p, iObj) ) continue; // assigned - seen first time - pObj->fMark0 = 0; + //pObj->fMark0 = 0; + Cbs2_VarSetMark0(p, iObj, 0); Cbs2_QuePush( pQue, iObj ); LevelCur = Cbs2_VarDecLevel( p, iObj ); if ( LevelMax < LevelCur ) LevelMax = LevelCur; } for ( i = pQue->iHead + 1; i < pQue->iTail; i++ ) - Gia_ManObj(p->pAig, pQue->pData[i])->fMark0 = 1; +// Gia_ManObj(p->pAig, pQue->pData[i])->fMark0 = 1; + Cbs2_VarSetMark0(p, pQue->pData[i], 1); Cbs2_ManDeriveReason( p, LevelMax ); return Cbs2_QueFinish( pQue ); } @@ -933,8 +942,6 @@ int Cbs2_ManSolve_rec( Cbs2_Man_t * p, int Level ) pDecVar = Gia_Not(Gia_ObjChild0(pVar)); else pDecVar = Gia_Not(Gia_ObjChild1(pVar)); -// pDecVar = Gia_NotCond( Gia_Regular(pDecVar), Gia_Regular(pDecVar)->fPhase ); -// pDecVar = Gia_Not(pDecVar); // decide on first fanin Cbs2_ManAssign( p, pDecVar, Level+1, NULL, NULL ); if ( !(hLearn0 = Cbs2_ManSolve_rec( p, Level+1 )) ) @@ -1070,10 +1077,10 @@ Vec_Int_t * Cbs2_ManSolveMiterNc( Gia_Man_t * pAig, int nConfs, Vec_Str_t ** pvS // Gia_ManCollectTest( pAig ); // prepare AIG Gia_ManCreateRefs( pAig ); - Gia_ManCleanMark0( pAig ); - Gia_ManCleanMark1( pAig ); + //Gia_ManCleanMark0( pAig ); + //Gia_ManCleanMark1( pAig ); //Gia_ManFillValue( pAig ); // maps nodes into trail ids - Gia_ManSetPhase( pAig ); // maps nodes into trail ids + //Gia_ManSetPhase( pAig ); // maps nodes into trail ids // create logic network p = Cbs2_ManAlloc( pAig ); p->Pars.nBTLimit = nConfs; |