summaryrefslogtreecommitdiffstats
path: root/src/base/wln/wlnObj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/wln/wlnObj.c')
-rw-r--r--src/base/wln/wlnObj.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/src/base/wln/wlnObj.c b/src/base/wln/wlnObj.c
new file mode 100644
index 00000000..ec373304
--- /dev/null
+++ b/src/base/wln/wlnObj.c
@@ -0,0 +1,151 @@
+/**CFile****************************************************************
+
+ FileName [wlnObj.c]
+
+ SystemName [ABC: Logic synthesis and verification system.]
+
+ PackageName [Word-level network.]
+
+ Synopsis [Object construction procedures.]
+
+ Author [Alan Mishchenko]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - September 23, 2018.]
+
+ Revision [$Id: wlnObj.c,v 1.00 2018/09/23 00:00:00 alanmi Exp $]
+
+***********************************************************************/
+
+#include "wln.h"
+
+ABC_NAMESPACE_IMPL_START
+
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis [Creating objects.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+char * Wln_ObjName( Wln_Ntk_t * p, int iObj )
+{
+ static char Buffer[100];
+ if ( Wln_NtkHasNameId(p) && Wln_ObjNameId(p, iObj) )
+ return Abc_NamStr( p->pManName, Wln_ObjNameId(p, iObj) );
+ sprintf( Buffer, "n%d", iObj );
+ return Buffer;
+}
+char * Wln_ObjConstString( Wln_Ntk_t * p, int iObj )
+{
+ assert( Wln_ObjIsConst(p, iObj) );
+ return Abc_NamStr( p->pManName, Wln_ObjFanin0(p, iObj) );
+}
+void Wln_ObjUpdateType( Wln_Ntk_t * p, int iObj, int Type )
+{
+ assert( Wln_ObjIsNone(p, iObj) );
+ p->nObjs[Wln_ObjType(p, iObj)]--;
+ Vec_IntWriteEntry( &p->vTypes, iObj, Type );
+ p->nObjs[Wln_ObjType(p, iObj)]++;
+}
+void Wln_ObjSetConst( Wln_Ntk_t * p, int iObj, int NameId )
+{
+ assert( Wln_ObjIsConst(p, iObj) );
+ Wln_ObjSetFanin( p, iObj, 0, NameId );
+}
+void Wln_ObjSetSlice( Wln_Ntk_t * p, int iObj, int SliceId )
+{
+ assert( Wln_ObjIsSlice(p, iObj) );
+ Wln_ObjSetFanin( p, iObj, 1, SliceId );
+}
+void Wln_ObjAddFanin( Wln_Ntk_t * p, int iObj, int i )
+{
+ Wln_Vec_t * pVec = p->vFanins + iObj;
+ if ( Wln_ObjFaninNum(p, iObj) < 2 )
+ pVec->Array[pVec->nSize++] = i;
+ else if ( Wln_ObjFaninNum(p, iObj) == 2 )
+ {
+ int * pArray = ABC_ALLOC( int, 4 );
+ pArray[0] = pVec->Array[0];
+ pArray[1] = pVec->Array[1];
+ pArray[2] = i;
+ pVec->pArray[0] = pArray;
+ pVec->nSize = 3;
+ pVec->nCap = 4;
+ }
+ else
+ {
+ if ( pVec->nSize == pVec->nCap )
+ pVec->pArray[0] = ABC_REALLOC( int, pVec->pArray[0], (pVec->nCap = 2*pVec->nSize) );
+ assert( pVec->nSize < pVec->nCap );
+ pVec->pArray[0][pVec->nSize++] = i;
+ }
+}
+int Wln_ObjAddFanins( Wln_Ntk_t * p, int iObj, Vec_Int_t * vFanins )
+{
+ int i, iFanin;
+ Vec_IntForEachEntry( vFanins, iFanin, i )
+ Wln_ObjAddFanin( p, iObj, iFanin );
+ return iObj;
+}
+int Wln_ObjAlloc( Wln_Ntk_t * p, int Type, int Signed, int End, int Beg )
+{
+ int iObj = Vec_IntSize(&p->vTypes);
+ if ( iObj == Vec_IntCap(&p->vTypes) )
+ {
+ p->vFanins = ABC_REALLOC( Wln_Vec_t, p->vFanins, 2 * iObj );
+ memset( p->vFanins + iObj, 0, sizeof(Wln_Vec_t) * iObj );
+ Vec_IntGrow( &p->vTypes, 2 * iObj );
+ }
+ assert( iObj == Vec_StrSize(&p->vSigns) );
+ assert( iObj == Vec_IntSize(&p->vRanges) );
+ Vec_IntPush( &p->vTypes, Type );
+ Vec_StrPush( &p->vSigns, (char)Signed );
+ Vec_IntPush( &p->vRanges, Hash_Int2ManInsert(p->pRanges, End, Beg, 0) );
+ if ( Wln_ObjIsCi(p, iObj) ) Wln_ObjSetFanin( p, iObj, 1, Vec_IntSize(&p->vCis) ), Vec_IntPush( &p->vCis, iObj );
+ if ( Wln_ObjIsCo(p, iObj) ) Wln_ObjSetFanin( p, iObj, 1, Vec_IntSize(&p->vCos) ), Vec_IntPush( &p->vCos, iObj );
+ if ( Wln_ObjIsFf(p, iObj) ) Vec_IntPush( &p->vFfs, iObj );
+ p->nObjs[Type]++;
+ return iObj;
+}
+int Wln_ObjClone( Wln_Ntk_t * pNew, Wln_Ntk_t * p, int iObj )
+{
+ return Wln_ObjAlloc( pNew, Wln_ObjType(p, iObj), Wln_ObjIsSigned(p, iObj), Wln_ObjRangeEnd(p, iObj), Wln_ObjRangeBeg(p, iObj) );
+}
+int Wln_ObjCreateCo( Wln_Ntk_t * p, int iFanin )
+{
+ int iCo = Wln_ObjClone( p, p, iFanin );
+ Wln_ObjUpdateType( p, iCo, ABC_OPER_CO );
+ Wln_ObjAddFanin( p, iCo, iFanin );
+ return iCo;
+}
+void Wln_ObjPrint( Wln_Ntk_t * p, int iObj )
+{
+ int k, iFanin, Type = Wln_ObjType(p, iObj);
+ printf( "Obj %6d : Type = %6s Fanins = %d : ", iObj, Abc_OperName(Type), Wln_ObjFaninNum(p, iObj) );
+ Wln_ObjForEachFanin( p, iObj, iFanin, k )
+ printf( "%5d ", iFanin );
+ printf( "\n" );
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
+ABC_NAMESPACE_IMPL_END
+