70static inline int Frc_ManRegNum(
Frc_Man_t *
p ) {
return p->nRegs; }
71static inline int Frc_ManCiNum(
Frc_Man_t *
p ) {
return Vec_IntSize(
p->vCis); }
72static inline int Frc_ManCoNum(
Frc_Man_t *
p ) {
return Vec_IntSize(
p->vCos); }
73static inline int Frc_ManPiNum(
Frc_Man_t *
p ) {
return Vec_IntSize(
p->vCis) -
p->nRegs; }
74static inline int Frc_ManPoNum(
Frc_Man_t *
p ) {
return Vec_IntSize(
p->vCos) -
p->nRegs; }
75static inline int Frc_ManObjNum(
Frc_Man_t *
p ) {
return p->nObjs; }
76static inline int Frc_ManNodeNum(
Frc_Man_t *
p ) {
return p->nObjs - Vec_IntSize(
p->vCis) - Vec_IntSize(
p->vCos); }
79static inline Frc_Obj_t * Frc_ManCi(
Frc_Man_t *
p,
int i ) {
return Frc_ManObj(
p, Vec_IntEntry(
p->vCis,i) ); }
80static inline Frc_Obj_t * Frc_ManCo(
Frc_Man_t *
p,
int i ) {
return Frc_ManObj(
p, Vec_IntEntry(
p->vCos,i) ); }
82static inline int Frc_ObjIsTerm(
Frc_Obj_t * pObj ) {
return pObj->fCi || pObj->fCo; }
83static inline int Frc_ObjIsCi(
Frc_Obj_t * pObj ) {
return pObj->fCi; }
84static inline int Frc_ObjIsCo(
Frc_Obj_t * pObj ) {
return pObj->fCo; }
85static inline int Frc_ObjIsPi(
Frc_Obj_t * pObj ) {
return pObj->fCi && pObj->nFanins == 0; }
86static inline int Frc_ObjIsPo(
Frc_Obj_t * pObj ) {
return pObj->fCo && pObj->nFanouts == 0; }
87static inline int Frc_ObjIsNode(
Frc_Obj_t * pObj ) {
return!Frc_ObjIsTerm(pObj) && pObj->nFanins > 0; }
88static inline int Frc_ObjIsConst0(
Frc_Obj_t * pObj ) {
return!Frc_ObjIsTerm(pObj) && pObj->nFanins == 0; }
90static inline int Frc_ObjSize(
Frc_Obj_t * pObj ) {
return sizeof(
Frc_Obj_t) / 4 + pObj->nFanins + pObj->nFanouts; }
91static inline int Frc_ObjFaninNum(
Frc_Obj_t * pObj ) {
return pObj->nFanins; }
92static inline int Frc_ObjFanoutNum(
Frc_Obj_t * pObj ) {
return pObj->nFanouts; }
94static inline Frc_Obj_t * Frc_ObjFanout(
Frc_Obj_t * pObj,
int i ) {
return (
Frc_Obj_t *)(((
int *)pObj) + pObj->Fanios[pObj->nFanins+i]); }
96#define Frc_ManForEachObj( p, pObj, i ) \
97 for ( i = 0; (i < p->nObjData) && (pObj = Frc_ManObj(p,i)); i += Frc_ObjSize(pObj) )
98#define Frc_ManForEachObjVec( vVec, p, pObj, i ) \
99 for ( i = 0; (i < Vec_IntSize(vVec)) && ((pObj) = Frc_ManObj(p, Vec_IntEntry(vVec,i))); i++ )
101#define Frc_ManForEachNode( p, pObj, i ) \
102 for ( i = 0; (i < p->nObjData) && (pObj = Frc_ManObj(p,i)); i += Frc_ObjSize(pObj) ) if ( Frc_ObjIsTerm(pObj) ) {} else
103#define Frc_ManForEachCi( p, pObj, i ) \
104 for ( i = 0; (i < Vec_IntSize(p->vCis)) && (pObj = Frc_ManObj(p,Vec_IntEntry(p->vCis,i))); i++ )
105#define Frc_ManForEachCo( p, pObj, i ) \
106 for ( i = 0; (i < Vec_IntSize(p->vCos)) && (pObj = Frc_ManObj(p,Vec_IntEntry(p->vCos,i))); i++ )
108#define Frc_ObjForEachFanin( pObj, pNext, i ) \
109 for ( i = 0; (i < (int)pObj->nFanins) && (pNext = Frc_ObjFanin(pObj,i)); i++ )
110#define Frc_ObjForEachFaninReverse( pObj, pNext, i ) \
111 for ( i = (int)pObj->nFanins - 1; (i >= 0) && (pNext = Frc_ObjFanin(pObj,i)); i-- )
112#define Frc_ObjForEachFanout( pObj, pNext, i ) \
113 for ( i = 0; (i < (int)pObj->nFanouts) && (pNext = Frc_ObjFanout(pObj,i)); i++ )
133 assert( pObj->iFanin < pObj->nFanins );
134 assert( pFanin->iFanout < pFanin->nFanouts );
135 pFanin->Fanios[pFanin->nFanins + pFanin->iFanout++] =
136 pObj->Fanios[pObj->iFanin++] = pObj->hHandle - pFanin->hHandle;
155 int i, nNodes, hHandle = 0;
161 p->nRegs = Gia_ManRegNum(pGia);
162 p->vCis = Vec_IntAlloc( Gia_ManCiNum(pGia) );
163 p->vCos = Vec_IntAlloc( Gia_ManCoNum(pGia) );
164 p->nObjData = (
sizeof(
Frc_Obj_t) / 4) * Gia_ManObjNum(pGia) + 2 * (2 * Gia_ManAndNum(pGia) + Gia_ManCoNum(pGia));
167 Gia_ManConst0(pGia)->Value = hHandle;
168 pObjLog = Frc_ManObj(
p, hHandle );
169 pObjLog->hHandle = hHandle;
170 pObjLog->nFanins = 0;
171 pObjLog->nFanouts = Gia_ObjRefNum( pGia, Gia_ManConst0(pGia) );
173 hHandle += Frc_ObjSize( pObjLog );
180 pObj->
Value = hHandle;
181 Vec_IntPush(
p->vCis, hHandle );
182 pObjLog = Frc_ManObj(
p, hHandle );
183 pObjLog->hHandle = hHandle;
184 pObjLog->nFanins = 0;
185 pObjLog->nFanouts = Gia_ObjRefNum( pGia, pObj );
188 hHandle += Frc_ObjSize( pObjLog );
194 assert( Gia_ObjRefNum( pGia, pObj ) > 0 );
196 pObj->
Value = hHandle;
197 pObjLog = Frc_ManObj(
p, hHandle );
198 pObjLog->hHandle = hHandle;
199 pObjLog->nFanins = 2;
200 pObjLog->nFanouts = Gia_ObjRefNum( pGia, pObj );
202 pFanLog = Frc_ManObj(
p, Gia_ObjValue(Gia_ObjFanin0(pObj)) );
204 pFanLog = Frc_ManObj(
p, Gia_ObjValue(Gia_ObjFanin1(pObj)) );
207 hHandle += Frc_ObjSize( pObjLog );
215 pObj->
Value = hHandle;
216 Vec_IntPush(
p->vCos, hHandle );
217 pObjLog = Frc_ManObj(
p, hHandle );
218 pObjLog->hHandle = hHandle;
219 pObjLog->nFanins = 1;
220 pObjLog->nFanouts = 0;
223 pFanLog = Frc_ManObj(
p, Gia_ObjValue(Gia_ObjFanin0(pObj)) );
226 hHandle += Frc_ObjSize( pObjLog );
232 assert( nNodes == Frc_ManNodeNum(
p) );
233 assert( hHandle ==
p->nObjData );
234 if ( hHandle !=
p->nObjData )
235 printf(
"Frc_ManStartSimple(): Fatal error in internal representation.\n" );
239 if ( !~Gia_ObjValue(pObj) )
241 pObjLog = Frc_ManObj(
p, Gia_ObjValue(pObj) );
242 assert( pObjLog->nFanins == pObjLog->iFanin );
243 assert( pObjLog->nFanouts == pObjLog->iFanout );
244 pObjLog->iFanin = pObjLog->iFanout = 0;
266 Vec_IntPush( vVisit, Gia_ObjId(
p, pObj) );
269 Vec_IntPush( vSuper, Gia_ObjId(
p, pObj) );
272 assert( Gia_ObjIsAnd(pObj) );
292 Vec_IntClear( vSuper );
293 Vec_IntClear( vVisit );
299 Gia_ManObj(
p, Entry)->fMark1 = 0;
324 pFan0 = Gia_ObjFanin0(pObj);
325 pFan1 = Gia_ObjFanin1(pObj);
327 if ( Gia_ObjIsCi(pFan0) || pFan0->
fMark0 ||
328 Gia_ObjIsCi(pFan1) || pFan1->
fMark0 )
339 Gia_ObjRefDec(
p, Gia_Regular(pObjC) );
340 if ( Gia_Regular(pObjD0) == Gia_Regular(pObjD1) )
341 Gia_ObjRefDec(
p, Gia_Regular(pObjD0) );
344 assert( Gia_ObjRefNum(
p, pObj) > 0 );
368 Gia_ManConst0(
p)->fMark0 = 1;
374 pObj->
fMark0 = (Gia_ObjRefNum(
p, pObj) > 1);
383 *pnObjs = Counter + Gia_ManCoNum(
p);
390 vSuper = Vec_IntAlloc( 100 );
391 vVisit = Vec_IntAlloc( 100 );
401 Gia_ObjRefInc(
p, pFanin );
403 Counter += Vec_IntSize( vSuper );
406 Vec_IntFree( vSuper );
407 Vec_IntFree( vVisit );
412 Gia_ObjRefInc(
p, pObj );
414 *pnFanios = Counter + Gia_ManCoNum(
p);
434 int nObjs, nFanios, nNodes = 0;
435 int i, k, hHandle = 0;
444 p->nRegs = Gia_ManRegNum(pGia);
445 p->vCis = Vec_IntAlloc( Gia_ManCiNum(pGia) );
446 p->vCos = Vec_IntAlloc( Gia_ManCoNum(pGia) );
447 p->nObjData = (
sizeof(
Frc_Obj_t) / 4) * nObjs + 2 * nFanios;
450 Gia_ManConst0(pGia)->Value = hHandle;
451 pObjLog = Frc_ManObj(
p, hHandle );
452 pObjLog->hHandle = hHandle;
453 pObjLog->nFanins = 0;
454 pObjLog->nFanouts = Gia_ObjRefNum( pGia, Gia_ManConst0(pGia) );
456 hHandle += Frc_ObjSize( pObjLog );
463 pObj->
Value = hHandle;
464 Vec_IntPush(
p->vCis, hHandle );
465 pObjLog = Frc_ManObj(
p, hHandle );
466 pObjLog->hHandle = hHandle;
467 pObjLog->nFanins = 0;
468 pObjLog->nFanouts = Gia_ObjRefNum( pGia, pObj );
471 hHandle += Frc_ObjSize( pObjLog );
475 vSuper = Vec_IntAlloc( 100 );
476 vVisit = Vec_IntAlloc( 100 );
481 assert( Gia_ObjRefNum( pGia, pObj ) == 0 );
484 assert( Gia_ObjRefNum( pGia, pObj ) > 0 );
487 pObj->
Value = hHandle;
488 pObjLog = Frc_ManObj(
p, hHandle );
489 pObjLog->hHandle = hHandle;
490 pObjLog->nFanins = Vec_IntSize( vSuper );
491 pObjLog->nFanouts = Gia_ObjRefNum( pGia, pObj );
495 pFanLog = Frc_ManObj(
p, Gia_ObjValue(pFanin) );
499 hHandle += Frc_ObjSize( pObjLog );
503 Vec_IntFree( vSuper );
504 Vec_IntFree( vVisit );
509 pObj->
Value = hHandle;
510 Vec_IntPush(
p->vCos, hHandle );
511 pObjLog = Frc_ManObj(
p, hHandle );
512 pObjLog->hHandle = hHandle;
513 pObjLog->nFanins = 1;
514 pObjLog->nFanouts = 0;
517 pFanLog = Frc_ManObj(
p, Gia_ObjValue(Gia_ObjFanin0(pObj)) );
520 hHandle += Frc_ObjSize( pObjLog );
527 assert( nNodes == Frc_ManNodeNum(
p) );
529 assert( hHandle ==
p->nObjData );
530 if ( hHandle !=
p->nObjData )
531 printf(
"Frc_ManStart(): Fatal error in internal representation.\n" );
535 if ( !~Gia_ObjValue(pObj) )
537 pObjLog = Frc_ManObj(
p, Gia_ObjValue(pObj) );
538 assert( pObjLog->nFanins == pObjLog->iFanin );
539 assert( pObjLog->nFanouts == pObjLog->iFanout );
540 pObjLog->iFanin = pObjLog->iFanout = 0;
561 printf(
"i/o =%7d/%7d ", Frc_ManPiNum(
p), Frc_ManPoNum(
p) );
562 if ( Frc_ManRegNum(
p) )
563 printf(
"ff =%7d ", Frc_ManRegNum(
p) );
564 printf(
"node =%8d ", Frc_ManNodeNum(
p) );
565 printf(
"obj =%8d ", Frc_ManObjNum(
p) );
568 printf(
"mem =%5.2f MB", 4.0*
p->nObjData/(1<<20) );
586 Vec_IntFree(
p->vCis );
587 Vec_IntFree(
p->vCos );
606 assert( pObj->iFanout > 0 );
607 if ( pObj->iFanout-- == pObj->nFanouts )
612 p->nCutMax = Abc_MaxInt(
p->nCutMax,
p->nCutCur );
613 if ( !Frc_ObjIsCi(pObj) )
617 return pObj->iFanout == 0;
633 assert( pObj->iFanout > 0 );
634 if ( pObj->iFanout-- == pObj->nFanouts )
639 p->nCutMax = Abc_MaxInt(
p->nCutMax,
p->nCutCur );
640 if ( !Frc_ObjIsCi(pObj) )
644 return pObj->iFanout == 0;
662 assert( Vec_IntSize(vOrder) == Frc_ManCoNum(
p) );
666 pObj->iFanout = pObj->nFanouts;
669 assert( Frc_ObjIsCo(pObj) );
697 vCoOrder = Vec_IntAlloc( Frc_ManCoNum(
p) );
699 Vec_IntPush( vCoOrder, pObj->hHandle );
721 Vec_IntReverseOrder( vOrder );
724 Vec_IntReverseOrder( vOrder );
725 if ( vOrder != vOrderInit )
726 Vec_IntFree( vOrder );
747 int i, h, Temp, iNext, Counter;
749 for ( i = 0; i <
p->nObjs; i++ )
751 for ( i = 0; i <
p->nObjs; i++ )
754 Temp = pPlacement[i];
755 pPlacement[i] = pPlacement[iNext];
756 pPlacement[iNext] = Temp;
760 pThis->pPlace = pPlacement[Counter++];
778 for ( i = 0; i < vArray->nSize; i++ )
781 Temp = vArray->pArray[i];
782 vArray->pArray[i] = vArray->pArray[iNext];
783 vArray->pArray[iNext] = Temp;
800 assert( pObj->iFanout > 0 );
801 if ( pObj->iFanout-- == pObj->nFanouts )
805 if ( !Frc_ObjIsCi(pObj) )
808 pObj->pPlace = (*piPlace)++;
829 pObj->iFanout = pObj->nFanouts;
830 if ( pObj->nFanouts == 0 && !Frc_ObjIsCo(pObj) )
831 pObj->pPlace = nPlaces++;
835 assert( Frc_ObjIsCo(pObj) );
837 pObj->pPlace = nPlaces++;
855 int nCutStart1, nCutStart2;
857 Vec_IntReverseOrder( vCoOrder );
859 if ( nCutStart1 <= nCutStart2 )
861 Vec_IntReverseOrder( vCoOrder );
863 *piCutSize2 = nCutStart2;
869 Vec_IntReverseOrder( vCoOrder );
870 *piCutSize2 = nCutStart1;
891 double CostThis, CostPrev;
892 float * pVertX, VertX;
893 int * pPermX, * pHandles;
894 int k, h, Iter, iMinX, iMaxX, Counter, nCutStart, nCutCur, nCutCur2, nCutPrev;
895 abctime clk = Abc_Clock(), clk2, clk2Total = 0;
903 nCutPrev = nCutStart;
906 for ( Iter = 0; Iter < nIters; Iter++ )
912 iMinX = iMaxX = pThis->pPlace;
915 iMinX = Abc_MinInt( iMinX, pNext->pPlace );
916 iMaxX = Abc_MaxInt( iMaxX, pNext->pPlace );
918 pThis->fEdgeCenter = 0.5 * (iMaxX + iMinX);
919 CostThis += (iMaxX - iMinX);
925 VertX = pThis->fEdgeCenter;
927 VertX += pNext->fEdgeCenter;
928 pVertX[Counter] = VertX / (Frc_ObjFaninNum(pThis) + 1);
929 pHandles[Counter++] = h;
931 assert( Counter == Frc_ManObjNum(
p) );
935 clk2Total += Abc_Clock() - clk2;
936 assert( pPermX == pHandles );
937 Vec_IntClear( vCoOrder );
938 for ( k = 0; k <
p->nObjs; k++ )
940 pThis = Frc_ManObj(
p, pPermX[k] );
942 if ( Frc_ObjIsCo(pThis) )
943 Vec_IntPush( vCoOrder, pThis->hHandle );
955 printf(
"%2d : Span = %e ", Iter+1, CostThis );
956 printf(
"Cut = %6d (%5.2f %%) CutR = %6d ", nCutCur, 100.0*(nCutStart-nCutCur)/nCutStart, nCutCur2 );
957 ABC_PRTn(
"Total", Abc_Clock() - clk );
967 Vec_IntFree( vCoOrder );
986 if ( !Frc_ObjIsCo(pNext) )
1006 int i, k, Counter = 0;
1011 pThis->iFanin = Counter++;
1016 pFile = fopen(
"x\\large\\aig\\dg1.g",
"w" );
1021 if ( ~pThis->iFanin && ~pNext->iFanin )
1022 fprintf( pFile,
"%d %d\n", pThis->iFanin, pNext->iFanin );
1070 int i, Size, Exp = 25;
1075 printf(
"2^%d machine words (%d bytes).\n", Exp, (
int)
sizeof(
int) * Size );
1078 for ( i = 0; i < Size; i++ )
1080ABC_PRT(
"Fillup", Abc_Clock() - clk );
1083 pFile = fopen(
"test.txt",
"rb" );
1084 RetValue = fread( pBuffer, 1,
sizeof(
int) * Size, pFile );
1086ABC_PRT(
"Read ", Abc_Clock() - clk );
1089 pFile = fopen(
"test.txt",
"wb" );
1090 fwrite( pBuffer, 1,
sizeof(
int) * Size, pFile );
1092ABC_PRT(
"Write ", Abc_Clock() - clk );
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Frc_ObjForEachFaninReverse(pObj, pNext, i)
void Frc_ManPlaceDfs_rec(Frc_Man_t *p, Frc_Obj_t *pObj, int *piPlace)
Vec_Int_t * Frc_ManCollectCos(Frc_Man_t *p)
void Frc_ManCollectSuper_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vSuper, Vec_Int_t *vVisit)
void Frc_ManTransformRefs(Gia_Man_t *p, int *pnObjs, int *pnFanios)
void Frc_DumpGraphIntoFile(Frc_Man_t *p)
int Frc_ManCrossCut(Frc_Man_t *p, Vec_Int_t *vOrder, int fReverse)
void Frc_ManCreateRefsSpecial(Gia_Man_t *p)
#define Frc_ManForEachObj(p, pObj, i)
void For_ManExperiment(Gia_Man_t *pGia, int nIters, int fClustered, int fVerbose)
Frc_Man_t * Frc_ManStartSimple(Gia_Man_t *pGia)
int Frc_ManPlaceDfsBoth(Frc_Man_t *p, Vec_Int_t *vCoOrder, int *piCutSize2)
void Frc_ManStop(Frc_Man_t *p)
Frc_Man_t * Frc_ManStart(Gia_Man_t *pGia)
#define Frc_ManForEachCo(p, pObj, i)
#define Frc_ObjForEachFanin(pObj, pNext, i)
struct Frc_Man_t_ Frc_Man_t
void Frc_ManPlaceRandom(Frc_Man_t *p)
void Frc_ManPrintStats(Frc_Man_t *p)
void Frc_ManCollectSuper(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vSuper, Vec_Int_t *vVisit)
int Frc_ObjFanoutsAreCos(Frc_Obj_t *pThis)
#define Frc_ObjForEachFanout(pObj, pNext, i)
#define Frc_ManForEachObjVec(vVec, p, pObj, i)
typedefABC_NAMESPACE_IMPL_START struct Frc_Obj_t_ Frc_Obj_t
DECLARATIONS ///.
int Frc_ManCrossCut_rec(Frc_Man_t *p, Frc_Obj_t *pObj)
void Frc_ManCrossCutTest(Frc_Man_t *p, Vec_Int_t *vOrderInit)
void For_ManFileExperiment()
void Frc_ObjAddFanin(Frc_Obj_t *pObj, Frc_Obj_t *pFanin)
FUNCTION DEFINITIONS ///.
void Frc_ManPlaceDfs(Frc_Man_t *p, Vec_Int_t *vCoOrder)
void Frc_ManArrayShuffle(Vec_Int_t *vArray)
int Frc_ManCrossCut2_rec(Frc_Man_t *p, Frc_Obj_t *pObj)
void Frc_ManPlacementRefine(Frc_Man_t *p, int nIters, int fVerbose)
Gia_Obj_t * Gia_ObjRecognizeMux(Gia_Obj_t *pNode, Gia_Obj_t **ppNodeT, Gia_Obj_t **ppNodeE)
#define Gia_ManForEachAnd(p, pObj, i)
int * Gia_SortFloats(float *pArray, int *pPerm, int nSize)
struct Gia_Obj_t_ Gia_Obj_t
int Gia_ObjIsMuxType(Gia_Obj_t *pNode)
void Gia_ManFillValue(Gia_Man_t *p)
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
void Gia_ManCleanMark0(Gia_Man_t *p)
void Gia_ManCreateRefs(Gia_Man_t *p)
void Gia_ManCheckMark1(Gia_Man_t *p)
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
unsigned Gia_ManRandom(int fReset)
FUNCTION DEFINITIONS ///.
#define Gia_ManForEachCoDriver(p, pObj, i)
void Gia_ManCleanMark1(Gia_Man_t *p)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.