diff options
Diffstat (limited to 'src/base/cba/cbaPrsTrans.c')
-rw-r--r-- | src/base/cba/cbaPrsTrans.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/base/cba/cbaPrsTrans.c b/src/base/cba/cbaPrsTrans.c index 1f5ad97d..b3cd6625 100644 --- a/src/base/cba/cbaPrsTrans.c +++ b/src/base/cba/cbaPrsTrans.c @@ -33,6 +33,70 @@ ABC_NAMESPACE_IMPL_START /**Function************************************************************* + Synopsis [Count range size.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline int Prs_ManRangeSizeName( Prs_Ntk_t * p, int Name ) +{ + return 1; +} +static inline int Prs_ManRangeSizeRange( Prs_Ntk_t * p, int Range ) +{ + char * pStr; + int Left, Right; + if ( Range == 0 ) + return 1; + pStr = Prs_NtkStr( p, Range ); + assert( pStr[0] == '[' ); + Left = Right = atoi( pStr + 1 ); + pStr = strstr( pStr, "=" ); + if ( pStr ) + Right = atoi( pStr + 1 ); + return 1 + (Left > Right ? Left - Right : Right - Left); +} +static inline int Prs_ManRangeSizeConst( Prs_Ntk_t * p, int Const ) +{ + return atoi( Prs_NtkStr(p, Const) ); +} +static inline int Prs_ManRangeSizeConcat( Prs_Ntk_t * p, int Con ) +{ + extern int Prs_ManRangeSizeArray( Prs_Ntk_t * p, Vec_Int_t * vSlices, int Start, int Stop ); + Vec_Int_t * vSigs = Prs_CatSignals(p, Con); + return Prs_ManRangeSizeArray( p, vSigs, 0, Vec_IntSize(vSigs) ); +} +static inline int Prs_ManRangeSizeSignal( Prs_Ntk_t * p, int Sig ) +{ + int Value = Abc_Lit2Var2( Sig ); + Prs_ManType_t Type = Abc_Lit2Att2( Sig ); + if ( Type == CBA_PRS_NAME ) + return Prs_ManRangeSizeName( p, Value ); + if ( Type == CBA_PRS_SLICE ) + return Prs_ManRangeSizeRange( p, Prs_SliceRange(p, Value) ); + if ( Type == CBA_PRS_CONST ) + return Prs_ManRangeSizeConst( p, Value ); + if ( Type == CBA_PRS_CONCAT ) + return Prs_ManRangeSizeConcat( p, Value ); + assert( 0 ); + return 0; +} +int Prs_ManRangeSizeArray( Prs_Ntk_t * p, Vec_Int_t * vSlices, int Start, int Stop ) +{ + int i, Sig, Count = 0; + assert( Vec_IntSize(vSlices) > 0 ); + Vec_IntForEachEntryStartStop( vSlices, Sig, i, Start, Stop ) + Count += Prs_ManRangeSizeSignal( p, Sig ); + return Count; +} + + +/**Function************************************************************* + Synopsis [] Description [] |