static inline int Gia_ObjCheckMffc( Gia_Man_t * p, Gia_Obj_t * pRoot, int Limit, Vec_Int_t * vNodes, Vec_Int_t * vLeaves, Vec_Int_t * vInners ) { int RetValue, iObj, i; Vec_IntClear( vNodes ); RetValue = Gia_ObjCheckMffc_rec( p, pRoot, Limit, vNodes ); if ( RetValue ) { Vec_IntClear( vLeaves ); Vec_IntClear( vInners ); Vec_IntSort( vNodes, 0 ); Vec_IntForEachEntry( vNodes, iObj, i ) if ( Gia_ObjRefNumId(p, iObj) > 0 || Gia_ObjIsCi(Gia_ManObj(p, iObj)) ) { if ( !Vec_IntSize(vLeaves) || Vec_IntEntryLast(vLeaves) != iObj ) Vec_IntPush( vLeaves, iObj ); } else { if ( !Vec_IntSize(vInners) || Vec_IntEntryLast(vInners) != iObj ) Vec_IntPush( vInners, iObj ); } Vec_IntPush( vInners, Gia_ObjId(p, pRoot) ); } Vec_IntForEachEntry( vNodes, iObj, i ) Gia_ObjRefIncId( p, iObj ); return RetValue; }
/**Function************************************************************* Synopsis [Add constraint that no more than 1 variable is 1.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline int Cnf_AddCardinConstr( sat_solver * p, Vec_Int_t * vVars ) { int i, k, pLits[2], iVar, nVars = sat_solver_nvars(p); Vec_IntForEachEntry( vVars, iVar, i ) assert( iVar >= 0 && iVar < nVars ); iVar = nVars; sat_solver_setnvars( p, nVars + Vec_IntSize(vVars) - 1 ); while ( Vec_IntSize(vVars) > 1 ) { for ( k = i = 0; i < Vec_IntSize(vVars)/2; i++ ) { pLits[0] = Abc_Var2Lit( Vec_IntEntry(vVars, 2*i), 1 ); pLits[1] = Abc_Var2Lit( Vec_IntEntry(vVars, 2*i+1), 1 ); sat_solver_addclause( p, pLits, pLits + 2 ); sat_solver_add_and( p, iVar, Vec_IntEntry(vVars, 2*i), Vec_IntEntry(vVars, 2*i+1), 1, 1, 1 ); Vec_IntWriteEntry( vVars, k++, iVar++ ); } if ( Vec_IntSize(vVars) & 1 ) Vec_IntWriteEntry( vVars, k++, Vec_IntEntryLast(vVars) ); Vec_IntShrink( vVars, k ); } return iVar; }