86 p->pInToOutPart =
ABC_ALLOC(
int, Aig_ManCiNum(pAig) );
87 memset(
p->pInToOutPart, 0,
sizeof(
int) * Aig_ManCiNum(pAig) );
88 p->pInToOutNum =
ABC_ALLOC(
int, Aig_ManCiNum(pAig) );
89 memset(
p->pInToOutNum, 0,
sizeof(
int) * Aig_ManCiNum(pAig) );
90 p->vFraigs = Vec_PtrAlloc( 1000 );
107 printf(
"Iterations = %d. LitBeg = %d. LitEnd = %d. (%6.2f %%).\n",
108 p->nIters,
p->nLitsBeg,
p->nLitsEnd, 100.0*
p->nLitsEnd/
p->nLitsBeg );
109 printf(
"NBeg = %d. NEnd = %d. (Gain = %6.2f %%). RBeg = %d. REnd = %d. (Gain = %6.2f %%).\n",
110 p->nNodesBeg,
p->nNodesEnd, 100.0*(
p->nNodesBeg-
p->nNodesEnd)/
p->nNodesBeg,
111 p->nRegsBeg,
p->nRegsEnd, 100.0*(
p->nRegsBeg-
p->nRegsEnd)/
p->nRegsBeg );
112 ABC_PRT(
"AIG simulation ",
p->timeSim );
113 ABC_PRT(
"AIG partitioning",
p->timePart );
114 ABC_PRT(
"AIG rebuiding ",
p->timeTrav );
115 ABC_PRT(
"FRAIGing ",
p->timeFraig );
116 ABC_PRT(
"AIG updating ",
p->timeUpdate );
117 ABC_PRT(
"TOTAL RUNTIME ",
p->timeTotal );
139 Vec_PtrFree(
p->vFraigs );
141 if (
p->vParts ) Vec_VecFree( (
Vec_Vec_t *)
p->vParts );
208 assert( Aig_ObjIsCi(pObj0) );
209 assert( Aig_ObjIsCi(pObj1) );
211 nPart0 = pLcr->pInToOutPart[(long)pObj0->
pNext];
212 nPart1 = pLcr->pInToOutPart[(long)pObj1->
pNext];
215 if ( nPart0 != nPart1 )
220 assert( nPart0 == nPart1 );
221 pFraig = (
Aig_Man_t *)Vec_PtrEntry( pLcr->vFraigs, nPart0 );
223 pOut0 = Aig_ManCo( pFraig, pLcr->pInToOutNum[(
long)pObj0->
pNext] );
224 pOut1 = Aig_ManCo( pFraig, pLcr->pInToOutNum[(
long)pObj1->
pNext] );
225 return Aig_ObjFanin0(pOut0) == Aig_ObjFanin0(pOut1);
246 assert( Aig_ObjIsCi(pObj) );
248 nPart = pLcr->pInToOutPart[(long)pObj->
pNext];
249 pFraig = (
Aig_Man_t *)Vec_PtrEntry( pLcr->vFraigs, nPart );
251 pOut = Aig_ManCo( pFraig, pLcr->pInToOutNum[(
long)pObj->
pNext] );
252 return Aig_ObjFanin0(pOut) == Aig_ManConst1(pFraig);
272 if ( Aig_ObjIsBuf(pObj) )
275 pObjNew =
Aig_Oper( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj), Aig_ObjType(pObj) );
299 Aig_Obj_t * pObj, * pObjPo, * pObjNew, ** ppClass, * pMiter;
308 Offset = Aig_ManCoNum(pLcr->pAig) - Aig_ManCiNum(pLcr->pAig);
315 pMiter = Aig_ManConst0(pNew);
316 for ( c = 0; ppClass[c]; c++ )
318 assert( Aig_ObjIsCi(ppClass[c]) );
319 pObjPo = Aig_ManCo( pLcr->pAig, Offset+(
long)ppClass[c]->
pNext );
321 pMiter =
Aig_Exor( pNew, pMiter, pObjNew );
328 assert( Aig_ObjIsCi(pObj) );
329 pObjPo = Aig_ManCo( pLcr->pAig, Offset+(
long)pObj->
pNext );
351 int Out, Offset, i, k, c;
353 Offset = Aig_ManCoNum(pCla->
pAig) - Aig_ManCiNum(pCla->
pAig);
356 vOneNew = Vec_IntAlloc( Vec_IntSize(vOne) );
359 if ( Out < Vec_PtrSize(pCla->
vClasses) )
362 for ( c = 0; ppClass[c]; c++ )
364 pInToOutPart[(long)ppClass[c]->pNext] = i;
365 pInToOutNum[(long)ppClass[c]->pNext] = Vec_IntSize(vOneNew);
366 Vec_IntPush( vOneNew, Offset+(
long)ppClass[c]->pNext );
372 pInToOutPart[(long)pObjPi->
pNext] = i;
373 pInToOutNum[(long)pObjPi->
pNext] = Vec_IntSize(vOneNew);
374 Vec_IntPush( vOneNew, Offset+(
long)pObjPi->
pNext );
378 Vec_PtrWriteEntry( vParts, i, vOneNew );
396 assert( !Aig_IsComplement(pObj) );
397 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
399 Aig_ObjSetTravIdCurrent(
p, pObj);
400 if ( Aig_ObjIsCi(pObj) )
415 return (
Aig_Obj_t *)(pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ));
437 Aig_ObjSetTravIdCurrent(
p->pAig, Aig_ManConst1(
p->pAig) );
438 Aig_ManConst1(
p->pAig)->pData = Aig_ManConst1(pNew);
441 pObj = Aig_ManCo(
p->pAig, Out );
445 pObjNew = Aig_NotCond( pObjNew, Aig_ObjFaninC0(pObj) );
448 pObjNew = Aig_ManConst1( pNew );
470 Offset = Aig_ManCoNum(
p->pCla->pAig) - Aig_ManCiNum(
p->pCla->pAig);
474 pObj = Aig_ManCo(
p->pCla->pAig, Offset+(
long)pObj->
pNext );
479 for ( c = 0; ppClass[c]; c++ )
481 pObj = Aig_ManCo(
p->pCla->pAig, Offset+(
long)ppClass[c]->
pNext );
503 Offset = Aig_ManCoNum(
p->pCla->pAig) - Aig_ManCiNum(
p->pCla->pAig);
507 pObj = Aig_ManCo(
p->pCla->pAig, Offset+(
long)pObj->
pNext );
512 for ( c = 0; ppClass[c]; c++ )
514 pObj = Aig_ManCo(
p->pCla->pAig, Offset+(
long)ppClass[c]->
pNext );
538 Aig_Man_t * pAigPart, * pAigTemp, * pAigNew = NULL;
541 abctime timeSim, clk2, clk3, clk = Abc_Clock();
542 abctime TimeToStop = TimeLimit ? TimeLimit * CLOCKS_PER_SEC + Abc_Clock() : 0;
543 if ( Aig_ManNodeNum(pAig) == 0 )
545 if ( pnIter ) *pnIter = 0;
550 assert( Aig_ManRegNum(pAig) > 0 );
555printf(
"Simulating AIG with %d nodes for %d cycles ... ", Aig_ManNodeNum(pAig), nFramesP + 32 );
559ABC_PRT(
"Time", Abc_Clock() - clk2 );
561timeSim = Abc_Clock() - clk2;
573 p->nFramesP = nFramesP;
574 p->fVerbose = fVerbose;
575 p->timeSim += timeSim;
591printf(
"Partitioning AIG ... " );
598ABC_PRT(
"Time", Abc_Clock() - clk2 );
599p->timePart += Abc_Clock() - clk2;
604 p->nNodesBeg = Aig_ManNodeNum(
p->pAig);
605 p->nRegsBeg = Aig_ManRegNum(
p->pAig);
609 for ( nIter = 0;
p->fRefining; nIter++ )
615 Vec_PtrClear(
p->vFraigs );
618 if ( TimeLimit != 0.0 && Abc_Clock() > TimeToStop )
624 printf(
"Fra_FraigLatchCorrespondence(): Runtime limit exceeded.\n" );
629p->timeTrav += Abc_Clock() - clk2;
632p->timeFraig += Abc_Clock() - clk2;
633 Vec_PtrPush(
p->vFraigs, pAigTemp );
650 printf(
"%3d : Const = %6d. Class = %6d. L = %6d. Part = %3d. ",
651 nIter, Vec_PtrSize(
p->pCla->vClasses1), Vec_PtrSize(
p->pCla->vClasses),
653 ABC_PRT(
"T", Abc_Clock() - clk3 );
674p->timePart += Abc_Clock() - clk2;
688p->timeUpdate += Abc_Clock() - clk2;
689p->timeTotal = Abc_Clock() - clk;
692 p->nNodesEnd = Aig_ManNodeNum(pAigNew);
693 p->nRegsEnd = Aig_ManRegNum(pAigNew);
697 if ( pnIter ) *pnIter = nIter;
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
Aig_Man_t * Aig_ManDupRepr(Aig_Man_t *p, int fOrdered)
Aig_Man_t * Aig_ManDupOrdered(Aig_Man_t *p)
void Aig_ManCleanMarkB(Aig_Man_t *p)
int Aig_ManSeqCleanup(Aig_Man_t *p)
void Aig_ManReprStart(Aig_Man_t *p, int nIdMax)
DECLARATIONS ///.
void Aig_ManCleanMarkA(Aig_Man_t *p)
#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)
Aig_Obj_t * Aig_Oper(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1, Aig_Type_t Type)
Aig_Man_t * Aig_ManStartFrom(Aig_Man_t *p)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Obj_t * Aig_Exor(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Vec_Ptr_t * Aig_ManPartitionSmart(Aig_Man_t *p, int nPartSizeLimit, int fVerbose, Vec_Ptr_t **pvPartSupps)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
void Aig_ManCleanData(Aig_Man_t *p)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Fra_ClassNodesUnmark(Fra_Lcr_t *p)
int Fra_LcrNodeIsConst(Aig_Obj_t *pObj)
Aig_Man_t * Fra_FraigLatchCorrespondence(Aig_Man_t *pAig, int nFramesP, int nConfMax, int fProve, int fVerbose, int *pnIter, float TimeLimit)
Fra_Lcr_t * Lcr_ManAlloc(Aig_Man_t *pAig)
FUNCTION DEFINITIONS ///.
Fra_Man_t * Fra_LcrAigPrepare(Aig_Man_t *pAig)
Aig_Man_t * Fra_LcrCreatePart(Fra_Lcr_t *p, Vec_Int_t *vPart)
void Fra_LcrRemapPartitions(Vec_Ptr_t *vParts, Fra_Cla_t *pCla, int *pInToOutPart, int *pInToOutNum)
void Fra_ClassNodesMark(Fra_Lcr_t *p)
void Fra_LcrAigPrepareTwo(Aig_Man_t *pAig, Fra_Man_t *p)
typedefABC_NAMESPACE_IMPL_START struct Fra_Lcr_t_ Fra_Lcr_t
DECLARATIONS ///.
Aig_Man_t * Fra_LcrDeriveAigForPartitioning(Fra_Lcr_t *pLcr)
void Lcr_ManFree(Fra_Lcr_t *p)
int Fra_LcrNodesAreEqual(Aig_Obj_t *pObj0, Aig_Obj_t *pObj1)
void Lcr_ManPrint(Fra_Lcr_t *p)
Aig_Obj_t * Fra_LcrCreatePart_rec(Fra_Cla_t *pCla, Aig_Man_t *pNew, Aig_Man_t *p, Aig_Obj_t *pObj)
Aig_Obj_t * Fra_LcrManDup_rec(Aig_Man_t *pNew, Aig_Man_t *p, Aig_Obj_t *pObj)
int Fra_ClassesRefine1(Fra_Cla_t *p, int fRefineNewClass, int *pSkipped)
void Fra_ClassesCopyReprs(Fra_Cla_t *p, Vec_Ptr_t *vFailed)
Fra_Cla_t * Fra_ClassesStart(Aig_Man_t *pAig)
FUNCTION DEFINITIONS ///.
struct Fra_Bmc_t_ Fra_Bmc_t
void Fra_ClassesStop(Fra_Cla_t *p)
Aig_Man_t * Fra_FraigEquivence(Aig_Man_t *pManAig, int nConfMax, int fProve)
void Fra_SmlStop(Fra_Sml_t *p)
void Fra_ClassesPrepare(Fra_Cla_t *p, int fLatchCorr, int nMaxLevs)
struct Fra_Man_t_ Fra_Man_t
int Fra_ClassesRefine(Fra_Cla_t *p)
int Fra_ClassesCountLits(Fra_Cla_t *p)
struct Fra_Sml_t_ Fra_Sml_t
void Fra_ClassesSelectRepr(Fra_Cla_t *p)
Fra_Sml_t * Fra_SmlSimulateSeq(Aig_Man_t *pAig, int nPref, int nFrames, int nWords, int fCheckMiter)
struct Fra_Cla_t_ Fra_Cla_t
Abc_Cex_t * Fra_SmlGetCounterExample(Fra_Sml_t *p)
#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 ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.