diff options
Diffstat (limited to 'src/map/mapper/mapperTruth.c')
-rw-r--r-- | src/map/mapper/mapperTruth.c | 310 |
1 files changed, 0 insertions, 310 deletions
diff --git a/src/map/mapper/mapperTruth.c b/src/map/mapper/mapperTruth.c deleted file mode 100644 index 388b6dd3..00000000 --- a/src/map/mapper/mapperTruth.c +++ /dev/null @@ -1,310 +0,0 @@ -/**CFile**************************************************************** - - FileName [mapperTruth.c] - - PackageName [MVSIS 1.3: Multi-valued logic synthesis system.] - - Synopsis [Generic technology mapping engine.] - - Author [MVSIS Group] - - Affiliation [UC Berkeley] - - Date [Ver. 2.0. Started - June 1, 2004.] - - Revision [$Id: mapperTruth.c,v 1.8 2005/01/23 06:59:45 alanmi Exp $] - -***********************************************************************/ - -#include "mapperInt.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static void Map_TruthsCut( Map_Man_t * pMan, Map_Cut_t * pCut ); -extern void Map_TruthsCutOne( Map_Man_t * p, Map_Cut_t * pCut, unsigned uTruth[] ); -static void Map_CutsCollect_rec( Map_Cut_t * pCut, Map_NodeVec_t * vVisited ); - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Derives truth tables for each cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Map_MappingTruths( Map_Man_t * pMan ) -{ - ProgressBar * pProgress; - Map_Node_t * pNode; - Map_Cut_t * pCut; - int nNodes, i; - // compute the cuts for the POs - nNodes = pMan->vAnds->nSize; - pProgress = Extra_ProgressBarStart( stdout, nNodes ); - for ( i = 0; i < nNodes; i++ ) - { - pNode = pMan->vAnds->pArray[i]; - if ( !Map_NodeIsAnd( pNode ) ) - continue; - assert( pNode->pCuts ); - assert( pNode->pCuts->nLeaves == 1 ); - - // match the simple cut - pNode->pCuts->M[0].uPhase = 0; - pNode->pCuts->M[0].pSupers = pMan->pSuperLib->pSuperInv; - pNode->pCuts->M[0].uPhaseBest = 0; - pNode->pCuts->M[0].pSuperBest = pMan->pSuperLib->pSuperInv; - - pNode->pCuts->M[1].uPhase = 0; - pNode->pCuts->M[1].pSupers = pMan->pSuperLib->pSuperInv; - pNode->pCuts->M[1].uPhaseBest = 1; - pNode->pCuts->M[1].pSuperBest = pMan->pSuperLib->pSuperInv; - - // match the rest of the cuts - for ( pCut = pNode->pCuts->pNext; pCut; pCut = pCut->pNext ) - Map_TruthsCut( pMan, pCut ); - Extra_ProgressBarUpdate( pProgress, i, "Tables ..." ); - } - Extra_ProgressBarStop( pProgress ); -} - -/**Function************************************************************* - - Synopsis [Derives the truth table for one cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Map_TruthsCut( Map_Man_t * p, Map_Cut_t * pCut ) -{ -// unsigned uCanon1, uCanon2; - unsigned uTruth[2], uCanon[2]; - unsigned char uPhases[16]; - unsigned * uCanon2; - char * pPhases2; - int fUseFast = 1; - int fUseSlow = 0; - int fUseRec = 0; // this does not work for Solaris - - extern int Map_CanonCompute( int nVarsMax, int nVarsReal, unsigned * pt, unsigned ** pptRes, char ** ppfRes ); - - // generally speaking, 1-input cut can be matched into a wire! - if ( pCut->nLeaves == 1 ) - return; -/* - if ( p->nVarsMax == 5 ) - { - uTruth[0] = pCut->uTruth; - uTruth[1] = pCut->uTruth; - } - else -*/ - Map_TruthsCutOne( p, pCut, uTruth ); - - - // compute the canonical form for the positive phase - if ( fUseFast ) - Map_CanonComputeFast( p, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); - else if ( fUseSlow ) - Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); - else if ( fUseRec ) - { -// Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); - Extra_TruthCanonFastN( p->nVarsMax, pCut->nLeaves, uTruth, &uCanon2, &pPhases2 ); -/* - if ( uCanon[0] != uCanon2[0] || uPhases[0] != pPhases2[0] ) - { - int k = 0; - Map_CanonCompute( p->nVarsMax, pCut->nLeaves, uTruth, &uCanon2, &pPhases2 ); - } -*/ - uCanon[0] = uCanon2[0]; - uCanon[1] = (p->nVarsMax == 6)? uCanon2[1] : uCanon2[0]; - uPhases[0] = pPhases2[0]; - } - else - Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); - pCut->M[1].pSupers = Map_SuperTableLookupC( p->pSuperLib, uCanon ); - pCut->M[1].uPhase = uPhases[0]; - p->nCanons++; - -//uCanon1 = uCanon[0] & 0xFFFF; - - // compute the canonical form for the negative phase - uTruth[0] = ~uTruth[0]; - uTruth[1] = ~uTruth[1]; - if ( fUseFast ) - Map_CanonComputeFast( p, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); - else if ( fUseSlow ) - Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); - else if ( fUseRec ) - { -// Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); - Extra_TruthCanonFastN( p->nVarsMax, pCut->nLeaves, uTruth, &uCanon2, &pPhases2 ); -/* - if ( uCanon[0] != uCanon2[0] || uPhases[0] != pPhases2[0] ) - { - int k = 0; - Map_CanonCompute( p->nVarsMax, pCut->nLeaves, uTruth, &uCanon2, &pPhases2 ); - } -*/ - uCanon[0] = uCanon2[0]; - uCanon[1] = (p->nVarsMax == 6)? uCanon2[1] : uCanon2[0]; - uPhases[0] = pPhases2[0]; - } - else - Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); - pCut->M[0].pSupers = Map_SuperTableLookupC( p->pSuperLib, uCanon ); - pCut->M[0].uPhase = uPhases[0]; - p->nCanons++; - -//uCanon2 = uCanon[0] & 0xFFFF; -//assert( p->nVarsMax == 4 ); -//Rwt_Man4ExploreCount( uCanon1 < uCanon2 ? uCanon1 : uCanon2 ); - - // restore the truth table - uTruth[0] = ~uTruth[0]; - uTruth[1] = ~uTruth[1]; -} - -/**Function************************************************************* - - Synopsis [Computes the truth table of one cut.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Map_TruthsCutOne( Map_Man_t * p, Map_Cut_t * pCut, unsigned uTruth[] ) -{ - unsigned uTruth1[2], uTruth2[2]; - Map_Cut_t * pTemp; - int i; - // mark the cut leaves - for ( i = 0; i < pCut->nLeaves; i++ ) - { - pTemp = pCut->ppLeaves[i]->pCuts; - pTemp->fMark = 1; - pTemp->M[0].uPhaseBest = p->uTruths[i][0]; - pTemp->M[1].uPhaseBest = p->uTruths[i][1]; - } - assert( pCut->fMark == 0 ); - - // collect the cuts in the cut cone - p->vVisited->nSize = 0; - Map_CutsCollect_rec( pCut, p->vVisited ); - assert( p->vVisited->nSize > 0 ); - pCut->nVolume = p->vVisited->nSize; - - // compute the tables and unmark - for ( i = 0; i < pCut->nLeaves; i++ ) - { - pTemp = pCut->ppLeaves[i]->pCuts; - pTemp->fMark = 0; - } - for ( i = 0; i < p->vVisited->nSize; i++ ) - { - // get the cut - pTemp = (Map_Cut_t *)p->vVisited->pArray[i]; - pTemp->fMark = 0; - // get truth table of the first branch - if ( Map_CutIsComplement(pTemp->pOne) ) - { - uTruth1[0] = ~Map_CutRegular(pTemp->pOne)->M[0].uPhaseBest; - uTruth1[1] = ~Map_CutRegular(pTemp->pOne)->M[1].uPhaseBest; - } - else - { - uTruth1[0] = Map_CutRegular(pTemp->pOne)->M[0].uPhaseBest; - uTruth1[1] = Map_CutRegular(pTemp->pOne)->M[1].uPhaseBest; - } - // get truth table of the second branch - if ( Map_CutIsComplement(pTemp->pTwo) ) - { - uTruth2[0] = ~Map_CutRegular(pTemp->pTwo)->M[0].uPhaseBest; - uTruth2[1] = ~Map_CutRegular(pTemp->pTwo)->M[1].uPhaseBest; - } - else - { - uTruth2[0] = Map_CutRegular(pTemp->pTwo)->M[0].uPhaseBest; - uTruth2[1] = Map_CutRegular(pTemp->pTwo)->M[1].uPhaseBest; - } - // get the truth table of the output - if ( !pTemp->Phase ) - { - pTemp->M[0].uPhaseBest = uTruth1[0] & uTruth2[0]; - pTemp->M[1].uPhaseBest = uTruth1[1] & uTruth2[1]; - } - else - { - pTemp->M[0].uPhaseBest = ~(uTruth1[0] & uTruth2[0]); - pTemp->M[1].uPhaseBest = ~(uTruth1[1] & uTruth2[1]); - } - } - uTruth[0] = pTemp->M[0].uPhaseBest; - uTruth[1] = pTemp->M[1].uPhaseBest; -} - -/**Function************************************************************* - - Synopsis [Recursively collect the cuts.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Map_CutsCollect_rec( Map_Cut_t * pCut, Map_NodeVec_t * vVisited ) -{ - if ( pCut->fMark ) - return; - Map_CutsCollect_rec( Map_CutRegular(pCut->pOne), vVisited ); - Map_CutsCollect_rec( Map_CutRegular(pCut->pTwo), vVisited ); - assert( pCut->fMark == 0 ); - pCut->fMark = 1; - Map_NodeVecPush( vVisited, (Map_Node_t *)pCut ); -} - -/* - { - unsigned * uCanon2; - char * pPhases2; - - Map_CanonComputeSlow( p->uTruths, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); - Map_CanonCompute( p->nVarsMax, pCut->nLeaves, uTruth, &uCanon2, &pPhases2 ); - if ( uCanon2[0] != uCanon[0] ) - { - int v = 0; - Map_CanonCompute( p->nVarsMax, pCut->nLeaves, uTruth, &uCanon2, &pPhases2 ); - Map_CanonComputeFast( p, p->nVarsMax, pCut->nLeaves, uTruth, uPhases, uCanon ); - } -// else -// { -// printf( "Correct.\n" ); -// } - } -*/ - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - |