51 p->nVertsMax = nVertsMax;
52 p->nEdgeHash = Abc_PrimeCudd( 3 * nVertsMax );
55 p->vPairs = Vec_IntAlloc( 1000 );
72 if (
p->vPairs ) Vec_IntFree(
p->vPairs );
97 sizeof(
void *) *
p->nEdgeHash +
98 sizeof(int) * (
p->nObjs +
p->nVertsMax) +
102 sizeof(
int) * 2 *
p->nEdges;
103 printf(
"Memory usage stats: Preprocessing = %.2f MB. Solving = %.2f MB.\n",
104 1.0 *
p->nMemBytes1 / (1<<20), 1.0 *
p->nMemBytes2 / (1<<20) );
123 if ( iLut1 == iLut2 )
132 if (
p->nObjs < iLut2 )
134 Key = (unsigned)(741457 * iLut1 + 4256249 * iLut2) %
p->nEdgeHash;
135 for ( pEntry =
p->pEdgeHash[Key]; pEntry; pEntry = pEntry->
pNext )
136 if ( pEntry->
iNode1 == iLut1 && pEntry->
iNode2 == iLut2 )
141 pEntry->
pNext =
p->pEdgeHash[Key];
142 p->pEdgeHash[Key] = pEntry;
162 pHead =
p->pVerts[*pList];
167 *pList = pVertex->
Id;
181static inline void Nwk_ManGraphListDelete(
Nwk_Grf_t *
p,
int * pList,
Nwk_Vrt_t * pVertex )
184 if ( pVertex->
iPrev )
189 if ( pVertex->
iNext )
194 if ( *pList == pVertex->
Id )
195 *pList = pVertex->
iNext;
215 if ( pVertex->
nEdges == 1 )
217 pNext =
p->pVerts[ pVertex->
pEdges[0] ];
221 Nwk_ManGraphListAdd(
p,
p->pLists1 + pNext->
nEdges, pVertex );
228 Nwk_ManGraphListAdd(
p,
p->pLists2 + pVertex->
nEdges, pVertex );
248 if ( pVertex->
nEdges == 1 )
250 pNext =
p->pVerts[ pVertex->
pEdges[0] ];
254 Nwk_ManGraphListDelete(
p,
p->pLists1 + pNext->
nEdges, pVertex );
261 Nwk_ManGraphListDelete(
p,
p->pLists2 + pVertex->
nEdges, pVertex );
280 int * pnEdges, nBytes, i;
284 memset(
p->pMapLut2Id, 0xff,
sizeof(
int) * (
p->nObjs+1) );
285 memset(
p->pMapId2Lut, 0xff,
sizeof(
int) * (
p->nVertsMax+1) );
291 p->pMapLut2Id[ pEntry->
iNode1 ] = 0;
292 p->pMapLut2Id[ pEntry->
iNode2 ] = 0;
296 for ( i = 0; i <=
p->nObjs; i++ )
298 if (
p->pMapLut2Id[i] == 0 )
300 p->pMapLut2Id[i] = ++
p->nVerts;
301 p->pMapId2Lut[
p->nVerts] = i;
316 pnEdges[pEntry->
iNode1]++;
317 pnEdges[pEntry->
iNode2]++;
323 for ( i = 1; i <=
p->nVerts; i++ )
326 nBytes =
sizeof(
Nwk_Vrt_t) +
sizeof(
int) * pnEdges[i];
328 memset(
p->pVerts[i], 0, nBytes );
329 p->pVerts[i]->Id = i;
334 pVertex =
p->pVerts[pEntry->
iNode1];
336 pVertex =
p->pVerts[pEntry->
iNode2];
340 for ( i = 1; i <=
p->nVerts; i++ )
342 assert(
p->pVerts[i]->nEdges == pnEdges[i] );
343 Nwk_ManGraphListInsert(
p,
p->pVerts[i] );
365 int nSize = Vec_IntSize(
p->vPairs);
369 for ( i = 0; i <=
p->nObjs; i++ )
372 for ( i = 0; i <
p->vPairs->nSize; i += 2 )
374 assert( pIdToPair[
p->vPairs->pArray[i] ] == -1 );
375 pIdToPair[
p->vPairs->pArray[i] ] =
p->vPairs->pArray[i+1];
378 Vec_IntClear(
p->vPairs );
379 for ( i = 0; i <=
p->nObjs; i++ )
380 if ( pIdToPair[i] >= 0 )
382 assert( i < pIdToPair[i] );
383 Vec_IntPush(
p->vPairs, i );
384 Vec_IntPush(
p->vPairs, pIdToPair[i] );
386 assert( nSize == Vec_IntSize(
p->vPairs) );
410 pVertex =
p->pVerts[
p->pLists1[i] ];
412 pNext =
p->pVerts[ pVertex->
pEdges[0] ];
421 pVertex =
p->pVerts[
p->pLists2[j] ];
437static inline void Nwk_ManGraphVertexRemoveEdge(
Nwk_Vrt_t * pThis,
Nwk_Vrt_t * pNext )
440 for ( k = 0; k < pThis->
nEdges; k++ )
441 if ( pThis->
pEdges[k] == pNext->
Id )
443 assert( k < pThis->nEdges );
445 for ( ; k < pThis->
nEdges; k++ )
465 Nwk_ManGraphListExtract(
p, pVertex );
466 Nwk_ManGraphListExtract(
p, pNext );
470 if ( pChanged == pNext )
472 Nwk_ManGraphListExtract(
p, pChanged );
474 if ( pChanged->
nEdges > 1 )
477 if ( pOther == pVertex || pOther->
nEdges > 1 )
480 Nwk_ManGraphListExtract(
p, pOther );
482 Nwk_ManGraphListInsert(
p, pOther );
486 Nwk_ManGraphVertexRemoveEdge( pChanged, pVertex );
488 if ( pChanged->
nEdges > 0 )
489 Nwk_ManGraphListInsert(
p, pChanged );
494 if ( pChanged == pVertex )
496 Nwk_ManGraphListExtract(
p, pChanged );
498 if ( pChanged->
nEdges > 1 )
501 if ( pOther == pNext || pOther->
nEdges > 1 )
504 Nwk_ManGraphListExtract(
p, pOther );
506 Nwk_ManGraphListInsert(
p, pOther );
510 Nwk_ManGraphVertexRemoveEdge( pChanged, pNext );
512 if ( pChanged->
nEdges > 0 )
513 Nwk_ManGraphListInsert(
p, pChanged );
516 if ( pVertex->
Id < pNext->
Id )
518 Vec_IntPush(
p->vPairs,
p->pMapId2Lut[pVertex->
Id] );
519 Vec_IntPush(
p->vPairs,
p->pMapId2Lut[pNext->
Id] );
523 Vec_IntPush(
p->vPairs,
p->pMapId2Lut[pNext->
Id] );
524 Vec_IntPush(
p->vPairs,
p->pMapId2Lut[pVertex->
Id] );
547 if ( fVerbose && Counter < 20 )
548 printf(
"%d ",
p->pVerts[pThis->
pEdges[0]]->nEdges );
573 if ( pMinCost == NULL || pMinCost->
nEdges > pThis->
nEdges )
593 int k, Counter = 10000, BestCost = 1000000;
596 for ( k = 0; k < pThis->
nEdges; k++ )
598 if ( pMinCost == NULL || BestCost >
p->pVerts[pThis->
pEdges[k]]->nEdges )
600 BestCost =
p->pVerts[pThis->
pEdges[k]]->nEdges;
604 if ( --Counter == 0 )
635 pVertex =
p->pVerts[
p->pLists1[i] ];
637 pNext =
p->pVerts[ pVertex->
pEdges[0] ];
679 int nNodes, nEdges, iNode1, iNode2;
681 pFile = fopen( pFileName,
"r" );
682 RetValue = fscanf( pFile,
"%s %d", Buffer, &nNodes );
683 RetValue = fscanf( pFile,
"%s %d", Buffer, &nEdges );
685 while ( fscanf( pFile,
"%s %d %d", Buffer, &iNode1, &iNode2 ) == 3 )
709 ABC_PRT(
"Reading", Abc_Clock() - clk );
712 printf(
"GRAPH: Nodes = %6d. Edges = %6d. Pairs = %6d. ",
713 p->nVerts,
p->nEdges, Vec_IntSize(
p->vPairs)/2 );
714 ABC_PRT(
"Solving", Abc_Clock() - clk );
715 nPairs = Vec_IntSize(
p->vPairs)/2;
739 if ( !Nwk_ObjIsNode(pLut) )
741 if ( Nwk_ObjIsTravIdCurrent( pLut ) )
743 Nwk_ObjSetTravIdCurrent( pLut );
744 if ( Nwk_ObjLevel(pLut) < nLevMin )
765 if ( !Nwk_ObjIsNode(pLut) )
767 if ( Nwk_ObjIsTravIdCurrent( pLut ) )
769 Nwk_ObjSetTravIdCurrent( pLut );
770 if ( Nwk_ObjLevel(pLut) > nLevMax )
772 if ( Nwk_ObjFanoutNum(pLut) > nFanMax )
793 Vec_PtrClear( vNext );
798 if ( !Nwk_ObjIsNode(pNext) )
800 if ( Nwk_ObjIsTravIdCurrent( pNext ) )
802 Nwk_ObjSetTravIdCurrent( pNext );
803 Vec_PtrPush( vNext, pNext );
807 if ( !Nwk_ObjIsNode(pNext) )
809 if ( Nwk_ObjIsTravIdCurrent( pNext ) )
811 Nwk_ObjSetTravIdCurrent( pNext );
812 if ( Nwk_ObjFanoutNum(pNext) > nFanMax )
814 Vec_PtrPush( vNext, pNext );
835 Vec_PtrClear( vCands );
841 Vec_PtrClear( vStart );
842 Vec_PtrPush( vStart, pLut );
844 Nwk_ObjSetTravIdCurrent( pLut );
853 Vec_PtrPush( vCands, pObj );
859 Nwk_ObjSetTravIdCurrent( pLut );
862 Nwk_ObjSetTravIdPrevious( pLut );
864 Nwk_ObjSetTravIdPrevious( pLut );
876 if ( Nwk_ObjIsTravIdCurrent(pObj) )
878 if ( Nwk_ObjFaninNum(pLut) + Nwk_ObjFaninNum(pObj) > pPars->
nMaxSuppSize )
880 if ( Nwk_ObjLevel(pLut) - Nwk_ObjLevel(pObj) > pPars->
nMaxLevelDiff ||
881 Nwk_ObjLevel(pObj) - Nwk_ObjLevel(pLut) > pPars->
nMaxLevelDiff )
883 Vec_PtrWriteEntry( vCands, k++, pObj );
885 Vec_PtrShrink( vCands, k );
903 int i, nCounter = Nwk_ObjFaninNum(pLut);
905 nCounter += !pFanin->MarkC;
928 Vec_PtrClear( vCands );
930 Nwk_ObjSetTravIdCurrent( pLut );
933 if ( !Nwk_ObjIsNode(pFanin) )
935 if ( Nwk_ObjFanoutNum(pFanin) > pPars->
nMaxFanout )
939 if ( !Nwk_ObjIsNode(pObj) )
941 if ( Nwk_ObjIsTravIdCurrent( pObj ) )
943 Nwk_ObjSetTravIdCurrent( pObj );
945 if ( Nwk_ObjLevel(pLut) - Nwk_ObjLevel(pObj) > pPars->
nMaxLevelDiff ||
946 Nwk_ObjLevel(pObj) - Nwk_ObjLevel(pLut) > pPars->
nMaxLevelDiff )
951 Vec_PtrPush( vCands, pObj );
975 Vec_Ptr_t * vStart, * vNext, * vCands1, * vCands2;
977 int i, k, nVertsMax, nCands;
982 nVertsMax += (int)(Nwk_ObjFaninNum(pLut) <= pPars->
nMaxLutSize);
985 vStart = Vec_PtrAlloc( 1000 );
986 vNext = Vec_PtrAlloc( 1000 );
987 vCands1 = Vec_PtrAlloc( 1000 );
988 vCands2 = Vec_PtrAlloc( 1000 );
997 if ( Vec_PtrSize(vCands1) == 0 && Vec_PtrSize(vCands2) == 0 )
999 nCands += Vec_PtrSize(vCands1) + Vec_PtrSize(vCands2);
1007 printf(
"Node %6d : Fanins = %d. Fanouts = %3d. Cand1 = %3d. Cand2 = %3d.\n",
1008 Nwk_ObjId(pLut), Nwk_ObjFaninNum(pLut), Nwk_ObjFaninNum(pLut),
1009 Vec_PtrSize(vCands1), Vec_PtrSize(vCands2) );
1011 Vec_PtrFree( vStart );
1012 Vec_PtrFree( vNext );
1013 Vec_PtrFree( vCands1 );
1014 Vec_PtrFree( vCands2 );
1017 printf(
"Mergable LUTs = %6d. Total cands = %6d. ",
p->nVertsMax, nCands );
1018 ABC_PRT(
"Deriving graph", Abc_Clock() - clk );
1025 printf(
"GRAPH: Nodes = %6d. Edges = %6d. Pairs = %6d. ",
1026 p->nVerts,
p->nEdges, Vec_IntSize(
p->vPairs)/2 );
1027 ABC_PRT(
"Solving", Abc_Clock() - clk );
1030 vResult =
p->vPairs;
p->vPairs = NULL;
#define ABC_ALLOC(type, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_MmFlexStop(Aig_MmFlex_t *p, int fVerbose)
char * Aig_MmFixedEntryFetch(Aig_MmFixed_t *p)
char * Aig_MmFlexEntryFetch(Aig_MmFlex_t *p, int nBytes)
Aig_MmFixed_t * Aig_MmFixedStart(int nEntrySize, int nEntriesMax)
FUNCTION DEFINITIONS ///.
Aig_MmFlex_t * Aig_MmFlexStart()
void Aig_MmFixedStop(Aig_MmFixed_t *p, int fVerbose)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Nwk_Man_t_ Nwk_Man_t
void Nwk_ManGraphPrepare(Nwk_Grf_t *p)
void Nwk_ManMarkFanouts_rec(Nwk_Obj_t *pLut, int nLevMax, int nFanMax)
void Nwk_ManGraphSolve(Nwk_Grf_t *p)
Nwk_Grf_t * Nwk_ManLutMergeReadGraph(char *pFileName)
void Nwk_ManCollectOverlapCands(Nwk_Obj_t *pLut, Vec_Ptr_t *vCands, Nwk_LMPars_t *pPars)
ABC_NAMESPACE_IMPL_START Nwk_Grf_t * Nwk_ManGraphAlloc(int nVertsMax)
DECLARATIONS ///.
void Nwk_ManCollectCircle(Vec_Ptr_t *vStart, Vec_Ptr_t *vNext, int nFanMax)
void Nwk_ManGraphUpdate(Nwk_Grf_t *p, Nwk_Vrt_t *pVertex, Nwk_Vrt_t *pNext)
void Nwk_ManGraphHashEdge(Nwk_Grf_t *p, int iLut1, int iLut2)
void Nwk_ManGraphCheckLists(Nwk_Grf_t *p)
Nwk_Vrt_t * Nwk_ManGraphListFindMinEdge(Nwk_Grf_t *p, Nwk_Vrt_t *pVert)
int Nwk_ManCountTotalFanins(Nwk_Obj_t *pLut, Nwk_Obj_t *pCand)
void Nwk_ManMarkFanins_rec(Nwk_Obj_t *pLut, int nLevMin)
void Nwk_ManCollectNonOverlapCands(Nwk_Obj_t *pLut, Vec_Ptr_t *vStart, Vec_Ptr_t *vNext, Vec_Ptr_t *vCands, Nwk_LMPars_t *pPars)
Vec_Int_t * Nwk_ManLutMerge(Nwk_Man_t *pNtk, void *pParsInit)
int Nwk_ManLutMergeGraphTest(char *pFileName)
int Nwk_ManGraphListLength(Nwk_Grf_t *p, int List)
void Nwk_ManGraphSortPairs(Nwk_Grf_t *p)
Nwk_Vrt_t * Nwk_ManGraphListFindMin(Nwk_Grf_t *p, int List)
void Nwk_ManGraphReportMemoryUsage(Nwk_Grf_t *p)
void Nwk_ManGraphFree(Nwk_Grf_t *p)
struct Nwk_Edg_t_ Nwk_Edg_t
#define Nwk_GraphForEachEdge(p, pEdge, k)
MACRO DEFINITIONS ///.
struct Nwk_Vrt_t_ Nwk_Vrt_t
struct Nwk_Grf_t_ Nwk_Grf_t
#define Nwk_ListForEachVertex(p, List, pVrt)
#define NWK_MAX_LIST
INCLUDES ///.
struct Nwk_LMPars_t_ Nwk_LMPars_t
BASIC TYPES ///.
#define Nwk_VertexForEachAdjacent(p, pVrt, pNext, k)
ABC_DLL void Nwk_ManIncrementTravId(Nwk_Man_t *pNtk)
DECLARATIONS ///.
#define Nwk_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Nwk_Obj_t_ Nwk_Obj_t
INCLUDES ///.
#define Nwk_ObjForEachFanout(pObj, pFanout, i)
#define Nwk_ObjForEachFanin(pObj, pFanin, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.