| /**CFile**************************************************************** |
| |
| FileName [fpgaSwitch.c] |
| |
| PackageName [MVSIS 1.3: Multi-valued logic synthesis system.] |
| |
| Synopsis [Generic technology mapping engine.] |
| |
| Author [MVSIS Group] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - September 8, 2003.] |
| |
| Revision [$Id: fpgaSwitch.h,v 1.0 2003/09/08 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "fpgaInt.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**function************************************************************* |
| |
| synopsis [Computes the exact area associated with the cut.] |
| |
| description [] |
| |
| sideeffects [] |
| |
| seealso [] |
| |
| ***********************************************************************/ |
| float Fpga_CutGetSwitchDerefed( Fpga_Man_t * pMan, Fpga_Node_t * pNode, Fpga_Cut_t * pCut ) |
| { |
| float aResult, aResult2; |
| aResult2 = Fpga_CutRefSwitch( pMan, pNode, pCut, 0 ); |
| aResult = Fpga_CutDerefSwitch( pMan, pNode, pCut, 0 ); |
| // assert( aResult == aResult2 ); |
| return aResult; |
| } |
| |
| /**function************************************************************* |
| |
| synopsis [References the cut.] |
| |
| description [This procedure is similar to the procedure NodeReclaim.] |
| |
| sideeffects [] |
| |
| seealso [] |
| |
| ***********************************************************************/ |
| float Fpga_CutRefSwitch( Fpga_Man_t * pMan, Fpga_Node_t * pNode, Fpga_Cut_t * pCut, int fFanouts ) |
| { |
| Fpga_Node_t * pNodeChild; |
| float aArea; |
| int i; |
| // start the area of this cut |
| aArea = pNode->Switching; |
| if ( pCut->nLeaves == 1 ) |
| return aArea; |
| // go through the children |
| for ( i = 0; i < pCut->nLeaves; i++ ) |
| { |
| pNodeChild = pCut->ppLeaves[i]; |
| assert( pNodeChild->nRefs >= 0 ); |
| if ( pNodeChild->nRefs++ > 0 ) |
| continue; |
| aArea += Fpga_CutRefSwitch( pMan, pNodeChild, pNodeChild->pCutBest, fFanouts ); |
| } |
| return aArea; |
| } |
| |
| /**function************************************************************* |
| |
| synopsis [Dereferences the cut.] |
| |
| description [This procedure is similar to the procedure NodeRecusiveDeref.] |
| |
| sideeffects [] |
| |
| seealso [] |
| |
| ***********************************************************************/ |
| float Fpga_CutDerefSwitch( Fpga_Man_t * pMan, Fpga_Node_t * pNode, Fpga_Cut_t * pCut, int fFanouts ) |
| { |
| Fpga_Node_t * pNodeChild; |
| float aArea; |
| int i; |
| // start the area of this cut |
| aArea = pNode->Switching; |
| if ( pCut->nLeaves == 1 ) |
| return aArea; |
| // go through the children |
| for ( i = 0; i < pCut->nLeaves; i++ ) |
| { |
| pNodeChild = pCut->ppLeaves[i]; |
| assert( pNodeChild->nRefs > 0 ); |
| if ( --pNodeChild->nRefs > 0 ) |
| continue; |
| aArea += Fpga_CutDerefSwitch( pMan, pNodeChild, pNodeChild->pCutBest, fFanouts ); |
| } |
| return aArea; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Computes the array of mapping.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| float Fpga_MappingGetSwitching( Fpga_Man_t * pMan, Fpga_NodeVec_t * vMapping ) |
| { |
| Fpga_Node_t * pNode; |
| float Switch; |
| int i; |
| Switch = 0.0; |
| for ( i = 0; i < vMapping->nSize; i++ ) |
| { |
| pNode = vMapping->pArray[i]; |
| // at least one phase has the best cut assigned |
| assert( !Fpga_NodeIsAnd(pNode) || pNode->pCutBest != NULL ); |
| // at least one phase is used in the mapping |
| assert( pNode->nRefs > 0 ); |
| // compute the array due to the supergate |
| Switch += pNode->Switching; |
| } |
| // add buffer for each CO driven by a CI |
| for ( i = 0; i < pMan->nOutputs; i++ ) |
| if ( Fpga_NodeIsVar(Fpga_Regular(pMan->pOutputs[i])) && !Fpga_IsComplement(pMan->pOutputs[i]) ) |
| Switch += Fpga_Regular(pMan->pOutputs[i])->Switching; |
| return Switch; |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |