32static inline int Ssc_ObjSatLit(
Ssc_Man_t *
p,
int Lit ) {
return Abc_Var2Lit( Ssc_ObjSatVar(
p, Abc_Lit2Var(Lit)), Abc_LitIsCompl(Lit) ); }
52 int pLits[4], LitF, LitI, LitT, LitE, RetValue;
53 assert( !Gia_IsComplement( pNode ) );
58 LitF = Ssc_ObjSatLit(
p, Gia_Obj2Lit(
p->pFraig,pNode) );
59 LitI = Ssc_ObjSatLit(
p, Gia_Obj2Lit(
p->pFraig,pNodeI) );
60 LitT = Ssc_ObjSatLit(
p, Gia_Obj2Lit(
p->pFraig,pNodeT) );
61 LitE = Ssc_ObjSatLit(
p, Gia_Obj2Lit(
p->pFraig,pNodeE) );
71 pLits[0] = Abc_LitNotCond(LitI, 1);
72 pLits[1] = Abc_LitNotCond(LitT, 1);
73 pLits[2] = Abc_LitNotCond(LitF, 0);
76 pLits[0] = Abc_LitNotCond(LitI, 1);
77 pLits[1] = Abc_LitNotCond(LitT, 0);
78 pLits[2] = Abc_LitNotCond(LitF, 1);
81 pLits[0] = Abc_LitNotCond(LitI, 0);
82 pLits[1] = Abc_LitNotCond(LitE, 1);
83 pLits[2] = Abc_LitNotCond(LitF, 0);
86 pLits[0] = Abc_LitNotCond(LitI, 0);
87 pLits[1] = Abc_LitNotCond(LitE, 0);
88 pLits[2] = Abc_LitNotCond(LitF, 1);
105 pLits[0] = Abc_LitNotCond(LitT, 0);
106 pLits[1] = Abc_LitNotCond(LitE, 0);
107 pLits[2] = Abc_LitNotCond(LitF, 1);
110 pLits[0] = Abc_LitNotCond(LitT, 1);
111 pLits[1] = Abc_LitNotCond(LitE, 1);
112 pLits[2] = Abc_LitNotCond(LitF, 0);
130 int i, RetValue, Lit, LitNode, pLits[2];
131 assert( !Gia_IsComplement(pNode) );
132 assert( Gia_ObjIsAnd( pNode ) );
136 LitNode = Ssc_ObjSatLit(
p, Gia_Obj2Lit(
p->pFraig,pNode) );
139 pLits[0] = Ssc_ObjSatLit(
p, Lit );
140 pLits[1] = Abc_LitNot( LitNode );
144 Vec_IntWriteEntry( vSuper, i, Abc_LitNot(pLits[0]) );
147 Vec_IntPush( vSuper, LitNode );
148 RetValue =
sat_solver_addclause(
p->pSat, Vec_IntArray(vSuper), Vec_IntArray(vSuper) + Vec_IntSize(vSuper) );
168 if ( Gia_IsComplement(pObj) || Gia_ObjIsCi(pObj) ||
Gia_ObjIsMuxType(pObj) )
170 Vec_IntPushUnique( vSuper, Gia_Obj2Lit(
p, pObj) );
173 Ssc_ManCollectSuper_rec(
p, Gia_ObjChild0(pObj), vSuper );
174 Ssc_ManCollectSuper_rec(
p, Gia_ObjChild1(pObj), vSuper );
178 assert( !Gia_IsComplement(pObj) );
179 assert( Gia_ObjIsAnd(pObj) );
180 Vec_IntClear( vSuper );
181 Ssc_ManCollectSuper_rec(
p, Gia_ObjChild0(pObj), vSuper );
182 Ssc_ManCollectSuper_rec(
p, Gia_ObjChild1(pObj), vSuper );
200 if ( Ssc_ObjSatVar(
p, Id) )
202 pObj = Gia_ManObj(
p->pFraig, Id );
203 Ssc_ObjSetSatVar(
p, Id,
p->nSatVars++ );
205 if ( Gia_ObjIsAnd(pObj) )
206 Vec_IntPush( vFront, Id );
208static void Ssc_ManCnfNodeAddToSolver(
Ssc_Man_t *
p,
int NodeId )
215 if ( Ssc_ObjSatVar(
p, NodeId) )
219 Vec_IntClear(
p->vFront );
220 Ssc_ManCnfAddToFrontier(
p, NodeId,
p->vFront );
225 assert( Ssc_ObjSatVar(
p, Gia_ObjId(
p->pFraig, pNode)) );
228 Vec_IntClear(
p->vFanins );
229 Vec_IntPushUnique(
p->vFanins, Gia_ObjFaninId0p(
p->pFraig, Gia_ObjFanin0(pNode) ) );
230 Vec_IntPushUnique(
p->vFanins, Gia_ObjFaninId0p(
p->pFraig, Gia_ObjFanin1(pNode) ) );
231 Vec_IntPushUnique(
p->vFanins, Gia_ObjFaninId1p(
p->pFraig, Gia_ObjFanin0(pNode) ) );
232 Vec_IntPushUnique(
p->vFanins, Gia_ObjFaninId1p(
p->pFraig, Gia_ObjFanin1(pNode) ) );
234 Ssc_ManCnfAddToFrontier(
p, Id,
p->vFront );
235 Gia_ManAddClausesMux(
p, pNode );
239 Ssc_ManCollectSuper(
p->pFraig, pNode,
p->vFanins );
241 Ssc_ManCnfAddToFrontier(
p, Abc_Lit2Var(Lit),
p->vFront );
242 Gia_ManAddClausesSuper(
p, pNode,
p->vFanins );
244 assert( Vec_IntSize(
p->vFanins) > 1 );
246p->timeCnfGen += Abc_Clock() - clk;
268 assert(
p->pSat == NULL &&
p->vId2Var == NULL );
269 assert( Aig_ManObjNumMax(pMan) == Gia_ManObjNum(
p->pFraig) );
272 p->nSatVarsPivot =
p->nSatVars = pDat->
nVars;
273 p->vId2Var = Vec_IntStart( Gia_ManCandNum(
p->pAig) + Gia_ManCandNum(
p->pCare) + 10 );
274 p->vVar2Id = Vec_IntStart( Gia_ManCandNum(
p->pAig) + Gia_ManCandNum(
p->pCare) + 10 );
275 Ssc_ObjSetSatVar(
p, 0, pDat->
pVarNums[0] );
278 int iObj = Gia_ObjId(
p->pFraig, pObj );
279 Ssc_ObjSetSatVar(
p, iObj, pDat->
pVarNums[iObj] );
285 for ( i = 0; i < pDat->
nClauses; i++ )
319 Vec_IntClear( vPattern );
321 Vec_IntPush( vPattern, sat_solver_var_value(
p->pSat, Ssc_ObjSatVar(
p, Gia_ObjId(
p->pFraig, pObj))) );
332 vInit = Vec_IntAlloc( Gia_ManCiNum(
p->pFraig) );
350 int pLitsSat[2], RetValue;
361 Ssc_ManCnfNodeAddToSolver(
p, iRepr );
362 Ssc_ManCnfNodeAddToSolver(
p, iNode );
363 sat_solver_compress(
p->pSat );
366 pLitsSat[0] = Abc_Var2Lit( Ssc_ObjSatVar(
p, iRepr), 0 );
367 pLitsSat[1] = Abc_Var2Lit( Ssc_ObjSatVar(
p, iNode), fCompl ^ (
int)(iRepr > 0) );
372 RetValue =
sat_solver_solve(
p->pSat, pLitsSat, pLitsSat + 2, (ABC_INT64_T)
p->pPars->nBTLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
375 pLitsSat[0] = Abc_LitNot( pLitsSat[0] );
376 pLitsSat[1] = Abc_LitNot( pLitsSat[1] );
379 p->timeSatUnsat += Abc_Clock() - clk;
381 else if ( RetValue ==
l_True )
384 p->timeSatSat += Abc_Clock() - clk;
389 p->timeSatUndec += Abc_Clock() - clk;
400 RetValue =
sat_solver_solve(
p->pSat, pLitsSat, pLitsSat + 2, (ABC_INT64_T)
p->pPars->nBTLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
403 pLitsSat[0] = Abc_LitNot( pLitsSat[0] );
404 pLitsSat[1] = Abc_LitNot( pLitsSat[1] );
407 p->timeSatUnsat += Abc_Clock() - clk;
409 else if ( RetValue ==
l_True )
412 p->timeSatSat += Abc_Clock() - clk;
417 p->timeSatUndec += Abc_Clock() - clk;
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManStop(Aig_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define sat_solver_addclause
Cnf_Dat_t * Cnf_Derive(Aig_Man_t *pAig, int nOutputs)
struct Cnf_Dat_t_ Cnf_Dat_t
void Cnf_DataFree(Cnf_Dat_t *p)
Aig_Man_t * Gia_ManToAigSimple(Gia_Man_t *p)
Gia_Obj_t * Gia_ObjRecognizeMux(Gia_Obj_t *pNode, Gia_Obj_t **ppNodeT, Gia_Obj_t **ppNodeE)
struct Gia_Obj_t_ Gia_Obj_t
int Gia_ObjIsMuxType(Gia_Obj_t *pNode)
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
sat_solver * sat_solver_new(void)
int sat_solver_simplify(sat_solver *s)
void sat_solver_setnvars(sat_solver *s, int n)
void sat_solver_delete(sat_solver *s)
typedefABC_NAMESPACE_HEADER_START struct Ssc_Man_t_ Ssc_Man_t
INCLUDES ///.
void Ssc_ManCollectSatPattern(Ssc_Man_t *p, Vec_Int_t *vPattern)
void Ssc_ManStartSolver(Ssc_Man_t *p)
Vec_Int_t * Ssc_ManFindPivotSat(Ssc_Man_t *p)
int Ssc_ManCheckEquivalence(Ssc_Man_t *p, int iRepr, int iNode, int fCompl)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.