summaryrefslogtreecommitdiffstats
path: root/src/opt/fxu/fxuReduce.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/opt/fxu/fxuReduce.c')
-rw-r--r--src/opt/fxu/fxuReduce.c204
1 files changed, 0 insertions, 204 deletions
diff --git a/src/opt/fxu/fxuReduce.c b/src/opt/fxu/fxuReduce.c
deleted file mode 100644
index 0ab8a157..00000000
--- a/src/opt/fxu/fxuReduce.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/**CFile****************************************************************
-
- FileName [fxuReduce.c]
-
- PackageName [MVSIS 2.0: Multi-valued logic synthesis system.]
-
- Synopsis [Procedures to reduce the number of considered cube pairs.]
-
- Author [MVSIS Group]
-
- Affiliation [UC Berkeley]
-
- Date [Ver. 1.0. Started - February 1, 2003.]
-
- Revision [$Id: fxuReduce.c,v 1.0 2003/02/01 00:00:00 alanmi Exp $]
-
-***********************************************************************/
-
-#include "abc.h"
-#include "fxuInt.h"
-#include "fxu.h"
-
-////////////////////////////////////////////////////////////////////////
-/// DECLARATIONS ///
-////////////////////////////////////////////////////////////////////////
-
-static int Fxu_CountPairDiffs( char * pCover, unsigned char pDiffs[] );
-
-////////////////////////////////////////////////////////////////////////
-/// FUNCTION DEFINITIONS ///
-////////////////////////////////////////////////////////////////////////
-
-/**Function*************************************************************
-
- Synopsis [Precomputes the pairs to use for creating two-cube divisors.]
-
- Description [This procedure takes the matrix with variables and cubes
- allocated (p), the original covers of the nodes (i-sets) and their number
- (ppCovers,nCovers). The maximum number of pairs to compute and the total
- number of pairs in existence. This procedure adds to the storage of
- divisors exactly the given number of pairs (nPairsMax) while taking
- first those pairs that have the smallest number of literals in their
- cube-free form.]
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-int Fxu_PreprocessCubePairs( Fxu_Matrix * p, Vec_Ptr_t * vCovers, int nPairsTotal, int nPairsMax )
-{
- unsigned char * pnLitsDiff; // storage for the counters of diff literals
- int * pnPairCounters; // the counters of pairs for each number of diff literals
- Fxu_Cube * pCubeFirst, * pCubeLast;
- Fxu_Cube * pCube1, * pCube2;
- Fxu_Var * pVar;
- int nCubes, nBitsMax, nSum;
- int CutOffNum, CutOffQuant;
- int iPair, iQuant, k, c;
- int clk = clock();
- char * pSopCover;
- int nFanins;
-
- assert( nPairsMax < nPairsTotal );
-
- // allocate storage for counter of diffs
- pnLitsDiff = ALLOC( unsigned char, nPairsTotal );
- // go through the covers and precompute the distances between the pairs
- iPair = 0;
- nBitsMax = -1;
- for ( c = 0; c < vCovers->nSize; c++ )
- if ( pSopCover = vCovers->pArray[c] )
- {
- nFanins = Abc_SopGetVarNum(pSopCover);
- // precompute the differences
- Fxu_CountPairDiffs( pSopCover, pnLitsDiff + iPair );
- // update the counter
- nCubes = Abc_SopGetCubeNum( pSopCover );
- iPair += nCubes * (nCubes - 1) / 2;
- if ( nBitsMax < nFanins )
- nBitsMax = nFanins;
- }
- assert( iPair == nPairsTotal );
-
- // allocate storage for counters of cube pairs by difference
- pnPairCounters = ALLOC( int, 2 * nBitsMax );
- memset( pnPairCounters, 0, sizeof(int) * 2 * nBitsMax );
- // count the number of different pairs
- for ( k = 0; k < nPairsTotal; k++ )
- pnPairCounters[ pnLitsDiff[k] ]++;
- // determine what pairs to take starting from the lower
- // so that there would be exactly pPairsMax pairs
- if ( pnPairCounters[0] != 0 )
- {
- printf( "The SOPs of the nodes are not cube-free. Run \"bdd; sop\" before \"fx\".\n" );
- return 0;
- }
- if ( pnPairCounters[1] != 0 )
- {
- printf( "The SOPs of the nodes are not SCC-free. Run \"bdd; sop\" before \"fx\".\n" );
- return 0;
- }
- assert( pnPairCounters[0] == 0 ); // otherwise, covers are not dup-free
- assert( pnPairCounters[1] == 0 ); // otherwise, covers are not SCC-free
- nSum = 0;
- for ( k = 0; k < 2 * nBitsMax; k++ )
- {
- nSum += pnPairCounters[k];
- if ( nSum >= nPairsMax )
- {
- CutOffNum = k;
- CutOffQuant = pnPairCounters[k] - (nSum - nPairsMax);
- break;
- }
- }
- FREE( pnPairCounters );
-
- // set to 0 all the pairs above the cut-off number and quantity
- iQuant = 0;
- iPair = 0;
- for ( k = 0; k < nPairsTotal; k++ )
- if ( pnLitsDiff[k] > CutOffNum )
- pnLitsDiff[k] = 0;
- else if ( pnLitsDiff[k] == CutOffNum )
- {
- if ( iQuant++ >= CutOffQuant )
- pnLitsDiff[k] = 0;
- else
- iPair++;
- }
- else
- iPair++;
- assert( iPair == nPairsMax );
-
- // collect the corresponding pairs and add the divisors
- iPair = 0;
- for ( c = 0; c < vCovers->nSize; c++ )
- if ( pSopCover = vCovers->pArray[c] )
- {
- // get the var
- pVar = p->ppVars[2*c+1];
- // get the first cube
- pCubeFirst = pVar->pFirst;
- // get the last cube
- pCubeLast = pCubeFirst;
- for ( k = 0; k < pVar->nCubes; k++ )
- pCubeLast = pCubeLast->pNext;
- assert( pCubeLast == NULL || pCubeLast->pVar != pVar );
-
- // go through the cube pairs
- for ( pCube1 = pCubeFirst; pCube1 != pCubeLast; pCube1 = pCube1->pNext )
- for ( pCube2 = pCube1->pNext; pCube2 != pCubeLast; pCube2 = pCube2->pNext )
- if ( pnLitsDiff[iPair++] )
- { // create the divisors for this pair
- Fxu_MatrixAddDivisor( p, pCube1, pCube2 );
- }
- }
- assert( iPair == nPairsTotal );
- FREE( pnLitsDiff );
-//PRT( "Preprocess", clock() - clk );
- return 1;
-}
-
-
-/**Function*************************************************************
-
- Synopsis [Counts the differences in each cube pair in the cover.]
-
- Description [Takes the cover (pCover) and the array where the
- diff counters go (pDiffs). The array pDiffs should have as many
- entries as there are different pairs of cubes in the cover: n(n-1)/2.
- Fills out the array pDiffs with the following info: For each cube
- pair, included in the array is the number of literals in both cubes
- after they are made cube free.]
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-int Fxu_CountPairDiffs( char * pCover, unsigned char pDiffs[] )
-{
- char * pCube1, * pCube2;
- int nOnes, nCubePairs, nFanins, v;
- nCubePairs = 0;
- nFanins = Abc_SopGetVarNum(pCover);
- Abc_SopForEachCube( pCover, nFanins, pCube1 )
- Abc_SopForEachCube( pCube1, nFanins, pCube2 )
- {
- if ( pCube1 == pCube2 )
- continue;
- nOnes = 0;
- for ( v = 0; v < nFanins; v++ )
- nOnes += (pCube1[v] != pCube2[v]);
- pDiffs[nCubePairs++] = nOnes;
- }
- return 1;
-}
-
-////////////////////////////////////////////////////////////////////////
-/// END OF FILE ///
-////////////////////////////////////////////////////////////////////////
-
-