229 int iLut, iFanin, iFirst;
230 int pLits[3], Count = 0;
231 int i, k, nVars, Edge,
value;
237 int iFirstLut = Vec_IntEntry(
p->vFirsts, iLut );
238 int nVarsLut = Vec_IntEntry(
p->vNvars, iLut );
239 if ( pTim && Gia_ObjIsCi(pObj) )
242 if ( nVarsLut > 0 && iBox >= 0 )
245 if ( iCiId == Gia_ObjCioId(pObj) )
249 for ( i = 0; i < nIns-1; i++ )
251 Gia_Obj_t * pOut = Gia_ManCo(
p->pGia, iIn0+i );
252 int iDriverId = Gia_ObjFaninId0p(
p->pGia, pOut );
255 iFirst = Vec_IntEntry(
p->vFirsts, iDriverId );
256 nVars = Vec_IntEntry(
p->vNvars, iDriverId );
257 assert( nVars < nVarsLut );
258 AddOn = (int)(nVars < nVarsLut);
259 for ( k = 0; k < nVars; k++ )
261 pLits[0] = Abc_Var2Lit( iFirst+k, 1 );
262 pLits[1] = Abc_Var2Lit( iFirstLut+k+AddOn, 0 );
270 Gia_Obj_t * pIn = Gia_ManCi(
p->pGia, iCiId );
271 int iObjId = Gia_ObjId(
p->pGia, pIn );
273 iFirst = Vec_IntEntry(
p->vFirsts, iObjId );
274 nVars = Vec_IntEntry(
p->vNvars, iObjId );
277 for ( k = 0; k < nVars; k++ )
279 pLits[0] = Abc_Var2Lit( iFirst+k, 1 );
280 pLits[1] = Abc_Var2Lit( iFirstLut+k, 0 );
289 if ( !Gia_ObjIsLut(
p->pGia, iLut) )
292 if ( pTim && Gia_ObjIsCi(Gia_ManObj(
p->pGia, iFanin)) )
294 iFirst = Vec_IntEntry(
p->vFirsts, iFanin );
295 nVars = Vec_IntEntry(
p->vNvars, iFanin );
296 assert( nVars <= nVarsLut );
299 for ( k = 0; k < nVars; k++ )
301 pLits[0] = Abc_Var2Lit( iFirst+k, 1 );
302 pLits[1] = Abc_Var2Lit( iFirstLut+k, 0 );
308 else if ( Gia_ObjIsAnd(Gia_ManObj(
p->pGia, iFanin)) )
310 iFirst = Vec_IntEntry(
p->vFirsts, iFanin );
311 nVars = Vec_IntEntry(
p->vNvars, iFanin );
312 assert( nVars != 1 && nVars < nVarsLut );
316 pLits[0] = Abc_Var2Lit( Count, 1 );
317 pLits[1] = Abc_Var2Lit( iFirstLut, 0 );
321 pLits[0] = Abc_Var2Lit( Count, 0 );
322 pLits[1] = Abc_Var2Lit( iFirstLut+1, 0 );
327 for ( k = 0; k < nVars; k++ )
329 pLits[0] = Abc_Var2Lit( iFirst+k, 1 );
330 pLits[1] = Abc_Var2Lit( Count, 1 );
331 pLits[2] = Abc_Var2Lit( iFirstLut+k, 0 );
335 pLits[0] = Abc_Var2Lit( iFirst+k, 1 );
336 pLits[1] = Abc_Var2Lit( Count, 0 );
337 pLits[2] = Abc_Var2Lit( iFirstLut+k+1, 0 );
367 int v1, v2, v3,
Var1, Var2, Var3;
368 if ( (!fTwo && Vec_IntSize(vLevel) >= 2) || (fTwo && Vec_IntSize(vLevel) > 10) )
373 pLits[0] = Abc_Var2Lit(
Var1, 1 );
374 pLits[1] = Abc_Var2Lit( Var2, 1 );
379 else if ( fTwo && Vec_IntSize(vLevel) >= 3 )
385 pLits[0] = Abc_Var2Lit(
Var1, 1 );
386 pLits[1] = Abc_Var2Lit( Var2, 1 );
387 pLits[2] = Abc_Var2Lit( Var3, 1 );
393 Vec_WecFree( vObjEdges );
397 pLits[0] = Abc_Var2Lit( Edge, 1 );
404 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
443 int fVeryVerbose = 0;
448 int i, iLut, iFirst, nVars, status, Delay, nConfs;
450 int DelayStart = DelayInit ? DelayInit :
p->DelayMax;
453 printf(
"Running SatEdge with starting delay %d and edge %d (edge vars %d, total vars %d)\n",
459 sat_solver_set_runtime_limit(
p->pSat, nTimeOut ? nTimeOut * CLOCKS_PER_SEC + Abc_Clock(): 0 );
460 sat_solver_set_random(
p->pSat, 1 );
461 sat_solver_set_polarity(
p->pSat, Vec_IntArray(
p->vPolars), Vec_IntSize(
p->vPolars) );
464 for ( Delay =
p->DelayMax; Delay >= 0; Delay-- )
469 iLut = Gia_ObjId(
p->pGia, pObj );
470 iFirst = Vec_IntEntry(
p->vFirsts, iLut );
471 nVars = Vec_IntEntry(
p->vNvars, iLut );
472 if ( Delay < nVars && !
sat_solver_push(
p->pSat, Abc_Var2Lit(iFirst + Delay, 1)) )
475 if ( i < Gia_ManCoNum(
p->pGia) )
477 printf(
"Proved UNSAT for delay %d. ", Delay );
478 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
481 if ( Delay > DelayStart )
493 for ( i = 0; i <
p->nVars; i++ )
494 Count += sat_solver_var_value(
p->pSat, i);
495 printf(
"Solution with delay %2d and %5d edges exists. Conf = %8d. ", Delay, Count, nConfs );
496 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
499 Vec_IntFreeP( &vEdges2 );
503 for ( i = 0; i <
p->nVars; i++ )
504 printf(
"%d=%d ", i, sat_solver_var_value(
p->pSat, i) );
508 printf(
"%d=%d ", i, sat_solver_var_value(
p->pSat, i) );
517 printf(
"Proved UNSAT for delay %d. ", Delay );
519 printf(
"Resource limit reached for delay %d. ", Delay );
520 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
526 Vec_IntFreeP( &vEdges2 );