43#define GIA_PLACE_SIZE 0x7fff
90static inline int Emb_ManRegNum(
Emb_Man_t *
p ) {
return p->nRegs; }
91static inline int Emb_ManCiNum(
Emb_Man_t *
p ) {
return Vec_IntSize(
p->vCis); }
92static inline int Emb_ManCoNum(
Emb_Man_t *
p ) {
return Vec_IntSize(
p->vCos); }
93static inline int Emb_ManPiNum(
Emb_Man_t *
p ) {
return Vec_IntSize(
p->vCis) -
p->nRegs; }
94static inline int Emb_ManPoNum(
Emb_Man_t *
p ) {
return Vec_IntSize(
p->vCos) -
p->nRegs; }
95static inline int Emb_ManObjNum(
Emb_Man_t *
p ) {
return p->nObjs; }
96static inline int Emb_ManNodeNum(
Emb_Man_t *
p ) {
return p->nObjs - Vec_IntSize(
p->vCis) - Vec_IntSize(
p->vCos); }
99static inline Emb_Obj_t * Emb_ManCi(
Emb_Man_t *
p,
int i ) {
return Emb_ManObj(
p, Vec_IntEntry(
p->vCis,i) ); }
100static inline Emb_Obj_t * Emb_ManCo(
Emb_Man_t *
p,
int i ) {
return Emb_ManObj(
p, Vec_IntEntry(
p->vCos,i) ); }
102static inline int Emb_ObjIsTerm(
Emb_Obj_t * pObj ) {
return pObj->
fCi || pObj->
fCo; }
103static inline int Emb_ObjIsCi(
Emb_Obj_t * pObj ) {
return pObj->
fCi; }
104static inline int Emb_ObjIsCo(
Emb_Obj_t * pObj ) {
return pObj->
fCo; }
107static inline int Emb_ObjIsNode(
Emb_Obj_t * pObj ) {
return!Emb_ObjIsTerm(pObj) && pObj->
nFanins > 0; }
111static inline int Emb_ObjFaninNum(
Emb_Obj_t * pObj ) {
return pObj->
nFanins; }
117static inline void Emb_ManIncrementTravId(
Emb_Man_t *
p ) {
p->nTravIds++; }
118static inline void Emb_ObjSetTravId(
Emb_Obj_t * pObj,
int TravId ) { pObj->
TravId = TravId; }
122static inline int Emb_ObjIsTravIdPrevious(
Emb_Man_t *
p,
Emb_Obj_t * pObj ) {
return ((
int)pObj->
TravId ==
p->nTravIds - 1); }
125static inline float * Emb_ManSol(
Emb_Man_t *
p,
int v ) {
return p->pSols + v *
p->nObjs; }
127#define Emb_ManForEachObj( p, pObj, i ) \
128 for ( i = 0; (i < p->nObjData) && (pObj = Emb_ManObj(p,i)); i += Emb_ObjSize(pObj) )
129#define Emb_ManForEachNode( p, pObj, i ) \
130 for ( i = 0; (i < p->nObjData) && (pObj = Emb_ManObj(p,i)); i += Emb_ObjSize(pObj) ) if ( Emb_ObjIsTerm(pObj) ) {} else
131#define Emb_ManForEachObjVec( vVec, p, pObj, i ) \
132 for ( i = 0; (i < Vec_IntSize(vVec)) && ((pObj) = Emb_ManObj(p, Vec_IntEntry(vVec,i))); i++ )
133#define Emb_ObjForEachFanin( pObj, pNext, i ) \
134 for ( i = 0; (i < (int)pObj->nFanins) && (pNext = Emb_ObjFanin(pObj,i)); i++ )
135#define Emb_ObjForEachFanout( pObj, pNext, i ) \
136 for ( i = 0; (i < (int)pObj->nFanouts) && (pNext = Emb_ObjFanout(pObj,i)); i++ )
177 int i, nNodes, hHandle = 0;
183 p->nRegs = Gia_ManRegNum(pGia);
184 p->vCis = Vec_IntAlloc( Gia_ManCiNum(pGia) );
185 p->vCos = Vec_IntAlloc( Gia_ManCoNum(pGia) );
186 p->nObjData = (
sizeof(
Emb_Obj_t) / 4) * Gia_ManObjNum(pGia) + 2 * (2 * Gia_ManAndNum(pGia) + Gia_ManCoNum(pGia) + Gia_ManRegNum(pGia) + Gia_ManCoNum(pGia));
189 Gia_ManConst0(pGia)->Value = hHandle;
190 pObjLog = Emb_ManObj(
p, hHandle );
192 pObjLog->
nFanins = Gia_ManCoNum(pGia);
193 pObjLog->
nFanouts = Gia_ObjRefNum( pGia, Gia_ManConst0(pGia) );
195 hHandle += Emb_ObjSize( pObjLog );
202 pObj->
Value = hHandle;
203 Vec_IntPush(
p->vCis, hHandle );
204 pObjLog = Emb_ManObj(
p, hHandle );
206 pObjLog->
nFanins = Gia_ObjIsRo( pGia, pObj );
207 pObjLog->
nFanouts = Gia_ObjRefNum( pGia, pObj );
210 hHandle += Emb_ObjSize( pObjLog );
216 assert( Gia_ObjRefNum( pGia, pObj ) > 0 );
218 pObj->
Value = hHandle;
219 pObjLog = Emb_ManObj(
p, hHandle );
222 pObjLog->
nFanouts = Gia_ObjRefNum( pGia, pObj );
224 pFanLog = Emb_ManObj(
p, Gia_ObjValue(Gia_ObjFanin0(pObj)) );
226 pFanLog = Emb_ManObj(
p, Gia_ObjValue(Gia_ObjFanin1(pObj)) );
229 hHandle += Emb_ObjSize( pObjLog );
237 pObj->
Value = hHandle;
238 Vec_IntPush(
p->vCos, hHandle );
239 pObjLog = Emb_ManObj(
p, hHandle );
242 pObjLog->
nFanouts = 1 + Gia_ObjIsRi( pGia, pObj );
245 pFanLog = Emb_ManObj(
p, Gia_ObjValue(Gia_ObjFanin0(pObj)) );
248 hHandle += Emb_ObjSize( pObjLog );
253 Emb_ObjAddFanin( Emb_ManObj(
p,Gia_ObjValue(pObjRo)), Emb_ManObj(
p,Gia_ObjValue(pObjRi)) );
254 assert( nNodes == Emb_ManNodeNum(
p) );
255 assert( hHandle ==
p->nObjData );
256 assert(
p->nObjs == Gia_ManObjNum(pGia) );
257 if ( hHandle !=
p->nObjData )
258 printf(
"Emb_ManStartSimple(): Fatal error in internal representation.\n" );
262 if ( !~Gia_ObjValue(pObj) )
264 pObjLog = Emb_ManObj(
p, Gia_ObjValue(pObj) );
289 Vec_IntPush( vVisit, Gia_ObjId(
p, pObj) );
292 Vec_IntPush( vSuper, Gia_ObjId(
p, pObj) );
295 assert( Gia_ObjIsAnd(pObj) );
315 Vec_IntClear( vSuper );
316 Vec_IntClear( vVisit );
322 Gia_ManObj(
p, Entry)->fMark1 = 0;
347 pFan0 = Gia_ObjFanin0(pObj);
348 pFan1 = Gia_ObjFanin1(pObj);
350 if ( Gia_ObjIsCi(pFan0) || pFan0->
fMark0 ||
351 Gia_ObjIsCi(pFan1) || pFan1->
fMark0 )
362 Gia_ObjRefDec(
p, Gia_Regular(pObjC) );
363 if ( Gia_Regular(pObjD0) == Gia_Regular(pObjD1) )
364 Gia_ObjRefDec(
p, Gia_Regular(pObjD0) );
367 assert( Gia_ObjRefNum(
p, pObj) > 0 );
391 Gia_ManConst0(
p)->fMark0 = 1;
397 pObj->
fMark0 = (Gia_ObjRefNum(
p, pObj) > 1);
406 *pnObjs = Counter + Gia_ManCoNum(
p);
413 vSuper = Vec_IntAlloc( 100 );
414 vVisit = Vec_IntAlloc( 100 );
424 Gia_ObjRefInc(
p, pFanin );
426 Counter += Vec_IntSize( vSuper );
429 Vec_IntFree( vSuper );
430 Vec_IntFree( vVisit );
435 Gia_ObjRefInc(
p, pObj );
437 *pnFanios = Counter + Gia_ManCoNum(
p);
476 pObj->
Value = Counter++;
497 Gia_Obj_t * pObj, * pObjRi, * pObjRo, * pFanin;
499 int nObjs, nFanios, nNodes = 0;
500 int i, k, hHandle = 0;
509 p->nRegs = Gia_ManRegNum(pGia);
510 p->vCis = Vec_IntAlloc( Gia_ManCiNum(pGia) );
511 p->vCos = Vec_IntAlloc( Gia_ManCoNum(pGia) );
512 p->nObjData = (
sizeof(
Emb_Obj_t) / 4) * nObjs + 2 * (nFanios + Gia_ManRegNum(pGia) + Gia_ManCoNum(pGia));
515 Gia_ManConst0(pGia)->Value = hHandle;
516 pObjLog = Emb_ManObj(
p, hHandle );
518 pObjLog->
nFanins = Gia_ManCoNum(pGia);
519 pObjLog->
nFanouts = Gia_ObjRefNum( pGia, Gia_ManConst0(pGia) );
521 hHandle += Emb_ObjSize( pObjLog );
528 pObj->
Value = hHandle;
529 Vec_IntPush(
p->vCis, hHandle );
530 pObjLog = Emb_ManObj(
p, hHandle );
532 pObjLog->
nFanins = Gia_ObjIsRo( pGia, pObj );
533 pObjLog->
nFanouts = Gia_ObjRefNum( pGia, pObj );
536 hHandle += Emb_ObjSize( pObjLog );
540 vSuper = Vec_IntAlloc( 100 );
541 vVisit = Vec_IntAlloc( 100 );
546 assert( Gia_ObjRefNum( pGia, pObj ) == 0 );
549 assert( Gia_ObjRefNum( pGia, pObj ) > 0 );
552 pObj->
Value = hHandle;
553 pObjLog = Emb_ManObj(
p, hHandle );
555 pObjLog->
nFanins = Vec_IntSize( vSuper );
556 pObjLog->
nFanouts = Gia_ObjRefNum( pGia, pObj );
560 pFanLog = Emb_ManObj(
p, Gia_ObjValue(pFanin) );
564 hHandle += Emb_ObjSize( pObjLog );
568 Vec_IntFree( vSuper );
569 Vec_IntFree( vVisit );
574 pObj->
Value = hHandle;
575 Vec_IntPush(
p->vCos, hHandle );
576 pObjLog = Emb_ManObj(
p, hHandle );
579 pObjLog->
nFanouts = 1 + Gia_ObjIsRi( pGia, pObj );
582 pFanLog = Emb_ManObj(
p, Gia_ObjValue(Gia_ObjFanin0(pObj)) );
585 hHandle += Emb_ObjSize( pObjLog );
590 Emb_ObjAddFanin( Emb_ManObj(
p,Gia_ObjValue(pObjRo)), Emb_ManObj(
p,Gia_ObjValue(pObjRi)) );
592 assert( nNodes == Emb_ManNodeNum(
p) );
594 assert( hHandle ==
p->nObjData );
595 if ( hHandle !=
p->nObjData )
596 printf(
"Emb_ManStart(): Fatal error in internal representation.\n" );
600 if ( !~Gia_ObjValue(pObj) )
602 pObjLog = Emb_ManObj(
p, Gia_ObjValue(pObj) );
626 printf(
"i/o =%7d/%7d ", Emb_ManPiNum(
p), Emb_ManPoNum(
p) );
627 if ( Emb_ManRegNum(
p) )
628 printf(
"ff =%7d ", Emb_ManRegNum(
p) );
629 printf(
"node =%8d ", Emb_ManNodeNum(
p) );
630 printf(
"obj =%8d ", Emb_ManObjNum(
p) );
633 printf(
"mem =%5.2f MB", 4.0*
p->nObjData/(1<<20) );
653 Vec_IntFree(
p->vCis );
654 Vec_IntFree(
p->vCos );
680 int nFanins, nFanouts, nFaninsMax, nFanoutsMax, nFaninsAll, nFanoutsAll;
684 nFaninsMax = nFanoutsMax = 0;
685 nFaninsAll = nFanoutsAll = 0;
688 if ( i == 0 )
continue;
689 nFanins = Emb_ObjFaninNum(pNode);
690 nFanouts = Emb_ObjFanoutNum(pNode);
691 nFaninsAll += nFanins;
692 nFanoutsAll += nFanouts;
693 nFaninsMax = Abc_MaxInt( nFaninsMax, nFanins );
694 nFanoutsMax = Abc_MaxInt( nFanoutsMax, nFanouts );
698 nSizeMax = Abc_MaxInt( 10 * (Abc_Base10Log(nFaninsMax) + 1), 10 * (Abc_Base10Log(nFanoutsMax) + 1) );
699 vFanins = Vec_IntStart( nSizeMax );
700 vFanouts = Vec_IntStart( nSizeMax );
705 if ( i == 0 )
continue;
706 nFanins = Emb_ObjFaninNum(pNode);
707 nFanouts = Emb_ObjFanoutNum(pNode);
710 Vec_IntAddToEntry( vFanins, nFanins, 1 );
711 else if ( nFanins < 100 )
712 Vec_IntAddToEntry( vFanins, 10 + nFanins/10, 1 );
713 else if ( nFanins < 1000 )
714 Vec_IntAddToEntry( vFanins, 20 + nFanins/100, 1 );
715 else if ( nFanins < 10000 )
716 Vec_IntAddToEntry( vFanins, 30 + nFanins/1000, 1 );
717 else if ( nFanins < 100000 )
718 Vec_IntAddToEntry( vFanins, 40 + nFanins/10000, 1 );
719 else if ( nFanins < 1000000 )
720 Vec_IntAddToEntry( vFanins, 50 + nFanins/100000, 1 );
721 else if ( nFanins < 10000000 )
722 Vec_IntAddToEntry( vFanins, 60 + nFanins/1000000, 1 );
725 Vec_IntAddToEntry( vFanouts, nFanouts, 1 );
726 else if ( nFanouts < 100 )
727 Vec_IntAddToEntry( vFanouts, 10 + nFanouts/10, 1 );
728 else if ( nFanouts < 1000 )
729 Vec_IntAddToEntry( vFanouts, 20 + nFanouts/100, 1 );
730 else if ( nFanouts < 10000 )
731 Vec_IntAddToEntry( vFanouts, 30 + nFanouts/1000, 1 );
732 else if ( nFanouts < 100000 )
733 Vec_IntAddToEntry( vFanouts, 40 + nFanouts/10000, 1 );
734 else if ( nFanouts < 1000000 )
735 Vec_IntAddToEntry( vFanouts, 50 + nFanouts/100000, 1 );
736 else if ( nFanouts < 10000000 )
737 Vec_IntAddToEntry( vFanouts, 60 + nFanouts/1000000, 1 );
740 printf(
"The distribution of fanins and fanouts in the network:\n" );
741 printf(
" Number Nodes with fanin Nodes with fanout\n" );
742 for ( k = 0; k < nSizeMax; k++ )
744 if ( vFanins->pArray[k] == 0 && vFanouts->pArray[k] == 0 )
747 printf(
"%15d : ", k );
750 sprintf( Buffer,
"%d - %d", (
int)pow((
double)10, k/10) * (k%10), (
int)pow((
double)10, k/10) * (k%10+1) - 1 );
751 printf(
"%15s : ", Buffer );
753 if ( vFanins->pArray[k] == 0 )
756 printf(
"%12d ", vFanins->pArray[k] );
758 if ( vFanouts->pArray[k] == 0 )
761 printf(
"%12d ", vFanouts->pArray[k] );
764 Vec_IntFree( vFanins );
765 Vec_IntFree( vFanouts );
767 printf(
"Fanins: Max = %d. Ave = %.2f. Fanouts: Max = %d. Ave = %.2f.\n",
768 nFaninsMax, 1.0*nFaninsAll/Emb_ManNodeNum(
p),
769 nFanoutsMax, 1.0*nFanoutsAll/Emb_ManNodeNum(
p) );
787 int i, k, d, nVisited = 0;
789 vThis = Vec_IntAlloc( 1000 );
790 vNext = Vec_IntAlloc( 1000 );
791 Emb_ManIncrementTravId(
p );
792 Emb_ObjSetTravIdCurrent(
p, pPivot );
793 Vec_IntPush( vThis, pPivot->
hHandle );
794 for ( d = 0; Vec_IntSize(vThis) > 0; d++ )
796 nVisited += Vec_IntSize(vThis);
797 Vec_IntClear( vNext );
802 if ( Emb_ObjIsTravIdCurrent(
p, pNext) )
804 Emb_ObjSetTravIdCurrent(
p, pNext);
805 Vec_IntPush( vNext, pNext->
hHandle );
806 nVisited += !Emb_ObjIsTerm(pNext);
810 if ( Emb_ObjIsTravIdCurrent(
p, pNext) )
812 Emb_ObjSetTravIdCurrent(
p, pNext);
813 Vec_IntPush( vNext, pNext->
hHandle );
814 nVisited += !Emb_ObjIsTerm(pNext);
817 vTemp = vThis; vThis = vNext; vNext = vTemp;
819 Vec_IntFree( vThis );
820 Vec_IntFree( vNext );
845 Emb_ManResetTravId(
p );
848 printf(
"From inputs: " );
849 for ( i = 0; i < nAttempts; i++ )
852 pPivot = Emb_ManCi(
p, iNode );
853 if ( Emb_ObjFanoutNum(pPivot) == 0 )
855 pNext = Emb_ObjFanout( pPivot, 0 );
856 if ( !Emb_ObjIsNode(pNext) )
859 printf(
"%d ",
Dist );
861 ABC_PRT(
"Time", Abc_Clock() - clk );
864 printf(
"From outputs: " );
865 for ( i = 0; i < nAttempts; i++ )
868 pPivot = Emb_ManCo(
p, iNode );
869 pNext = Emb_ObjFanin( pPivot, 0 );
870 if ( !Emb_ObjIsNode(pNext) )
873 printf(
"%d ",
Dist );
875 ABC_PRT(
"Time", Abc_Clock() - clk );
878 printf(
"From nodes: " );
879 for ( i = 0; i < nAttempts; i++ )
882 if ( !~Gia_ManObj(
p->pGia, iNode)->Value )
884 pPivot = Emb_ManObj(
p, Gia_ManObj(
p->pGia, iNode)->Value );
885 if ( !Emb_ObjIsNode(pPivot) )
888 printf(
"%d ",
Dist );
890 ABC_PRT(
"Time", Abc_Clock() - clk );
911ABC_PRT(
"Time", Abc_Clock() - clk );
935 assert( Vec_IntSize(vThis) > 0 );
936 for (
p->nDistMax = 0; Vec_IntSize(vThis) > 0;
p->nDistMax++ )
938 p->nReached += Vec_IntSize(vThis);
939 Vec_IntClear( vNext );
942 if ( pDist ) pDist[pThis->
Value] =
p->nDistMax;
945 if ( Emb_ObjIsTravIdCurrent(
p, pNext) )
947 Emb_ObjSetTravIdCurrent(
p, pNext);
948 Vec_IntPush( vNext, pNext->
hHandle );
952 if ( Emb_ObjIsTravIdCurrent(
p, pNext) )
954 Emb_ObjSetTravIdCurrent(
p, pNext);
955 Vec_IntPush( vNext, pNext->
hHandle );
958 vTemp = vThis; vThis = vNext; vNext = vTemp;
960 assert( Vec_IntSize(vNext) > 0 );
961 pResult = Emb_ManObj(
p, Vec_IntEntry(vNext, 0) );
962 assert( pDist == NULL || pDist[pResult->
Value] ==
p->nDistMax - 1 );
983 vResult = Vec_IntAlloc( 1000 );
984 vThis = Vec_IntAlloc( 1000 );
985 vNext = Vec_IntAlloc( 1000 );
987 Emb_ManIncrementTravId(
p );
990 pThis = Emb_ManObj(
p, Gia_ObjValue(pObj) );
991 if ( Emb_ObjIsTravIdCurrent(
p, pThis) )
993 Emb_ObjSetTravIdCurrent(
p, pThis );
994 Vec_IntPush( vResult, pThis->
hHandle );
996 Vec_IntClear( vThis );
997 Vec_IntPush( vThis, pThis->
hHandle );
1000 Vec_IntFree( vThis );
1001 Vec_IntFree( vNext );
1021 p->nReached =
p->nDistMax = 0;
1022 vThis = Vec_IntAlloc( 1000 );
1023 vNext = Vec_IntAlloc( 1000 );
1024 Emb_ManIncrementTravId(
p );
1027 Emb_ObjSetTravIdCurrent(
p, pThis );
1028 Vec_IntPush( vThis, pThis->
hHandle );
1031 Vec_IntFree( vThis );
1032 Vec_IntFree( vNext );
1052 if ( ~Gia_ManObj(
p->pGia, iNode)->Value )
1053 pPivot = Emb_ManObj(
p, Gia_ManObj(
p->pGia, iNode)->Value );
1057 while ( pPivot == NULL || !Emb_ObjIsNode(pPivot) );
1077 pFile = fopen(
"1.g",
"w" );
1080 if ( !Emb_ObjIsTravIdCurrent(
p, pThis) )
1084 assert( Emb_ObjIsTravIdCurrent(
p, pNext) );
1085 fprintf( pFile,
"%d %d\n", pThis->
Value, pNext->
Value );
1111 if ( Vec_IntSize(vComps) > 1 )
1113 Emb_Obj_t * pFanin, * pObj = Emb_ManObj(
p, 0 );
1116 assert( Emb_ObjIsCo(pFanin) );
1121 Vec_IntFree( vComps );
1127 vStart = Vec_IntAlloc( nDims );
1130 Vec_IntPush( vStart, pRandom->
hHandle );
1134 nReached =
p->nReached;
1135 if ( nReached < Emb_ManObjNum(
p) )
1140 Vec_IntClear( vStart );
1141 for ( d = 0; d < nDims; d++ )
1144 Vec_IntPush( vStart, pPivot->
hHandle );
1145 if ( d+1 == nReached )
1148 assert( nReached ==
p->nReached );
1150 Vec_IntFree( vStart );
1173 float ** pMatr = (
float **)
ABC_ALLOC(
char,
sizeof(
float *) * nDims +
sizeof(
float) * nDims * nDims );
1174 pMatr[0] = (
float *)(pMatr + nDims);
1175 for ( i = 1; i < nDims; i++ )
1176 pMatr[i] = pMatr[i-1] + nDims;
1198 for ( d = 0; d < nDims; d++ )
1202 pOne = Emb_ManVec(
p, d );
1203 for ( v = 0; v <
p->nObjs; v++ )
1208 for ( v = 0; v <
p->nObjs; v++ )
1219 for ( i = 0; i < nDims; i++ )
1221 pOne = Emb_ManVec(
p, i );
1223 for ( k = 0; k < nDims; k++ )
1225 pTwo = Emb_ManVec(
p, k );
1227 for ( v = 0; v <
p->nObjs; v++ )
1228 pRow[k] += pOne[v]*pTwo[v];
1247 for ( i = 0; i < nDims; i++ )
1266 for ( i = 0; i < nDims; i++ )
1267 Norm += pVec[i] * pVec[i];
1268 Norm = pow( Norm, 0.5 );
1269 for ( i = 0; i < nDims; i++ )
1288 for ( i = 0; i < nDims; i++ )
1289 Res += pVec0[i] * pVec1[i];
1307 for ( i = 0; i < nDims; i++ )
1308 pVecDest[i] = pVecSour[i];
1325 for ( k = 0; k < nDims; k++ )
1343 for ( k = 0; k < nDims; k++ )
1360 float * pVecUiHat, * pVecUi;
1363 pVecUiHat =
p->pEigen[nSols];
1364 for ( i = 0; i < nSols; i++ )
1366 pVecUi =
p->pEigen[i];
1373 for ( j = 0; j < i; j++ )
1404 for ( i = 0; i < nDims; i++ )
1406 pX = Emb_ManVec(
p, i );
1407 for ( j = 0; j < nSols; j++ )
1409 pY = Emb_ManSol(
p, j );
1410 for ( k = 0; k <
p->nObjs; k++ )
1411 pY[k] += pX[k] *
p->pEigen[j][i];
1429 float * pY0, * pY1, Max0, Max1, Min0, Min1, Str0, Str1;
1430 int * pPerm0, * pPerm1;
1437 pY0 = Emb_ManSol(
p, 0 );
1438 for ( k = 0; k <
p->nObjs; k++ )
1440 Min0 = Abc_MinInt( Min0, pY0[k] );
1441 Max0 = Abc_MaxInt( Max0, pY0[k] );
1445 for ( k = 0; k <
p->nObjs; k++ )
1446 pY0[k] = (pY0[k] != 0.0) ? ((pY0[k] - Min0) * Str0) : 0.0;
1451 pY1 = Emb_ManSol(
p, 1 );
1452 for ( k = 0; k <
p->nObjs; k++ )
1454 Min1 = Abc_MinInt( Min1, pY1[k] );
1455 Max1 = Abc_MaxInt( Max1, pY1[k] );
1459 for ( k = 0; k <
p->nObjs; k++ )
1460 pY1[k] = (pY1[k] != 0.0) ? ((pY1[k] - Min1) * Str1) : 0.0;
1467 p->pPlacement =
ABC_ALLOC(
unsigned short, 2 *
p->nObjs );
1468 for ( k = 0; k <
p->nObjs; k++ )
1470 p->pPlacement[2*pPerm0[k]+0] = (
unsigned short)(
int)(1.0 * k *
GIA_PLACE_SIZE /
p->nObjs);
1471 p->pPlacement[2*pPerm1[k]+1] = (
unsigned short)(
int)(1.0 * k *
GIA_PLACE_SIZE /
p->nObjs);
1491 double Result = 0.0;
1493 int i, k, iMinX, iMaxX, iMinY, iMaxY;
1494 if (
p->pPlacement == NULL )
1498 iMinX = iMaxX =
p->pPlacement[2*pThis->
Value+0];
1499 iMinY = iMaxY =
p->pPlacement[2*pThis->
Value+1];
1502 iMinX = Abc_MinInt( iMinX,
p->pPlacement[2*pNext->
Value+0] );
1503 iMaxX = Abc_MaxInt( iMaxX,
p->pPlacement[2*pNext->
Value+0] );
1504 iMinY = Abc_MinInt( iMinY,
p->pPlacement[2*pNext->
Value+1] );
1505 iMaxY = Abc_MaxInt( iMaxY,
p->pPlacement[2*pNext->
Value+1] );
1507 Result += (iMaxX - iMinX) + (iMaxY - iMinY);
1527 double CostThis, CostPrev;
1528 float * pEdgeX, * pEdgeY;
1529 float * pVertX, * pVertY;
1531 int * pPermX, * pPermY;
1532 int i, k, Iter, iMinX, iMaxX, iMinY, iMaxY;
1534 if (
p->pPlacement == NULL )
1542 for ( Iter = 0; Iter < nIters; Iter++ )
1548 iMinX = iMaxX =
p->pPlacement[2*pThis->
Value+0];
1549 iMinY = iMaxY =
p->pPlacement[2*pThis->
Value+1];
1552 iMinX = Abc_MinInt( iMinX,
p->pPlacement[2*pNext->
Value+0] );
1553 iMaxX = Abc_MaxInt( iMaxX,
p->pPlacement[2*pNext->
Value+0] );
1554 iMinY = Abc_MinInt( iMinY,
p->pPlacement[2*pNext->
Value+1] );
1555 iMaxY = Abc_MaxInt( iMaxY,
p->pPlacement[2*pNext->
Value+1] );
1557 pEdgeX[pThis->
Value] = 0.5 * (iMaxX + iMinX);
1558 pEdgeY[pThis->
Value] = 0.5 * (iMaxY + iMinY);
1559 CostThis += (iMaxX - iMinX) + (iMaxY - iMinY);
1564 VertX = pEdgeX[pThis->
Value];
1565 VertY = pEdgeY[pThis->
Value];
1568 VertX += pEdgeX[pNext->
Value];
1569 VertY += pEdgeY[pNext->
Value];
1571 pVertX[pThis->
Value] = VertX / (Emb_ObjFaninNum(pThis) + 1);
1572 pVertY[pThis->
Value] = VertY / (Emb_ObjFaninNum(pThis) + 1);
1577 for ( k = 0; k <
p->nObjs; k++ )
1579 p->pPlacement[2*pPermX[k]+0] = (
unsigned short)(
int)(1.0 * k *
GIA_PLACE_SIZE /
p->nObjs);
1580 p->pPlacement[2*pPermY[k]+1] = (
unsigned short)(
int)(1.0 * k *
GIA_PLACE_SIZE /
p->nObjs);
1587 printf(
"%2d : HPWL = %e ", Iter+1, CostThis );
1588 ABC_PRT(
"Time", Abc_Clock() - clk );
1613 for ( i = 0; i < nSols; i++ )
1615 pSol = Emb_ManSol(
p, i );
1616 for ( k = 0; k <
p->nObjs; k++ )
1617 printf(
"%4d ", (
int)(100 * pSol[k]) );
1641 char * pBuffer, ** ppRows;
1642 int i, k, placeX, placeY;
1645 pBuffer =
ABC_CALLOC(
char, nRows * (nCols+1) );
1647 for ( i = 0; i < nRows; i++ )
1648 ppRows[i] = pBuffer + i*(nCols+1);
1652 placeX =
p->pPlacement[2*pThis->
Value+0] * nCols / (1<<16);
1653 placeY =
p->pPlacement[2*pThis->
Value+1] * nRows / (1<<16);
1654 assert( placeX < nCols && placeY < nRows );
1655 ppRows[placeY][placeX] = 1;
1658 vLines = Vec_IntAlloc( 1000 );
1659 for ( i = 0; i < nRows; i++ )
1662 for ( k = 0; k <= nCols; k++ )
1664 if ( ppRows[i][k] && !fStart )
1666 Vec_IntPush( vLines, k );
1667 Vec_IntPush( vLines, i );
1670 if ( !ppRows[i][k] && fStart )
1672 Vec_IntPush( vLines, k-1 );
1673 Vec_IntPush( vLines, i );
1699 char * pDirectory =
"";
1705 if (
p->pPlacement == NULL )
1707 printf(
"Emb_ManDumpGnuplot(): Placement is not available.\n" );
1711 pFile = fopen( Buffer,
"w" );
1712 fprintf( pFile,
"# This Gnuplot file was produced by ABC on %s\n",
Ioa_TimeStamp() );
1713 fprintf( pFile,
"\n" );
1714 fprintf( pFile,
"set nokey\n" );
1715 fprintf( pFile,
"\n" );
1719 fprintf( pFile,
"set terminal gif font \'arial\' 10 size 800,600 xffffff x000000 x000000 x000000\n" );
1721 fprintf( pFile,
"\n" );
1723 fprintf( pFile,
"set title \"%s : PI = %d PO = %d FF = %d Node = %d Obj = %d HPWL = %.2e\\n",
1724 pName, Emb_ManPiNum(
p), Emb_ManPoNum(
p), Emb_ManRegNum(
p), Emb_ManNodeNum(
p), Emb_ManObjNum(
p),
Emb_ManComputeHPWL(
p) );
1725 fprintf( pFile,
"(image generated by ABC and Gnuplot on %s)\"",
Ioa_TimeStamp() );
1726 fprintf( pFile,
"font \"Times, 12\"\n" );
1727 fprintf( pFile,
"\n" );
1728 fprintf( pFile,
"plot [:] '-' w l\n" );
1729 fprintf( pFile,
"\n" );
1732 int begX, begY, endX, endY;
1736 begY = Vec_IntEntry( vLines, i+1 );
1737 endX = Vec_IntEntry( vLines, i+2 );
1738 endY = Vec_IntEntry( vLines, i+3 );
1740 fprintf( pFile,
"%5d %5d\n", begX, begY );
1741 fprintf( pFile,
"%5d %5d\n", endX, endY );
1742 fprintf( pFile,
"\n" );
1744 Vec_IntFree( vLines );
1750 if ( !Emb_ObjIsTravIdCurrent(
p, pThis) )
1754 assert( Emb_ObjIsTravIdCurrent(
p, pNext) );
1755 fprintf( pFile,
"%5d %5d\n",
p->pPlacement[2*pThis->
Value+0],
p->pPlacement[2*pThis->
Value+1] );
1756 fprintf( pFile,
"%5d %5d\n",
p->pPlacement[2*pNext->
Value+0],
p->pPlacement[2*pNext->
Value+1] );
1757 fprintf( pFile,
"\n" );
1761 fprintf( pFile,
"EOF\n" );
1762 fprintf( pFile,
"\n" );
1765 fprintf( pFile,
"pause -1 \"Close window\"\n" );
1766 fprintf( pFile,
"reset\n" );
1767 fprintf( pFile,
"\n" );
1771 fprintf( pFile,
"# pause -1 \"Close window\"\n" );
1772 fprintf( pFile,
"# reset\n" );
1773 fprintf( pFile,
"\n" );
1806 printf(
"Clustered: " );
1817 Emb_ManResetTravId(
p );
1819clkSetup = Abc_Clock() - clk;
1826ABC_PRT(
"Dimensions", Abc_Clock() - clk );
1831ABC_PRT(
"Matrix ", Abc_Clock() - clk );
1838ABC_PRT(
"Eigenvecs ", Abc_Clock() - clk );
1845ABC_PRT(
"Refinement", Abc_Clock() - clk );
1853ABC_PRT(
"Image dump", Abc_Clock() - clk );
1857 if ( Gia_ManObjNum(pGia) ==
p->nObjs )
1861 for ( i = 0; i <
p->nObjs; i++ )
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#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 ///.
void Gia_ManGnuplotShow(char *pPlotFileName)
Emb_Obj_t * Emb_ManFindDistances(Emb_Man_t *p, Vec_Int_t *vStart, Emb_Dat_t *pDist)
void Emb_ManVecRandom(float *pVec, int nDims)
void Emb_ManCreateRefsSpecial(Gia_Man_t *p)
#define Emb_ManForEachObj(p, pObj, i)
void Emb_ManCollectSuper_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vSuper, Vec_Int_t *vVisit)
void Emb_ManTransformRefs(Gia_Man_t *p, int *pnObjs, int *pnFanios)
void Emb_ManVecCopyOne(float *pVecDest, float *pVecSour, int nDims)
void Emb_ManStop(Emb_Man_t *p)
int Emb_ManComputeDistance_old(Emb_Man_t *p, Emb_Obj_t *pPivot)
void Emb_ManCollectSuper(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vSuper, Vec_Int_t *vVisit)
void Emb_ManDumpGnuplot(Emb_Man_t *p, char *pName, int fDumpLarge, int fShowImage)
double Emb_ManComputeHPWL(Emb_Man_t *p)
void Emb_ManVecOrthogonolizeOne(float *pEigen, float *pVecI, int nDims, float *pVecRes)
void Emb_ManComputeEigenvectors(Emb_Man_t *p, int nDims, int nSols)
Emb_Man_t * Emb_ManStartSimple(Gia_Man_t *pGia)
#define GIA_PLACE_SIZE
DECLARATIONS ///.
struct Emb_Obj_t_ Emb_Obj_t
float ** Emb_ManMatrAlloc(int nDims)
void Emb_ManComputeSolutions(Emb_Man_t *p, int nDims, int nSols)
Emb_Man_t * Emb_ManStart(Gia_Man_t *pGia)
#define Emb_ManForEachNode(p, pObj, i)
void Gia_ManTestDistanceInternal(Emb_Man_t *p)
void Emb_ManDerivePlacement(Emb_Man_t *p, int nSols)
void Emb_ManPrintStats(Emb_Man_t *p)
#define Emb_ObjForEachFanout(pObj, pNext, i)
#define Emb_ManForEachObjVec(vVec, p, pObj, i)
Vec_Int_t * Emb_ManDumpGnuplotPrepare(Emb_Man_t *p)
void Gia_ManSolveProblem(Gia_Man_t *pGia, Emb_Par_t *pPars)
void Emb_ManPrintFanio(Emb_Man_t *p)
Emb_Obj_t * Emb_ManPerformBfs(Emb_Man_t *p, Vec_Int_t *vThis, Vec_Int_t *vNext, Emb_Dat_t *pDist)
void Emb_ManPlacementRefine(Emb_Man_t *p, int nIters, int fVerbose)
void Emb_ManVecNormal(float *pVec, int nDims)
void Emb_DumpGraphIntoFile(Emb_Man_t *p)
void Emb_ManSetValue(Emb_Man_t *p)
struct Emb_Man_t_ Emb_Man_t
Emb_Obj_t * Emb_ManRandomVertex(Emb_Man_t *p)
#define Emb_ObjForEachFanin(pObj, pNext, i)
void Emb_ManVecMultiply(float **pMatr, float *pVec, int nDims, float *pRes)
void Emb_ObjAddFanin(Emb_Obj_t *pObj, Emb_Obj_t *pFanin)
FUNCTION DEFINITIONS ///.
float Emb_ManVecMultiplyOne(float *pVec0, float *pVec1, int nDims)
void Emb_ManComputeCovariance(Emb_Man_t *p, int nDims)
Vec_Int_t * Emb_ManConnectedComponents(Emb_Man_t *p)
void Emb_ManComputeDimensions(Emb_Man_t *p, int nDims)
void Emb_ManPrintSolutions(Emb_Man_t *p, int nSols)
void Gia_ManTestDistance(Gia_Man_t *pGia)
void Emb_ManCleanTravId(Emb_Man_t *p)
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_Plc_t_ Gia_Plc_t
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)
#define Gia_ManForEachRiRo(p, pObjRi, pObjRo, i)
struct Emb_Par_t_ Emb_Par_t
char * Gia_FileNameGenericAppend(char *pBase, char *pSuffix)
unsigned Gia_ManRandom(int fReset)
FUNCTION DEFINITIONS ///.
#define Gia_ManForEachCoDriver(p, pObj, i)
void Gia_ManCleanMark1(Gia_Man_t *p)
unsigned short * pPlacement
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.