73 p->nRegsMax = nPartSize;
74 p->vParts = Vec_PtrAlloc(256);
75 p->vRegs = Vec_IntAlloc(256);
76 p->vUniques = Vec_IntAlloc(256);
77 p->vFreeVars = Vec_IntAlloc(256);
78 p->vPartCost = Vec_FltAlloc(256);
79 p->pfUsedRegs =
ABC_ALLOC(
char, Aig_ManRegNum(
p->pAig) );
80 memset(
p->pfUsedRegs, 0,
sizeof(
char) * Aig_ManRegNum(
p->pAig) );
81 p->pfPartVars =
ABC_ALLOC(
char, Aig_ManRegNum(
p->pAig) );
101 Vec_IntFree(
p->vRegs );
102 Vec_IntFree(
p->vUniques );
103 Vec_IntFree(
p->vFreeVars );
104 Vec_FltFree(
p->vPartCost );
127 int nRegsCur, nRegsMax = -1;
128 for ( i = 0; i < Aig_ManRegNum(
p->pAig); i++ )
130 if (
p->pfUsedRegs[i] )
133 vRegs = (
Vec_Int_t *)Vec_PtrEntry(
p->vMatrix, i );
135 nRegsCur += !
p->pfUsedRegs[iReg];
136 if ( nRegsMax < nRegsCur )
160 int iVarFree, iVarSupp, iVarBest = -1, i, k;
167 vSupp = (
Vec_Int_t *)Vec_PtrEntry(
p->vMatrix, iVarFree );
172 if (
p->pfPartVars[iVarSupp] )
174 nNewVars += 1 + 3 *
p->pfUsedRegs[iVarSupp];
180 if ( nNewVarsBest > nNewVars )
182 nNewVarsBest = nNewVars;
203 int RetValue, iVar, i;
206 if ( !
p->pfUsedRegs[iReg] )
208 p->pfUsedRegs[iReg] = 1;
209 Vec_IntPush(
p->vUniques, iReg );
212 if ( Vec_IntSize(
p->vFreeVars) > 0 )
215 RetValue = Vec_IntRemove(
p->vFreeVars, iReg );
219 assert( !
p->pfPartVars[iReg] );
221 p->pfPartVars[iReg] = 1;
222 Vec_IntPush(
p->vRegs, iReg );
224 vSupp = (
Vec_Int_t *)Vec_PtrEntry(
p->vMatrix, iReg );
227 if (
p->pfPartVars[iVar] )
229 p->pfPartVars[iVar] = 1;
230 Vec_IntPush(
p->vFreeVars, iVar );
233 Vec_FltPush(
p->vPartCost, 1.0*Vec_IntSize(
p->vFreeVars)/Vec_IntSize(
p->vRegs) );
253 int nOffset, iReg, i, k;
258 nOffset = Aig_ManCiNum(pAig)-Aig_ManRegNum(pAig);
264 pObj = Aig_ManCi( pAig, nOffset+iReg );
265 if ( !Aig_ObjIsTravIdCurrent(pAig, pObj) )
267 if ( vGroupNew == NULL )
268 vGroupNew = Vec_IntAlloc( Vec_IntSize(vGroup) );
270 Vec_IntPush( vGroupNew, pObjNew->
iData );
272 if ( vGroupNew == NULL )
274 if ( Vec_IntSize(vGroupNew) > 1 )
276 if ( vOnehotsPart == NULL )
277 vOnehotsPart = Vec_PtrAlloc( 100 );
278 Vec_PtrPush( vOnehotsPart, vGroupNew );
281 Vec_IntFree( vGroupNew );
287 if ( vOnehotsPart && fVerbose )
289 printf(
"Partition contains %d groups of 1-hot registers: { ", Vec_PtrSize(vOnehotsPart) );
291 printf(
"%d ", Vec_IntSize(vGroup) );
314 int nOffset, iOut, i;
315 int nCountPis, nCountRegs;
318 vRoots = Vec_PtrAlloc( Vec_IntSize(vPart) );
319 nOffset = Aig_ManCoNum(pAig)-Aig_ManRegNum(pAig);
322 pObj = Aig_ManCo(pAig, nOffset+iOut);
323 Vec_PtrPush( vRoots, Aig_ObjFanin0(pObj) );
327 Vec_PtrFree( vRoots );
329 nOffset = Aig_ManCiNum(pAig)-Aig_ManRegNum(pAig);
332 pObj = Aig_ManCi(pAig, nOffset+iOut);
333 Aig_ObjSetTravIdPrevious( pAig, pObj );
336 nCountPis = nCountRegs = 0;
338 nCountPis += Aig_ObjIsTravIdCurrent(pAig, pObj);
341 nCountRegs += Aig_ObjIsTravIdCurrent(pAig, pObj);
343 *pnCountPis = nCountPis;
345 *pnCountRegs = nCountRegs;
348 Aig_ManConst1(pAig)->pData = Aig_ManConst1(pNew);
351 if ( Aig_ObjIsTravIdCurrent(pAig, pObj) )
355 nOffset = Aig_ManCiNum(pAig)-Aig_ManRegNum(pAig);
358 pObj = Aig_ManCi(pAig, nOffset+iOut);
361 Aig_ObjSetTravIdCurrent( pAig, pObj );
365 if ( Aig_ObjIsNode(pObj) )
366 pObj->
pData =
Aig_And(pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
368 nOffset = Aig_ManCoNum(pAig)-Aig_ManRegNum(pAig);
371 pObj = Aig_ManCo( pAig, nOffset+iOut );
374 pNew->nRegs = Vec_IntSize(vPart);
378 pMapBack =
ABC_ALLOC(
int, Aig_ManObjNumMax(pNew) );
379 memset( pMapBack, 0xff,
sizeof(
int) * Aig_ManObjNumMax(pNew) );
386 pMapBack[pObjNew->
Id] = pObj->
Id;
389 nOffset = Aig_ManCiNum(pAig)-Aig_ManRegNum(pAig);
392 pObj = Aig_ManCi(pAig, nOffset+iOut);
394 pMapBack[pObjNew->
Id] = pObj->
Id;
396 *ppMapBack = pMapBack;
398 Vec_PtrFree( vNodes );
419 int iSeed, iNext, i, k;
427 Vec_IntClear(
p->vRegs );
428 Vec_IntClear(
p->vUniques );
429 Vec_IntClear(
p->vFreeVars );
430 Vec_FltClear(
p->vPartCost );
431 memset(
p->pfPartVars, 0,
sizeof(
char) * Aig_ManRegNum(
p->pAig) );
435 for ( k = 0; Vec_IntSize(
p->vRegs) <
p->nRegsMax; k++ )
448 if ( Vec_IntSize(
p->vFreeVars) == 0 )
452 Vec_PtrPush(
p->vParts, Vec_IntDup(
p->vRegs) );
453printf(
"Part %3d SUMMARY: Free = %4d. Total = %4d. Ratio = %6.2f. Unique = %4d.\n", i,
454 Vec_IntSize(
p->vFreeVars), Vec_IntSize(
p->vRegs),
455 1.0*Vec_IntSize(
p->vFreeVars)/Vec_IntSize(
p->vRegs), Vec_IntSize(
p->vUniques) );
458 vResult =
p->vParts;
p->vParts = NULL;
479 if ( nOverSize >= nPartSize )
481 printf(
"Overlap size (%d) is more or equal than the partition size (%d).\n", nOverSize, nPartSize );
482 printf(
"Adjusting it to be equal to half of the partition size.\n" );
483 nOverSize = nPartSize/2;
485 assert( nOverSize < nPartSize );
486 vResult = Vec_PtrAlloc( 100 );
487 for ( Counter = 0; Counter < Aig_ManRegNum(pAig); Counter -= nOverSize )
489 vPart = Vec_IntAlloc( nPartSize );
490 for ( i = 0; i < nPartSize; i++, Counter++ )
491 if ( Counter < Aig_ManRegNum(pAig) )
492 Vec_IntPush( vPart, Counter );
493 if ( Vec_IntSize(vPart) <= nOverSize )
496 Vec_PtrPush( vResult, vPart );
517 assert( nPartSize && Vec_IntSize(vDomain) > nPartSize );
518 if ( nOverSize >= nPartSize )
520 printf(
"Overlap size (%d) is more or equal than the partition size (%d).\n", nOverSize, nPartSize );
521 printf(
"Adjusting it to be equal to half of the partition size.\n" );
522 nOverSize = nPartSize/2;
524 assert( nOverSize < nPartSize );
525 for ( Counter = 0; Counter < Vec_IntSize(vDomain); Counter -= nOverSize )
527 vPart = Vec_IntAlloc( nPartSize );
528 for ( i = 0; i < nPartSize; i++, Counter++ )
529 if ( Counter < Vec_IntSize(vDomain) )
530 Vec_IntPush( vPart, Vec_IntEntry(vDomain, Counter) );
531 if ( Vec_IntSize(vPart) <= nOverSize )
534 Vec_PtrPush( vResult, vPart );
551 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
553 Aig_ObjSetTravIdCurrent(
p, pObj );
554 if ( Aig_ObjIsCi(pObj) )
556 if ( pObj->
iData >= Aig_ManCiNum(
p) - Aig_ManRegNum(
p) )
558 Vec_PtrPush( vLos, pObj );
559 printf(
"%d ", pObj->
iData - (Aig_ManCiNum(
p) - Aig_ManRegNum(
p)) );
582 int i, nPrev, Counter;
587 vLos = Vec_PtrAlloc( Aig_ManRegNum(
p) );
594 printf(
"Latch %d: ", Counter );
596printf(
"%d=%d \n", Counter, Vec_PtrSize(vLos)-nPrev );
597 nPrev = Vec_PtrSize(vLos);
599 printf(
"Total collected = %d. Total regs = %d.\n", Vec_PtrSize(vLos), Aig_ManRegNum(
p) );
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Aig_ManPre_t_ Aig_ManPre_t
DECLARATIONS ///.
void Aig_ManRegPartitionTraverse_rec(Aig_Man_t *p, Aig_Obj_t *pObj, Vec_Ptr_t *vLos)
Vec_Ptr_t * Aig_ManRegPartitionLinear(Aig_Man_t *pAig, int nPartSize)
int Aig_ManRegFindBestVar(Aig_ManPre_t *p)
void Aig_ManPartDivide(Vec_Ptr_t *vResult, Vec_Int_t *vDomain, int nPartSize, int nOverSize)
Aig_ManPre_t * Aig_ManRegManStart(Aig_Man_t *pAig, int nPartSize)
FUNCTION DEFINITIONS ///.
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)
void Aig_ManRegManStop(Aig_ManPre_t *p)
Vec_Ptr_t * Aig_ManRegPartitionSmart(Aig_Man_t *pAig, int nPartSize)
Vec_Ptr_t * Aig_ManRegPartitionTraverse(Aig_Man_t *p)
Vec_Ptr_t * Aig_ManRegProjectOnehots(Aig_Man_t *pAig, Aig_Man_t *pPart, Vec_Ptr_t *vOnehots, int fVerbose)
void Aig_ManRegPartitionAdd(Aig_ManPre_t *p, int iReg)
int Aig_ManRegFindSeed(Aig_ManPre_t *p)
Vec_Ptr_t * Aig_ManSupportsRegisters(Aig_Man_t *p)
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_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
#define Aig_ManForEachPiSeq(p, pObj, i)
SEQUENTIAL ITERATORS ///.
Vec_Ptr_t * Aig_ManDfsNodes(Aig_Man_t *p, Aig_Obj_t **ppNodes, int nNodes)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachLoSeq(p, pObj, i)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Ioa_WriteAiger(Aig_Man_t *pMan, char *pFileName, int fWriteSymbols, int fCompact)
typedefABC_NAMESPACE_HEADER_START struct Vec_Flt_t_ Vec_Flt_t
INCLUDES ///.
#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 ///.