summaryrefslogtreecommitdiffstats
path: root/src/base/cba/cbaPrsTrans.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/cba/cbaPrsTrans.c')
-rw-r--r--src/base/cba/cbaPrsTrans.c64
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 []