summaryrefslogtreecommitdiffstats
path: root/src/base/abci/abcPart.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/abci/abcPart.c')
-rw-r--r--src/base/abci/abcPart.c1205
1 files changed, 0 insertions, 1205 deletions
diff --git a/src/base/abci/abcPart.c b/src/base/abci/abcPart.c
deleted file mode 100644
index 85c4e918..00000000
--- a/src/base/abci/abcPart.c
+++ /dev/null
@@ -1,1205 +0,0 @@
-/**CFile****************************************************************
-
- FileName [abcPart.c]
-
- SystemName [ABC: Logic synthesis and verification system.]
-
- PackageName [Network and node package.]
-
- Synopsis [Output partitioning package.]
-
- Author [Alan Mishchenko]
-
- Affiliation [UC Berkeley]
-
- Date [Ver. 1.0. Started - June 20, 2005.]
-
- Revision [$Id: abcPart.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
-
-***********************************************************************/
-
-#include "abc.h"
-
-////////////////////////////////////////////////////////////////////////
-/// DECLARATIONS ///
-////////////////////////////////////////////////////////////////////////
-
-typedef struct Supp_Man_t_ Supp_Man_t;
-struct Supp_Man_t_
-{
- int nChunkSize; // the size of one chunk of memory (~1 Mb)
- int nStepSize; // the step size in saving memory (~64 bytes)
- char * pFreeBuf; // the pointer to free memory
- int nFreeSize; // the size of remaining free memory
- Vec_Ptr_t * vMemory; // the memory allocated
- Vec_Ptr_t * vFree; // the vector of free pieces of memory
-};
-
-typedef struct Supp_One_t_ Supp_One_t;
-struct Supp_One_t_
-{
- int nRefs; // the number of references
- int nOuts; // the number of outputs
- int nOutsAlloc; // the array size
- int pOuts[0]; // the array of outputs
-};
-
-static inline int Supp_SizeType( int nSize, int nStepSize ) { return nSize / nStepSize + ((nSize % nStepSize) > 0); }
-static inline char * Supp_OneNext( char * pPart ) { return *((char **)pPart); }
-static inline void Supp_OneSetNext( char * pPart, char * pNext ) { *((char **)pPart) = pNext; }
-
-////////////////////////////////////////////////////////////////////////
-/// FUNCTION DEFINITIONS ///
-////////////////////////////////////////////////////////////////////////
-
-/**Function*************************************************************
-
- Synopsis [Start the memory manager.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Supp_Man_t * Supp_ManStart( int nChunkSize, int nStepSize )
-{
- Supp_Man_t * p;
- p = ALLOC( Supp_Man_t, 1 );
- memset( p, 0, sizeof(Supp_Man_t) );
- p->nChunkSize = nChunkSize;
- p->nStepSize = nStepSize;
- p->vMemory = Vec_PtrAlloc( 1000 );
- p->vFree = Vec_PtrAlloc( 1000 );
- return p;
-}
-
-/**Function*************************************************************
-
- Synopsis [Stops the memory manager.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Supp_ManStop( Supp_Man_t * p )
-{
- void * pMemory;
- int i;
- Vec_PtrForEachEntry( p->vMemory, pMemory, i )
- free( pMemory );
- Vec_PtrFree( p->vMemory );
- Vec_PtrFree( p->vFree );
- free( p );
-}
-
-/**Function*************************************************************
-
- Synopsis [Fetches the memory entry of the given size.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-char * Supp_ManFetch( Supp_Man_t * p, int nSize )
-{
- int Type, nSizeReal;
- char * pMemory;
- assert( nSize > 0 );
- Type = Supp_SizeType( nSize, p->nStepSize );
- Vec_PtrFillExtra( p->vFree, Type + 1, NULL );
- if ( pMemory = Vec_PtrEntry( p->vFree, Type ) )
- {
- Vec_PtrWriteEntry( p->vFree, Type, Supp_OneNext(pMemory) );
- return pMemory;
- }
- nSizeReal = p->nStepSize * Type;
- if ( p->nFreeSize < nSizeReal )
- {
- p->pFreeBuf = ALLOC( char, p->nChunkSize );
- p->nFreeSize = p->nChunkSize;
- Vec_PtrPush( p->vMemory, p->pFreeBuf );
- }
- assert( p->nFreeSize >= nSizeReal );
- pMemory = p->pFreeBuf;
- p->pFreeBuf += nSizeReal;
- p->nFreeSize -= nSizeReal;
- return pMemory;
-}
-
-/**Function*************************************************************
-
- Synopsis [Recycles the memory entry of the given size.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Supp_ManRecycle( Supp_Man_t * p, char * pMemory, int nSize )
-{
- int Type;
- Type = Supp_SizeType( nSize, p->nStepSize );
- Vec_PtrFillExtra( p->vFree, Type + 1, NULL );
- Supp_OneSetNext( pMemory, Vec_PtrEntry(p->vFree, Type) );
- Vec_PtrWriteEntry( p->vFree, Type, pMemory );
-}
-
-/**Function*************************************************************
-
- Synopsis [Fetches the memory entry of the given size.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline Supp_One_t * Supp_ManFetchEntry( Supp_Man_t * p, int nWords, int nRefs )
-{
- Supp_One_t * pPart;
- pPart = (Supp_One_t *)Supp_ManFetch( p, sizeof(Supp_One_t) + sizeof(int) * nWords );
- pPart->nRefs = nRefs;
- pPart->nOuts = 0;
- pPart->nOutsAlloc = nWords;
- return pPart;
-}
-
-/**Function*************************************************************
-
- Synopsis [Recycles the memory entry of the given size.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline void Supp_ManRecycleEntry( Supp_Man_t * p, Supp_One_t * pEntry )
-{
- assert( pEntry->nOuts <= pEntry->nOutsAlloc );
- assert( pEntry->nOuts >= pEntry->nOutsAlloc/2 );
- Supp_ManRecycle( p, (char *)pEntry, sizeof(Supp_One_t) + sizeof(int) * pEntry->nOutsAlloc );
-}
-
-/**Function*************************************************************
-
- Synopsis [Merges two entries.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Supp_One_t * Supp_ManMergeEntry( Supp_Man_t * pMan, Supp_One_t * p1, Supp_One_t * p2, int nRefs )
-{
- Supp_One_t * p = Supp_ManFetchEntry( pMan, p1->nOuts + p2->nOuts, nRefs );
- int * pBeg1 = p1->pOuts;
- int * pBeg2 = p2->pOuts;
- int * pBeg = p->pOuts;
- int * pEnd1 = p1->pOuts + p1->nOuts;
- int * pEnd2 = p2->pOuts + p2->nOuts;
- while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
- {
- if ( *pBeg1 == *pBeg2 )
- *pBeg++ = *pBeg1++, pBeg2++;
- else if ( *pBeg1 < *pBeg2 )
- *pBeg++ = *pBeg1++;
- else
- *pBeg++ = *pBeg2++;
- }
- while ( pBeg1 < pEnd1 )
- *pBeg++ = *pBeg1++;
- while ( pBeg2 < pEnd2 )
- *pBeg++ = *pBeg2++;
- p->nOuts = pBeg - p->pOuts;
- assert( p->nOuts <= p->nOutsAlloc );
- assert( p->nOuts >= p1->nOuts );
- assert( p->nOuts >= p2->nOuts );
- return p;
-}
-
-/**Function*************************************************************
-
- Synopsis [Tranfers the entry.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Vec_Int_t * Supp_ManTransferEntry( Supp_One_t * p )
-{
- Vec_Int_t * vSupp;
- int i;
- vSupp = Vec_IntAlloc( p->nOuts );
- for ( i = 0; i < p->nOuts; i++ )
- Vec_IntPush( vSupp, p->pOuts[i] );
- return vSupp;
-}
-
-/**Function*************************************************************
-
- Synopsis [Computes supports of the POs in the multi-output AIG.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Vec_Ptr_t * Abc_NtkDfsNatural( Abc_Ntk_t * pNtk )
-{
- Vec_Ptr_t * vNodes;
- Abc_Obj_t * pObj, * pNext;
- int i, k;
- assert( Abc_NtkIsStrash(pNtk) );
- vNodes = Vec_PtrAlloc( Abc_NtkObjNum(pNtk) );
- Abc_NtkIncrementTravId( pNtk );
- // add the constant-1 nodes
- pObj = Abc_AigConst1(pNtk);
- Abc_NodeSetTravIdCurrent( pObj );
- Vec_PtrPush( vNodes, pObj );
- // add the CIs/nodes/COs in the topological order
- Abc_NtkForEachNode( pNtk, pObj, i )
- {
- // check the fanins and add CIs
- Abc_ObjForEachFanin( pObj, pNext, k )
- if ( Abc_ObjIsCi(pNext) && !Abc_NodeIsTravIdCurrent(pNext) )
- {
- Abc_NodeSetTravIdCurrent( pNext );
- Vec_PtrPush( vNodes, pNext );
- }
- // add the node
- Vec_PtrPush( vNodes, pObj );
- // check the fanouts and add COs
- Abc_ObjForEachFanout( pObj, pNext, k )
- if ( Abc_ObjIsCo(pNext) && !Abc_NodeIsTravIdCurrent(pNext) )
- {
- Abc_NodeSetTravIdCurrent( pNext );
- Vec_PtrPush( vNodes, pNext );
- }
- }
- return vNodes;
-}
-
-/**Function*************************************************************
-
- Synopsis [Computes supports of the POs.]
-
- Description [Returns the ptr-vector of int-vectors.]
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Vec_Ptr_t * Abc_NtkComputeSupportsSmart( Abc_Ntk_t * pNtk )
-{
- Vec_Ptr_t * vSupports;
- Vec_Ptr_t * vNodes;
- Vec_Int_t * vSupp;
- Supp_Man_t * p;
- Supp_One_t * pPart0, * pPart1;
- Abc_Obj_t * pObj;
- int i;
- // set the number of PIs/POs
- Abc_NtkForEachCi( pNtk, pObj, i )
- pObj->pNext = (Abc_Obj_t *)i;
- Abc_NtkForEachCo( pNtk, pObj, i )
- pObj->pNext = (Abc_Obj_t *)i;
- // start the support computation manager
- p = Supp_ManStart( 1 << 20, 1 << 6 );
- // consider objects in the topological order
- vSupports = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) );
- Abc_NtkCleanCopy(pNtk);
- // order the nodes so that the PIs and POs follow naturally
- vNodes = Abc_NtkDfsNatural( pNtk );
- Vec_PtrForEachEntry( vNodes, pObj, i )
- {
- if ( Abc_ObjIsNode(pObj) )
- {
- pPart0 = (Supp_One_t *)Abc_ObjFanin0(pObj)->pCopy;
- pPart1 = (Supp_One_t *)Abc_ObjFanin1(pObj)->pCopy;
- pObj->pCopy = (Abc_Obj_t *)Supp_ManMergeEntry( p, pPart0, pPart1, Abc_ObjFanoutNum(pObj) );
- assert( pPart0->nRefs > 0 );
- if ( --pPart0->nRefs == 0 )
- Supp_ManRecycleEntry( p, pPart0 );
- assert( pPart1->nRefs > 0 );
- if ( --pPart1->nRefs == 0 )
- Supp_ManRecycleEntry( p, pPart1 );
- continue;
- }
- if ( Abc_ObjIsCo(pObj) )
- {
- pPart0 = (Supp_One_t *)Abc_ObjFanin0(pObj)->pCopy;
- // only save the CO if it is non-trivial
- if ( Abc_ObjIsNode(Abc_ObjFanin0(pObj)) )
- {
- vSupp = Supp_ManTransferEntry(pPart0);
- Vec_IntPush( vSupp, (int)pObj->pNext );
- Vec_PtrPush( vSupports, vSupp );
- }
- assert( pPart0->nRefs > 0 );
- if ( --pPart0->nRefs == 0 )
- Supp_ManRecycleEntry( p, pPart0 );
- continue;
- }
- if ( Abc_ObjIsCi(pObj) )
- {
- if ( Abc_ObjFanoutNum(pObj) )
- {
- pPart0 = (Supp_One_t *)Supp_ManFetchEntry( p, 1, Abc_ObjFanoutNum(pObj) );
- pPart0->pOuts[ pPart0->nOuts++ ] = (int)pObj->pNext;
- pObj->pCopy = (Abc_Obj_t *)pPart0;
- }
- continue;
- }
- if ( pObj == Abc_AigConst1(pNtk) )
- {
- if ( Abc_ObjFanoutNum(pObj) )
- pObj->pCopy = (Abc_Obj_t *)Supp_ManFetchEntry( p, 0, Abc_ObjFanoutNum(pObj) );
- continue;
- }
- assert( 0 );
- }
- Vec_PtrFree( vNodes );
-//printf( "Memory usage = %d Mb.\n", Vec_PtrSize(p->vMemory) * p->nChunkSize / (1<<20) );
- Supp_ManStop( p );
- // sort supports by size
- Vec_VecSort( (Vec_Vec_t *)vSupports, 1 );
- // clear the number of PIs/POs
- Abc_NtkForEachCi( pNtk, pObj, i )
- pObj->pNext = NULL;
- Abc_NtkForEachCo( pNtk, pObj, i )
- pObj->pNext = NULL;
-/*
- Vec_PtrForEachEntry( vSupports, vSupp, i )
- printf( "%d ", Vec_IntSize(vSupp) );
- printf( "\n" );
-*/
- return vSupports;
-}
-
-
-/**Function*************************************************************
-
- Synopsis [Computes supports of the POs using naive method.]
-
- Description [Returns the ptr-vector of int-vectors.]
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Vec_Ptr_t * Abc_NtkComputeSupportsNaive( Abc_Ntk_t * pNtk )
-{
- Vec_Ptr_t * vSupp, * vSupports;
- Vec_Int_t * vSuppI;
- Abc_Obj_t * pObj, * pTemp;
- int i, k;
- // set the PI numbers
- Abc_NtkForEachCi( pNtk, pObj, i )
- pObj->pNext = (void *)i;
- // save the CI numbers
- vSupports = Vec_PtrAlloc( Abc_NtkCoNum(pNtk) );
- Abc_NtkForEachCo( pNtk, pObj, i )
- {
- if ( !Abc_ObjIsNode(Abc_ObjFanin0(pObj)) )
- continue;
- vSupp = Abc_NtkNodeSupport( pNtk, &pObj, 1 );
- vSuppI = (Vec_Int_t *)vSupp;
- Vec_PtrForEachEntry( vSupp, pTemp, k )
- Vec_IntWriteEntry( vSuppI, k, (int)pTemp->pNext );
- Vec_IntSort( vSuppI, 0 );
- // append the number of this output
- Vec_IntPush( vSuppI, i );
- // save the support in the vector
- Vec_PtrPush( vSupports, vSuppI );
- }
- // clean the CI numbers
- Abc_NtkForEachCi( pNtk, pObj, i )
- pObj->pNext = NULL;
- // sort supports by size
- Vec_VecSort( (Vec_Vec_t *)vSupports, 1 );
-/*
- Vec_PtrForEachEntry( vSupports, vSuppI, i )
- printf( "%d ", Vec_IntSize(vSuppI) );
- printf( "\n" );
-*/
- return vSupports;
-}
-
-/**Function*************************************************************
-
- Synopsis [Start bitwise support representation.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-unsigned * Abc_NtkSuppCharStart( Vec_Int_t * vOne, int nPis )
-{
- unsigned * pBuffer;
- int i, Entry;
- int nWords = Abc_BitWordNum(nPis);
- pBuffer = ALLOC( unsigned, nWords );
- memset( pBuffer, 0, sizeof(unsigned) * nWords );
- Vec_IntForEachEntry( vOne, Entry, i )
- {
- assert( Entry < nPis );
- Abc_InfoSetBit( pBuffer, Entry );
- }
- return pBuffer;
-}
-
-/**Function*************************************************************
-
- Synopsis [Add to bitwise support representation.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Abc_NtkSuppCharAdd( unsigned * pBuffer, Vec_Int_t * vOne, int nPis )
-{
- int i, Entry;
- Vec_IntForEachEntry( vOne, Entry, i )
- {
- assert( Entry < nPis );
- Abc_InfoSetBit( pBuffer, Entry );
- }
-}
-
-/**Function*************************************************************
-
- Synopsis [Find the common variables using bitwise support representation.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-int Abc_NtkSuppCharCommon( unsigned * pBuffer, Vec_Int_t * vOne )
-{
- int i, Entry, nCommon = 0;
- Vec_IntForEachEntry( vOne, Entry, i )
- nCommon += Abc_InfoHasBit(pBuffer, Entry);
- return nCommon;
-}
-
-/**Function*************************************************************
-
- Synopsis [Find the best partition.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-int Abc_NtkPartitionSmartFindPart( Vec_Ptr_t * vPartSuppsAll, Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsChar, int nSuppSizeLimit, Vec_Int_t * vOne )
-{
-/*
- Vec_Int_t * vPartSupp, * vPart;
- double Attract, Repulse, Cost, CostBest;
- int i, nCommon, iBest;
- iBest = -1;
- CostBest = 0.0;
- Vec_PtrForEachEntry( vPartSuppsAll, vPartSupp, i )
- {
- vPart = Vec_PtrEntry( vPartsAll, i );
- if ( nPartSizeLimit > 0 && Vec_IntSize(vPart) >= nPartSizeLimit )
- continue;
- nCommon = Vec_IntTwoCountCommon( vPartSupp, vOne );
- if ( nCommon == 0 )
- continue;
- if ( nCommon == Vec_IntSize(vOne) )
- return i;
- Attract = 1.0 * nCommon / Vec_IntSize(vOne);
- if ( Vec_IntSize(vPartSupp) < 100 )
- Repulse = 1.0;
- else
- Repulse = log10( Vec_IntSize(vPartSupp) / 10.0 );
- Cost = pow( Attract, pow(Repulse, 5.0) );
- if ( CostBest < Cost )
- {
- CostBest = Cost;
- iBest = i;
- }
- }
- if ( CostBest < 0.6 )
- return -1;
- return iBest;
-*/
-
- Vec_Int_t * vPartSupp;//, * vPart;
- int Attract, Repulse, Value, ValueBest;
- int i, nCommon, iBest;
-// int nCommon2;
- iBest = -1;
- ValueBest = 0;
- Vec_PtrForEachEntry( vPartSuppsAll, vPartSupp, i )
- {
- // skip partitions with too many outputs
-// vPart = Vec_PtrEntry( vPartsAll, i );
-// if ( nSuppSizeLimit > 0 && Vec_IntSize(vPart) >= nSuppSizeLimit )
-// continue;
- // find the number of common variables between this output and the partitions
-// nCommon2 = Vec_IntTwoCountCommon( vPartSupp, vOne );
- nCommon = Abc_NtkSuppCharCommon( Vec_PtrEntry(vPartSuppsChar, i), vOne );
-// assert( nCommon2 == nCommon );
- // if no common variables, continue searching
- if ( nCommon == 0 )
- continue;
- // if all variables are common, the best partition if found
- if ( nCommon == Vec_IntSize(vOne) )
- return i;
- // skip partitions whose size exceeds the limit
- if ( nSuppSizeLimit > 0 && Vec_IntSize(vPartSupp) >= 2 * nSuppSizeLimit )
- continue;
- // figure out might be the good partition for this one
- Attract = 1000 * nCommon / Vec_IntSize(vOne);
- if ( Vec_IntSize(vPartSupp) < 100 )
- Repulse = 1;
- else
- Repulse = 1+Extra_Base2Log(Vec_IntSize(vPartSupp)-100);
- Value = Attract/Repulse;
- if ( ValueBest < Value )
- {
- ValueBest = Value;
- iBest = i;
- }
- }
- if ( ValueBest < 75 )
- return -1;
- return iBest;
-}
-
-/**Function*************************************************************
-
- Synopsis [Perform the smart partitioning.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Abc_NtkPartitionPrint( Abc_Ntk_t * pNtk, Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsAll )
-{
- Vec_Int_t * vOne;
- int i, nOutputs, Counter;
-
- Counter = 0;
- Vec_PtrForEachEntry( vPartSuppsAll, vOne, i )
- {
- nOutputs = Vec_IntSize(Vec_PtrEntry(vPartsAll, i));
- printf( "%d=(%d,%d) ", i, Vec_IntSize(vOne), nOutputs );
- Counter += nOutputs;
- if ( i == Vec_PtrSize(vPartsAll) - 1 )
- break;
- }
-// assert( Counter == Abc_NtkCoNum(pNtk) );
- printf( "\nTotal = %d. Outputs = %d.\n", Counter, Abc_NtkCoNum(pNtk) );
-}
-
-/**Function*************************************************************
-
- Synopsis [Perform the smart partitioning.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Abc_NtkPartitionCompact( Vec_Ptr_t * vPartsAll, Vec_Ptr_t * vPartSuppsAll, int nSuppSizeLimit )
-{
- Vec_Int_t * vOne, * vPart, * vPartSupp, * vTemp;
- int i, iPart;
-
- if ( nSuppSizeLimit == 0 )
- nSuppSizeLimit = 200;
-
- // pack smaller partitions into larger blocks
- iPart = 0;
- vPart = vPartSupp = NULL;
- Vec_PtrForEachEntry( vPartSuppsAll, vOne, i )
- {
- if ( Vec_IntSize(vOne) < nSuppSizeLimit )
- {
- if ( vPartSupp == NULL )
- {
- assert( vPart == NULL );
- vPartSupp = Vec_IntDup(vOne);
- vPart = Vec_PtrEntry(vPartsAll, i);
- }
- else
- {
- vPartSupp = Vec_IntTwoMerge( vTemp = vPartSupp, vOne );
- Vec_IntFree( vTemp );
- vPart = Vec_IntTwoMerge( vTemp = vPart, Vec_PtrEntry(vPartsAll, i) );
- Vec_IntFree( vTemp );
- Vec_IntFree( Vec_PtrEntry(vPartsAll, i) );
- }
- if ( Vec_IntSize(vPartSupp) < nSuppSizeLimit )
- continue;
- }
- else
- vPart = Vec_PtrEntry(vPartsAll, i);
- // add the partition
- Vec_PtrWriteEntry( vPartsAll, iPart, vPart );
- vPart = NULL;
- if ( vPartSupp )
- {
- Vec_IntFree( Vec_PtrEntry(vPartSuppsAll, iPart) );
- Vec_PtrWriteEntry( vPartSuppsAll, iPart, vPartSupp );
- vPartSupp = NULL;
- }
- iPart++;
- }
- // add the last one
- if ( vPart )
- {
- Vec_PtrWriteEntry( vPartsAll, iPart, vPart );
- vPart = NULL;
-
- assert( vPartSupp != NULL );
- Vec_IntFree( Vec_PtrEntry(vPartSuppsAll, iPart) );
- Vec_PtrWriteEntry( vPartSuppsAll, iPart, vPartSupp );
- vPartSupp = NULL;
- iPart++;
- }
- Vec_PtrShrink( vPartsAll, iPart );
- Vec_PtrShrink( vPartsAll, iPart );
-}
-
-/**Function*************************************************************
-
- Synopsis [Perform the smart partitioning.]
-
- Description [Returns the ptr-vector of int-vectors.]
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Vec_Ptr_t * Abc_NtkPartitionSmart( Abc_Ntk_t * pNtk, int nSuppSizeLimit, int fVerbose )
-{
- ProgressBar * pProgress;
- Vec_Ptr_t * vPartSuppsChar;
- Vec_Ptr_t * vSupps, * vPartsAll, * vPartsAll2, * vPartSuppsAll;
- Vec_Int_t * vOne, * vPart, * vPartSupp, * vTemp;
- int i, iPart, iOut, clk, clk2, timeFind = 0;
-
- // compute the supports for all outputs
-clk = clock();
-// vSupps = Abc_NtkComputeSupportsNaive( pNtk );
- vSupps = Abc_NtkComputeSupportsSmart( pNtk );
-if ( fVerbose )
-{
-PRT( "Supps", clock() - clk );
-}
- // start char-based support representation
- vPartSuppsChar = Vec_PtrAlloc( 1000 );
-
- // create partitions
-clk = clock();
- vPartsAll = Vec_PtrAlloc( 256 );
- vPartSuppsAll = Vec_PtrAlloc( 256 );
- pProgress = Extra_ProgressBarStart( stdout, Vec_PtrSize(vSupps) );
- Vec_PtrForEachEntry( vSupps, vOne, i )
- {
- Extra_ProgressBarUpdate( pProgress, i, NULL );
-// if ( i % 1000 == 0 )
-// printf( "CIs = %6d. COs = %6d. Processed = %6d (out of %6d). Parts = %6d.\r",
-// Abc_NtkCiNum(pNtk), Abc_NtkCoNum(pNtk), i, Vec_PtrSize(vSupps), Vec_PtrSize(vPartsAll) );
- // get the output number
- iOut = Vec_IntPop(vOne);
- // find closely matching part
-clk2 = clock();
- iPart = Abc_NtkPartitionSmartFindPart( vPartSuppsAll, vPartsAll, vPartSuppsChar, nSuppSizeLimit, vOne );
-timeFind += clock() - clk2;
- if ( iPart == -1 )
- {
- // create new partition
- vPart = Vec_IntAlloc( 32 );
- Vec_IntPush( vPart, iOut );
- // create new partition support
- vPartSupp = Vec_IntDup( vOne );
- // add this partition and its support
- Vec_PtrPush( vPartsAll, vPart );
- Vec_PtrPush( vPartSuppsAll, vPartSupp );
-
- Vec_PtrPush( vPartSuppsChar, Abc_NtkSuppCharStart(vOne, Abc_NtkCiNum(pNtk)) );
- }
- else
- {
- // add output to this partition
- vPart = Vec_PtrEntry( vPartsAll, iPart );
- Vec_IntPush( vPart, iOut );
- // merge supports
- vPartSupp = Vec_PtrEntry( vPartSuppsAll, iPart );
- vPartSupp = Vec_IntTwoMerge( vTemp = vPartSupp, vOne );
- Vec_IntFree( vTemp );
- // reinsert new support
- Vec_PtrWriteEntry( vPartSuppsAll, iPart, vPartSupp );
-
- Abc_NtkSuppCharAdd( Vec_PtrEntry(vPartSuppsChar, iPart), vOne, Abc_NtkCiNum(pNtk) );
- }
- }
- Extra_ProgressBarStop( pProgress );
-
- // stop char-based support representation
- Vec_PtrForEachEntry( vPartSuppsChar, vTemp, i )
- free( vTemp );
- Vec_PtrFree( vPartSuppsChar );
-
-//printf( "\n" );
-if ( fVerbose )
-{
-PRT( "Parts", clock() - clk );
-//PRT( "Find ", timeFind );
-}
-
-clk = clock();
- // remember number of supports
- Vec_PtrForEachEntry( vPartSuppsAll, vOne, i )
- Vec_IntPush( vOne, i );
- // sort the supports in the decreasing order
- Vec_VecSort( (Vec_Vec_t *)vPartSuppsAll, 1 );
- // reproduce partitions
- vPartsAll2 = Vec_PtrAlloc( 256 );
- Vec_PtrForEachEntry( vPartSuppsAll, vOne, i )
- Vec_PtrPush( vPartsAll2, Vec_PtrEntry(vPartsAll, Vec_IntPop(vOne)) );
- Vec_PtrFree( vPartsAll );
- vPartsAll = vPartsAll2;
-
- // compact small partitions
-// Abc_NtkPartitionPrint( pNtk, vPartsAll, vPartSuppsAll );
- Abc_NtkPartitionCompact( vPartsAll, vPartSuppsAll, nSuppSizeLimit );
-
-if ( fVerbose )
-{
-PRT( "Comps", clock() - clk );
-}
- if ( fVerbose )
- printf( "Created %d partitions.\n", Vec_PtrSize(vPartsAll) );
-// Abc_NtkPartitionPrint( pNtk, vPartsAll, vPartSuppsAll );
-
- // cleanup
- Vec_VecFree( (Vec_Vec_t *)vSupps );
- Vec_VecFree( (Vec_Vec_t *)vPartSuppsAll );
-/*
- // converts from intergers to nodes
- Vec_PtrForEachEntry( vPartsAll, vPart, iPart )
- {
- vPartPtr = Vec_PtrAlloc( Vec_IntSize(vPart) );
- Vec_IntForEachEntry( vPart, iOut, i )
- Vec_PtrPush( vPartPtr, Abc_NtkCo(pNtk, iOut) );
- Vec_IntFree( vPart );
- Vec_PtrWriteEntry( vPartsAll, iPart, vPartPtr );
- }
-*/
- return vPartsAll;
-}
-
-/**Function*************************************************************
-
- Synopsis [Perform the naive partitioning.]
-
- Description [Returns the ptr-vector of int-vectors.]
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Vec_Ptr_t * Abc_NtkPartitionNaive( Abc_Ntk_t * pNtk, int nPartSize )
-{
- Vec_Ptr_t * vParts;
- Abc_Obj_t * pObj;
- int nParts, i;
- nParts = (Abc_NtkCoNum(pNtk) / nPartSize) + ((Abc_NtkCoNum(pNtk) % nPartSize) > 0);
- vParts = (Vec_Ptr_t *)Vec_VecStart( nParts );
- Abc_NtkForEachCo( pNtk, pObj, i )
- Vec_IntPush( Vec_PtrEntry(vParts, i / nPartSize), i );
- return vParts;
-}
-
-/**Function*************************************************************
-
- Synopsis [Converts from intergers to pointers for the given network.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Abc_NtkConvertCos( Abc_Ntk_t * pNtk, Vec_Int_t * vOuts, Vec_Ptr_t * vOutsPtr )
-{
- int Out, i;
- Vec_PtrClear( vOutsPtr );
- Vec_IntForEachEntry( vOuts, Out, i )
- Vec_PtrPush( vOutsPtr, Abc_NtkCo(pNtk, Out) );
-}
-
-/**Function*************************************************************
-
- Synopsis [Returns representative of the given node.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Abc_Obj_t * Abc_NtkPartStitchFindRepr_rec( Vec_Ptr_t * vEquiv, Abc_Obj_t * pObj )
-{
- Abc_Obj_t * pRepr;
- pRepr = Vec_PtrEntry( vEquiv, pObj->Id );
- if ( pRepr == NULL || pRepr == pObj )
- return pObj;
- return Abc_NtkPartStitchFindRepr_rec( vEquiv, pRepr );
-}
-
-/**Function*************************************************************
-
- Synopsis [Returns the representative of the fanin.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline Abc_Obj_t * Abc_NtkPartStitchCopy0( Vec_Ptr_t * vEquiv, Abc_Obj_t * pObj )
-{
- Abc_Obj_t * pFan = Abc_ObjFanin0( pObj );
- Abc_Obj_t * pRepr = Abc_NtkPartStitchFindRepr_rec( vEquiv, pFan );
- return Abc_ObjNotCond( pRepr->pCopy, pRepr->fPhase ^ pFan->fPhase ^ Abc_ObjFaninC1(pObj) );
-}
-static inline Abc_Obj_t * Abc_NtkPartStitchCopy1( Vec_Ptr_t * vEquiv, Abc_Obj_t * pObj )
-{
- Abc_Obj_t * pFan = Abc_ObjFanin1( pObj );
- Abc_Obj_t * pRepr = Abc_NtkPartStitchFindRepr_rec( vEquiv, pFan );
- return Abc_ObjNotCond( pRepr->pCopy, pRepr->fPhase ^ pFan->fPhase ^ Abc_ObjFaninC1(pObj) );
-}
-
-/**Function*************************************************************
-
- Synopsis []
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline Hop_Obj_t * Hop_ObjChild0Next( Abc_Obj_t * pObj ) { return Hop_NotCond( (Hop_Obj_t *)Abc_ObjFanin0(pObj)->pNext, Abc_ObjFaninC0(pObj) ); }
-static inline Hop_Obj_t * Hop_ObjChild1Next( Abc_Obj_t * pObj ) { return Hop_NotCond( (Hop_Obj_t *)Abc_ObjFanin1(pObj)->pNext, Abc_ObjFaninC1(pObj) ); }
-
-
-/**Function*************************************************************
-
- Synopsis [Stitches together several networks with choice nodes.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Hop_Man_t * Abc_NtkPartStartHop( Abc_Ntk_t * pNtk )
-{
- Hop_Man_t * pMan;
- Abc_Obj_t * pObj;
- int i;
- // start the HOP package
- pMan = Hop_ManStart();
- pMan->vObjs = Vec_PtrAlloc( Abc_NtkObjNumMax(pNtk) + 1 );
- Vec_PtrPush( pMan->vObjs, Hop_ManConst1(pMan) );
- // map constant node and PIs
- Abc_AigConst1(pNtk)->pNext = (Abc_Obj_t *)Hop_ManConst1(pMan);
- Abc_NtkForEachCi( pNtk, pObj, i )
- pObj->pNext = (Abc_Obj_t *)Hop_ObjCreatePi(pMan);
- // map the internal nodes
- Abc_AigForEachAnd( pNtk, pObj, i )
- {
- pObj->pNext = (Abc_Obj_t *)Hop_And( pMan, Hop_ObjChild0Next(pObj), Hop_ObjChild1Next(pObj) );
- assert( !Abc_ObjIsComplement(pObj->pNext) );
- }
- // set the choice nodes
- Abc_AigForEachAnd( pNtk, pObj, i )
- {
- if ( pObj->pCopy )
- ((Hop_Obj_t *)pObj->pNext)->pData = pObj->pCopy->pNext;
- }
- // transfer the POs
- Abc_NtkForEachCo( pNtk, pObj, i )
- Hop_ObjCreatePo( pMan, Hop_ObjChild0Next(pObj) );
- // check the new manager
- if ( !Hop_ManCheck(pMan) )
- printf( "Abc_NtkPartStartHop: HOP manager check has failed.\n" );
- return pMan;
-}
-
-/**Function*************************************************************
-
- Synopsis [Stitches together several networks with choice nodes.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Abc_Ntk_t * Abc_NtkPartStitchChoices( Abc_Ntk_t * pNtk, Vec_Ptr_t * vParts )
-{
- extern Abc_Ntk_t * Abc_NtkHopRemoveLoops( Abc_Ntk_t * pNtk, Hop_Man_t * pMan );
-
- Hop_Man_t * pMan;
- Vec_Ptr_t * vNodes;
- Abc_Ntk_t * pNtkNew, * pNtkTemp;
- Abc_Obj_t * pObj, * pFanin;
- int i, k, iNodeId;
-
- // start a new network similar to the original one
- assert( Abc_NtkIsStrash(pNtk) );
- pNtkNew = Abc_NtkStartFrom( pNtk, ABC_NTK_STRASH, ABC_FUNC_AIG );
-
- // annotate parts to point to the new network
- Vec_PtrForEachEntry( vParts, pNtkTemp, i )
- {
- assert( Abc_NtkIsStrash(pNtkTemp) );
- Abc_NtkCleanCopy( pNtkTemp );
-
- // map the CI nodes
- Abc_AigConst1(pNtkTemp)->pCopy = Abc_AigConst1(pNtkNew);
- Abc_NtkForEachCi( pNtkTemp, pObj, k )
- {
- iNodeId = Nm_ManFindIdByNameTwoTypes( pNtkNew->pManName, Abc_ObjName(pObj), ABC_OBJ_PI, ABC_OBJ_BO );
- if ( iNodeId == -1 )
- {
- printf( "Cannot find CI node %s in the original network.\n", Abc_ObjName(pObj) );
- return NULL;
- }
- pObj->pCopy = Abc_NtkObj( pNtkNew, iNodeId );
- }
-
- // add the internal nodes while saving representatives
- vNodes = Abc_AigDfs( pNtkTemp, 1, 0 );
- Vec_PtrForEachEntry( vNodes, pObj, k )
- {
- pObj->pCopy = Abc_AigAnd( pNtkNew->pManFunc, Abc_ObjChild0Copy(pObj), Abc_ObjChild1Copy(pObj) );
- assert( !Abc_ObjIsComplement(pObj->pCopy) );
- if ( Abc_AigNodeIsChoice(pObj) )
- for ( pFanin = pObj->pData; pFanin; pFanin = pFanin->pData )
- pFanin->pCopy->pCopy = pObj->pCopy;
- }
- Vec_PtrFree( vNodes );
-
- // map the CO nodes
- Abc_NtkForEachCo( pNtkTemp, pObj, k )
- {
- iNodeId = Nm_ManFindIdByNameTwoTypes( pNtkNew->pManName, Abc_ObjName(pObj), ABC_OBJ_PO, ABC_OBJ_BI );
- if ( iNodeId == -1 )
- {
- printf( "Cannot find CO node %s in the original network.\n", Abc_ObjName(pObj) );
- return NULL;
- }
- pObj->pCopy = Abc_NtkObj( pNtkNew, iNodeId );
- Abc_ObjAddFanin( pObj->pCopy, Abc_ObjChild0Copy(pObj) );
- }
- }
-
- // connect the remaining POs
-/*
- Abc_AigConst1(pNtk)->pCopy = Abc_AigConst1(pNtkNew);
- Abc_NtkForEachCi( pNtk, pObj, i )
- pObj->pCopy = Abc_NtkCi( pNtkNew, i );
- Abc_NtkForEachCo( pNtk, pObj, i )
- pObj->pCopy = Abc_NtkCo( pNtkNew, i );
-*/
- Abc_NtkForEachCo( pNtk, pObj, i )
- {
- if ( Abc_ObjFaninNum(pObj->pCopy) == 0 )
- Abc_ObjAddFanin( pObj->pCopy, Abc_ObjChild0Copy(pObj) );
- }
-
- // transform into the HOP manager
- pMan = Abc_NtkPartStartHop( pNtkNew );
- pNtkNew = Abc_NtkHopRemoveLoops( pNtkTemp = pNtkNew, pMan );
- Abc_NtkDelete( pNtkTemp );
-
- // check correctness of the new network
- if ( !Abc_NtkCheck( pNtkNew ) )
- {
- printf( "Abc_NtkPartStitchChoices: The network check has failed.\n" );
- Abc_NtkDelete( pNtkNew );
- return NULL;
- }
- return pNtkNew;
-}
-
-/**Function*************************************************************
-
- Synopsis [Stitches together several networks with choice nodes.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-Abc_Ntk_t * Abc_NtkFraigPartitioned( Vec_Ptr_t * vStore, void * pParams )
-{
- extern int Cmd_CommandExecute( void * pAbc, char * sCommand );
- extern void * Abc_FrameGetGlobalFrame();
-
- Vec_Ptr_t * vParts, * vFraigs, * vOnePtr;
- Vec_Int_t * vOne;
- Abc_Ntk_t * pNtk, * pNtk2, * pNtkAig, * pNtkFraig;
- int i, k;
-
- // perform partitioning
- pNtk = Vec_PtrEntry( vStore, 0 );
- assert( Abc_NtkIsStrash(pNtk) );
-// vParts = Abc_NtkPartitionNaive( pNtk, 20 );
- vParts = Abc_NtkPartitionSmart( pNtk, 300, 0 );
-
- Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "unset progressbar" );
-
- // fraig each partition
- vOnePtr = Vec_PtrAlloc( 1000 );
- vFraigs = Vec_PtrAlloc( Vec_PtrSize(vParts) );
- Vec_PtrForEachEntry( vParts, vOne, i )
- {
- // start the partition
- Abc_NtkConvertCos( pNtk, vOne, vOnePtr );
- pNtkAig = Abc_NtkCreateConeArray( pNtk, vOnePtr, 0 );
- // add nodes to the partition
- Vec_PtrForEachEntryStart( vStore, pNtk2, k, 1 )
- {
- Abc_NtkConvertCos( pNtk2, vOne, vOnePtr );
- Abc_NtkAppendToCone( pNtkAig, pNtk2, vOnePtr );
- }
- printf( "Fraiging part %4d (out of %4d) PI = %5d. PO = %5d. And = %6d. Lev = %4d.\r",
- i+1, Vec_PtrSize(vParts), Abc_NtkPiNum(pNtkAig), Abc_NtkPoNum(pNtkAig),
- Abc_NtkNodeNum(pNtkAig), Abc_AigLevel(pNtkAig) );
- // fraig the partition
- pNtkFraig = Abc_NtkFraig( pNtkAig, pParams, 1, 0 );
- Vec_PtrPush( vFraigs, pNtkFraig );
- Abc_NtkDelete( pNtkAig );
- }
- printf( " \r" );
- Vec_VecFree( (Vec_Vec_t *)vParts );
-
- Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "set progressbar" );
-
- // derive the final network
- pNtkFraig = Abc_NtkPartStitchChoices( pNtk, vFraigs );
- Vec_PtrForEachEntry( vFraigs, pNtkAig, i )
- Abc_NtkDelete( pNtkAig );
- Vec_PtrFree( vFraigs );
- Vec_PtrFree( vOnePtr );
- return pNtkFraig;
-}
-
-/**Function*************************************************************
-
- Synopsis [Stitches together several networks with choice nodes.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-void Abc_NtkFraigPartitionedTime( Abc_Ntk_t * pNtk, void * pParams )
-{
- extern int Cmd_CommandExecute( void * pAbc, char * sCommand );
- extern void * Abc_FrameGetGlobalFrame();
-
- Vec_Ptr_t * vParts, * vFraigs, * vOnePtr;
- Vec_Int_t * vOne;
- Abc_Ntk_t * pNtkAig, * pNtkFraig;
- int i;
- int clk = clock();
-
- // perform partitioning
- assert( Abc_NtkIsStrash(pNtk) );
-// vParts = Abc_NtkPartitionNaive( pNtk, 20 );
- vParts = Abc_NtkPartitionSmart( pNtk, 300, 0 );
-
- Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "unset progressbar" );
-
- // fraig each partition
- vOnePtr = Vec_PtrAlloc( 1000 );
- vFraigs = Vec_PtrAlloc( Vec_PtrSize(vParts) );
- Vec_PtrForEachEntry( vParts, vOne, i )
- {
- Abc_NtkConvertCos( pNtk, vOne, vOnePtr );
- pNtkAig = Abc_NtkCreateConeArray( pNtk, vOnePtr, 0 );
- pNtkFraig = Abc_NtkFraig( pNtkAig, pParams, 0, 0 );
- Vec_PtrPush( vFraigs, pNtkFraig );
- Abc_NtkDelete( pNtkAig );
-
- printf( "Finished part %5d (out of %5d)\r", i+1, Vec_PtrSize(vParts) );
- }
- Vec_VecFree( (Vec_Vec_t *)vParts );
-
- Cmd_CommandExecute( Abc_FrameGetGlobalFrame(), "set progressbar" );
-
- // derive the final network
- Vec_PtrForEachEntry( vFraigs, pNtkAig, i )
- Abc_NtkDelete( pNtkAig );
- Vec_PtrFree( vFraigs );
- Vec_PtrFree( vOnePtr );
- PRT( "Partitioned fraiging time", clock() - clk );
-}
-
-////////////////////////////////////////////////////////////////////////
-/// END OF FILE ///
-////////////////////////////////////////////////////////////////////////
-
-