| /**CFile**************************************************************** |
| |
| FileName [lpkAbcUtil.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Fast Boolean matching for LUT structures.] |
| |
| Synopsis [Procedures working on decomposed functions.] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - April 28, 2007.] |
| |
| Revision [$Id: lpkAbcUtil.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "lpkInt.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [Allocates the function.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Lpk_Fun_t * Lpk_FunAlloc( int nVars ) |
| { |
| Lpk_Fun_t * p; |
| p = (Lpk_Fun_t *)ABC_ALLOC( char, sizeof(Lpk_Fun_t) + sizeof(unsigned) * Kit_TruthWordNum(nVars) * 3 ); |
| memset( p, 0, sizeof(Lpk_Fun_t) ); |
| return p; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Deletes the function] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Lpk_FunFree( Lpk_Fun_t * p ) |
| { |
| ABC_FREE( p ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Creates the starting function.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Lpk_Fun_t * Lpk_FunCreate( Abc_Ntk_t * pNtk, Vec_Ptr_t * vLeaves, unsigned * pTruth, int nLutK, int AreaLim, int DelayLim ) |
| { |
| Lpk_Fun_t * p; |
| Abc_Obj_t * pNode; |
| int i; |
| p = Lpk_FunAlloc( Vec_PtrSize(vLeaves) ); |
| p->Id = Vec_PtrSize(vLeaves); |
| p->vNodes = vLeaves; |
| p->nVars = Vec_PtrSize(vLeaves); |
| p->nLutK = nLutK; |
| p->nAreaLim = AreaLim; |
| p->nDelayLim = DelayLim; |
| p->uSupp = Kit_TruthSupport( pTruth, p->nVars ); |
| Kit_TruthCopy( Lpk_FunTruth(p,0), pTruth, p->nVars ); |
| Vec_PtrForEachEntry( Abc_Obj_t *, vLeaves, pNode, i ) |
| { |
| p->pFanins[i] = i; |
| p->pDelays[i] = pNode->Level; |
| } |
| Vec_PtrPush( p->vNodes, p ); |
| return p; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Creates the new function with the given truth table.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| Lpk_Fun_t * Lpk_FunDup( Lpk_Fun_t * p, unsigned * pTruth ) |
| { |
| Lpk_Fun_t * pNew; |
| pNew = Lpk_FunAlloc( p->nVars ); |
| pNew->Id = Vec_PtrSize(p->vNodes); |
| pNew->vNodes = p->vNodes; |
| pNew->nVars = p->nVars; |
| pNew->nLutK = p->nLutK; |
| pNew->nAreaLim = p->nAreaLim; |
| pNew->nDelayLim = p->nDelayLim; |
| pNew->uSupp = Kit_TruthSupport( pTruth, p->nVars ); |
| Kit_TruthCopy( Lpk_FunTruth(pNew,0), pTruth, p->nVars ); |
| memcpy( pNew->pFanins, p->pFanins, 16 ); |
| memcpy( pNew->pDelays, p->pDelays, 16 ); |
| Vec_PtrPush( p->vNodes, pNew ); |
| return pNew; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Minimizes support of the function.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Lpk_FunSuppMinimize( Lpk_Fun_t * p ) |
| { |
| int i, k, nVarsNew; |
| // compress the truth table |
| if ( p->uSupp == Kit_BitMask(p->nVars) ) |
| return 0; |
| // invalidate support info |
| p->fSupports = 0; |
| //Extra_PrintBinary( stdout, &p->uSupp, p->nVars ); printf( "\n" ); |
| // minimize support |
| nVarsNew = Kit_WordCountOnes(p->uSupp); |
| Kit_TruthShrink( Lpk_FunTruth(p, 1), Lpk_FunTruth(p, 0), nVarsNew, p->nVars, p->uSupp, 1 ); |
| k = 0; |
| Lpk_SuppForEachVar( p->uSupp, i ) |
| { |
| p->pFanins[k] = p->pFanins[i]; |
| p->pDelays[k] = p->pDelays[i]; |
| /* |
| if ( p->fSupports ) |
| { |
| p->puSupps[2*k+0] = p->puSupps[2*i+0]; |
| p->puSupps[2*k+1] = p->puSupps[2*i+1]; |
| } |
| */ |
| k++; |
| } |
| assert( k == nVarsNew ); |
| p->nVars = k; |
| p->uSupp = Kit_BitMask(p->nVars); |
| return 1; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Computes cofactors w.r.t. each variable.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| void Lpk_FunComputeCofSupps( Lpk_Fun_t * p ) |
| { |
| unsigned * pTruth = Lpk_FunTruth( p, 0 ); |
| unsigned * pTruth0 = Lpk_FunTruth( p, 1 ); |
| unsigned * pTruth1 = Lpk_FunTruth( p, 2 ); |
| int Var; |
| assert( p->fSupports == 0 ); |
| // Lpk_SuppForEachVar( p->uSupp, Var ) |
| for ( Var = 0; Var < (int)p->nVars; Var++ ) |
| { |
| Kit_TruthCofactor0New( pTruth0, pTruth, p->nVars, Var ); |
| Kit_TruthCofactor1New( pTruth1, pTruth, p->nVars, Var ); |
| p->puSupps[2*Var+0] = Kit_TruthSupport( pTruth0, p->nVars ); |
| p->puSupps[2*Var+1] = Kit_TruthSupport( pTruth1, p->nVars ); |
| } |
| p->fSupports = 1; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Get the delay of the bound set.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Lpk_SuppDelay( unsigned uSupp, char * pDelays ) |
| { |
| int Delay, Var; |
| Delay = 0; |
| Lpk_SuppForEachVar( uSupp, Var ) |
| Delay = Abc_MaxInt( Delay, pDelays[Var] ); |
| return Delay + 1; |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Converts support into variables.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int Lpk_SuppToVars( unsigned uBoundSet, char * pVars ) |
| { |
| int i, nVars = 0; |
| Lpk_SuppForEachVar( uBoundSet, i ) |
| pVars[nVars++] = i; |
| return nVars; |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |