63 assert(
p->pManFraig->nRegs == pTemp->nRegs );
64 assert(
p->pManFraig->nAsserts == pTemp->nAsserts );
65 nTruePis = Aig_ManCiNum(
p->pManAig) - Aig_ManRegNum(
p->pManAig);
67 Fra_ObjSetFraig( Aig_ManConst1(
p->pManAig),
p->pPars->nFramesK, Aig_ManConst1(pTemp) );
69 Fra_ObjSetFraig( pObj,
p->pPars->nFramesK, Aig_ManCi(pTemp,nTruePis*
p->pPars->nFramesK+i) );
71 assert( Aig_ManRegNum(
p->pManAig) == Aig_ManCoNum(pTemp) - pTemp->nAsserts );
74 pObjPo = Aig_ManCo(pTemp, pTemp->nAsserts + k++);
75 Fra_ObjSetFraig( pObj,
p->pPars->nFramesK, Aig_ObjChild0(pObjPo) );
80p->timeRwr += Abc_Clock() - clk;
94static inline void Fra_FramesConstrainNode(
Aig_Man_t * pManFraig,
Aig_Obj_t * pObj,
int iFrame )
96 Aig_Obj_t * pObjNew, * pObjNew2, * pObjRepr, * pObjReprNew, * pMiter;
98 if ( (pObjRepr = Fra_ClassObjRepr(pObj)) == NULL )
102 pObjNew = Fra_ObjFraig( pObj, iFrame );
104 pObjReprNew = Fra_ObjFraig( pObjRepr, iFrame );
106 if ( Aig_Regular(pObjNew) == Aig_Regular(pObjReprNew) )
109 pObjNew2 = Aig_NotCond( pObjReprNew, pObj->
fPhase ^ pObjRepr->
fPhase );
111 Fra_ObjSetFraig( pObj, iFrame, pObjNew2 );
113 pMiter =
Aig_Exor( pManFraig, pObjNew, pObjReprNew );
114 pMiter = Aig_NotCond( pMiter, !Aig_ObjPhaseReal(pMiter) );
115 assert( Aig_ObjPhaseReal(pMiter) == 1 );
133 Aig_Obj_t * pObj, * pObjLi, * pObjLo, * pObjNew;
135 assert(
p->pManFraig == NULL );
136 assert( Aig_ManRegNum(
p->pManAig) > 0 );
137 assert( Aig_ManRegNum(
p->pManAig) < Aig_ManCiNum(
p->pManAig) );
140 pManFraig =
Aig_ManStart( Aig_ManObjNumMax(
p->pManAig) *
p->nFramesAll );
141 pManFraig->pName = Abc_UtilStrsav(
p->pManAig->pName );
142 pManFraig->pSpec = Abc_UtilStrsav(
p->pManAig->pSpec );
143 pManFraig->nRegs =
p->pManAig->nRegs;
145 for ( f = 0; f <
p->nFramesAll; f++ )
146 Fra_ObjSetFraig( Aig_ManConst1(
p->pManAig), f, Aig_ManConst1(pManFraig) );
147 for ( f = 0; f <
p->nFramesAll; f++ )
156 for ( f = 0; f <
p->nFramesAll - 1; f++ )
160 Fra_FramesConstrainNode( pManFraig, pObj, f );
164 pObjNew =
Aig_And( pManFraig, Fra_ObjChild0Fra(pObj,f), Fra_ObjChild1Fra(pObj,f) );
165 Fra_ObjSetFraig( pObj, f, pObjNew );
166 Fra_FramesConstrainNode( pManFraig, pObj, f );
170 Fra_ObjSetFraig( pObjLo, f+1, Fra_ObjChild0Fra(pObjLi,f) );
174 pManFraig->nAsserts = Aig_ManCoNum(pManFraig);
182 assert( pManFraig->pData == NULL );
200 int i, k, f, nNodesOld;
205 nNodesOld = Aig_ManObjNumMax(
p);
207 for ( f = 0; f < nFrames; f++ )
218 if ( Aig_ObjFanin0(pObj)->pData )
219 pLatches[k++] = Aig_ObjChild0Copy(pObj);
221 pLatches[k++] = NULL;
226 pObj->
pData = pLatches[k++];
232 if ( Aig_ObjFanin0(pObj)->pData && Aig_ObjFanin1(pObj)->pData )
233 pObj->
pData =
Aig_And(
p, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
261 int i, nCountPis, nCountRegs;
262 int nClasses, nPartSize, fVerbose;
269 if ( pAig->vClockDoms )
272 vResult = Vec_PtrAlloc( 100 );
275 if ( nPartSize && Vec_IntSize(vPart) > nPartSize )
278 Vec_PtrPush( vResult, Vec_IntDup(vPart) );
288 printf(
"Simple partitioning. %d partitions are saved:\n", Vec_PtrSize(vResult) );
291 sprintf( Buffer,
"part%03d.aig", i );
294 printf(
"part%03d.aig : Reg = %4d. PI = %4d. (True = %4d. Regs = %4d.) And = %5d.\n",
295 i, Vec_IntSize(vPart), Aig_ManCiNum(pTemp)-Vec_IntSize(vPart), nCountPis, nCountRegs, Aig_ManNodeNum(pTemp) );
306 if ( pAig->vOnehots )
312 printf(
"%3d : Reg = %4d. PI = %4d. (True = %4d. Regs = %4d.) And = %5d. It = %3d. Cl = %5d.\n",
313 i, Vec_IntSize(vPart), Aig_ManCiNum(pTemp)-Vec_IntSize(vPart), nCountPis, nCountRegs, Aig_ManNodeNum(pTemp), pPars->
nIters, nClasses );
328 ABC_PRT(
"Total time", Abc_Clock() - clk );
346 int fUseSimpleCnf = 0;
347 int fUseOldSimulation = 0;
359 int nNodesBeg, nRegsBeg;
362 abctime clk = Abc_Clock(), clk2;
365 if ( Aig_ManNodeNum(pManAig) == 0 )
372 assert( Aig_ManRegNum(pManAig) > 0 );
379 printf(
"Partitioning was disabled to allow implication writing.\n" );
383 || (pManAig->vClockDoms && Vec_VecSize(pManAig->vClockDoms) > 0) )
386 nNodesBeg = Aig_ManNodeNum(pManAig);
387 nRegsBeg = Aig_ManRegNum(pManAig);
394 pPars->nFramesP = pParams->
nFramesP;
395 pPars->nFramesK = pParams->
nFramesK;
396 pPars->nMaxImps = pParams->
nMaxImps;
397 pPars->nMaxLevs = pParams->
nMaxLevs;
398 pPars->fVerbose = pParams->
fVerbose;
399 pPars->fRewrite = pParams->
fRewrite;
401 pPars->fUseImps = pParams->
fUseImps;
403 pPars->fUse1Hot = pParams->
fUse1Hot;
405 assert( !(pPars->nFramesP > 0 && pPars->fUse1Hot) );
406 assert( !(pPars->nFramesK > 1 && pPars->fUse1Hot) );
410 p->pPars->nBTLimitNode = 0;
412 if ( fUseOldSimulation )
414 if ( pPars->nFramesP > 0 )
417 printf(
"Fra_FraigInduction(): Prefix cannot be used.\n" );
419 p->pSml =
Fra_SmlStart( pManAig, 0, pPars->nFramesK + 1, pPars->nSimWords );
427if ( pPars->fVerbose )
428printf(
"Simulating %d AIG nodes for %d cycles ... ", Aig_ManNodeNum(pManAig), pPars->nFramesP + 32 );
430if ( pPars->fVerbose )
432ABC_PRT(
"Time", Abc_Clock() - clk );
437 if (
p->pPars->fUse1Hot )
441 p->pSml =
Fra_SmlStart( pManAig, 0, pPars->nFramesK + 1, pPars->nSimWords );
445 if ( pPars->fUseImps )
446 p->pCla->vImps =
Fra_ImpDerive(
p, 5000000, pPars->nMaxImps, pPars->fLatchCorr );
448 if ( pParams->
TimeLimit != 0.0 && Abc_Clock() > TimeToStop )
451 printf(
"Fra_FraigInduction(): Runtime limit exceeded.\n" );
462 p->nNodesBeg = nNodesBeg;
463 p->nRegsBeg = nRegsBeg;
472 p->pCla->fRefinement = 1;
473 for ( nIter = 0;
p->pCla->fRefinement; nIter++ )
476 int nImpsOld =
p->pCla->vImps? Vec_IntSize(
p->pCla->vImps) : 0;
480 if ( pParams->
TimeLimit != 0.0 && Abc_Clock() > TimeToStop )
483 printf(
"Fra_FraigInduction(): Runtime limit exceeded.\n" );
488 p->pCla->fRefinement = 0;
492p->timeTrav += Abc_Clock() - clk2;
496 if (
p->pPars->fRewrite )
500 if ( fUseSimpleCnf || pPars->fUseImps )
503 pCnf =
Cnf_Derive(
p->pManFraig, Aig_ManRegNum(
p->pManFraig) );
508 p->nSatVars = pCnf->
nVars;
510 if (
p->pSat == NULL )
511 printf(
"Fra_FraigInduction(): Computed CNF is not valid.\n" );
512 if ( pPars->fUseImps )
515 if (
p->pSat == NULL )
516 printf(
"Fra_FraigInduction(): Adding implicationsn to CNF led to a conflict.\n" );
524 Fra_ManClean(
p, Aig_ManObjNumMax(
p->pManFraig) + Aig_ManNodeNum(
p->pManAig) );
531 Fra_ObjSetSatNum( pObj, pCnf->
pVarNums[pObj->
Id] );
532 Fra_ObjSetFaninVec( pObj, (
Vec_Ptr_t *)1 );
537 if (
p->pPars->fUse1Hot )
543 if ( pPars->fVerbose )
545 printf(
"%3d : C = %6d. Cl = %6d. L = %6d. LR = %6d. ",
546 nIter, Vec_PtrSize(
p->pCla->vClasses1), Vec_PtrSize(
p->pCla->vClasses),
548 if (
p->pCla->vImps )
549 printf(
"I = %6d. ", Vec_IntSize(
p->pCla->vImps) );
550 if (
p->pPars->fUse1Hot )
552 printf(
"NR = %6d. ", Aig_ManNodeNum(
p->pManFraig) );
557 p->nSatCallsRecent = 0;
558 p->nSatCallsSkipped = 0;
560 if (
p->pPars->fUse1Hot )
563 if ( pPars->fVerbose )
565 ABC_PRT(
"T", Abc_Clock() - clk3 );
575 assert(
p->vTimeouts == NULL );
577 printf(
"Fra_FraigInduction(): SAT solver timed out!\n" );
580 if (
p->pCla->fRefinement &&
582 nImpsOld == (
p->pCla->vImps? Vec_IntSize(
p->pCla->vImps) : 0) &&
585 printf(
"Fra_FraigInduction(): Internal error. The result may not verify.\n" );
610 printf(
"Care one-hotness clauses will be written into file \"%s\".\n", pFileName );
633p->timeTrav += Abc_Clock() - clk2;
634p->timeTotal = Abc_Clock() - clk;
637 p->nNodesEnd = Aig_ManNodeNum(pManAigNew);
638 p->nRegsEnd = Aig_ManRegNum(pManAigNew);
681 printf(
"Original AIG: " );
683 printf(
"Reduced AIG: " );
687 pNum2Id = (
int *)pMan->pData;
690 pFile = fopen( pFilePairs,
"w" );
692 if ( (pRepr = pMan->pReprs[pObj->
Id]) )
694 fprintf( pFile,
"%d %d %c\n", pNum2Id[pObj->
Id], pNum2Id[pRepr->
Id], (Aig_ObjPhase(pObj) ^ Aig_ObjPhase(pRepr))?
'-' :
'+' );
700 printf(
"Result: %d pairs of seq equiv nodes are written into file \"%s\".\n", Counter, pFilePairs );
#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)
int Aig_ManSeqCleanup(Aig_Man_t *p)
void Aig_ManReprStart(Aig_Man_t *p, int nIdMax)
DECLARATIONS ///.
#define Aig_ManForEachObj(p, pObj, i)
void Aig_ManStop(Aig_Man_t *p)
#define Aig_ManForEachLiSeq(p, pObj, i)
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_ManPartDivide(Vec_Ptr_t *vResult, Vec_Int_t *vDomain, int nPartSize, int nOverSize)
Aig_Obj_t * Aig_Exor(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
Aig_Man_t * Aig_ManRegCreatePart(Aig_Man_t *pAig, Vec_Int_t *vPart, int *pnCountPis, int *pnCountRegs, int **ppMapBack)
void Aig_ManPrintStats(Aig_Man_t *p)
#define Aig_ManForEachNode(p, pObj, i)
Vec_Ptr_t * Aig_ManRegPartitionSimple(Aig_Man_t *pAig, int nPartSize, int nOverSize)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
#define Aig_ManForEachPiSeq(p, pObj, i)
SEQUENTIAL ITERATORS ///.
int Aig_TransferMappedClasses(Aig_Man_t *pAig, Aig_Man_t *pPart, int *pMapBack)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
char * Aig_FileNameGenericAppend(char *pBase, char *pSuffix)
Vec_Ptr_t * Aig_ManRegProjectOnehots(Aig_Man_t *pAig, Aig_Man_t *pPart, Vec_Ptr_t *vOnehots, int fVerbose)
#define Aig_ManForEachLoSeq(p, pObj, i)
#define Aig_ManForEachLiLoSeq(p, pObjLi, pObjLo, k)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Cnf_Dat_t * Cnf_DeriveSimple(Aig_Man_t *p, int nOutputs)
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 * Dar_ManRewriteDefault(Aig_Man_t *pAig)
DECLARATIONS ///.
int Fra_FraigInductionTest(char *pFileName, Fra_Ssw_t *pParams)
Aig_Man_t * Fra_FraigInduction(Aig_Man_t *pManAig, Fra_Ssw_t *pParams)
Aig_Man_t * Fra_FramesWithClasses(Fra_Man_t *p)
ABC_NAMESPACE_IMPL_START void Fra_FraigInductionRewrite(Fra_Man_t *p)
DECLARATIONS ///.
void Fra_FramesAddMore(Aig_Man_t *p, int nFrames)
Aig_Man_t * Fra_FraigInductionPart(Aig_Man_t *pAig, Fra_Ssw_t *pPars)
void Fra_ClassesCopyReprs(Fra_Cla_t *p, Vec_Ptr_t *vFailed)
void Fra_FraigSweep(Fra_Man_t *pManAig)
typedefABC_NAMESPACE_HEADER_START struct Fra_Par_t_ Fra_Par_t
INCLUDES ///.
void Fra_SmlSimulate(Fra_Man_t *p, int fInit)
Vec_Int_t * Fra_OneHotCompute(Fra_Man_t *p, Fra_Sml_t *pSim)
void Fra_OneHotAssume(Fra_Man_t *p, Vec_Int_t *vOneHots)
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
Fra_Sml_t * Fra_SmlStart(Aig_Man_t *pAig, int nPref, int nFrames, int nWordsFrame)
Aig_Man_t * Fra_OneHotCreateExdc(Fra_Man_t *p, Vec_Int_t *vOneHots)
Vec_Int_t * Fra_ImpDerive(Fra_Man_t *p, int nImpMaxLimit, int nImpUseLimit, int fLatchCorr)
void Fra_ManStop(Fra_Man_t *p)
int Fra_ClassesCountLits(Fra_Cla_t *p)
Fra_Man_t * Fra_ManStart(Aig_Man_t *pManAig, Fra_Par_t *pParams)
void Fra_ImpAddToSolver(Fra_Man_t *p, Vec_Int_t *vImps, int *pSatVarNums)
void Fra_ClassesSelectRepr(Fra_Cla_t *p)
void Fra_OneHotCheck(Fra_Man_t *p, Vec_Int_t *vOneHots)
struct Fra_Ssw_t_ Fra_Ssw_t
Fra_Sml_t * Fra_SmlSimulateSeq(Aig_Man_t *pAig, int nPref, int nFrames, int nWords, int fCheckMiter)
void Fra_ManClean(Fra_Man_t *p, int nNodesMax)
int Fra_OneHotCount(Fra_Man_t *p, Vec_Int_t *vOneHots)
void Fra_BmcPerform(Fra_Man_t *p, int nPref, int nDepth)
void Fra_ParamsDefaultSeq(Fra_Par_t *pParams)
void Ioa_WriteAiger(Aig_Man_t *pMan, char *pFileName, int fWriteSymbols, int fCompact)
char * Ioa_FileNameGenericAppend(char *pBase, char *pSuffix)
void * Cnf_DataWriteIntoSolver(Cnf_Dat_t *p, int nFrames, int fInit)
Aig_Man_t * Saig_ManReadBlif(char *pFileName)
void sat_solver_delete(sat_solver *s)
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 ///.