53 pNew->pName = Abc_UtilStrsav(
p->pName );
54 pNew->pSpec = Abc_UtilStrsav(
p->pSpec );
55 pNew->nAsserts =
p->nAsserts;
56 pNew->nConstrs =
p->nConstrs;
57 pNew->nBarBufs =
p->nBarBufs;
58 assert(
p->vFlopNums == NULL || Vec_IntSize(
p->vFlopNums) ==
p->nRegs );
60 pNew->vFlopNums = Vec_IntDup(
p->vFlopNums );
62 pNew->vFlopReprs = Vec_IntDup(
p->vFlopReprs );
65 Aig_ManConst1(
p)->pData = Aig_ManConst1(pNew);
69 nTruePis = Aig_ManCiNum(
p)-Aig_ManRegNum(
p);
73 pObj->
pNext = (
Aig_Obj_t *)(
long)Vec_IntEntry(
p->vFlopNums, i-nTruePis );
77 pObjMapped = (
Aig_Obj_t *)Vec_PtrEntry( vMap, i );
78 pObj->
pData = Aig_NotCond( (
Aig_Obj_t *)Aig_Regular(pObjMapped)->pData, Aig_IsComplement(pObjMapped) );
79 if ( pNew->vFlopReprs && i >= nTruePis && pObj != pObjMapped )
81 Vec_IntPush( pNew->vFlopReprs, Aig_ObjCioId(pObj) );
82 if ( Aig_ObjIsConst1( Aig_Regular(pObjMapped) ) )
83 Vec_IntPush( pNew->vFlopReprs, -1 );
86 assert( !Aig_IsComplement(pObjMapped) );
87 assert( Aig_ObjIsCi(pObjMapped) );
88 assert( Aig_ObjCioId(pObj) != Aig_ObjCioId(pObjMapped) );
89 Vec_IntPush( pNew->vFlopReprs, Aig_ObjCioId(pObjMapped) );
100 if ( Aig_ObjIsBuf(pObj) )
101 pObj->
pData = Aig_ObjChild0Copy(pObj);
102 else if ( Aig_ObjIsNode(pObj) )
103 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
107 assert( Aig_ManNodeNum(
p) >= Aig_ManNodeNum(pNew) );
111 printf(
"Aig_ManRemap(): The check has failed.\n" );
128 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
130 Aig_ObjSetTravIdCurrent(
p, pObj);
132 if ( Aig_ObjIsCi(pObj) )
134 Vec_PtrPush( vNodes, pObj->
pNext );
137 if ( Aig_ObjIsCo(pObj) || Aig_ObjIsBuf(pObj) )
142 assert( Aig_ObjIsNode(pObj) );
162 int i, nTruePis, nTruePos;
167 Aig_ObjSetTravIdCurrent(
p, Aig_ManConst1(
p) );
169 Aig_ObjSetTravIdCurrent(
p, pObj );
172 vNodes = Vec_PtrAlloc( 100 );
174 Vec_PtrPush( vNodes, pObj );
178 pObjLo->
pNext = pObjLi;
182 assert( Vec_PtrSize(vNodes) <= Aig_ManCoNum(
p) );
185 pObjLo->
pNext = NULL;
188 if ( Vec_PtrSize(vNodes) < Aig_ManCoNum(
p) )
192 int nTruePos = Aig_ManCoNum(
p)-Aig_ManRegNum(
p);
195 if ( i >= nTruePos && Aig_ObjIsTravIdCurrent(
p, pObj) )
197 iNum = Vec_IntEntry(
p->vFlopNums, i - nTruePos );
198 Vec_IntWriteEntry(
p->vFlopNums, k++, iNum );
200 assert( k == Vec_PtrSize(vNodes) - nTruePos );
201 Vec_IntShrink(
p->vFlopNums, k );
204 vCis = Vec_PtrAlloc( Aig_ManCiNum(
p) );
206 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
207 Vec_PtrPush( vCis, pObj );
210 Vec_PtrWriteEntry(
p->vObjs, pObj->
Id, NULL );
213 vCos = Vec_PtrAlloc( Aig_ManCoNum(
p) );
215 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
216 Vec_PtrPush( vCos, pObj );
220 Vec_PtrWriteEntry(
p->vObjs, pObj->
Id, NULL );
224 nTruePis = Aig_ManCiNum(
p) - Aig_ManRegNum(
p);
225 nTruePos = Aig_ManCoNum(
p) - Aig_ManRegNum(
p);
227 p->nRegs -= Aig_ManCoNum(
p) - Vec_PtrSize(vNodes);
229 assert( Vec_PtrSize(vCis) == nTruePis +
p->nRegs );
230 assert( Vec_PtrSize(vCos) == nTruePos +
p->nRegs );
231 Vec_PtrFree(
p->vCis );
p->vCis = vCis;
232 Vec_PtrFree(
p->vCos );
p->vCos = vCos;
237 Vec_PtrFree( vNodes );
238 p->nTruePis = Aig_ManCiNum(
p) - Aig_ManRegNum(
p);
239 p->nTruePos = Aig_ManCoNum(
p) - Aig_ManRegNum(
p);
266 Aig_ObjSetTravIdCurrent(
p, Aig_ManConst1(
p) );
268 Aig_ObjSetTravIdCurrent(
p, pObj );
271 vNodes = Vec_PtrAlloc( 100 );
273 Vec_PtrPush( vNodes, pObj );
277 pObjLo->
pNext = pObjLi;
281 assert( Vec_PtrSize(vNodes) <= Aig_ManCoNum(
p) );
284 pObjLo->
pNext = NULL;
287 if ( Vec_PtrSize(vNodes) < Aig_ManCoNum(
p) )
291 if ( !Aig_ObjIsTravIdCurrent(
p, pObj) )
294 Vec_PtrFree( vNodes );
313 int i, Counter = 0, Const0 = 0, Const1 = 0;
317 pFanin = Aig_ObjFanin0(pObj);
318 if ( Aig_ObjIsConst1(pFanin) )
320 if ( Aig_ObjFaninC0(pObj) )
325 if ( Aig_ObjIsTravIdCurrent(
p, pFanin) )
327 Aig_ObjSetTravIdCurrent(
p, pFanin);
330 printf(
"Regs = %d. Fanins = %d. Const0 = %d. Const1 = %d.\n",
331 Aig_ManRegNum(
p), Counter, Const0, Const1 );
350 int i, Counter = 0, Diffs = 0;
351 assert( Aig_ManRegNum(
p) > 0 );
356 pFanin = Aig_ObjFanin0(pObj);
357 if ( Aig_ObjFaninC0(pObj) )
375 pFanin = Aig_ObjFanin0(pObj);
397 Aig_Obj_t * pObj, * pObjLi, * pObjLo, * pFanin;
400 vMap = Vec_PtrAlloc( Aig_ManCiNum(
p) );
402 Vec_PtrPush( vMap, pObj );
404 pMapping =
ABC_FALLOC(
int, 2 * Aig_ManObjNumMax(
p) );
407 pFanin = Aig_ObjFanin0(pObjLi);
408 if ( Aig_ObjFaninC0(pObjLi) )
412 Vec_PtrPush( vMap, Aig_ManLo(
p, pMapping[2*pFanin->
Id + 1]) );
417 pMapping[2*pFanin->
Id + 1] = i;
418 Vec_PtrPush( vMap, pObjLo );
425 Vec_PtrPush( vMap, Aig_ManLo(
p, pMapping[2*pFanin->
Id]) );
430 pMapping[2*pFanin->
Id] = i;
431 Vec_PtrPush( vMap, pObjLo );
438 pFanin = Aig_ObjFanin0(pObj);
461 printf(
"Performing combinational register sweep:\n" );
491 Vec_Ptr_t * vSupports, * vMatrix, * vMatrix2;
494 int i, k, m, iOut, iIn, nComps;
495 if ( Aig_ManRegNum(
p) == 0 )
497 printf(
"The network is combinational.\n" );
503 vMatrix = Vec_PtrStart( Aig_ManRegNum(
p) );
507 iOut = Vec_IntPop( vSupp );
508 iOut -= Aig_ManCoNum(
p) - Aig_ManRegNum(
p);
515 iIn -= Aig_ManCiNum(
p) - Aig_ManRegNum(
p);
518 assert( iIn < Aig_ManRegNum(
p) );
519 Vec_IntWriteEntry( vSupp, m++, iIn );
521 Vec_IntShrink( vSupp, m );
523 assert( iOut < Aig_ManRegNum(
p) );
524 Vec_PtrWriteEntry( vMatrix, iOut, vSupp );
527 vMatrix2 = Vec_PtrAlloc( Aig_ManRegNum(
p) );
528 for ( i = 0; i < Aig_ManRegNum(
p); i++ )
529 Vec_PtrPush( vMatrix2, Vec_IntAlloc(8) );
534 vSupp2 = (
Vec_Int_t *)Vec_PtrEntry( vMatrix2, iIn );
535 Vec_IntPush( vSupp2, i );
540 vComp = Vec_IntAlloc( Aig_ManRegNum(
p) );
541 pVarsTot =
ABC_ALLOC(
char, Aig_ManRegNum(
p) );
542 memset( pVarsTot, 0, Aig_ManRegNum(
p) *
sizeof(
char) );
543 for ( nComps = 0; ; nComps++ )
545 Vec_IntClear( vComp );
547 for ( iOut = 0; iOut < Aig_ManRegNum(
p); iOut++ )
548 if ( pVarsTot[iOut] == 0 )
550 if ( iOut == Aig_ManRegNum(
p) )
553 Vec_IntPush( vComp, iOut );
556 vSupp = (
Vec_Int_t *)Vec_PtrEntry( vMatrix, iOut );
562 Vec_IntPush( vComp, iIn );
564 vSupp2 = (
Vec_Int_t *)Vec_PtrEntry( vMatrix2, iOut );
570 Vec_IntPush( vComp, iIn );
573 if ( Vec_IntSize(vComp) == Aig_ManRegNum(
p) )
575 printf(
"There is only one SCC of registers in this network.\n" );
578 printf(
"SCC #%d contains %5d registers.\n", nComps+1, Vec_IntSize(vComp) );
581 Vec_IntFree( vComp );
582 Vec_PtrFree( vMatrix );
602 int i, nCountPis, nCountRegs;
607 if ( pAig->vClockDoms )
609 vResult = Vec_PtrAlloc( 100 );
611 Vec_PtrPush( vResult, Vec_IntDup(vPart) );
623 pNew =
Aig_ManScl( pTemp, fLatchConst, fLatchEqual, 0, -1, -1, fVerbose, 0 );
626 printf(
"%3d : Reg = %4d. PI = %4d. (True = %4d. Regs = %4d.) And = %5d. It = %3d. Cl = %5d\n",
627 i, Vec_IntSize(vPart), Aig_ManCiNum(pTemp)-Vec_IntSize(vPart), nCountPis, nCountRegs, Aig_ManNodeNum(pTemp), 0, nClasses );
650Aig_Man_t *
Aig_ManScl(
Aig_Man_t * pAig,
int fLatchConst,
int fLatchEqual,
int fUseMvSweep,
int nFramesSymb,
int nFramesSatur,
int fVerbose,
int fVeryVerbose )
657 int i, Entry1, Entry2, nTruePis;
659 if ( pAig->vClockDoms && Vec_VecSize(pAig->vClockDoms) > 0 )
663 assert( pAig->vFlopNums == NULL );
667 pAig->vFlopNums = Vec_IntStartNatural( pAig->nRegs );
668 pAig->vFlopReprs = Vec_IntAlloc( 100 );
670 if ( fLatchConst && pAig->nRegs )
671 pAig =
Aig_ManConstReduce( pAig, fUseMvSweep, nFramesSymb, nFramesSatur, fVerbose, fVeryVerbose );
672 if ( fLatchEqual && pAig->nRegs )
675 nTruePis = Aig_ManCiNum(pAigInit)-Aig_ManRegNum(pAigInit);
679 Entry2 = Vec_IntEntry( pAig->vFlopReprs, ++i );
680 pFlop1 = Aig_ManCi( pAigInit, nTruePis + Entry1 );
681 pFlop2 = (Entry2 == -1)? Aig_ManConst1(pAigInit) : Aig_ManCi( pAigInit, nTruePis + Entry2 );
682 assert( pFlop1 != pFlop2 );
683 if ( pFlop1->
Id > pFlop2->
Id )
684 pAigInit->pReprs[pFlop1->
Id] = pFlop2;
686 pAigInit->pReprs[pFlop2->
Id] = pFlop1;
694 if ( Aig_ManRegNum(pAigNew) == 0 )
#define ABC_FALLOC(type, num)
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int Aig_ManSeqCleanup(Aig_Man_t *p)
ABC_NAMESPACE_IMPL_START Aig_Man_t * Aig_ManRemap(Aig_Man_t *p, Vec_Ptr_t *vMap)
DECLARATIONS ///.
int Aig_ManReduceLachesCount(Aig_Man_t *p)
Aig_Man_t * Aig_ManReduceLaches(Aig_Man_t *p, int fVerbose)
int Aig_ManSeqCleanupBasic(Aig_Man_t *p)
void Aig_ManSeqCleanup_rec(Aig_Man_t *p, Aig_Obj_t *pObj, Vec_Ptr_t *vNodes)
int Aig_ManCountMergeRegs(Aig_Man_t *p)
Aig_Man_t * Aig_ManScl(Aig_Man_t *pAig, int fLatchConst, int fLatchEqual, int fUseMvSweep, int nFramesSymb, int nFramesSatur, int fVerbose, int fVeryVerbose)
Vec_Ptr_t * Aig_ManReduceLachesOnce(Aig_Man_t *p)
Aig_Man_t * Aig_ManSclPart(Aig_Man_t *pAig, int fLatchConst, int fLatchEqual, int fVerbose)
void Aig_ManComputeSccs(Aig_Man_t *p)
Aig_Man_t * Aig_ManDupRepr(Aig_Man_t *p, int fOrdered)
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
Aig_Man_t * Aig_ManDupSimple(Aig_Man_t *p)
DECLARATIONS ///.
void Aig_ManSetCioIds(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)
void Aig_ObjDisconnect(Aig_Man_t *p, Aig_Obj_t *pObj)
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachLiSeq(p, pObj, i)
#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_Man_t * Aig_ManConstReduce(Aig_Man_t *p, int fUseMvSweep, int nFramesSymb, int nFramesSatur, int fVerbose, int fVeryVerbose)
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 ///.
Aig_Man_t * Aig_ManRegCreatePart(Aig_Man_t *pAig, Vec_Int_t *vPart, int *pnCountPis, int *pnCountRegs, int **ppMapBack)
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)
void Aig_ObjPatchFanin0(Aig_Man_t *p, Aig_Obj_t *pObj, Aig_Obj_t *pFaninNew)
#define Aig_ManForEachPiSeq(p, pObj, i)
SEQUENTIAL ITERATORS ///.
#define Aig_ManForEachCo(p, pObj, i)
int Aig_TransferMappedClasses(Aig_Man_t *pAig, Aig_Man_t *pPart, int *pMapBack)
#define Aig_ManForEachPoSeq(p, pObj, i)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachLoSeq(p, pObj, i)
void Aig_ManCleanData(Aig_Man_t *p)
Vec_Ptr_t * Aig_ManSupports(Aig_Man_t *p)
#define Aig_ManForEachLiLoSeq(p, pObjLi, pObjLo, k)
ABC_DLL int Aig_ManCheck(Aig_Man_t *p)
FUNCTION DECLARATIONS ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int Saig_ManReportComplements(Aig_Man_t *p)
void Saig_ManReportUselessRegisters(Aig_Man_t *pAig)
DECLARATIONS ///.
#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 ///.