summaryrefslogtreecommitdiffstats
path: root/src/base/cba/cba.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/cba/cba.h')
-rw-r--r--src/base/cba/cba.h1167
1 files changed, 525 insertions, 642 deletions
diff --git a/src/base/cba/cba.h b/src/base/cba/cba.h
index 6d4262fc..20b4a7b1 100644
--- a/src/base/cba/cba.h
+++ b/src/base/cba/cba.h
@@ -12,7 +12,7 @@
Affiliation [UC Berkeley]
- Date [Ver. 1.0. Started - November 29, 2014.]
+ Date [Ver. 1.0. Started - July 21, 2015.]
Revision [$Id: cba.h,v 1.00 2014/11/29 00:00:00 alanmi Exp $]
@@ -44,14 +44,16 @@ typedef enum {
CBA_OBJ_NONE = 0, // 0: unused
CBA_OBJ_PI, // 1: input
CBA_OBJ_PO, // 2: output
- CBA_OBJ_BI, // 3: box input
- CBA_OBJ_BO, // 4: box output
- CBA_OBJ_BOX, // 5: box
-
- CBA_BOX_CF,
- CBA_BOX_CT,
- CBA_BOX_CX,
- CBA_BOX_CZ,
+ CBA_OBJ_BOX, // 3: box
+
+ CBA_BOX_SLICE,
+ CBA_BOX_CONCAT,
+
+ CBA_BOX_CF,
+ CBA_BOX_CT,
+ CBA_BOX_CX,
+ CBA_BOX_CZ,
+
CBA_BOX_BUF,
CBA_BOX_INV,
CBA_BOX_AND,
@@ -93,7 +95,7 @@ typedef enum {
CBA_BOX_DIV,
CBA_BOX_MOD,
CBA_BOX_REM,
- CBA_BOX_POW,
+ CBA_OBJ_POW,
CBA_BOX_MIN,
CBA_BOX_ABS,
@@ -125,18 +127,10 @@ typedef enum {
CBA_BOX_DFF,
CBA_BOX_DFFRS,
- CBA_BOX_UNKNOWN // 67
+ CBA_BOX_LAST // 67
} Cba_ObjType_t;
-// name types
-typedef enum {
- CBA_NAME_BIN = 0, // 0: binary variable
- CBA_NAME_WORD, // 1: first bit of word-level variable
- CBA_NAME_INFO, // 2: first bit of special variable
- CBA_NAME_INDEX, // 3: index of word-level variable
-} Cba_NameType_t;
-
typedef struct Cba_Ntk_t_ Cba_Ntk_t;
typedef struct Cba_Man_t_ Cba_Man_t;
@@ -145,26 +139,40 @@ typedef struct Cba_Man_t_ Cba_Man_t;
struct Cba_Ntk_t_
{
Cba_Man_t * pDesign; // design
- int NameId; // name ID
+ int Id; // network ID
+ int NameId; // name ID
int iCopy; // copy module
- int iBoxNtk; // instance network ID
- int iBoxObj; // instance object ID
- int Count; // object counter
int Mark; // visit mark
// interface
Vec_Int_t vInputs; // inputs
Vec_Int_t vOutputs; // outputs
- Vec_Int_t vInfo; // input/output/wire info
- // object attributes
- Vec_Str_t vType; // types
- Vec_Int_t vFanin; // fanin
- Vec_Int_t vIndex; // index
- Vec_Int_t vName; // original NameId or InstId
- Vec_Int_t vFanout; // fanout
- Vec_Int_t vCopy; // copy
+ Vec_Int_t vOrder; // order
+ // stucture
+ Vec_Str_t vObjType; // type
+ Vec_Int_t vObjFin0; // fanins
+ Vec_Int_t vObjFon0; // outputs
+ Vec_Int_t vFinFon; // fons
+ Vec_Int_t vFonObj; // object
+ // optional
+ Vec_Int_t vObjCopy; // copy
+ Vec_Int_t vObjFunc; // function
+ Vec_Int_t vObjName; // name
+ Vec_Int_t vObjAttr; // attribute offset
+ Vec_Int_t vAttrSto; // attribute storage
+ Vec_Int_t vFonCopy; // copy
+ Vec_Int_t vFonName; // name
+ Vec_Int_t vFonRange;// range
+ Vec_Int_t vFonLeft; // left
+ Vec_Int_t vFonRight;// right
+ Vec_Int_t vFonPrev; // fanout: prev fon
+ Vec_Int_t vFonNext; // fanout: next fon
+ Vec_Int_t vFinFon0; // fanout: first fon
+ Vec_Int_t vFinObj; // object
+ Vec_Int_t vNtkObjs; // instances
// other
- Vec_Int_t vArray;
- Vec_Int_t vArray2;
+ Vec_Ptr_t * vOther; // various data
+ Vec_Int_t vArray0;
+ Vec_Int_t vArray1;
};
// design
@@ -177,158 +185,169 @@ struct Cba_Man_t_
Abc_Nam_t * pMods; // module name manager
// internal data
int iRoot; // root network
- int nNtks; // number of current networks
- Cba_Ntk_t * pNtks; // networks
+ Vec_Ptr_t vNtks; // networks
// user data
Vec_Str_t * vOut;
Vec_Str_t * vOut2;
- Vec_Int_t vBuf2RootNtk;
- Vec_Int_t vBuf2RootObj;
- Vec_Int_t vBuf2LeafNtk;
- Vec_Int_t vBuf2LeafObj;
- void * pMioLib;
- void ** ppGraphs;
- int ElemGates[4];
- char * pPrimNames[CBA_BOX_UNKNOWN];
- char * pPrimSymbs[CBA_BOX_UNKNOWN];
};
+////////////////////////////////////////////////////////////////////////
+/// MACRO DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
static inline char * Cba_ManName( Cba_Man_t * p ) { return p->pName; }
static inline char * Cba_ManSpec( Cba_Man_t * p ) { return p->pSpec; }
-static inline int Cba_ManNtkNum( Cba_Man_t * p ) { return p->nNtks; }
-static inline int Cba_ManPrimNum( Cba_Man_t * p ) { return Abc_NamObjNumMax(p->pMods) - Cba_ManNtkNum(p); }
+static inline int Cba_ManNtkNum( Cba_Man_t * p ) { return Vec_PtrSize(&p->vNtks)-1; }
static inline int Cba_ManNtkIsOk( Cba_Man_t * p, int i ) { return i > 0 && i <= Cba_ManNtkNum(p); }
-static inline Cba_Ntk_t * Cba_ManNtk( Cba_Man_t * p, int i ) { return Cba_ManNtkIsOk(p, i) ? p->pNtks + i : NULL; }
+static inline Cba_Ntk_t * Cba_ManNtk( Cba_Man_t * p, int i ) { return Cba_ManNtkIsOk(p, i) ? (Cba_Ntk_t *)Vec_PtrEntry(&p->vNtks, i) : NULL; }
static inline int Cba_ManNtkFindId( Cba_Man_t * p, char * pName ) { return Abc_NamStrFind(p->pMods, pName); }
static inline Cba_Ntk_t * Cba_ManNtkFind( Cba_Man_t * p, char * pName ) { return Cba_ManNtk( p, Cba_ManNtkFindId(p, pName) ); }
static inline Cba_Ntk_t * Cba_ManRoot( Cba_Man_t * p ) { return Cba_ManNtk(p, p->iRoot); }
static inline char * Cba_ManStr( Cba_Man_t * p, int i ) { return Abc_NamStr(p->pStrs, i); }
static inline int Cba_ManStrId( Cba_Man_t * p, char * pStr ) { return Abc_NamStrFind(p->pStrs, pStr); }
-static inline char * Cba_ManPrimName( Cba_Man_t * p, Cba_ObjType_t Type ) { return p->pPrimNames[Type]; }
-static inline char * Cba_ManPrimSymb( Cba_Man_t * p, Cba_ObjType_t Type ) { return p->pPrimSymbs[Type]; }
+static inline int Cba_ManNewStrId( Cba_Man_t * p, char * pPref, int n, char * pSuff ) { char pStr[100]; sprintf(pStr, "%s%d%s", pPref?pPref:"", n, pSuff?pSuff:""); return Abc_NamStrFindOrAdd(p->pStrs, pStr, NULL); }
+static inline int Cba_ManNameIdMax( Cba_Man_t * p ) { return Abc_NamObjNumMax(p->pStrs) + 1; }
-static inline int Cba_NtkId( Cba_Ntk_t * p ) { int i = p - p->pDesign->pNtks; assert(Cba_ManNtkIsOk(p->pDesign, i)); return i; }
static inline Cba_Man_t * Cba_NtkMan( Cba_Ntk_t * p ) { return p->pDesign; }
-static inline int Cba_NtkNameId( Cba_Ntk_t * p ) { return p->NameId; }
-static inline char * Cba_NtkName( Cba_Ntk_t * p ) { return Cba_ManStr(p->pDesign, Cba_NtkNameId(p)); }
+static inline Cba_Ntk_t * Cba_NtkNtk( Cba_Ntk_t * p, int i ) { return Cba_ManNtk(p->pDesign, i); }
+static inline int Cba_NtkId( Cba_Ntk_t * p ) { return p->Id; }
+static inline int Cba_NtkPi( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vInputs, i); }
+static inline int Cba_NtkPo( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vOutputs, i); }
+static inline char * Cba_NtkStr( Cba_Ntk_t * p, int i ) { return Cba_ManStr(p->pDesign, i); }
+static inline char * Cba_NtkName( Cba_Ntk_t * p ) { return Cba_NtkStr(p, p->NameId); }
static inline int Cba_NtkCopy( Cba_Ntk_t * p ) { return p->iCopy; }
static inline Cba_Ntk_t * Cba_NtkCopyNtk(Cba_Man_t * pNew, Cba_Ntk_t * p) { return Cba_ManNtk(pNew, Cba_NtkCopy(p)); }
-static inline void Cba_NtkSetCopy( Cba_Ntk_t * p, int i ) { assert(p->iCopy == -1); p->iCopy = i; }
+static inline void Cba_NtkSetCopy( Cba_Ntk_t * p, int i ) { assert(p->iCopy == 0); p->iCopy = i; }
-static inline int Cba_NtkObjNum( Cba_Ntk_t * p ) { return Vec_StrSize(&p->vType); }
-static inline int Cba_NtkObjNumAlloc( Cba_Ntk_t * p ) { return Vec_StrCap(&p->vType); }
static inline int Cba_NtkPiNum( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vInputs); }
static inline int Cba_NtkPoNum( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vOutputs); }
static inline int Cba_NtkPioNum( Cba_Ntk_t * p ) { return Cba_NtkPiNum(p) + Cba_NtkPoNum(p); }
static inline int Cba_NtkPiNumAlloc( Cba_Ntk_t * p ) { return Vec_IntCap(&p->vInputs); }
static inline int Cba_NtkPoNumAlloc( Cba_Ntk_t * p ) { return Vec_IntCap(&p->vOutputs); }
-static inline int Cba_NtkBiNum( Cba_Ntk_t * p ) { return Vec_StrCountEntryLit(&p->vType, (char)CBA_OBJ_BI); }
-static inline int Cba_NtkBoNum( Cba_Ntk_t * p ) { return Vec_StrCountEntryLit(&p->vType, (char)CBA_OBJ_BO); }
-static inline int Cba_NtkCiNum( Cba_Ntk_t * p ) { return Cba_NtkPiNum(p) + Cba_NtkBoNum(p); }
-static inline int Cba_NtkCoNum( Cba_Ntk_t * p ) { return Cba_NtkPoNum(p) + Cba_NtkBiNum(p); }
-static inline int Cba_NtkBoxNum( Cba_Ntk_t * p ) { return Cba_NtkObjNum(p) - Vec_StrCountSmallerLit(&p->vType, (char)CBA_OBJ_BOX); }
-static inline int Cba_NtkPrimNum( Cba_Ntk_t * p ) { return Vec_StrCountLargerLit(&p->vType, (char)CBA_OBJ_BOX); }
-static inline int Cba_NtkUserNum( Cba_Ntk_t * p ) { return Vec_StrCountEntryLit(&p->vType, (char)CBA_OBJ_BOX); }
-
-static inline int Cba_NtkPi( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vInputs, i); }
-static inline int Cba_NtkPo( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vOutputs, i); }
-static inline char * Cba_NtkStr( Cba_Ntk_t * p, int i ) { return Cba_ManStr(p->pDesign, i); }
-static inline Cba_Ntk_t * Cba_NtkHostNtk( Cba_Ntk_t * p ) { return p->iBoxNtk > 0 ? Cba_ManNtk(p->pDesign, p->iBoxNtk) : NULL; }
-static inline int Cba_NtkHostObj( Cba_Ntk_t * p ) { return p->iBoxObj; }
-static inline void Cba_NtkSetHost( Cba_Ntk_t * p, int n, int i ) { assert(p->iBoxNtk == -1); p->iBoxNtk = n; p->iBoxObj = i; }
-
-static inline int Cba_InfoRange( int Beg, int End ) { return End > Beg ? End - Beg + 1 : Beg - End + 1; }
-static inline int Cba_NtkInfoNum( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vInfo)/3; }
-static inline int Cba_NtkInfoNumAlloc( Cba_Ntk_t * p ) { return Vec_IntCap(&p->vInfo)/3; }
-static inline int Cba_NtkInfoType( Cba_Ntk_t * p, int i ) { return Abc_Lit2Att2(Vec_IntEntry(&p->vInfo, 3*i)); }
-static inline int Cba_NtkInfoName( Cba_Ntk_t * p, int i ) { return Abc_Lit2Var2(Vec_IntEntry(&p->vInfo, 3*i)); }
-static inline int Cba_NtkInfoBeg( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vInfo, 3*i+1); }
-static inline int Cba_NtkInfoEnd( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vInfo, 3*i+2); }
-static inline int Cba_NtkInfoRange( Cba_Ntk_t * p, int i ) { int* a = Vec_IntEntryP(&p->vInfo, 3*i); return a[1]>=0 ? Cba_InfoRange( a[1], a[2] ) : 1; }
-static inline int Cba_NtkInfoIndex( Cba_Ntk_t * p, int i, int j ) { int* a = Vec_IntEntryP(&p->vInfo, 3*i); assert(a[1]>=0); return a[1]<a[2] ? a[1]+j : a[1]-j;}
-static inline void Cba_NtkAddInfo( Cba_Ntk_t * p,int i,int b,int e){ Vec_IntPush(&p->vInfo, i); Vec_IntPushTwo(&p->vInfo, b, e); }
-static inline void Cba_NtkSetInfoName( Cba_Ntk_t * p, int i, int n){ Vec_IntWriteEntry( &p->vInfo, 3*i, n ); }
-
-static inline void Cba_NtkStartNames( Cba_Ntk_t * p ) { assert(Cba_NtkObjNumAlloc(p)); Vec_IntFill(&p->vName, Cba_NtkObjNumAlloc(p), 0); }
-static inline void Cba_NtkStartFanouts( Cba_Ntk_t * p ) { assert(Cba_NtkObjNumAlloc(p)); Vec_IntFill(&p->vFanout, Cba_NtkObjNumAlloc(p), 0); }
-static inline void Cba_NtkStartCopies( Cba_Ntk_t * p ) { assert(Cba_NtkObjNumAlloc(p)); Vec_IntFill(&p->vCopy, Cba_NtkObjNumAlloc(p), -1); }
-static inline void Cba_NtkFreeNames( Cba_Ntk_t * p ) { Vec_IntErase(&p->vName); }
-static inline void Cba_NtkFreeFanouts( Cba_Ntk_t * p ) { Vec_IntErase(&p->vFanout); }
-static inline void Cba_NtkFreeCopies( Cba_Ntk_t * p ) { Vec_IntErase(&p->vCopy); }
-static inline int Cba_NtkHasNames( Cba_Ntk_t * p ) { return p->vName.pArray != NULL; }
-static inline int Cba_NtkHasFanouts( Cba_Ntk_t * p ) { return p->vFanout.pArray != NULL; }
-static inline int Cba_NtkHasCopies( Cba_Ntk_t * p ) { return p->vCopy.pArray != NULL; }
-
-static inline int Cba_TypeIsBox( Cba_ObjType_t Type ) { return Type >= CBA_OBJ_BOX && Type < CBA_BOX_UNKNOWN; }
-static inline Cba_NameType_t Cba_NameType( int n ) { assert( n ); return (Cba_NameType_t)Abc_Lit2Att2( n ); }
-static inline int Cba_CharIsDigit( char c ) { return c >= '0' && c <= '9'; }
-
-static inline Cba_ObjType_t Cba_ObjType( Cba_Ntk_t * p, int i ) { return (Cba_ObjType_t)Abc_Lit2Var((int)(unsigned char)Vec_StrEntry(&p->vType, i)); }
+static inline int Cba_NtkObjNum( Cba_Ntk_t * p ) { return Vec_StrSize(&p->vObjType)-1; }
+static inline int Cba_NtkObjNumAlloc( Cba_Ntk_t * p ) { return Vec_StrCap(&p->vObjType)-1; }
+static inline int Cba_NtkFinNum( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vFinFon)-1; }
+static inline int Cba_NtkFinNumAlloc( Cba_Ntk_t * p ) { return Vec_IntCap(&p->vFinFon)-1; }
+static inline int Cba_NtkFonNum( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vFonObj)-1; }
+static inline int Cba_NtkFonNumAlloc( Cba_Ntk_t * p ) { return Vec_IntCap(&p->vFonObj)-1; }
+static inline int Cba_NtkTypeNum( Cba_Ntk_t * p, int Type ) { return Vec_StrCountEntry(&p->vObjType, (char)Type); }
+static inline int Cba_NtkBoxNum( Cba_Ntk_t * p ) { return Cba_NtkObjNum(p) - Cba_NtkPioNum(p); }
+static inline int Cba_NtkBoxUserNum( Cba_Ntk_t * p ) { return Cba_NtkTypeNum(p, CBA_OBJ_BOX); }
+static inline int Cba_NtkBoxPrimNum( Cba_Ntk_t * p ) { return Vec_StrCountLarger(&p->vObjType, (char)CBA_OBJ_BOX); }
+
+static inline void Cba_NtkStartObjCopies( Cba_Ntk_t * p ) { Vec_IntFill(&p->vObjCopy, Vec_StrCap(&p->vObjType), -1); }
+static inline void Cba_NtkStartObjFuncs( Cba_Ntk_t * p ) { Vec_IntFill(&p->vObjFunc, Vec_StrCap(&p->vObjType), 0); }
+static inline void Cba_NtkStartObjNames( Cba_Ntk_t * p ) { Vec_IntFill(&p->vObjName, Vec_StrCap(&p->vObjType), 0); }
+static inline void Cba_NtkStartObjAttrs( Cba_Ntk_t * p ) { Vec_IntFill(&p->vObjAttr, Vec_StrCap(&p->vObjType), 0); }
+static inline void Cba_NtkStartFonCopies( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonCopy, Vec_IntCap(&p->vFonObj), 0); }
+static inline void Cba_NtkStartFonNames( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonName, Vec_IntCap(&p->vFonObj), 0); }
+static inline void Cba_NtkStartFonRanges( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonRange,Vec_IntCap(&p->vFonObj), 0); }
+static inline void Cba_NtkStartFonLefts( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonLeft, Vec_IntCap(&p->vFonObj), 0); }
+static inline void Cba_NtkStartFonRights( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonRight,Vec_IntCap(&p->vFonObj), 0); }
+static inline void Cba_NtkStartFonPrevs( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonPrev, Vec_IntCap(&p->vFonObj), 0); }
+static inline void Cba_NtkStartFonNexts( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonNext, Vec_IntCap(&p->vFonObj), 0); }
+static inline void Cba_NtkStartFinFon0( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFinFon0, Vec_IntCap(&p->vFinFon), 0); }
+static inline void Cba_NtkStartFinObjs( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFinObj, Vec_IntCap(&p->vFinFon), 0); }
+
+static inline void Cba_NtkFreeObjCopies( Cba_Ntk_t * p ) { Vec_IntErase(&p->vObjCopy); }
+static inline void Cba_NtkFreeObjFuncs( Cba_Ntk_t * p ) { Vec_IntErase(&p->vObjFunc); }
+static inline void Cba_NtkFreeObjNames( Cba_Ntk_t * p ) { Vec_IntErase(&p->vObjName); }
+static inline void Cba_NtkFreeObjAttrs( Cba_Ntk_t * p ) { Vec_IntErase(&p->vObjAttr); }
+static inline void Cba_NtkFreeFonCopies( Cba_Ntk_t * p ) { Vec_IntErase(&p->vFonCopy); }
+static inline void Cba_NtkFreeFonNames( Cba_Ntk_t * p ) { Vec_IntErase(&p->vFonName); }
+static inline void Cba_NtkFreeFonRanges( Cba_Ntk_t * p ) { Vec_IntErase(&p->vFonRange); }
+static inline void Cba_NtkFreeFonLefts( Cba_Ntk_t * p ) { Vec_IntErase(&p->vFonLeft); }
+static inline void Cba_NtkFreeFonRights( Cba_Ntk_t * p ) { Vec_IntErase(&p->vFonRight); }
+static inline void Cba_NtkFreeFonPrevs( Cba_Ntk_t * p ) { Vec_IntErase(&p->vFonPrev); }
+static inline void Cba_NtkFreeFonNexts( Cba_Ntk_t * p ) { Vec_IntErase(&p->vFonNext); }
+static inline void Cba_NtkFreeFinFon0( Cba_Ntk_t * p ) { Vec_IntErase(&p->vFinFon0); }
+static inline void Cba_NtkFreeFinObjs( Cba_Ntk_t * p ) { Vec_IntErase(&p->vFinObj); }
+
+static inline int Cba_NtkHasObjCopies( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vObjCopy) > 0; }
+static inline int Cba_NtkHasObjFuncs( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vObjFunc) > 0; }
+static inline int Cba_NtkHasObjNames( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vObjName) > 0; }
+static inline int Cba_NtkHasObjAttrs( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vObjAttr) > 0; }
+static inline int Cba_NtkHasFonCopies( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vFonCopy) > 0; }
+static inline int Cba_NtkHasFonNames( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vFonName) > 0; }
+static inline int Cba_NtkHasFonRanges( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vFonRange)> 0; }
+static inline int Cba_NtkHasFonLefts( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vFonLeft) > 0; }
+static inline int Cba_NtkHasFonRights( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vFonRight)> 0; }
+static inline int Cba_NtkHasFonPrevs( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vFonPrev) > 0; }
+static inline int Cba_NtkHasFonNexts( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vFonNext) > 0; }
+static inline int Cba_NtkHasFinFon0( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vFinFon0) > 0; }
+static inline int Cba_NtkHasFinObjs( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vFinObj) > 0; }
+
+static inline void Cba_NtkCleanObjCopies( Cba_Ntk_t * p ) { Vec_IntFill(&p->vObjCopy, Vec_StrSize(&p->vObjType), -1); }
+static inline void Cba_NtkCleanFonCopies( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonCopy, Vec_IntSize(&p->vFonObj), -1); }
+static inline void Cba_NtkCleanFonNames( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonName, Vec_IntSize(&p->vFonObj), 0); }
+
+static inline Cba_ObjType_t Cba_ObjType( Cba_Ntk_t * p, int i ) { assert(i>0); return (Cba_ObjType_t)(int)(unsigned char)Vec_StrEntry(&p->vObjType, i); }
+static inline void Cba_ObjCleanType( Cba_Ntk_t * p, int i ) { assert(i>0); Vec_StrWriteEntry( &p->vObjType, i, (char)CBA_OBJ_NONE ); }
+static inline int Cba_TypeIsBox( Cba_ObjType_t Type ) { return Type >= CBA_OBJ_BOX && Type < CBA_BOX_LAST; }
+
static inline int Cba_ObjIsPi( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) == CBA_OBJ_PI; }
static inline int Cba_ObjIsPo( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) == CBA_OBJ_PO; }
static inline int Cba_ObjIsPio( Cba_Ntk_t * p, int i ) { return Cba_ObjIsPi(p, i) || Cba_ObjIsPo(p, i); }
-static inline int Cba_ObjIsBi( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) == CBA_OBJ_BI; }
-static inline int Cba_ObjIsBo( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) == CBA_OBJ_BO; }
-static inline int Cba_ObjIsBio( Cba_Ntk_t * p, int i ) { return Cba_ObjIsBi(p, i) || Cba_ObjIsBo(p, i); }
static inline int Cba_ObjIsBox( Cba_Ntk_t * p, int i ) { return Cba_TypeIsBox(Cba_ObjType(p, i)); }
static inline int Cba_ObjIsBoxUser( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) == CBA_OBJ_BOX; }
-static inline int Cba_ObjIsBoxPrim( Cba_Ntk_t * p, int i ) { return Cba_ObjIsBox(p, i) && !Cba_ObjIsBoxUser(p, i); }
+static inline int Cba_ObjIsBoxPrim( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) > CBA_OBJ_BOX && Cba_ObjType(p, i) < CBA_BOX_LAST; }
static inline int Cba_ObjIsGate( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) == CBA_BOX_GATE; }
-static inline int Cba_ObjIsCi( Cba_Ntk_t * p, int i ) { return Cba_ObjIsPi(p, i) || Cba_ObjIsBo(p, i); }
-static inline int Cba_ObjIsCo( Cba_Ntk_t * p, int i ) { return Cba_ObjIsPo(p, i) || Cba_ObjIsBi(p, i); }
-static inline int Cba_ObjIsCio( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) < CBA_OBJ_BOX; }
-static inline int Cba_ObjIsConst( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) >= CBA_BOX_CF && Cba_ObjType(p, i) <= CBA_BOX_CZ; }
-static inline int Cba_ObjIsConstBin( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) == CBA_BOX_CF || Cba_ObjType(p, i) == CBA_BOX_CT; }
-
-static inline int Cba_ObjBit( Cba_Ntk_t * p, int i ) { assert(!Cba_ObjIsBox(p, i)); return Abc_LitIsCompl((int)Vec_StrEntry(&p->vType, i)); }
-static inline void Cba_ObjSetBit( Cba_Ntk_t * p, int i ) { char *q = Vec_StrArray(&p->vType); assert(!Cba_ObjIsBox(p, i)); q[i] = (char)Abc_LitNot((int)q[i]); }
-static inline int Cba_ObjFanin( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsCo(p, i)); return Vec_IntEntry(&p->vFanin, i); }
-static inline int Cba_ObjIndex( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsCio(p, i)); return Vec_IntEntry(&p->vIndex, i); }
-static inline int Cba_ObjNameInt( Cba_Ntk_t * p, int i ) { assert(!Cba_ObjIsCo(p, i)); return Vec_IntEntry(&p->vName, i); }
-static inline int Cba_ObjName( Cba_Ntk_t * p, int i ) { return Cba_ObjIsCo(p, i) ? Cba_ObjNameInt(p, Cba_ObjFanin(p,i)) : Cba_ObjNameInt(p, i); }
-static inline Cba_NameType_t Cba_ObjNameType( Cba_Ntk_t * p, int i ) { return Cba_NameType( Cba_ObjName(p, i) ); }
-static inline int Cba_ObjNameId( Cba_Ntk_t * p, int i ) { return Abc_Lit2Var2( Cba_ObjName(p, i) ); }
-static inline char * Cba_ObjNameStr( Cba_Ntk_t * p, int i ) { assert(Cba_ObjNameType(p, i) <= CBA_NAME_WORD); return Cba_NtkStr(p, Cba_ObjNameId(p, i)); }
-static inline int Cba_ObjCopy( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vCopy, i); }
-static inline int Cba_ObjFanout( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsCi(p, i)); return Vec_IntEntry(&p->vFanout, i); }
-static inline int Cba_ObjNextFanout( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsCo(p, i)); return Vec_IntEntry(&p->vFanout, i); }
-static inline void Cba_ObjSetFanout( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjIsCi(p, i)); Vec_IntSetEntry(&p->vFanout, i, x); }
-static inline void Cba_ObjSetNextFanout( Cba_Ntk_t * p,int i,int x){ assert(Cba_ObjIsCo(p, i)); Vec_IntSetEntry(&p->vFanout, i, x); }
-static inline void Cba_ObjCleanFanin( Cba_Ntk_t * p, int i ) { assert(Cba_ObjFanin(p, i) >= 0 && Cba_ObjIsCo(p, i)); Vec_IntSetEntry( &p->vFanin, i, -1); }
-static inline void Cba_ObjSetFanin( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjFanin(p, i) == -1 && Cba_ObjIsCo(p, i)); Vec_IntSetEntry( &p->vFanin, i, x); }
-static inline void Cba_ObjSetIndex( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjIndex(p, i) == -1); Vec_IntSetEntry( &p->vIndex, i, x ); }
-static inline void Cba_ObjSetName( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjName(p, i) == 0 && !Cba_ObjIsCo(p, i)); Vec_IntSetEntry( &p->vName, i, x ); }
-static inline void Cba_ObjSetCopy( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjCopy(p, i) == -1); Vec_IntSetEntry( &p->vCopy, i, x ); }
-static inline int Cba_ObjGetConst( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsCi(p, i)); return Cba_ObjIsBo(p, i) && Cba_ObjIsConst(p, i-1) ? Cba_ObjType(p, i-1) : 0; }
-
-static inline int Cba_BoxBiNum( Cba_Ntk_t * p, int i ) { int s = i-1; assert(Cba_ObjIsBox(p, i)); while (--i >= 0 && Cba_ObjIsBi(p, i)) {} return s - i; }
-static inline int Cba_BoxBoNum( Cba_Ntk_t * p, int i ) { int s = i+1; assert(Cba_ObjIsBox(p, i)); while (++i < Cba_NtkObjNum(p) && Cba_ObjIsBo(p, i)) {} return i - s; }
-static inline int Cba_BoxSize( Cba_Ntk_t * p, int i ) { return 1 + Cba_BoxBiNum(p, i) + Cba_BoxBoNum(p, i); }
-static inline int Cba_BoxBi( Cba_Ntk_t * p, int b, int i ) { assert(Cba_ObjIsBox(p, b)); return b - 1 - i; }
-static inline int Cba_BoxBo( Cba_Ntk_t * p, int b, int i ) { assert(Cba_ObjIsBox(p, b)); return b + 1 + i; }
-//static inline int Cba_BoxBiBox( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBi(p, i)); return i + 1 + Cba_ObjIndex(p, i); }
-static inline int Cba_BoxBoBox( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBo(p, i)); return i - 1 - Cba_ObjIndex(p, i); }
-static inline int Cba_BoxFanin( Cba_Ntk_t * p, int b, int i ) { return Cba_ObjFanin(p, Cba_BoxBi(p, b, i)); }
-static inline int Cba_BoxFaninBox( Cba_Ntk_t * p, int b, int i ) { return Cba_BoxBoBox(p, Cba_BoxFanin(p, b, i)); }
-static inline int Cba_BoxBiRange( Cba_Ntk_t * p, int i ) { int s = i; assert(Cba_ObjIsBi(p, i) && !Cba_ObjBit(p, i)); while (--i >= 0 && Cba_ObjIsBi(p, i) && Cba_ObjBit(p, i)) {} return s - i; }
-static inline int Cba_BoxBoRange( Cba_Ntk_t * p, int i ) { int s = i; assert(Cba_ObjIsBo(p, i) && !Cba_ObjBit(p, i)); while (++i < Cba_NtkObjNum(p) && Cba_ObjIsBo(p, i) && Cba_ObjBit(p, i)) {} return i - s; }
-static inline int Cba_ObjPiRange( Cba_Ntk_t * p, int i ) { int s = i; assert(Cba_ObjIsPi(p, i) && !Cba_ObjBit(p, i)); while (++i < Cba_NtkObjNum(p) && Cba_ObjIsPi(p, i) && Cba_ObjBit(p, i)) {} return i - s; }
-
-static inline int Cba_BoxNtkId( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBox(p, i)); return Vec_IntEntry(&p->vFanin, i); }
-static inline void Cba_BoxSetNtkId( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjIsBox(p, i)&&Cba_ManNtkIsOk(p->pDesign, x));Vec_IntSetEntry(&p->vFanin, i, x);}
-//static inline int Cba_BoxBiNtkId( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBi(p, i)); return Cba_BoxNtkId(p, Cba_BoxBiBox(p, i)); }
-static inline int Cba_BoxBoNtkId( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBo(p, i)); return Cba_BoxNtkId(p, Cba_BoxBoBox(p, i)); }
-static inline Cba_Ntk_t * Cba_BoxNtk( Cba_Ntk_t * p, int i ) { return Cba_ManNtk( p->pDesign, Cba_BoxNtkId(p, i) ); }
-//static inline Cba_Ntk_t * Cba_BoxBiNtk( Cba_Ntk_t * p, int i ) { return Cba_ManNtk( p->pDesign, Cba_BoxBiNtkId(p, i) ); }
-static inline Cba_Ntk_t * Cba_BoxBoNtk( Cba_Ntk_t * p, int i ) { return Cba_ManNtk( p->pDesign, Cba_BoxBoNtkId(p, i) ); }
-static inline char * Cba_BoxNtkName( Cba_Ntk_t * p, int i ) { return Abc_NamStr( p->pDesign->pMods, Cba_BoxNtkId(p, i) ); }
-////////////////////////////////////////////////////////////////////////
-/// MACRO DEFINITIONS ///
-////////////////////////////////////////////////////////////////////////
+static inline int Cba_ObjFin0( Cba_Ntk_t * p, int i ) { assert(i>0); return Vec_IntEntry(&p->vObjFin0, i); }
+static inline int Cba_ObjFon0( Cba_Ntk_t * p, int i ) { assert(i>0); return Vec_IntEntry(&p->vObjFon0, i); }
+static inline int Cba_ObjFin( Cba_Ntk_t * p, int i, int k ) { assert(i>0); return Cba_ObjFin0(p, i) + k; }
+static inline int Cba_ObjFon( Cba_Ntk_t * p, int i, int k ) { assert(i>0); return Cba_ObjFon0(p, i) + k; }
+static inline int Cba_ObjFinNum( Cba_Ntk_t * p, int i ) { assert(i>0); return Cba_ObjFin0(p, i+1) - Cba_ObjFin0(p, i); }
+static inline int Cba_ObjFonNum( Cba_Ntk_t * p, int i ) { assert(i>0); return Cba_ObjFon0(p, i+1) - Cba_ObjFon0(p, i); }
+
+static inline int Cba_ObjCopy( Cba_Ntk_t * p, int i ) { assert(i>0); return Vec_IntGetEntryFull(&p->vObjCopy, i); }
+static inline int Cba_ObjFunc( Cba_Ntk_t * p, int i ) { assert(i>0); return Vec_IntGetEntry(&p->vObjFunc, i); }
+static inline int Cba_ObjName( Cba_Ntk_t * p, int i ) { assert(i>0); return Vec_IntGetEntry(&p->vObjName, i); }
+static inline char * Cba_ObjNameStr( Cba_Ntk_t * p, int i ) { assert(i>0); return Cba_NtkStr(p, Cba_ObjName(p, i)); }
+static inline int Cba_ObjAttr( Cba_Ntk_t * p, int i ) { assert(i>0); return Vec_IntGetEntry(&p->vObjAttr, i); }
+
+static inline int * Cba_ObjAttrs( Cba_Ntk_t * p, int i ) { assert(i>0); return Vec_IntGetEntryP(&p->vObjAttr, i); }
+static inline int Cba_ObjAttrSize( Cba_Ntk_t * p, int i ) { assert(i>0); return Vec_IntEntry(&p->vAttrSto, Vec_IntGetEntry(&p->vObjAttr, i)); }
+static inline int * Cba_ObjAttrArray( Cba_Ntk_t * p, int i ) { assert(i>0); return Vec_IntEntryP(&p->vAttrSto, Vec_IntGetEntry(&p->vObjAttr, i)+1); }
+
+static inline void Cba_ObjSetCopy( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjCopy(p, i) == -1); Vec_IntSetEntry( &p->vObjCopy, i, x ); }
+static inline void Cba_ObjSetFunc( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjFunc(p, i) == 0); Vec_IntSetEntry( &p->vObjFunc, i, x ); }
+static inline void Cba_ObjSetName( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjName(p, i) == 0); Vec_IntSetEntry( &p->vObjName, i, x ); }
+static inline void Cba_ObjSetAttrs( Cba_Ntk_t * p, int i, int * a, int s ) { assert(Cba_ObjAttr(p, i) == 0); Vec_IntSetEntry(&p->vObjAttr, i, Vec_IntSize(&p->vAttrSto)); if (a) Vec_IntPushArray(&p->vAttrSto, a, s); }
+
+static inline int Cba_FinFon( Cba_Ntk_t * p, int f ) { assert(f>0); return Vec_IntEntry(&p->vFinFon, f); }
+static inline int Cba_ObjFinFon( Cba_Ntk_t * p, int i, int k ) { assert(i>0); return Cba_FinFon(p, Cba_ObjFin(p, i, k)); }
+static inline int * Cba_ObjFinFons( Cba_Ntk_t * p, int i ) { assert(i>0); return Vec_IntEntryP(&p->vFinFon, Cba_ObjFin0(p, i)); }
+
+static inline void Cba_ObjSetFinFon( Cba_Ntk_t * p, int i, int k, int x ) { assert(i>0); assert(Cba_ObjFinFon(p, i, k)== 0); Vec_IntWriteEntry(&p->vFinFon, Cba_ObjFin(p, i, k), x); }
+static inline void Cba_ObjCleanFinFon( Cba_Ntk_t * p, int i, int k) { assert(i>0); assert(Cba_ObjFinFon(p, i, k) > 0); Vec_IntWriteEntry(&p->vFinFon, Cba_ObjFin(p, i, k), 0); }
+static inline void Cba_ObjPatchFinFon( Cba_Ntk_t * p, int i, int k, int x){ assert(i>0); Cba_ObjCleanFinFon(p, i, k); Cba_ObjSetFinFon(p, i, k, x); }
+
+static inline int Cba_ObjNtkId( Cba_Ntk_t * p, int i ) { assert(i>0 && Cba_NtkHasObjFuncs(p)); return Cba_ObjIsBoxUser(p, i) ? Cba_ObjFunc(p, i) : 0;}
+static inline Cba_Ntk_t * Cba_ObjNtk( Cba_Ntk_t * p, int i ) { assert(i>0); return Cba_NtkNtk(p, Cba_ObjNtkId(p, i)); }
+static inline int Cba_ObjSetNtkId( Cba_Ntk_t * p, int i, int x ) { assert(i>0); assert(Cba_ObjIsBoxUser(p, i)); Cba_ObjSetFunc( p, i, x ); }
+
+static inline int Cba_FonIsReal( int f ) { return f > 0; }
+static inline int Cba_FonIsConst( int f ) { return f < 0; }
+static inline int Cba_FonConst( int f ) { assert(Cba_FonIsConst(f)); return -f-1; }
+static inline int Cba_FonFromConst( int c ) { assert(c >= 0); return -c-1; }
+
+static inline int Cba_FonObj( Cba_Ntk_t * p, int f ) { return Cba_FonIsReal(f) ? Vec_IntEntry(&p->vFonObj, f) : 0; }
+static inline int Cba_FonCopy( Cba_Ntk_t * p, int f ) { return Cba_FonIsReal(f) ? Vec_IntEntry( &p->vFonCopy, f ) : f; }
+static inline void Cba_FonSetCopy( Cba_Ntk_t * p, int f, int x ) { assert(Cba_FonIsReal(f)); assert(Cba_FonCopy(p, f) == 0); Vec_IntWriteEntry(&p->vFonCopy, f, x); }
+static inline int Cba_FonName( Cba_Ntk_t * p, int f ) { assert(Cba_FonIsReal(f)); return Vec_IntGetEntry( &p->vFonName, f ); }
+static inline char * Cba_FonNameStr( Cba_Ntk_t * p, int f ) { assert(Cba_FonIsReal(f)); return Cba_NtkStr(p, Cba_FonName(p, f)); }
+static inline void Cba_FonSetName( Cba_Ntk_t * p, int f, int x ) { assert(Cba_FonIsReal(f)); assert(Cba_FonName(p, f) == 0); Vec_IntSetEntry(&p->vFonName, f, x); }
+static inline void Cba_FonCleanName( Cba_Ntk_t * p, int f ) { assert(Cba_FonIsReal(f)); assert(Cba_FonName(p, f) != 0); Vec_IntSetEntry(&p->vFonName, f, 0); }
+static inline void Cba_FonPatchName( Cba_Ntk_t * p, int f, int x) { assert(Cba_FonIsReal(f)); Cba_FonCleanName(p, f); Cba_FonSetName(p, f, x); }
+static inline int Cba_FonIndex( Cba_Ntk_t * p, int f ) { assert(Cba_FonIsReal(f)); return f - Cba_ObjFon0( p, Cba_FonObj(p, f) ); }
+static inline int Cba_FonNtkId( Cba_Ntk_t * p, int f ) { assert(Cba_FonIsReal(f)); return Cba_ObjNtkId( p, Cba_FonObj(p, f) ); }
+static inline Cba_Ntk_t * Cba_FonNtk( Cba_Ntk_t * p, int f ) { assert(Cba_FonIsReal(f)); return Cba_ObjNtk( p, Cba_FonObj(p, f) ); }
+
+static inline int Cba_ObjFanin( Cba_Ntk_t * p, int i, int k ) { assert(i>0); return Cba_FonObj( p, Cba_ObjFinFon(p, i, k) ); }
////////////////////////////////////////////////////////////////////////
-/// ITERATORS ///
+/// ITERATORS ///
////////////////////////////////////////////////////////////////////////
#define Cba_ManForEachNtk( p, pNtk, i ) \
@@ -338,61 +357,41 @@ static inline char * Cba_BoxNtkName( Cba_Ntk_t * p, int i ) { r
for ( i = 0; (i < Cba_NtkPiNum(p)) && (((iObj) = Cba_NtkPi(p, i)), 1); i++ )
#define Cba_NtkForEachPo( p, iObj, i ) \
for ( i = 0; (i < Cba_NtkPoNum(p)) && (((iObj) = Cba_NtkPo(p, i)), 1); i++ )
-#define Cba_NtkForEachPoDriver( p, iObj, i ) \
- for ( i = 0; (i < Cba_NtkPoNum(p)) && (((iObj) = Cba_ObjFanin(p, Cba_NtkPo(p, i))), 1); i++ )
-#define Cba_NtkForEachPiMain( p, iObj, i ) \
- for ( i = 0; (i < Cba_NtkPiNum(p)) && (((iObj) = Cba_NtkPi(p, i)), 1); i++ ) if ( Cba_ObjBit(p, iObj) ) {} else
-#define Cba_NtkForEachPoMain( p, iObj, i ) \
- for ( i = 0; (i < Cba_NtkPoNum(p)) && (((iObj) = Cba_NtkPo(p, i)), 1); i++ ) if ( Cba_ObjBit(p, iObj) ) {} else
+#define Cba_NtkForEachPiFon( p, iObj, iFon, i ) \
+ for ( i = 0; (i < Cba_NtkPiNum(p)) && (((iObj) = Cba_NtkPi(p, i)), 1) && (((iFon) = Cba_ObjFon0(p, iObj)), 1); i++ )
+#define Cba_NtkForEachPoDriverFon( p, iObj, iFon, i ) \
+ for ( i = 0; (i < Cba_NtkPoNum(p)) && (((iObj) = Cba_NtkPo(p, i)), 1) && (((iFon) = Cba_ObjFinFon(p, iObj, 0)), 1); i++ )
+#define Cba_NtkForEachPoDriver( p, iObj, i ) \
+ for ( i = 0; (i < Cba_NtkPoNum(p)) && (((iObj) = Cba_ObjFanin(p, Cba_NtkPo(p, i), 0)), 1); i++ )
-#define Cba_NtkForEachObj( p, i ) if ( !Cba_ObjType(p, i) ) {} else \
- for ( i = 0; (i < Cba_NtkObjNum(p)); i++ )
+#define Cba_NtkForEachObj( p, i ) \
+ for ( i = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Cba_ObjType(p, i) ) {} else
#define Cba_NtkForEachObjType( p, Type, i ) \
- for ( i = 0; (i < Cba_NtkObjNum(p)) && (((Type) = Cba_ObjType(p, i)), 1); i++ ) if ( !Type ) {} else
-
+ for ( i = 1; i < Vec_StrSize(&p->vObjType) && (((Type) = Cba_ObjType(p, i)), 1); i++ ) if ( !Type ) {} else
#define Cba_NtkForEachBox( p, i ) \
- for ( i = 0; (i < Cba_NtkObjNum(p)); i++ ) if ( !Cba_ObjIsBox(p, i) ) {} else
+ for ( i = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Cba_ObjIsBox(p, i) ) {} else
#define Cba_NtkForEachBoxUser( p, i ) \
- for ( i = 0; (i < Cba_NtkObjNum(p)); i++ ) if ( !Cba_ObjIsBoxUser(p, i) ) {} else
+ for ( i = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Cba_ObjIsBoxUser(p, i) ) {} else
#define Cba_NtkForEachBoxPrim( p, i ) \
- for ( i = 0; (i < Cba_NtkObjNum(p)); i++ ) if ( !Cba_ObjIsBoxPrim(p, i) ) {} else
-
-#define Cba_NtkForEachCi( p, i ) \
- for ( i = 0; (i < Cba_NtkObjNum(p)); i++ ) if ( !Cba_ObjIsCi(p, i) ) {} else
-#define Cba_NtkForEachCo( p, i ) \
- for ( i = 0; (i < Cba_NtkObjNum(p)); i++ ) if ( !Cba_ObjIsCo(p, i) ) {} else
-#define Cba_NtkForEachCio( p, i ) \
- for ( i = 0; (i < Cba_NtkObjNum(p)); i++ ) if ( !Cba_ObjIsCio(p, i) ){} else
-
-#define Cba_NtkForEachBi( p, i ) \
- for ( i = 0; (i < Cba_NtkObjNum(p)); i++ ) if ( !Cba_ObjIsBi(p, i) ){} else
-#define Cba_NtkForEachBo( p, i ) \
- for ( i = 0; (i < Cba_NtkObjNum(p)); i++ ) if ( !Cba_ObjIsBo(p, i) ){} else
-#define Cba_NtkForEachBio( p, i ) \
- for ( i = 0; (i < Cba_NtkObjNum(p)); i++ ) if ( !Cba_ObjIsBio(p, i) ){} else
-
-#define Cba_BoxForEachBi( p, iBox, iTerm, i ) \
- for ( iTerm = iBox - 1, i = 0; iTerm >= 0 && Cba_ObjIsBi(p, iTerm); iTerm--, i++ )
-#define Cba_BoxForEachBo( p, iBox, iTerm, i ) \
- for ( iTerm = iBox + 1, i = 0; iTerm < Cba_NtkObjNum(p) && Cba_ObjIsBo(p, iTerm); iTerm++, i++ )
-#define Cba_BoxForEachBiReverse( p, iBox, iTerm, i ) \
- for ( i = Cba_BoxBiNum(p, iBox), iTerm = iBox - i--; Cba_ObjIsBi(p, iTerm); iTerm++, i-- )
-
-#define Cba_BoxForEachBiMain( p, iBox, iTerm, i ) \
- for ( iTerm = iBox - 1, i = 0; iTerm >= 0 && Cba_ObjIsBi(p, iTerm); iTerm--, i++ ) if ( Cba_ObjBit(p, iTerm) ) {} else
-#define Cba_BoxForEachBoMain( p, iBox, iTerm, i ) \
- for ( iTerm = iBox + 1, i = 0; iTerm < Cba_NtkObjNum(p) && Cba_ObjIsBo(p, iTerm); iTerm++, i++ ) if ( Cba_ObjBit(p, iTerm) ) {} else
-
-#define Cba_BoxForEachFanin( p, iBox, iFanin, i ) \
- for ( i = 0; iBox - 1 - i >= 0 && Cba_ObjIsBi(p, iBox - 1 - i) && (((iFanin) = Cba_BoxFanin(p, iBox, i)), 1); i++ )
-#define Cba_BoxForEachFaninBox( p, iBox, iFanin, i ) \
- for ( i = 0; iBox - 1 - i >= 0 && Cba_ObjIsBi(p, iBox - 1 - i) && (((iFanin) = Cba_BoxFaninBox(p, iBox, i)), 1); i++ )
-
-#define Cba_ObjForEachFanout( p, iCi, iCo ) \
- for ( iCo = Cba_ObjFanout(p, iCi); iCo; iCo = Cba_ObjNextFanout(p, iCo) )
-#define Cba_BoxForEachFanoutBox( p, iBox, iCo, iFanBox ) \
- for ( assert(Cba_BoxBoNum(p, iBox) == 1), iCo = Cba_ObjFanout(p, Cba_BoxBo(p, iBox, 0)); iCo && ((iFanBox = Cba_BoxBiBox(p, iCo)), 1); iCo = Cba_ObjNextFanout(p, iCo) )
+ for ( i = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Cba_ObjIsBoxPrim(p, i) ) {} else
+
+#define Cba_NtkForEachFinFon( p, iFon, i ) \
+ for ( i = 0; i < Vec_IntSize(&p->vFinFon) && (((iFon) = Vec_IntEntry(&p->vFinFon, i)), 1); i++ ) if ( !iFon ) {} else
+#define Cba_NtkForEachFonName( p, Name, i ) \
+ for ( i = 0; i < Vec_IntSize(&p->vFonName) && (((Name) = Vec_IntEntry(&p->vFonName, i)), 1); i++ ) if ( !Name ) {} else
+
+#define Cba_ObjForEachFin( p, iObj, iFin, k ) \
+ for ( k = 0, iFin = Cba_ObjFin0(p, iObj); iFin < Cba_ObjFin0(p, iObj+1); iFin++, k++ )
+#define Cba_ObjForEachFon( p, iObj, iFon, k ) \
+ for ( k = 0, iFon = Cba_ObjFon0(p, iObj); iFon < Cba_ObjFon0(p, iObj+1); iFon++, k++ )
+#define Cba_ObjForEachFinFon( p, iObj, iFin, iFon, k ) \
+ for ( k = 0, iFin = Cba_ObjFin0(p, iObj); iFin < Cba_ObjFin0(p, iObj+1) && ((iFon = Cba_FinFon(p, iFin)), 1); iFin++, k++ )
+#define Cba_ObjForEachFinFanin( p, iObj, iFin, iFanin, k ) \
+ for ( k = 0, iFin = Cba_ObjFin0(p, iObj); iFin < Cba_ObjFin0(p, iObj+1) && ((iFanin = Cba_FonObj(p, Cba_FinFon(p, iFin))), 1); iFin++, k++ )
+#define Cba_ObjForEachFinFaninReal( p, iObj, iFin, iFanin, k ) \
+ for ( k = 0, iFin = Cba_ObjFin0(p, iObj); iFin < Cba_ObjFin0(p, iObj+1) && ((iFanin = Cba_FonObj(p, Cba_FinFon(p, iFin))), 1); iFin++, k++ ) if ( !iFanin ) {} else
+
////////////////////////////////////////////////////////////////////////
/// FUNCTION DECLARATIONS ///
@@ -409,114 +408,40 @@ static inline char * Cba_BoxNtkName( Cba_Ntk_t * p, int i ) { r
SeeAlso []
***********************************************************************/
-static inline int Cba_ObjAlloc( Cba_Ntk_t * p, Cba_ObjType_t Type, int Fanin )
+static inline int Cba_ObjAlloc( Cba_Ntk_t * p, Cba_ObjType_t Type, int nFins, int nFons )
{
- int iObj = Cba_NtkObjNum(p);
- assert( iObj == Vec_IntSize(&p->vFanin) );
+ int i, iObj = Vec_StrSize(&p->vObjType);
if ( Type == CBA_OBJ_PI )
Vec_IntPush( &p->vInputs, iObj );
else if ( Type == CBA_OBJ_PO )
Vec_IntPush( &p->vOutputs, iObj );
- Vec_StrPush( &p->vType, (char)Abc_Var2Lit(Type, 0) );
- Vec_IntPush( &p->vFanin, Fanin );
+ Vec_StrPush( &p->vObjType, (char)Type );
+ // add fins
+ for ( i = 0; i < nFins; i++ )
+ Vec_IntPush( &p->vFinFon, 0 );
+ if ( Vec_IntSize(&p->vObjFin0) )
+ Vec_IntPush( &p->vObjFin0, Vec_IntSize(&p->vFinFon) );
+ // add fons
+ for ( i = 0; i < nFons; i++ )
+ Vec_IntPush( &p->vFonObj, iObj );
+ if ( Vec_IntSize(&p->vObjFon0) )
+ Vec_IntPush( &p->vObjFon0, Vec_IntSize(&p->vFonObj) );
return iObj;
}
static inline int Cba_ObjDup( Cba_Ntk_t * pNew, Cba_Ntk_t * p, int i )
{
- int iObj = Cba_ObjAlloc( pNew, Cba_ObjType(p, i), Cba_ObjIsBox(p, i) ? Cba_BoxNtkId(p, i) : -1 );
- if ( Cba_NtkHasNames(p) && Cba_NtkHasNames(pNew) && !Cba_ObjIsCo(p, i) )
- Cba_ObjSetName( pNew, iObj, Cba_ObjName(p, i) );
+ int iObj = Cba_ObjAlloc( pNew, Cba_ObjType(p, i), Cba_ObjFinNum(p, i), Cba_ObjFonNum(p, i) );
Cba_ObjSetCopy( p, i, iObj );
return iObj;
}
-static inline int Cba_BoxAlloc( Cba_Ntk_t * p, Cba_ObjType_t Type, int nIns, int nOuts, int iNtk )
-{
- int i, iObj;
- for ( i = nIns - 1; i >= 0; i-- )
- Cba_ObjAlloc( p, CBA_OBJ_BI, -1 );
- iObj = Cba_ObjAlloc( p, Type, iNtk );
- for ( i = 0; i < nOuts; i++ )
- Cba_ObjAlloc( p, CBA_OBJ_BO, -1 );
- return iObj;
-}
-static inline int Cba_BoxDup( Cba_Ntk_t * pNew, Cba_Ntk_t * p, int iBox )
-{
- int i, iTerm, iBoxNew;
- Cba_BoxForEachBiReverse( p, iBox, iTerm, i )
- Cba_ObjDup( pNew, p, iTerm );
- iBoxNew = Cba_ObjDup( pNew, p, iBox );
- if ( Cba_NtkHasNames(p) && Cba_NtkHasNames(pNew) && Cba_ObjName(p, iBox) )
- Cba_ObjSetName( pNew, iBoxNew, Cba_ObjName(p, iBox) );
- if ( Cba_BoxNtk(p, iBox) )
- Cba_BoxSetNtkId( pNew, iBoxNew, Cba_NtkCopy(Cba_BoxNtk(p, iBox)) );
- Cba_BoxForEachBo( p, iBox, iTerm, i )
- Cba_ObjDup( pNew, p, iTerm );
- return iBoxNew;
-}
-static inline void Cba_BoxDelete( Cba_Ntk_t * p, int iBox )
-{
- int iStart = iBox - Cba_BoxBiNum(p, iBox);
- int i, iStop = iBox + Cba_BoxBoNum(p, iBox);
- for ( i = iStart; i <= iStop; i++ )
- {
- Vec_StrWriteEntry( &p->vType, i, (char)0 );
- Vec_IntWriteEntry( &p->vFanin, i, -1 );
- if ( Cba_NtkHasNames(p) )
- Vec_IntWriteEntry( &p->vName, i, 0 );
- if ( Cba_NtkHasFanouts(p) )
- Vec_IntWriteEntry( &p->vFanout, i, 0 );
- }
-}
-static inline void Cba_BoxReplace( Cba_Ntk_t * p, int iBox, int * pArray, int nSize )
-{
- extern void Cba_NtkUpdateFanout( Cba_Ntk_t * p, int iOld, int iNew );
- int i, Limit = Cba_BoxBoNum(p, iBox);
- assert( Limit == nSize );
- for ( i = 0; i < Limit; i++ )
- Cba_NtkUpdateFanout( p, Cba_BoxBo(p, iBox, i), pArray[i] );
-}
-
-
-static inline Vec_Int_t * Cba_BoxCollectRanges( Cba_Ntk_t * p, int iBox )
-{
- static Vec_Int_t Bits, * vBits = &Bits;
- static int pArray[10]; int i, iTerm;
- assert( !Cba_ObjIsBoxUser(p, iBox) );
- // initialize array
- vBits->pArray = pArray;
- vBits->nSize = 0;
- vBits->nCap = 10;
- // iterate through inputs
- Cba_BoxForEachBiMain( p, iBox, iTerm, i )
- Vec_IntPush( vBits, Cba_BoxBiRange(p, iTerm) );
- // iterate through outputs
- Cba_BoxForEachBoMain( p, iBox, iTerm, i )
- Vec_IntPush( vBits, Cba_BoxBoRange(p, iTerm) );
- assert( Vec_IntSize(vBits) < 10 );
- //Vec_IntPrint( vBits );
- return vBits;
-}
-
-/**Function*************************************************************
-
- Synopsis [Prints vector.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline void Vec_StrPrint( Vec_Str_t * p, int fInt )
+static inline void Cba_ObjDelete( Cba_Ntk_t * p, int i )
{
- int i;
- for ( i = 0; i < p->nSize; i++ )
- if ( fInt )
- printf( "%d ", (int)p->pArray[i] );
- else
- printf( "%c ", p->pArray[i] );
- printf( "\n" );
+ int k, iFin, iFon;
+ Cba_ObjCleanType( p, i );
+ Cba_ObjForEachFin( p, i, iFin, k )
+ Vec_IntWriteEntry( &p->vFinFon, iFin, 0 );
+ Cba_ObjForEachFon( p, i, iFon, k )
+ Vec_IntWriteEntry( &p->vFonObj, iFon, 0 );
}
/**Function*************************************************************
@@ -530,181 +455,287 @@ static inline void Vec_StrPrint( Vec_Str_t * p, int fInt )
SeeAlso []
***********************************************************************/
-static inline void Cba_NtkAlloc( Cba_Ntk_t * pNew, int NameId, int nIns, int nOuts, int nObjs )
-{
- int NtkId, fFound;
- assert( pNew->pDesign != NULL );
- assert( Cba_NtkPiNum(pNew) == 0 );
- assert( Cba_NtkPoNum(pNew) == 0 );
+static inline Cba_Ntk_t * Cba_NtkAlloc( Cba_Man_t * p, int NameId, int nIns, int nOuts, int nObjs, int nFins, int nFons )
+{
+ Cba_Ntk_t * pNew = ABC_CALLOC( Cba_Ntk_t, 1 );
+ assert( nIns >= 0 && nOuts >= 0 && nObjs >= 0 && nFins >= 0 && nFons >= 0 );
+ pNew->Id = Vec_PtrSize(&p->vNtks); Vec_PtrPush( &p->vNtks, pNew );
pNew->NameId = NameId;
- pNew->iCopy = -1;
- pNew->iBoxNtk = -1;
- pNew->iBoxObj = -1;
+ pNew->pDesign = p;
Vec_IntGrow( &pNew->vInputs, nIns );
Vec_IntGrow( &pNew->vOutputs, nOuts );
- Vec_StrGrow( &pNew->vType, nObjs );
- Vec_IntGrow( &pNew->vFanin, nObjs );
- // check if the network is unique
- NtkId = Abc_NamStrFindOrAdd( pNew->pDesign->pMods, Cba_NtkStr(pNew, NameId), &fFound );
+ Vec_StrGrow( &pNew->vObjType, nObjs+1 ); Vec_StrPush( &pNew->vObjType, (char)CBA_OBJ_NONE );
+ Vec_IntGrow( &pNew->vObjFin0, nObjs+2 ); Vec_IntPush( &pNew->vObjFin0, 0 ); Vec_IntPush( &pNew->vObjFin0, 1 );
+ Vec_IntGrow( &pNew->vObjFon0, nObjs+2 ); Vec_IntPush( &pNew->vObjFon0, 0 ); Vec_IntPush( &pNew->vObjFon0, 1 );
+ Vec_IntGrow( &pNew->vFinFon, nFins+1 ); Vec_IntPush( &pNew->vFinFon, 0 );
+ Vec_IntGrow( &pNew->vFonObj, nFons+1 ); Vec_IntPush( &pNew->vFonObj, 0 );
+ return pNew;
+}
+static inline void Cba_NtkAdd( Cba_Man_t * p, Cba_Ntk_t * pNtk )
+{
+ int fFound, NtkId = Abc_NamStrFindOrAdd( p->pMods, Cba_NtkStr(pNtk, pNtk->NameId), &fFound );
if ( fFound )
- printf( "Network with name %s already exists.\n", Cba_NtkStr(pNew, NameId) );
+ printf( "Network with name \"%s\" already exists.\n", Cba_NtkStr(pNtk, pNtk->NameId) );
else
- assert( NtkId == Cba_NtkId(pNew) );
+ assert( NtkId == pNtk->Id );
}
-static inline void Cba_NtkDup( Cba_Ntk_t * pNew, Cba_Ntk_t * p )
+static inline Vec_Int_t * Cba_NtkCollect( Cba_Ntk_t * p )
{
- int i, iObj;
- assert( pNew != p );
- Cba_NtkAlloc( pNew, Cba_NtkNameId(p), Cba_NtkPiNum(p), Cba_NtkPoNum(p), Cba_NtkObjNum(p) );
- if ( Vec_IntSize(&p->vInfo) )
- Vec_IntAppend( &pNew->vInfo, &p->vInfo );
- Cba_NtkStartCopies( p );
- if ( Cba_NtkHasNames(p) )
- Cba_NtkStartNames( pNew );
+ int iObj;
+ Vec_Int_t * vObjs = Vec_IntAlloc( Cba_NtkObjNum(p) );
+ Cba_NtkForEachObj( p, iObj )
+ Vec_IntPush( vObjs, iObj );
+ return vObjs;
+}
+static inline void Cba_NtkCollectDfs_rec( Cba_Ntk_t * p, int iObj, Vec_Int_t * vObjs )
+{
+ int iFin, iFanin, k;
+ if ( !Cba_ObjCopy(p, iObj) )
+ return;
+ Cba_ObjSetCopy( p, iObj, 0 );
+ Cba_ObjForEachFinFaninReal( p, iObj, iFin, iFanin, k )
+ Cba_NtkCollectDfs_rec( p, iFanin, vObjs );
+ Vec_IntPush( vObjs, iObj );
+}
+static inline Vec_Int_t * Cba_NtkCollectDfs( Cba_Ntk_t * p )
+{
+ int i, k, iObj, iFin, iFanin;
+ Vec_Int_t * vObjs = Vec_IntAlloc( Cba_NtkObjNum(p) );
+ // collect PIs
Cba_NtkForEachPi( p, iObj, i )
- Cba_ObjDup( pNew, p, iObj );
- Cba_NtkForEachBox( p, iObj )
- Cba_BoxDup( pNew, p, iObj );
+ Vec_IntPush( vObjs, iObj );
+ // prepare leaves
+ Cba_NtkCleanObjCopies( p );
+ Vec_IntForEachEntry( vObjs, iObj, i )
+ Cba_ObjSetCopy( p, iObj, 0 );
+ // collect internal
Cba_NtkForEachPo( p, iObj, i )
- Cba_ObjDup( pNew, p, iObj );
- Cba_NtkForEachCo( p, iObj )
- Cba_ObjSetFanin( pNew, Cba_ObjCopy(p, iObj), Cba_ObjCopy(p, Cba_ObjFanin(p, iObj)) );
- //Cba_NtkFreeCopies( p ); // needed for name transfer and host ntk
- assert( Cba_NtkObjNum(pNew) == Cba_NtkObjNumAlloc(pNew) );
+ Cba_ObjForEachFinFaninReal( p, iObj, iFin, iFanin, k )
+ Cba_NtkCollectDfs_rec( p, iFanin, vObjs );
+ // additionally collect user modules without outputs
+ Cba_NtkForEachBoxUser( p, iObj )
+ if ( Cba_ObjFonNum(p, iObj) == 0 )
+ Cba_ObjForEachFinFaninReal( p, iObj, iFin, iFanin, k )
+ Cba_NtkCollectDfs_rec( p, iFanin, vObjs );
+ // collect POs
+ Cba_NtkForEachPo( p, iObj, i )
+ Vec_IntPush( vObjs, iObj );
+ // collect user boxes without fanouts
+ Cba_NtkForEachBoxUser( p, iObj )
+ if ( Cba_ObjFonNum(p, iObj) == 0 )
+ Vec_IntPush( vObjs, iObj );
+ assert( Vec_IntSize(vObjs) <= Cba_NtkObjNum(p) );
+ if ( Vec_IntSize(vObjs) != Cba_NtkObjNum(p) )
+ printf( "Warning: DSF ordering collected %d out of %d objects.\n", Vec_IntSize(vObjs), Cba_NtkObjNum(p) );
+ return vObjs;
}
-static inline void Cba_NtkDupUserBoxes( Cba_Ntk_t * pNew, Cba_Ntk_t * p )
+static inline void Cba_NtkCreateFonNames( Cba_Ntk_t * p, char * pPref )
{
- int i, iObj;
- assert( pNew != p );
- Cba_NtkAlloc( pNew, Cba_NtkNameId(p), Cba_NtkPiNum(p), Cba_NtkPoNum(p), Cba_NtkObjNum(p) + 3*Cba_NtkCoNum(p) );
- if ( Vec_IntSize(&p->vInfo) )
- Vec_IntAppend( &pNew->vInfo, &p->vInfo );
- Cba_NtkStartCopies( p );
+ int i, iObj, NameId;
+ Cba_NtkCleanFonNames( p );
Cba_NtkForEachPi( p, iObj, i )
- Cba_ObjDup( pNew, p, iObj );
+ Cba_FonSetName( p, Cba_ObjFon0(p, iObj), Cba_ObjName(p, iObj) );
Cba_NtkForEachPo( p, iObj, i )
- Cba_ObjDup( pNew, p, iObj );
- Cba_NtkForEachBoxUser( p, iObj )
- Cba_BoxDup( pNew, p, iObj );
- // connect feed-throughs
- Cba_NtkForEachCo( p, iObj )
- if ( Cba_ObjCopy(p, iObj) >= 0 && Cba_ObjCopy(p, Cba_ObjFanin(p, iObj)) >= 0 )
- Cba_ObjSetFanin( pNew, Cba_ObjCopy(p, iObj), Cba_ObjCopy(p, Cba_ObjFanin(p, iObj)) );
+ Cba_FonSetName( p, Cba_ObjFinFon(p, iObj, 0), Cba_ObjName(p, iObj) );
+ Vec_IntForEachEntryStart( &p->vFonName, NameId, i, 1 )
+ if ( NameId == 0 )
+ Vec_IntWriteEntry( &p->vFonName, i, Cba_ManNewStrId(p->pDesign, pPref, i, NULL) );
}
-static inline void Cba_NtkMoveNames( Cba_Ntk_t * pNew, Cba_Ntk_t * p )
+static inline void Cba_NtkMissingFonNames( Cba_Ntk_t * p, char * pPref )
{
- int i, iBox, iObj;
- assert( Cba_NtkHasNames(p) );
- assert( !Cba_NtkHasNames(pNew) );
- Cba_NtkStartNames( pNew );
+ int i, iObj, iFon;
Cba_NtkForEachPi( p, iObj, i )
- Cba_ObjSetName( pNew, Cba_ObjCopy(p, iObj), Cba_ObjName(p, iObj) );
- Cba_NtkForEachBoxUser( p, iBox )
+ if ( !Cba_FonName(p, Cba_ObjFon0(p, iObj)) )
+ Cba_FonSetName( p, Cba_ObjFon0(p, iObj), Cba_ObjName(p, iObj) );
+ Cba_NtkForEachPo( p, iObj, i )
+ if ( Cba_ObjFinFon(p, iObj, 0) > 0 && !Cba_FonName(p, Cba_ObjFinFon(p, iObj, 0)) )
+ Cba_FonSetName( p, Cba_ObjFinFon(p, iObj, 0), Cba_ObjName(p, iObj) );
+ Cba_NtkForEachObj( p, iObj )
+ Cba_ObjForEachFon( p, iObj, iFon, i )
+ if ( !Cba_FonName(p, iFon) )
+ Cba_FonSetName( p, iFon, Cba_ManNewStrId(p->pDesign, pPref, iFon, NULL) );
+}
+
+static inline void Cba_NtkCountParams( Cba_Ntk_t * p, Vec_Int_t * vObjs, int * nPis, int * nPos, int * nFins, int * nFons )
+{
+ int i, iObj;
+ *nPis = *nPos = *nFins = *nFons = 0;
+ Vec_IntForEachEntry( vObjs, iObj, i )
{
- Cba_ObjSetName( pNew, Cba_ObjCopy(p, iBox), Cba_ObjName(p, iBox) );
- Cba_BoxForEachBo( p, iBox, iObj, i )
- Cba_ObjSetName( pNew, Cba_ObjCopy(p, iObj), Cba_ObjName(p, iObj) );
+ *nPis += Cba_ObjIsPi(p, iObj);
+ *nPos += Cba_ObjIsPo(p, iObj);
+ *nFins += Cba_ObjFinNum(p, iObj);
+ *nFons += Cba_ObjFonNum(p, iObj);
}
- Cba_NtkForEachBoxUser( p, iBox )
- Cba_BoxForEachBi( p, iBox, iObj, i )
- if ( !Cba_ObjName(pNew, Cba_ObjFanin(pNew, Cba_ObjCopy(p, iObj))) )
- Cba_ObjSetName( pNew, Cba_ObjFanin(pNew, Cba_ObjCopy(p, iObj)), Cba_ObjName(p, iObj) );
- Cba_NtkForEachPo( p, iObj, i )
- if ( !Cba_ObjName(pNew, Cba_ObjFanin(pNew, Cba_ObjCopy(p, iObj))) )
- Cba_ObjSetName( pNew, Cba_ObjFanin(pNew, Cba_ObjCopy(p, iObj)), Cba_ObjName(p, iObj) );
+}
+static inline Cba_Ntk_t * Cba_NtkDup( Cba_Man_t * pMan, Cba_Ntk_t * p, Vec_Int_t * vObjs )
+{
+ Cba_Ntk_t * pNew;
+ int i, k, iObj, iObjNew, iFin, iFon;
+ int nPis, nPos, nFins, nFons;
+ Cba_NtkCountParams( p, vObjs, &nPis, &nPos, &nFins, &nFons );
+ pNew = Cba_NtkAlloc( pMan, 0, nPis, nPos, Vec_IntSize(vObjs), nFins, nFons );
+ Cba_NtkAdd( pMan, pNew );
+ Cba_NtkCleanObjCopies( p );
+ Cba_NtkCleanFonCopies( p );
+ Vec_IntForEachEntry( vObjs, iObj, i )
+ {
+ iObjNew = Cba_ObjDup( pNew, p, iObj );
+ Cba_ObjForEachFon( p, iObj, iFon, k )
+ Cba_FonSetCopy( p, iFon, Cba_ObjFon(pNew, iObjNew, k) );
+ }
+ Vec_IntForEachEntry( vObjs, iObj, i )
+ {
+ iObjNew = Cba_ObjCopy( p, iObj );
+ Cba_ObjForEachFinFon( p, iObj, iFin, iFon, k )
+ Cba_ObjSetFinFon( pNew, iObjNew, k, Cba_FonCopy(p, iFon) );
+ }
+ //Cba_NtkFreeObjCopies( p );
+ //Cba_NtkFreeFonCopies( p );
+ assert( Cba_NtkObjNum(pNew) == Cba_NtkObjNumAlloc(pNew) );
+ Cba_NtkSetCopy( p, Cba_NtkId(pNew) );
+ return pNew;
+}
+static inline Cba_Ntk_t * Cba_NtkDupOrder( Cba_Man_t * pMan, Cba_Ntk_t * p, Vec_Int_t*(* pFuncOrder)(Cba_Ntk_t*) )
+{
+ Cba_Ntk_t * pNew;
+ Vec_Int_t * vObjs = pFuncOrder ? pFuncOrder(p) : Cba_NtkCollect(p);
+ if ( vObjs == NULL )
+ return NULL;
+ pNew = Cba_NtkDup( pMan, p, vObjs );
+ Vec_IntFree( vObjs );
+ return pNew;
+}
+static inline Cba_Ntk_t * Cba_NtkDupAttrs( Cba_Ntk_t * pNew, Cba_Ntk_t * p )
+{
+ // transfer object attributes
+ Vec_IntRemapArray( &p->vObjCopy, &p->vObjFunc, &pNew->vObjFunc, Cba_NtkObjNum(pNew) + 1 );
+ Vec_IntRemapArray( &p->vObjCopy, &p->vObjName, &pNew->vObjName, Cba_NtkObjNum(pNew) + 1 );
+ Vec_IntRemapArray( &p->vObjCopy, &p->vObjAttr, &pNew->vObjAttr, Cba_NtkObjNum(pNew) + 1 );
+ // transfer fon attributes
+ Vec_IntRemapArray( &p->vFonCopy, &p->vFonName, &pNew->vFonName, Cba_NtkFonNum(pNew) + 1 );
+ Vec_IntRemapArray( &p->vFonCopy, &p->vFonRange, &pNew->vFonRange, Cba_NtkFonNum(pNew) + 1 );
+ Vec_IntRemapArray( &p->vFonCopy, &p->vFonLeft, &pNew->vFonLeft, Cba_NtkFonNum(pNew) + 1 );
+ Vec_IntRemapArray( &p->vFonCopy, &p->vFonRight, &pNew->vFonRight, Cba_NtkFonNum(pNew) + 1 );
+ // duplicate attributes
+ Vec_IntAppend( &pNew->vAttrSto, &p->vAttrSto );
+ pNew->vOther = p->vOther ? (Vec_Ptr_t *)Vec_VecDup( (Vec_Vec_t *)p->vOther ) : NULL;
}
static inline void Cba_NtkFree( Cba_Ntk_t * p )
{
+ // interface
Vec_IntErase( &p->vInputs );
Vec_IntErase( &p->vOutputs );
- Vec_IntErase( &p->vInfo );
- Vec_StrErase( &p->vType );
- Vec_IntErase( &p->vFanin );
- Vec_IntErase( &p->vIndex );
- Vec_IntErase( &p->vName );
- Vec_IntErase( &p->vFanout );
- Vec_IntErase( &p->vCopy );
- Vec_IntErase( &p->vArray );
- Vec_IntErase( &p->vArray2 );
+ Vec_IntErase( &p->vOrder );
+ // stucture
+ Vec_StrErase( &p->vObjType );
+ Vec_IntErase( &p->vObjFin0 );
+ Vec_IntErase( &p->vObjFon0 );
+ Vec_IntErase( &p->vFinFon );
+ Vec_IntErase( &p->vFonObj );
+ // optional
+ Vec_IntErase( &p->vObjCopy );
+ Vec_IntErase( &p->vObjFunc );
+ Vec_IntErase( &p->vObjName );
+ Vec_IntErase( &p->vObjAttr );
+ Vec_IntErase( &p->vAttrSto );
+ Vec_IntErase( &p->vFonCopy );
+ Vec_IntErase( &p->vFonName );
+ Vec_IntErase( &p->vFonRange );
+ Vec_IntErase( &p->vFonLeft );
+ Vec_IntErase( &p->vFonRight );
+ Vec_IntErase( &p->vFonPrev );
+ Vec_IntErase( &p->vFonNext );
+ Vec_IntErase( &p->vFinFon0 );
+ Vec_IntErase( &p->vFinObj );
+ Vec_IntErase( &p->vNtkObjs );
+ // other
+ Vec_IntErase( &p->vArray0 );
+ Vec_IntErase( &p->vArray1 );
+ if ( p->vOther ) Vec_VecFree( (Vec_Vec_t *)p->vOther );
+ ABC_FREE( p );
}
static inline int Cba_NtkMemory( Cba_Ntk_t * p )
{
int nMem = sizeof(Cba_Ntk_t);
+ // interface
nMem += (int)Vec_IntMemory(&p->vInputs);
nMem += (int)Vec_IntMemory(&p->vOutputs);
- nMem += (int)Vec_IntMemory(&p->vInfo);
- nMem += (int)Vec_StrMemory(&p->vType);
- nMem += (int)Vec_IntMemory(&p->vFanin);
- nMem += (int)Vec_IntMemory(&p->vIndex);
- nMem += (int)Vec_IntMemory(&p->vName);
- nMem += (int)Vec_IntMemory(&p->vFanout);
- nMem += (int)Vec_IntMemory(&p->vCopy);
+ nMem += (int)Vec_IntMemory(&p->vOrder);
+ // stucture
+ nMem += (int)Vec_StrMemory(&p->vObjType);
+ nMem += (int)Vec_IntMemory(&p->vObjFin0);
+ nMem += (int)Vec_IntMemory(&p->vObjFon0);
+ nMem += (int)Vec_IntMemory(&p->vFinFon);
+ nMem += (int)Vec_IntMemory(&p->vFonObj);
+ // optional
+ nMem += (int)Vec_IntMemory(&p->vObjCopy );
+ nMem += (int)Vec_IntMemory(&p->vObjFunc );
+ nMem += (int)Vec_IntMemory(&p->vObjName );
+ nMem += (int)Vec_IntMemory(&p->vObjAttr );
+ nMem += (int)Vec_IntMemory(&p->vAttrSto );
+ nMem += (int)Vec_IntMemory(&p->vFonCopy );
+ nMem += (int)Vec_IntMemory(&p->vFonName );
+ nMem += (int)Vec_IntMemory(&p->vFonRange );
+ nMem += (int)Vec_IntMemory(&p->vFonLeft );
+ nMem += (int)Vec_IntMemory(&p->vFonRight );
+ nMem += (int)Vec_IntMemory(&p->vFonPrev );
+ nMem += (int)Vec_IntMemory(&p->vFonNext );
+ nMem += (int)Vec_IntMemory(&p->vFinFon0 );
+ nMem += (int)Vec_IntMemory(&p->vFinObj );
+ nMem += (int)Vec_IntMemory(&p->vNtkObjs );
+ // other
+ nMem += (int)Vec_IntMemory(&p->vArray1 );
+ nMem += (int)Vec_IntMemory(&p->vArray1 );
return nMem;
}
+static inline int Cba_NtkIsTopoOrder( Cba_Ntk_t * p )
+{
+ int i, iObj, iFin, iFanin, fTopo = 1;
+ Vec_Bit_t * vVisited = Vec_BitStart( Cba_NtkObjNum(p) + 1 );
+ Cba_NtkForEachObj( p, iObj )
+ {
+ Cba_ObjForEachFinFaninReal( p, iObj, iFin, iFanin, i )
+ if ( !Vec_BitEntry(vVisited, iFanin) )
+ fTopo = 0;
+ if ( !fTopo )
+ break;
+ Vec_BitWriteEntry( vVisited, iObj, 1 );
+ }
+ Vec_BitFree( vVisited );
+ return fTopo;
+}
static inline void Cba_NtkPrintStats( Cba_Ntk_t * p )
{
printf( "pi =%5d ", Cba_NtkPiNum(p) );
- printf( "pi =%5d ", Cba_NtkPoNum(p) );
- printf( "box =%6d ", Cba_NtkBoxNum(p) );
- printf( "clp =%7d ", p->Count );
- printf( "obj =%7d ", Cba_NtkObjNum(p) );
- printf( "%s ", Cba_NtkName(p) );
- if ( Cba_NtkHostNtk(p) > 0 )
- printf( "-> %s", Cba_NtkName(Cba_NtkHostNtk(p)) );
+ printf( "po =%5d ", Cba_NtkPoNum(p) );
+ printf( "user =%6d ", Cba_NtkBoxUserNum(p) );
+ printf( "prim =%6d ", Cba_NtkBoxPrimNum(p) );
+ printf( "topo =%4s ", Cba_NtkIsTopoOrder(p) ? "yes" : "no" );
+ printf( " %s ", Cba_NtkName(p) );
+ if ( Vec_IntSize(&p->vNtkObjs) )
+ printf( "-> %s", Cba_NtkName(Cba_NtkNtk(p, Vec_IntEntry(&p->vNtkObjs, 0))) );
printf( "\n" );
-}
-static inline void Cba_NtkDeriveIndex( Cba_Ntk_t * p )
-{
- int i, iObj, iTerm;
- Vec_IntFill( &p->vIndex, Cba_NtkObjNum(p), -1 );
- Cba_NtkForEachPi( p, iObj, i )
- Cba_ObjSetIndex( p, iObj, i );
- Cba_NtkForEachPo( p, iObj, i )
- Cba_ObjSetIndex( p, iObj, i );
- Cba_NtkForEachBox( p, iObj )
- {
- Cba_BoxForEachBi( p, iObj, iTerm, i )
- Cba_ObjSetIndex( p, iTerm, i );
- Cba_BoxForEachBo( p, iObj, iTerm, i )
- Cba_ObjSetIndex( p, iTerm, i );
- }
+// Vec_StrIntPrint( &p->vObjType );
}
static inline void Cba_NtkPrint( Cba_Ntk_t * p )
{
- int i, Type, Value, Beg, End;
- printf( "Interface (%d):\n", Cba_NtkInfoNum(p) );
- Vec_IntForEachEntryTriple( &p->vInfo, Value, Beg, End, i )
- {
- printf( "%6d : ", i );
- printf( "Type =%3d ", Cba_NtkInfoType(p, i/3) );
- if ( Beg >= 0 )
- printf( "[%d:%d] ", End, Beg );
- else
- printf( " " );
- printf( "Name =%3d ", Cba_NtkInfoName(p, i/3) );
- if ( Cba_NtkInfoName(p, i/3) )
- printf( "%s", Cba_NtkStr( p, Cba_NtkInfoName(p, i/3) ) );
- printf( "\n" );
- }
+ int i, Type;
+ printf( "Interface (%d):\n", Cba_NtkPioNum(p) );
printf( "Objects (%d):\n", Cba_NtkObjNum(p) );
Cba_NtkForEachObjType( p, Type, i )
{
printf( "%6d : ", i );
printf( "Type =%3d ", Type );
- if ( Cba_ObjIsCo(p, i) )
- printf( "Fanin =%6d ", Cba_ObjFanin(p, i) );
- else if ( Cba_NtkHasNames(p) && Cba_ObjName(p, i) )
- {
- printf( "Name =%6d(%d) ", Cba_ObjNameId(p, i), Cba_ObjNameType(p, i) );
- if ( Cba_ObjNameType(p, i) <= CBA_NAME_WORD )
- printf( "%s", Cba_ObjNameStr(p, i) );
- }
+ printf( "Fins = %d ", Cba_ObjFinNum(p, i) );
+ printf( "Fons = %d ", Cba_ObjFonNum(p, i) );
+ if ( Cba_NtkHasObjNames(p) && Cba_ObjName(p, i) )
+ printf( "%s", Cba_ObjNameStr(p, i) );
printf( "\n" );
}
}
-
/**Function*************************************************************
Synopsis [Manager APIs.]
@@ -716,98 +747,63 @@ static inline void Cba_NtkPrint( Cba_Ntk_t * p )
SeeAlso []
***********************************************************************/
-static inline Cba_Man_t * Cba_ManAlloc( char * pFileName, int nNtks )
+static inline Cba_Man_t * Cba_ManAlloc( char * pFileName, int nNtks, Abc_Nam_t * pStrs, Abc_Nam_t * pMods )
{
- extern void Cba_ManSetupTypes( char ** pNames, char ** pSymbs );
- Cba_Ntk_t * pNtk; int i;
Cba_Man_t * pNew = ABC_CALLOC( Cba_Man_t, 1 );
pNew->pName = Extra_FileDesignName( pFileName );
pNew->pSpec = Abc_UtilStrsav( pFileName );
- pNew->pStrs = Abc_NamStart( 1000, 24 );
- pNew->pMods = Abc_NamStart( 1000, 24 );
- pNew->iRoot = 1;
- pNew->nNtks = nNtks;
- pNew->pNtks = ABC_CALLOC( Cba_Ntk_t, pNew->nNtks + 1 );
- Cba_ManForEachNtk( pNew, pNtk, i )
- pNtk->pDesign = pNew;
- Cba_ManSetupTypes( pNew->pPrimNames, pNew->pPrimSymbs );
- return pNew;
-}
-static inline Cba_Man_t * Cba_ManStart( Cba_Man_t * p, int nNtks )
-{
- Cba_Ntk_t * pNtk; int i;
- Cba_Man_t * pNew = ABC_CALLOC( Cba_Man_t, 1 );
- pNew->pName = Abc_UtilStrsav( Cba_ManName(p) );
- pNew->pSpec = Abc_UtilStrsav( Cba_ManSpec(p) );
- pNew->pStrs = Abc_NamRef( p->pStrs );
- pNew->pMods = Abc_NamStart( 1000, 24 );
- pNew->iRoot = 1;
- pNew->nNtks = nNtks;
- pNew->pNtks = ABC_CALLOC( Cba_Ntk_t, nNtks + 1 );
- Cba_ManForEachNtk( pNew, pNtk, i )
- pNtk->pDesign = pNew;
+ pNew->pStrs = pStrs ? pStrs : Abc_NamStart( 1000, 24 );
+ pNew->pMods = pMods ? pMods : Abc_NamStart( 1000, 24 );
+ Vec_PtrGrow( &pNew->vNtks, nNtks+1 ); Vec_PtrPush( &pNew->vNtks, NULL );
+ if ( nNtks == 1 ) pNew->iRoot = 1;
return pNew;
}
-static inline Cba_Man_t * Cba_ManDup( Cba_Man_t * p )
+static inline Cba_Man_t * Cba_ManDup( Cba_Man_t * p, Vec_Int_t*(* pFuncOrder)(Cba_Ntk_t*) )
{
- Cba_Ntk_t * pNtk, * pHost; int i;
- Cba_Man_t * pNew = Cba_ManStart( p, Cba_ManNtkNum(p) );
+ Cba_Ntk_t * pNtk, * pNtkNew; int i;
+ Cba_Man_t * pNew = Cba_ManAlloc( p->pSpec, Cba_ManNtkNum(p), Abc_NamRef(p->pStrs), Abc_NamRef(p->pMods) );
Cba_ManForEachNtk( p, pNtk, i )
- Cba_NtkSetCopy( pNtk, i );
- Cba_ManForEachNtk( p, pNtk, i )
- Cba_NtkDup( Cba_NtkCopyNtk(pNew, pNtk), pNtk );
- Cba_ManForEachNtk( p, pNtk, i )
- if ( (pHost = Cba_NtkHostNtk(pNtk)) )
- Cba_NtkSetHost( Cba_NtkCopyNtk(pNew, pNtk), Cba_NtkCopy(pHost), Cba_ObjCopy(pHost, Cba_NtkHostObj(pNtk)) );
- return pNew;
-}
-static inline Cba_Man_t * Cba_ManDupUserBoxes( Cba_Man_t * p )
-{
- Cba_Ntk_t * pNtk, * pHost; int i;
- Cba_Man_t * pNew = Cba_ManStart( p, Cba_ManNtkNum(p) );
- Cba_ManForEachNtk( p, pNtk, i )
- Cba_NtkSetCopy( pNtk, i );
- Cba_ManForEachNtk( p, pNtk, i )
- Cba_NtkDupUserBoxes( Cba_NtkCopyNtk(pNew, pNtk), pNtk );
- Cba_ManForEachNtk( p, pNtk, i )
- if ( (pHost = Cba_NtkHostNtk(pNtk)) )
- Cba_NtkSetHost( Cba_NtkCopyNtk(pNew, pNtk), Cba_NtkCopy(pHost), Cba_ObjCopy(pHost, Cba_NtkHostObj(pNtk)) );
+ {
+ pNtkNew = Cba_NtkDupOrder( pNew, pNtk, pFuncOrder );
+ Cba_NtkDupAttrs( pNtkNew, pNtk );
+ }
+// Cba_ManForEachNtk( p, pNtk, i )
+// if ( (pHost = Cba_NtkHostNtk(pNtk)) )
+// Cba_NtkSetHost( Cba_NtkCopyNtk(pNew, pNtk), Cba_NtkCopy(pHost), Cba_ObjCopy(pHost, Cba_NtkHostObj(pNtk)) );
+ pNew->iRoot = Cba_ManNtkNum(pNew);
return pNew;
}
-static inline void Cba_ManMoveNames( Cba_Man_t * pNew, Cba_Man_t * p )
-{
- Cba_Ntk_t * pNtk; int i;
- Cba_ManForEachNtk( p, pNtk, i )
- Cba_NtkMoveNames( Cba_NtkCopyNtk(pNew, pNtk), pNtk );
-}
-
-
static inline void Cba_ManFree( Cba_Man_t * p )
{
Cba_Ntk_t * pNtk; int i;
Cba_ManForEachNtk( p, pNtk, i )
Cba_NtkFree( pNtk );
- Vec_IntErase( &p->vBuf2LeafNtk );
- Vec_IntErase( &p->vBuf2LeafObj );
- Vec_IntErase( &p->vBuf2RootNtk );
- Vec_IntErase( &p->vBuf2RootObj );
+ ABC_FREE( p->vNtks.pArray );
Abc_NamDeref( p->pStrs );
Abc_NamDeref( p->pMods );
+ Vec_StrFreeP( &p->vOut );
+ Vec_StrFreeP( &p->vOut2 );
ABC_FREE( p->pName );
ABC_FREE( p->pSpec );
- ABC_FREE( p->pNtks );
ABC_FREE( p );
}
+static inline int Cba_ManIsTopOrder( Cba_Man_t * p )
+{
+ Cba_Ntk_t * pNtk; int i;
+ Cba_ManForEachNtk( p, pNtk, i )
+ if ( !Cba_NtkIsTopoOrder(pNtk) )
+ return 0;
+ return 1;
+}
static inline int Cba_ManMemory( Cba_Man_t * p )
{
Cba_Ntk_t * pNtk; int i;
int nMem = sizeof(Cba_Man_t);
- if ( p->pName )
- nMem += (int)strlen(p->pName);
- if ( p->pSpec )
- nMem += (int)strlen(p->pSpec);
+ nMem += p->pName ? (int)strlen(p->pName) : 0;
+ nMem += p->pSpec ? (int)strlen(p->pSpec) : 0;
nMem += Abc_NamMemUsed(p->pStrs);
nMem += Abc_NamMemUsed(p->pMods);
+ nMem += (int)Vec_PtrMemory(&p->vNtks);
Cba_ManForEachNtk( p, pNtk, i )
nMem += Cba_NtkMemory( pNtk );
return nMem;
@@ -819,43 +815,56 @@ static inline int Cba_ManObjNum( Cba_Man_t * p )
Count += Cba_NtkObjNum(pNtk);
return Count;
}
-static inline int Cba_ManNodeNum( Cba_Man_t * p )
+static inline int Cba_ManBoxNum( Cba_Man_t * p )
{
Cba_Ntk_t * pNtk; int i, Count = 0;
Cba_ManForEachNtk( p, pNtk, i )
Count += Cba_NtkBoxNum( pNtk );
return Count;
}
-static inline int Cba_ManBoxNum_rec( Cba_Ntk_t * p )
+static inline void Cba_ManBoxNumRec_rec( Cba_Ntk_t * p, int * pCountP, int * pCountU )
{
- int iObj, Counter = 0;
- if ( p->Count >= 0 )
- return p->Count;
- Cba_NtkForEachBox( p, iObj )
- Counter += Cba_ObjIsBoxUser(p, iObj) ? Cba_ManBoxNum_rec( Cba_BoxNtk(p, iObj) ) : 1;
- return (p->Count = Counter);
+ int iObj, Id = Cba_NtkId(p);
+ if ( pCountP[Id] >= 0 )
+ return;
+ pCountP[Id] = pCountU[Id] = 0;
+ Cba_NtkForEachObj( p, iObj )
+ {
+ if ( Cba_ObjIsBoxUser(p, iObj) )
+ {
+ Cba_ManBoxNumRec_rec( Cba_ObjNtk(p, iObj), pCountP, pCountU );
+ pCountP[Id] += pCountP[Cba_ObjNtkId(p, iObj)];
+ pCountU[Id] += pCountU[Cba_ObjNtkId(p, iObj)] + 1;
+ }
+ else
+ pCountP[Id] += 1;
+ }
}
-static inline int Cba_ManBoxNum( Cba_Man_t * p )
+static inline void Cba_ManBoxNumRec( Cba_Man_t * p, int * pnPrims, int * pnUsers )
{
- Cba_Ntk_t * pNtk; int i;
- Cba_ManForEachNtk( p, pNtk, i )
- pNtk->Count = -1;
- return Cba_ManBoxNum_rec( Cba_ManRoot(p) );
+ Cba_Ntk_t * pNtk = Cba_ManRoot(p);
+ int * pCountP = ABC_FALLOC( int, Cba_ManNtkNum(p) + 1 );
+ int * pCountU = ABC_FALLOC( int, Cba_ManNtkNum(p) + 1 );
+ Cba_ManBoxNumRec_rec( pNtk, pCountP, pCountU );
+ *pnPrims = pCountP[Cba_NtkId(pNtk)];
+ *pnUsers = pCountU[Cba_NtkId(pNtk)];
+ ABC_FREE( pCountP );
+ ABC_FREE( pCountU );
}
static inline void Cba_ManPrintStats( Cba_Man_t * p, int nModules, int fVerbose )
{
- Cba_Ntk_t * pNtk; int i;
+ Cba_Ntk_t * pNtk; int i, nPrims, nUsers;
Cba_Ntk_t * pRoot = Cba_ManRoot( p );
- printf( "%-12s : ", Cba_ManName(p) );
- printf( "pi =%5d ", Cba_NtkPiNum(pRoot) );
- printf( "po =%5d ", Cba_NtkPoNum(pRoot) );
- printf( "pri =%4d ", Cba_ManPrimNum(p) );
- printf( "mod =%6d ", Cba_ManNtkNum(p) );
- printf( "box =%7d ", Cba_ManNodeNum(p) );
- printf( "obj =%7d ", Cba_ManObjNum(p) );
+ Cba_ManBoxNumRec( p, &nPrims, &nUsers );
+ printf( "%-12s : ", Cba_ManName(p) );
+ printf( "pi =%5d ", Cba_NtkPiNum(pRoot) );
+ printf( "po =%5d ", Cba_NtkPoNum(pRoot) );
+ printf( "mod =%6d ", Cba_ManNtkNum(p) );
+ printf( "box =%5d ", nPrims + nUsers );
+ printf( "prim =%5d ", nPrims );
+ printf( "user =%5d ", nUsers );
printf( "mem =%6.3f MB", 1.0*Cba_ManMemory(p)/(1<<20) );
printf( "\n" );
- Cba_ManBoxNum( p );
Cba_ManForEachNtk( p, pNtk, i )
{
if ( i == nModules+1 )
@@ -867,146 +876,20 @@ static inline void Cba_ManPrintStats( Cba_Man_t * p, int nModules, int fVerbose
-/**Function*************************************************************
-
- Synopsis [Other APIs.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-static inline Cba_ObjType_t Ptr_SopToType( char * pSop )
-{
- if ( !strcmp(pSop, " 0\n") ) return CBA_BOX_CF;
- if ( !strcmp(pSop, " 1\n") ) return CBA_BOX_CT;
- if ( !strcmp(pSop, "1 1\n") ) return CBA_BOX_BUF;
- if ( !strcmp(pSop, "0 1\n") ) return CBA_BOX_INV;
- if ( !strcmp(pSop, "11 1\n") ) return CBA_BOX_AND;
- if ( !strcmp(pSop, "00 1\n") ) return CBA_BOX_NOR;
- if ( !strcmp(pSop, "00 0\n") ) return CBA_BOX_OR;
- if ( !strcmp(pSop, "-1 1\n1- 1\n") ) return CBA_BOX_OR;
- if ( !strcmp(pSop, "1- 1\n-1 1\n") ) return CBA_BOX_OR;
- if ( !strcmp(pSop, "01 1\n10 1\n") ) return CBA_BOX_XOR;
- if ( !strcmp(pSop, "10 1\n01 1\n") ) return CBA_BOX_XOR;
- if ( !strcmp(pSop, "11 1\n00 1\n") ) return CBA_BOX_XNOR;
- if ( !strcmp(pSop, "00 1\n11 1\n") ) return CBA_BOX_XNOR;
- if ( !strcmp(pSop, "10 1\n") ) return CBA_BOX_SHARP;
- if ( !strcmp(pSop, "01 1\n") ) return CBA_BOX_SHARPL;
- assert( 0 );
- return CBA_OBJ_NONE;
-}
-static inline char * Ptr_SopToTypeName( char * pSop )
-{
- if ( !strcmp(pSop, " 0\n") ) return "CBA_BOX_C0";
- if ( !strcmp(pSop, " 1\n") ) return "CBA_BOX_C1";
- if ( !strcmp(pSop, "1 1\n") ) return "CBA_BOX_BUF";
- if ( !strcmp(pSop, "0 1\n") ) return "CBA_BOX_INV";
- if ( !strcmp(pSop, "11 1\n") ) return "CBA_BOX_AND";
- if ( !strcmp(pSop, "00 1\n") ) return "CBA_BOX_NOR";
- if ( !strcmp(pSop, "00 0\n") ) return "CBA_BOX_OR";
- if ( !strcmp(pSop, "-1 1\n1- 1\n") ) return "CBA_BOX_OR";
- if ( !strcmp(pSop, "1- 1\n-1 1\n") ) return "CBA_BOX_OR";
- if ( !strcmp(pSop, "01 1\n10 1\n") ) return "CBA_BOX_XOR";
- if ( !strcmp(pSop, "10 1\n01 1\n") ) return "CBA_BOX_XOR";
- if ( !strcmp(pSop, "11 1\n00 1\n") ) return "CBA_BOX_XNOR";
- if ( !strcmp(pSop, "00 1\n11 1\n") ) return "CBA_BOX_XNOR";
- if ( !strcmp(pSop, "10 1\n") ) return "CBA_BOX_SHARP";
- if ( !strcmp(pSop, "01 1\n") ) return "CBA_BOX_SHARPL";
- assert( 0 );
- return NULL;
-}
-static inline char * Ptr_TypeToName( Cba_ObjType_t Type )
-{
- if ( Type == CBA_BOX_CF ) return "const0";
- if ( Type == CBA_BOX_CT ) return "const1";
- if ( Type == CBA_BOX_CX ) return "constX";
- if ( Type == CBA_BOX_CZ ) return "constZ";
- if ( Type == CBA_BOX_BUF ) return "buf";
- if ( Type == CBA_BOX_INV ) return "not";
- if ( Type == CBA_BOX_AND ) return "and";
- if ( Type == CBA_BOX_NAND ) return "nand";
- if ( Type == CBA_BOX_OR ) return "or";
- if ( Type == CBA_BOX_NOR ) return "nor";
- if ( Type == CBA_BOX_XOR ) return "xor";
- if ( Type == CBA_BOX_XNOR ) return "xnor";
- if ( Type == CBA_BOX_MUX ) return "mux";
- if ( Type == CBA_BOX_MAJ ) return "maj";
- if ( Type == CBA_BOX_SHARP ) return "sharp";
- if ( Type == CBA_BOX_SHARPL) return "sharpl";
- assert( 0 );
- return "???";
-}
-static inline char * Ptr_TypeToSop( Cba_ObjType_t Type )
-{
- if ( Type == CBA_BOX_CF ) return " 0\n";
- if ( Type == CBA_BOX_CT ) return " 1\n";
- if ( Type == CBA_BOX_CX ) return " 0\n";
- if ( Type == CBA_BOX_CZ ) return " 0\n";
- if ( Type == CBA_BOX_BUF ) return "1 1\n";
- if ( Type == CBA_BOX_INV ) return "0 1\n";
- if ( Type == CBA_BOX_AND ) return "11 1\n";
- if ( Type == CBA_BOX_NAND ) return "11 0\n";
- if ( Type == CBA_BOX_OR ) return "00 0\n";
- if ( Type == CBA_BOX_NOR ) return "00 1\n";
- if ( Type == CBA_BOX_XOR ) return "01 1\n10 1\n";
- if ( Type == CBA_BOX_XNOR ) return "00 1\n11 1\n";
- if ( Type == CBA_BOX_SHARP ) return "10 1\n";
- if ( Type == CBA_BOX_SHARPL) return "01 1\n";
- if ( Type == CBA_BOX_MUX ) return "11- 1\n0-1 1\n";
- if ( Type == CBA_BOX_MAJ ) return "11- 1\n1-1 1\n-11 1\n";
- assert( 0 );
- return "???";
-}
-
-/*=== cbaCom.c ===============================================================*/
-extern void Abc_FrameImportPtr( Vec_Ptr_t * vPtr );
-extern Vec_Ptr_t * Abc_FrameExportPtr();
-
/*=== cbaBlast.c =============================================================*/
-extern int Cba_NtkBuildLibrary( Cba_Man_t * p );
-extern Gia_Man_t * Cba_ManExtract( Cba_Man_t * p, int fBuffers, int fVerbose );
-extern Cba_Man_t * Cba_ManInsertGia( Cba_Man_t * p, Gia_Man_t * pGia );
-extern void * Cba_ManInsertAbc( Cba_Man_t * p, void * pAbc );
/*=== cbaCba.c ===============================================================*/
-extern Cba_Man_t * Cba_ManReadCba( char * pFileName );
-extern void Cba_ManWriteCba( char * pFileName, Cba_Man_t * p );
+/*=== cbaCom.c ===============================================================*/
/*=== cbaNtk.c ===============================================================*/
-extern char * Cba_NtkGenerateName( Cba_Ntk_t * p, Cba_ObjType_t Type, Vec_Int_t * vBits );
-extern Cba_ObjType_t Cba_NameToType( char * pName );
-extern Vec_Int_t * Cba_NameToRanges( char * pName );
-extern void Cba_NtkUpdateFanout( Cba_Ntk_t * p, int iOld, int iNew );
-extern void Cba_ManDeriveFanout( Cba_Man_t * p );
-//extern void Cba_ManAssignInternNames( Cba_Man_t * p );
-extern void Cba_ManAssignInternWordNames( Cba_Man_t * p );
-extern Cba_Man_t * Cba_ManCollapse( Cba_Man_t * p );
-extern void Cba_ManSetupTypes( char ** pNames, char ** pSymbs );
-/*=== cbaPtr.c ===============================================================*/
-extern void Cba_PtrFree( Vec_Ptr_t * vDes );
-extern int Cba_PtrMemory( Vec_Ptr_t * vDes );
-extern void Cba_PtrDumpBlif( char * pFileName, Vec_Ptr_t * vDes );
-extern void Cba_PtrDumpVerilog( char * pFileName, Vec_Ptr_t * vDes );
-extern Vec_Ptr_t * Cba_PtrTransformTest( Vec_Ptr_t * vDes );
-/*=== cbaPtrAbc.c ============================================================*/
-extern Cba_Man_t * Cba_PtrTransformToCba( Vec_Ptr_t * vDes );
-extern Vec_Ptr_t * Cba_PtrDeriveFromCba( Cba_Man_t * p );
-/*=== cbaPrsBuild.c ==========================================================*/
-extern void Prs_ManVecFree( Vec_Ptr_t * vPrs );
-extern Cba_Man_t * Prs_ManBuildCba( char * pFileName, Vec_Ptr_t * vDes );
/*=== cbaReadBlif.c ==========================================================*/
extern Vec_Ptr_t * Prs_ManReadBlif( char * pFileName );
-/*=== cbaReadSmt.c ===========================================================*/
-extern Vec_Ptr_t * Prs_ManReadSmt( char * pFileName );
/*=== cbaReadVer.c ===========================================================*/
extern Vec_Ptr_t * Prs_ManReadVerilog( char * pFileName );
/*=== cbaWriteBlif.c =========================================================*/
-extern void Prs_ManWriteBlif( char * pFileName, Vec_Ptr_t * p );
-extern void Cba_ManWriteBlif( char * pFileName, Cba_Man_t * p );
+//extern void Prs_ManWriteBlif( char * pFileName, Vec_Ptr_t * p );
+//extern void Cba_ManWriteBlif( char * pFileName, Cba_Man_t * p );
/*=== cbaWriteVer.c ==========================================================*/
-extern void Prs_ManWriteVerilog( char * pFileName, Vec_Ptr_t * p );
-extern void Cba_ManWriteVerilog( char * pFileName, Cba_Man_t * p, int fUseAssign );
+//extern void Prs_ManWriteVerilog( char * pFileName, Vec_Ptr_t * p );
+//extern void Cba_ManWriteVerilog( char * pFileName, Cba_Man_t * p, int fUseAssign );
ABC_NAMESPACE_HEADER_END