52 int nConfLimit = 1000000;
57 int i, RetValue, * pModel;
66 RetValue =
sat_solver_solve( pSat, NULL, NULL, (ABC_INT64_T)nConfLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
72 vCiIds = Vec_IntAlloc( Aig_ManCiNum(
p) );
74 Vec_IntPush( vCiIds, pCnf->
pVarNums[pObj->
Id] );
77 vInit = Vec_IntAllocArray( pModel, Aig_ManCiNum(
p) );
78 Vec_IntFree( vCiIds );
99 int nConfLimit = 1000000;
100 void * pSatCnf = NULL;
106 int * pClause1, * pClause2, * pLit, * pVars;
107 int i, RetValue, iBadPo, iClause, nVars, nPos;
113 for ( i = 0; i < pCnf->
nClauses; i++ )
124 RetValue =
sat_solver_solve( pSat, NULL, NULL, (ABC_INT64_T)nConfLimit, (ABC_INT64_T)0, (ABC_INT64_T)0, (ABC_INT64_T)0 );
142 pClause2 = pCnf->
pClauses[iClause+1];
143 for ( pLit = pClause1; pLit < pClause2; pLit++ )
145 if ( pVars[ (*pLit) >> 1 ] == 0 )
147 pVars[ (*pLit) >> 1 ] = 1;
149 printf(
"%s%d ", ((*pLit) & 1)?
"-" :
"+", (*pLit) >> 1 );
155 if ( fVeryVerbose ) {
174 printf(
"UNSAT core: %d clauses, %d variables, %d POs. ", Vec_IntSize(vCore), nVars, nPos );
176 Vec_IntFree( vCore );
196 if ( Aig_ObjIsTravIdCurrent(
p, pObj ) )
198 Aig_ObjSetTravIdCurrent(
p, pObj );
224 vNodes = Vec_PtrAlloc( 1000 );
227 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
229 pFanin = Aig_ObjFanin0( pObj );
230 if ( pFanin && !pFanin->
fMarkA && Aig_ObjIsTravIdCurrent(
p, pFanin) )
232 Vec_PtrPush( vNodes, pFanin );
235 pFanin = Aig_ObjFanin1( pObj );
236 if ( pFanin && !pFanin->
fMarkA && Aig_ObjIsTravIdCurrent(
p, pFanin) )
238 Vec_PtrPush( vNodes, pFanin );
244 RetValue = Vec_PtrSize( vNodes );
245 Vec_PtrFree( vNodes );
264 assert( Aig_ObjIsNode(pObj) );
267 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
290 pNew->pName = Abc_UtilStrsav(
p->pName );
291 pNew->pSpec = Abc_UtilStrsav(
p->pSpec );
292 pNew->nRegs = Vec_PtrSize(vCut);
293 pNew->nTruePis =
p->nTruePis;
294 pNew->nTruePos =
p->nTruePos;
297 Aig_ManConst1(
p)->pData = Aig_ManConst1(pNew);
311 pObj->
pData = Aig_ObjChild0Copy(pObj);
317 if ( Aig_ObjIsNode(pObj) )
349 pNew->pName = Abc_UtilStrsav(
p->pName );
350 pNew->pSpec = Abc_UtilStrsav(
p->pSpec );
351 pNew->nRegs = Vec_PtrSize(vCut);
352 pNew->nTruePis =
p->nTruePis;
353 pNew->nTruePos =
p->nTruePos;
356 Aig_ManConst1(
p)->pData = Aig_ManConst1(pNew);
366 pObj->
pData = Aig_ObjChild0Copy(pObj);
373 if ( Aig_ObjIsNode(pObj) )
376 pObj = Aig_ManConst1(
p);
377 pObj->
pData = Aig_ManConst1(pNew);
379 pObj->
pData = Aig_ManCi( pNew, i );
417 Aig_ManConst1(
p)->pData = Aig_ManConst1(pNew);
446 assert( Saig_ManRegNum(
p) > 0 );
449 pFanin = Aig_ObjFanin0(pObj);
450 if ( !Aig_ObjFaninC0(pObj) )
458 pFanin = Aig_ObjFanin0(pObj);
461 vNodes = Vec_PtrAlloc( 100 );
466 pFanin = Aig_ObjFanin0(pObj);
468 Vec_PtrPush( vNodes, pObj );
470 assert( Vec_PtrSize(vNodes) == Diffs );
474 pFanin = Aig_ObjFanin0(pObj);
495 int nTruePi, nTruePo, nBadRegs, i;
496 if ( Vec_PtrSize(vBadRegs) == 0 )
500 pObjLi->
pData = pObjLo;
502 vPisNew = Vec_PtrDup(
p->vCis );
503 vPosNew = Vec_PtrDup(
p->vCos );
504 nTruePi = Aig_ManCiNum(
p) - Aig_ManRegNum(
p);
505 nTruePo = Aig_ManCoNum(
p) - Aig_ManRegNum(
p);
506 assert( nTruePi ==
p->nTruePis );
507 assert( nTruePo ==
p->nTruePos );
510 Vec_PtrWriteEntry( vPisNew, nTruePi++, pObjLi->
pData );
511 Vec_PtrWriteEntry( vPosNew, nTruePo++, pObjLi );
521 Vec_PtrWriteEntry( vPisNew, nTruePi++, pObjLo );
522 Vec_PtrWriteEntry( vPosNew, nTruePo++, pObjLi );
525 assert( nTruePi == Aig_ManCiNum(
p) );
526 assert( nTruePo == Aig_ManCoNum(
p) );
528 Vec_PtrFree(
p->vCis );
p->vCis = vPisNew;
529 Vec_PtrFree(
p->vCos );
p->vCos = vPosNew;
531 nBadRegs = Vec_PtrSize(vBadRegs);
532 p->nRegs -= nBadRegs;
533 p->nTruePis += nBadRegs;
534 p->nTruePos += nBadRegs;
551 p->nRegs += nBadRegs;
552 p->nTruePis -= nBadRegs;
553 p->nTruePos -= nBadRegs;
575 if ( fVerbose && Vec_PtrSize(vBadRegs) )
576 printf(
"Excluding %d registers that cannot be backward retimed.\n", Vec_PtrSize(vBadRegs) );
580 Vec_PtrFree( vBadRegs );
583 if ( Vec_PtrSize(vCut) >= Aig_ManRegNum(pNew) )
594 Vec_IntFree( vInit );
604 printf(
"Excluding register %d.\n", iBadReg );
606 vBadRegs = Vec_PtrAlloc( 1 );
607 Vec_PtrPush( vBadRegs, Aig_ManCo( pNew, Saig_ManPoNum(pNew) + iBadReg ) );
631 if ( !fBackwardOnly )
632 for ( i = 0; i < nMaxIters; i++ )
634 if ( Saig_ManRegNum(pNew) == 0 )
637 if ( Vec_PtrSize(vCut) >= Aig_ManRegNum(pNew) )
639 if ( fVerbose && !fChanges )
640 printf(
"Forward retiming cannot reduce registers.\n" );
653 if ( !fForwardOnly && !fInitial )
654 for ( i = 0; i < nMaxIters; i++ )
656 if ( Saig_ManRegNum(pNew) == 0 )
659 if ( Vec_PtrSize(vCut) >= Aig_ManRegNum(pNew) )
661 if ( fVerbose && !fChanges )
662 printf(
"Backward retiming cannot reduce registers.\n" );
673 else if ( !fForwardOnly && fInitial )
674 for ( i = 0; i < nMaxIters; i++ )
676 if ( Saig_ManRegNum(pNew) == 0 )
683 if ( fVerbose && !fChanges )
684 printf(
"Backward retiming cannot reduce registers.\n" );
694 if ( !fForwardOnly && !fInitial && fChanges )
695 printf(
"Assuming const-0 init-state after backward retiming. Result will not verify.\n" );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Aig_Man_t * Aig_ManDupSimple(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachObj(p, pObj, i)
void Aig_ManStop(Aig_Man_t *p)
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
struct Aig_Obj_t_ Aig_Obj_t
void Aig_ManReportImprovement(Aig_Man_t *p, Aig_Man_t *pNew)
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
#define Aig_ManForEachCo(p, pObj, i)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
void Aig_ManCleanData(Aig_Man_t *p)
void Aig_ObjPrint(Aig_Man_t *p, Aig_Obj_t *pObj)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define sat_solver_addclause
Cnf_Dat_t * Cnf_DeriveSimpleForRetiming(Aig_Man_t *p)
struct Cnf_Dat_t_ Cnf_Dat_t
void Cnf_DataFree(Cnf_Dat_t *p)
ABC_DLL Vec_Ptr_t * Nwk_ManDeriveRetimingCut(Aig_Man_t *p, int fForward, int fVerbose)
FUNCTION DECLARATIONS ///.
void * Cnf_DataWriteIntoSolver(Cnf_Dat_t *p, int nFrames, int fInit)
int Saig_ManHideBadRegs(Aig_Man_t *p, Vec_Ptr_t *vBadRegs)
Aig_Man_t * Saig_ManRetimeMinArea(Aig_Man_t *p, int nMaxIters, int fForwardOnly, int fBackwardOnly, int fInitial, int fVerbose)
void Saig_ManExposeBadRegs(Aig_Man_t *p, int nBadRegs)
void Saig_ManMarkCone_rec(Aig_Man_t *p, Aig_Obj_t *pObj)
Vec_Ptr_t * Saig_ManGetRegistersToExclude(Aig_Man_t *p)
int Saig_ManRetimeCountCut(Aig_Man_t *p, Vec_Ptr_t *vCut)
int Saig_ManRetimeUnsatCore(Aig_Man_t *p, int fVerbose)
ABC_NAMESPACE_IMPL_START Vec_Int_t * Saig_ManRetimeInitState(Aig_Man_t *p)
DECLARATIONS ///.
Aig_Man_t * Saig_ManRetimeDupForward(Aig_Man_t *p, Vec_Ptr_t *vCut)
Aig_Man_t * Saig_ManRetimeDupBackward(Aig_Man_t *p, Vec_Ptr_t *vCut, Vec_Int_t *vInit)
Aig_Man_t * Saig_ManRetimeMinAreaBackward(Aig_Man_t *pNew, int fVerbose)
void Saig_ManRetimeDup_rec(Aig_Man_t *pNew, Aig_Obj_t *pObj)
Aig_Man_t * Saig_ManRetimeDupInitState(Aig_Man_t *p, Vec_Ptr_t *vCut)
#define Saig_ManForEachLiLo(p, pObjLi, pObjLo, i)
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachPo(p, pObj, i)
#define Saig_ManForEachPi(p, pObj, i)
void * Intp_ManUnsatCore(Intp_Man_t *p, Sto_Man_t *pCnf, int fLearned, int fVerbose)
void Intp_ManFree(Intp_Man_t *p)
Intp_Man_t * Intp_ManAlloc()
FUNCTION DEFINITIONS ///.
sat_solver * sat_solver_new(void)
void sat_solver_setnvars(sat_solver *s, int n)
void sat_solver_store_alloc(sat_solver *s)
void sat_solver_store_mark_roots(sat_solver *s)
void * sat_solver_store_release(sat_solver *s)
void sat_solver_delete(sat_solver *s)
int * Sat_SolverGetModel(sat_solver *p, int *pVars, int nVars)
void Sto_ManFree(Sto_Man_t *p)
struct Intp_Man_t_ Intp_Man_t
struct Sto_Man_t_ Sto_Man_t
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.