summaryrefslogtreecommitdiffstats
path: root/src/base/abcs
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/abcs')
-rw-r--r--src/base/abcs/abcSeqMan.c218
-rw-r--r--src/base/abcs/abcs.h1
2 files changed, 219 insertions, 0 deletions
diff --git a/src/base/abcs/abcSeqMan.c b/src/base/abcs/abcSeqMan.c
new file mode 100644
index 00000000..b5db4bef
--- /dev/null
+++ b/src/base/abcs/abcSeqMan.c
@@ -0,0 +1,218 @@
+/**CFile****************************************************************
+
+ FileName [abcSeqMan.c]
+
+ SystemName [ABC: Logic synthesis and verification system.]
+
+ PackageName [Network and node package.]
+
+ Synopsis [Manager of sequential AIGs.]
+
+ Author [Alan Mishchenko]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - June 20, 2005.]
+
+ Revision [$Id: abcSeqMan.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
+
+***********************************************************************/
+
+#include "abcs.h"
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+typedef struct Abc_SeqLat_t_ Abc_SeqLat_t;
+struct Abc_SeqLat_t_
+{
+ Abc_SeqLat_t * pNext; // the next Lat in the ring
+ Abc_SeqLat_t * pPrev; // the prev Lat in the ring
+};
+
+typedef struct Abc_SeqMan_t_ Abc_SeqMan_t;
+struct Abc_SeqMan_t_
+{
+ int nSize; // the number of entries in all internal arrays
+ Vec_Ptr_t * vInits; // the initial states for each edge in the AIG
+ Extra_MmFixed_t * pMmInits; // memory manager for initial states of the Lates
+
+};
+
+// reading the contents of the lat
+static inline Abc_InitType_t Abc_SeqLatInit( Abc_SeqLat_t * pLat ) { return ((unsigned)pLat->pPrev) & 3; }
+static inline Abc_SeqLat_t * Abc_SeqLatNext( Abc_SeqLat_t * pLat ) { return pLat->pNext; }
+static inline Abc_SeqLat_t * Abc_SeqLatPrev( Abc_SeqLat_t * pLat ) { return (void *)(((unsigned)pLat->pPrev) & (ABC_FULL_MASK << 2)); }
+
+// setting the contents of the lat
+static inline void Abc_SeqLatSetInit( Abc_SeqLat_t * pLat, Abc_InitType_t Init ) { pLat->pPrev = (void *)( (3 & Init) | (((unsigned)pLat->pPrev) & (ABC_FULL_MASK << 2)) ); }
+static inline void Abc_SeqLatSetNext( Abc_SeqLat_t * pLat, Abc_SeqLat_t * pNext ) { pLat->pNext = pNext; }
+static inline void Abc_SeqLatSetPrev( Abc_SeqLat_t * pLat, Abc_SeqLat_t * pPrev ) { Abc_InitType_t Init = Abc_SeqLatInit(pLat); pLat->pPrev = pPrev; Abc_SeqLatSetInit(pLat, Init); }
+
+// accessing initial state datastructure
+static inline Vec_Ptr_t * Abc_SeqNodeInits( Abc_Obj_t * pObj ) { return ((Abc_SeqMan_t*)pObj->pNtk->pManFunc)->vInits; }
+static inline Abc_SeqLat_t * Abc_SeqNodeReadInit( Abc_Obj_t * pObj, int Edge ) { return Vec_PtrEntry( Abc_SeqNodeInits(pObj), (pObj->Id<<1)+Edge ); }
+static inline void Abc_SeqNodeSetInit ( Abc_Obj_t * pObj, int Edge, Abc_SeqLat_t * pInit ) { Vec_PtrWriteEntry( Abc_SeqNodeInits(pObj), (pObj->Id<<1)+Edge, pInit ); }
+static inline Abc_SeqLat_t * Abc_SeqNodeCreateLat( Abc_Obj_t * pObj ) { return (Abc_SeqLat_t *)Extra_MmFixedEntryFetch( ((Abc_SeqMan_t*)pObj->pNtk->pManFunc)->pMmInits ); }
+static inline void Abc_SeqNodeRecycleLat( Abc_Obj_t * pObj, Abc_SeqLat_t * pLat ) { Extra_MmFixedEntryRecycle( ((Abc_SeqMan_t*)pObj->pNtk->pManFunc)->pMmInits, (char *)pLat ); }
+
+// getting the Lat with the given number
+static inline Abc_SeqLat_t * Abc_SeqNodeGetLat( Abc_Obj_t * pObj, int Edge, int iLat )
+{
+ int Counter;
+ Abc_SeqLat_t * pLat = Abc_SeqNodeReadInit(pObj, Edge);
+ for ( Counter = 0; Counter != iLat; Counter++ )
+ pLat = pLat->pNext;
+ return pLat;
+}
+// getting the first Lat
+static inline Abc_SeqLat_t * Abc_SeqNodeGetLatFirst( Abc_Obj_t * pObj, int Edge )
+{
+ return Abc_SeqNodeReadInit(pObj, Edge);
+}
+// getting the last Lat
+static inline Abc_SeqLat_t * Abc_SeqNodeGetLatLast( Abc_Obj_t * pObj, int Edge )
+{
+ return Abc_SeqLatPrev( Abc_SeqNodeReadInit(pObj, Edge) );
+}
+
+// getting the init value of the given Lat on the edge
+static inline Abc_InitType_t Abc_SeqNodeGetInitOne( Abc_Obj_t * pObj, int Edge, int iLat )
+{
+ return Abc_SeqLatInit( Abc_SeqNodeGetLat(pObj, Edge, iLat) );
+}
+// geting the init value of the first Lat on the edge
+static inline Abc_InitType_t Abc_SeqNodeGetInitFirst( Abc_Obj_t * pObj, int Edge )
+{
+ return Abc_SeqLatInit( Abc_SeqNodeGetLatFirst(pObj, Edge) );
+}
+// geting the init value of the last Lat on the edge
+static inline Abc_InitType_t Abc_SeqNodeGetInitLast( Abc_Obj_t * pObj, int Edge )
+{
+ return Abc_SeqLatInit( Abc_SeqNodeGetLatLast(pObj, Edge) );
+}
+
+
+// setting the init value of the given Lat on the edge
+static inline void Abc_SeqNodeSetInitOne( Abc_Obj_t * pObj, int Edge, int iLat, Abc_InitType_t Init )
+{
+ Abc_SeqLatSetInit( Abc_SeqNodeGetLat(pObj, Edge, iLat), Init );
+}
+
+
+// insert the first Lat on the edge
+static inline void Abc_SeqNodeInsertFirst( Abc_Obj_t * pObj, int Edge, Abc_InitType_t Init )
+{
+ Abc_SeqLat_t * pLat, * pRing, * pPrev;
+ pLat = Abc_SeqNodeCreateLat( pObj );
+ pRing = Abc_SeqNodeReadInit( pObj, Edge );
+ if ( pRing == NULL )
+ {
+ pLat->pNext = pLat->pPrev = pLat;
+ Abc_SeqNodeSetInit( pObj, Edge, pLat );
+ }
+ else
+ {
+ Abc_SeqLatSetPrev( pRing, pLat );
+ Abc_SeqLatSetNext( pLat, pRing );
+ pPrev = Abc_SeqLatPrev( pRing );
+ Abc_SeqLatSetPrev( pLat, pPrev );
+ Abc_SeqLatSetNext( pPrev, pLat );
+ Abc_SeqNodeSetInit( pObj, Edge, pLat ); // rotate the ring to make pLat the first
+ }
+ Abc_SeqLatSetInit( pLat, Init );
+}
+
+// insert the last Lat on the edge
+static inline void Abc_SeqNodeInsertLast( Abc_Obj_t * pObj, int Edge, Abc_InitType_t Init )
+{
+ Abc_SeqLat_t * pLat, * pRing, * pPrev;
+ pLat = Abc_SeqNodeCreateLat( pObj );
+ pRing = Abc_SeqNodeReadInit( pObj, Edge );
+ if ( pRing == NULL )
+ {
+ pLat->pNext = pLat->pPrev = pLat;
+ Abc_SeqNodeSetInit( pObj, Edge, pLat );
+ }
+ else
+ {
+ Abc_SeqLatSetPrev( pRing, pLat );
+ Abc_SeqLatSetNext( pLat, pRing );
+ pPrev = Abc_SeqLatPrev( pRing );
+ Abc_SeqLatSetPrev( pLat, pPrev );
+ Abc_SeqLatSetNext( pPrev, pLat );
+ }
+ Abc_SeqLatSetInit( pLat, Init );
+}
+
+// delete the first Lat on the edge
+static inline Abc_InitType_t Abc_SeqNodeDeleteFirst( Abc_Obj_t * pObj, int Edge )
+{
+ Abc_SeqLat_t * pLat, * pRing, * pPrev, * pNext;
+ pRing = Abc_SeqNodeReadInit( pObj, Edge );
+ pLat = pRing; // consider the first latch
+ if ( pLat->pNext == pLat )
+ Abc_SeqNodeSetInit( pObj, Edge, NULL );
+ else
+ {
+ pPrev = Abc_SeqLatPrev( pLat );
+ pNext = Abc_SeqLatNext( pLat );
+ Abc_SeqLatSetPrev( pNext, pPrev );
+ Abc_SeqLatSetNext( pPrev, pNext );
+ Abc_SeqNodeSetInit( pObj, Edge, pNext ); // rotate the ring
+ }
+ Abc_SeqNodeRecycleLat( pObj, pLat );
+}
+
+// delete the last Lat on the edge
+static inline Abc_InitType_t Abc_SeqNodeDeleteLast( Abc_Obj_t * pObj, int Edge )
+{
+ Abc_SeqLat_t * pLat, * pRing, * pPrev, * pNext;
+ pRing = Abc_SeqNodeReadInit( pObj, Edge );
+ pLat = Abc_SeqLatPrev( pRing ); // consider the last latch
+ if ( pLat->pNext == pLat )
+ Abc_SeqNodeSetInit( pObj, Edge, NULL );
+ else
+ {
+ pPrev = Abc_SeqLatPrev( pLat );
+ pNext = Abc_SeqLatNext( pLat );
+ Abc_SeqLatSetPrev( pNext, pPrev );
+ Abc_SeqLatSetNext( pPrev, pNext );
+ }
+ Abc_SeqNodeRecycleLat( pObj, pLat );
+}
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Abc_SeqMan_t * Abc_SeqCreate( int nMaxId )
+{
+ Abc_SeqMan_t * p;
+ // start the manager
+ p = ALLOC( Abc_SeqMan_t, 1 );
+ memset( p, 0, sizeof(Abc_SeqMan_t) );
+ p->nSize = nMaxId + 1;
+ // create internal data structures
+ p->vInits = Vec_PtrStart( 2 * p->nSize );
+ p->pMmInits = Extra_MmFixedStart( sizeof(Abc_SeqLat_t) );
+ return p;
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
diff --git a/src/base/abcs/abcs.h b/src/base/abcs/abcs.h
index e250d929..fd0bc4c9 100644
--- a/src/base/abcs/abcs.h
+++ b/src/base/abcs/abcs.h
@@ -34,6 +34,7 @@
// the maximum number of latches on the edge
#define ABC_MAX_EDGE_LATCH 16
+#define ABC_FULL_MASK 0xFFFFFFFF
////////////////////////////////////////////////////////////////////////
/// BASIC TYPES ///