/**CFile**************************************************************** FileName [cba.h] SystemName [ABC: Logic synthesis and verification system.] PackageName [Hierarchical word-level netlist.] Synopsis [External declarations.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - July 21, 2015.] Revision [$Id: cba.h,v 1.00 2014/11/29 00:00:00 alanmi Exp $] ***********************************************************************/ #ifndef ABC__base__cba__cba_h #define ABC__base__cba__cba_h //////////////////////////////////////////////////////////////////////// /// INCLUDES /// //////////////////////////////////////////////////////////////////////// #include "aig/gia/gia.h" #include "misc/extra/extra.h" #include "misc/util/utilNam.h" #include "misc/vec/vecHash.h" #include "cbaTypes.h" //////////////////////////////////////////////////////////////////////// /// PARAMETERS /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_HEADER_START //////////////////////////////////////////////////////////////////////// /// BASIC TYPES /// //////////////////////////////////////////////////////////////////////// typedef struct Cba_Ntk_t_ Cba_Ntk_t; typedef struct Cba_Man_t_ Cba_Man_t; // network struct Cba_Ntk_t_ { Cba_Man_t * pDesign; // design int Id; // network ID int NameId; // name ID int iCopy; // copy module unsigned Mark : 1; // visit mark unsigned fComb: 1; // the network is combinational unsigned fSeq : 1; // the network is sequential // interface Vec_Int_t vInputs; // inputs Vec_Int_t vOutputs; // outputs Vec_Int_t vOrder; // order Vec_Int_t vSeq; // sequential objects // 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 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 Vec_Int_t vFonBits; // fon mapping into AIG nodes // other Vec_Ptr_t * vOther; // various data Vec_Int_t vArray0; Vec_Int_t vArray1; }; // design struct Cba_Man_t_ { // design names char * pName; // design name char * pSpec; // spec file name Abc_Nam_t * pStrs; // string manager Abc_Nam_t * pFuns; // constant manager Abc_Nam_t * pMods; // module name manager Hash_IntMan_t * vHash; // variable ranges Vec_Int_t vNameMap; // mapping names Vec_Int_t vNameMap2;// mapping names Vec_Int_t vUsed; // used map entries Vec_Int_t vUsed2; // used map entries char * pTypeNames[CBA_BOX_LAST]; int nObjs[CBA_BOX_LAST]; // counter of objects of each type int nAnds[CBA_BOX_LAST]; // counter of AND gates after blasting // internal data int iRoot; // root network Vec_Ptr_t vNtks; // networks // user data int nOpens; Vec_Str_t vOut; Vec_Str_t vOut2; void * pMioLib; }; //////////////////////////////////////////////////////////////////////// /// 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 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) ? (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 int Cba_ManNameIdMax( Cba_Man_t * p ) { return Abc_NamObjNumMax(p->pStrs) + 1; } static inline char * Cba_ManConst( Cba_Man_t * p, int i ) { return Abc_NamStr(p->pFuns, i); } static inline int Cba_ManConstId( Cba_Man_t * p, char * pStr ) { return Abc_NamStrFind(p->pFuns, pStr); } static inline int Cba_ManConstIdMax( Cba_Man_t * p ) { return Abc_NamObjNumMax(p->pFuns) + 1; } static inline Cba_Man_t * Cba_NtkMan( Cba_Ntk_t * p ) { return p->pDesign; } 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 int Cba_NtkPioOrder( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vOrder, i); } static inline int Cba_NtkBoxSeq( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vSeq, i); } static inline Abc_Nam_t * Cba_NtkNam( Cba_Ntk_t * p ) { return p->pDesign->pStrs; } static inline char * Cba_NtkStr( Cba_Ntk_t * p, int i ) { return Cba_ManStr(p->pDesign, i); } static inline int Cba_NtkStrId( Cba_Ntk_t * p, char * pName ) { return Cba_ManStrId(p->pDesign, pName); } static inline char * Cba_NtkConst( Cba_Ntk_t * p, int i ) { return Cba_ManConst(p->pDesign, i); } static inline char * Cba_NtkSop( Cba_Ntk_t * p, int i ) { return Cba_ManConst(p->pDesign, i); } static inline int Cba_NtkNameId( Cba_Ntk_t * p ) { return p->NameId; } static inline char * Cba_NtkName( Cba_Ntk_t * p ) { return Cba_NtkStr(p, p->NameId); } static inline char * Cba_NtkTypeName( Cba_Ntk_t * p, int Type ) { return p->pDesign->pTypeNames[Type]; } 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 == 0); p->iCopy = i; } static inline int Cba_NtkHashRange( Cba_Ntk_t * p, int l, int r ) { return Hash_Int2ManInsert( p->pDesign->vHash, l, r, 0 ); } static inline int Cba_NtkRangeLeft( Cba_Ntk_t * p, int h ) { return h ? Hash_IntObjData0( p->pDesign->vHash, h ) : 0; } static inline int Cba_NtkRangeRight( Cba_Ntk_t * p, int h ) { return h ? Hash_IntObjData1( p->pDesign->vHash, h ) : 0; } static inline int Cba_NtkRangeSize( Cba_Ntk_t * p, int h ) { int l = Cba_NtkRangeLeft(p, h), r = Cba_NtkRangeRight(p, h); return 1 + (l > r ? l-r : r-l);} 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_NtkPioOrderNum( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vOrder); } 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 int Cba_NtkBoxSeqNum( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vSeq); } static inline void Cba_NtkCleanObjCopies( Cba_Ntk_t * p ) { Vec_IntFill(&p->vObjCopy, Vec_StrCap(&p->vObjType), -1); } static inline void Cba_NtkCleanObjFuncs( Cba_Ntk_t * p ) { Vec_IntFill(&p->vObjFunc, Vec_StrCap(&p->vObjType), 0); } static inline void Cba_NtkCleanObjNames( Cba_Ntk_t * p ) { Vec_IntFill(&p->vObjName, Vec_StrCap(&p->vObjType), 0); } static inline void Cba_NtkCleanObjAttrs( Cba_Ntk_t * p ) { Vec_IntFill(&p->vObjAttr, Vec_StrCap(&p->vObjType), 0); Vec_IntFill(&p->vAttrSto, 1, -1); } static inline void Cba_NtkCleanFonCopies( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonCopy, Vec_IntCap(&p->vFonObj), 0); } static inline void Cba_NtkCleanFonNames( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonName, Vec_IntCap(&p->vFonObj), 0); } static inline void Cba_NtkCleanFonRanges( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonRange, Vec_IntCap(&p->vFonObj), 0); } static inline void Cba_NtkCleanFonPrevs( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonPrev, Vec_IntCap(&p->vFonObj), 0); } static inline void Cba_NtkCleanFonNexts( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFonNext, Vec_IntCap(&p->vFonObj), 0); } static inline void Cba_NtkCleanFinFon0( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFinFon0, Vec_IntCap(&p->vFinFon), 0); } static inline void Cba_NtkCleanFinObjs( Cba_Ntk_t * p ) { Vec_IntFill(&p->vFinObj, Vec_IntCap(&p->vFinFon), 0); } 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_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_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_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 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_TypeIsSeq( Cba_ObjType_t Type ) { return Type >= CBA_BOX_RAM && Type <= CBA_BOX_DFFRS; } static inline int Cba_TypeIsUnary( Cba_ObjType_t Type ) { return Type == CBA_BOX_BUF || Type == CBA_BOX_INV || Type == CBA_BOX_LNOT || Type == CBA_BOX_MIN || Type == CBA_BOX_SQRT || Type == CBA_BOX_ABS || (Type >= CBA_BOX_RAND && Type <= CBA_BOX_RXNOR); } static inline int Cba_TypeIsMux( Cba_ObjType_t Type ) { return Type == CBA_BOX_MUX || Type == CBA_BOX_NMUX || Type == CBA_BOX_SEL || Type == CBA_BOX_PSEL; } 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_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_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_ObjIsSlice( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) == CBA_BOX_SLICE; } static inline int Cba_ObjIsConcat( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) == CBA_BOX_CONCAT; } static inline int Cba_ObjIsUnary( Cba_Ntk_t * p, int i ) { return Cba_TypeIsUnary(Cba_ObjType(p, i)); } 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); assert( Cba_NtkHasObjCopies(p) ); return Vec_IntGetEntryFull(&p->vObjCopy, i); } static inline int Cba_ObjFunc( Cba_Ntk_t * p, int i ) { assert(i>0); assert( Cba_NtkHasObjFuncs(p) ); return Vec_IntGetEntry(&p->vObjFunc, i); } static inline int Cba_ObjName( Cba_Ntk_t * p, int i ) { assert(i>0); assert( Cba_NtkHasObjNames(p) ); 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 Cba_NtkHasObjAttrs(p) ? Vec_IntGetEntry(&p->vObjAttr, i) : 0; } static inline int Cba_ObjAttrSize( Cba_Ntk_t * p, int i ) { assert(i>=0); return Cba_ObjAttr(p, i) ? Vec_IntEntry(&p->vAttrSto, Cba_ObjAttr(p, i)) : 0; } static inline int * Cba_ObjAttrArray( Cba_Ntk_t * p, int i ) { assert(i>=0); return Cba_ObjAttr(p, i) ? Vec_IntEntryP(&p->vAttrSto, Cba_ObjAttr(p, i)+1) : NULL; } static inline int Cba_ObjAttrValue( Cba_Ntk_t * p, int i, int x ) { int k, s = Cba_ObjAttrSize(p, i), * a = Cba_ObjAttrArray(p, i); for ( k = 0; k < s; k += 2) if (a[k] == x) return a[k+1]; return 0; } 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); if ( !a ) return; Vec_IntSetEntry(&p->vObjAttr, i, Vec_IntSize(&p->vAttrSto)); Vec_IntPush(&p->vAttrSto, s); 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 void Cba_PatchFinFon( Cba_Ntk_t * p, int f, int x ) { assert(f>0); Vec_IntWriteEntry(&p->vFinFon, f, x); } 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); return (Cba_ObjIsBoxUser(p, i) && Cba_NtkHasObjFuncs(p)) ? 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 void 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_ObjIsSeq( Cba_Ntk_t * p, int i ) { assert(i>0); return Cba_ObjIsBoxUser(p, i) ? Cba_ObjNtk(p, i)->fSeq : Cba_TypeIsSeq(Cba_ObjType(p, i)); } 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_FonConstRangeSize( Cba_Ntk_t * p, int f ) { assert(Cba_FonIsConst(f)); return atoi(Cba_NtkConst(p, Cba_FonConst(f))); } static inline int Cba_FonConstSigned( Cba_Ntk_t * p, int f ) { assert(Cba_FonIsConst(f)); return strchr(Cba_NtkConst(p, Cba_FonConst(f)), 's') != NULL; } 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_FonRangeId( Cba_Ntk_t * p, int f ) { assert(Cba_FonIsReal(f)); return Cba_NtkHasFonRanges(p)?Vec_IntGetEntry(&p->vFonRange, f):0;} static inline int Cba_FonRange( Cba_Ntk_t * p, int f ) { assert(Cba_FonIsReal(f)); return Abc_Lit2Var( Cba_FonRangeId(p, f) ); } static inline int Cba_FonLeft( Cba_Ntk_t * p, int f ) { return Cba_NtkRangeLeft(p, Cba_FonRange(p, f)); } static inline int Cba_FonRight( Cba_Ntk_t * p, int f ) { return Cba_NtkRangeRight(p, Cba_FonRange(p, f)); } static inline int Cba_FonSigned( Cba_Ntk_t * p, int f ) { return Cba_FonIsConst(f) ? Cba_FonConstSigned(p, f) : Abc_LitIsCompl(Cba_FonRangeId(p, f)); } static inline int Cba_FonRangeSize( Cba_Ntk_t * p, int f ) { return Cba_FonIsConst(f) ? Cba_FonConstRangeSize(p, f):Cba_NtkRangeSize(p, Cba_FonRange(p, f)); } static inline void Cba_FonSetRangeSign( Cba_Ntk_t * p, int f, int x ) { assert(Cba_NtkHasFonRanges(p)); Vec_IntSetEntry(&p->vFonRange, f, x); } static inline void Cba_FonSetRange( Cba_Ntk_t * p, int f, int x ) { assert(Cba_NtkHasFonRanges(p)); Vec_IntSetEntry(&p->vFonRange, f, Abc_Var2Lit(x,0)); } static inline void Cba_FonHashRange( Cba_Ntk_t * p, int f, int l, int r ) { Cba_FonSetRange( p, f, Cba_NtkHashRange(p, l, r) ); } 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_NtkHasFonNames(p)); assert(Cba_FonIsReal(f)); return Vec_IntGetEntry( &p->vFonName, f ); } static inline char * Cba_FonNameStr( Cba_Ntk_t * p, int f ) { assert(Cba_NtkHasFonNames(p)); 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_NtkHasFonNames(p)); 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_NtkHasFonNames(p)); 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_NtkHasFonNames(p)); 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) ); } static inline int Cba_ObjLeft( Cba_Ntk_t * p, int i ) { return Cba_FonLeft( p, Cba_ObjFon0(p, i) ); } static inline int Cba_ObjRight( Cba_Ntk_t * p, int i ) { return Cba_FonRight( p, Cba_ObjFon0(p, i) ); } static inline int Cba_ObjRangeSize( Cba_Ntk_t * p, int i ) { return Cba_FonRangeSize( p, Cba_ObjFon0(p, i) ); } static inline int Cba_ObjSigned( Cba_Ntk_t * p, int i ) { return Cba_FonSigned( p, Cba_ObjFon0(p, i) ); } static inline int Cba_ObjSign( Cba_Ntk_t * p, int i ) { return Abc_Var2Lit( Cba_FonRangeSize(p, i), Cba_ObjSigned(p, i) ); } //////////////////////////////////////////////////////////////////////// /// ITERATORS /// //////////////////////////////////////////////////////////////////////// #define Cba_ManForEachNtk( p, pNtk, i ) \ for ( i = 1; (i <= Cba_ManNtkNum(p)) && (((pNtk) = Cba_ManNtk(p, i)), 1); i++ ) #define Cba_NtkForEachPi( p, iObj, i ) \ 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_NtkForEachBoxSeq( p, iObj, i ) \ for ( i = 0; (i < Cba_NtkBoxSeqNum(p)) && (((iObj) = Cba_NtkBoxSeq(p, i)), 1); i++ ) #define Cba_NtkForEachPioOrder( p, iObj, i ) \ for ( i = 0; (i < Cba_NtkPioOrderNum(p)) && (((iObj) = Cba_NtkPioOrder(p, i)), 1); i++ ) #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 ) \ for ( i = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Cba_ObjType(p, i) ) {} else #define Cba_NtkForEachObjType( p, Type, i ) \ 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 = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Cba_ObjIsBox(p, i) ) {} else #define Cba_NtkForEachBoxComb( p, i ) \ for ( i = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Cba_ObjIsBox(p, i) || Cba_ObjIsSeq(p, i) ) {} else #define Cba_NtkForEachBoxUser( p, i ) \ for ( i = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Cba_ObjIsBoxUser(p, i) ) {} else #define Cba_NtkForEachBoxPrim( p, i ) \ for ( i = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Cba_ObjIsBoxPrim(p, i) ) {} else #define Cba_NtkForEachFon( p, i ) \ for ( i = 1; i < Vec_IntSize(&p->vFonObj); i++ ) #define Cba_NtkForEachFinFon( p, iFon, iFin ) \ for ( iFin = 1; iFin < Vec_IntSize(&p->vFinFon) && (((iFon) = Vec_IntEntry(&p->vFinFon, iFin)), 1); iFin++ ) if ( !iFon ) {} else #define Cba_NtkForEachFonName( p, NameId, iFon ) \ for ( iFon = 1; iFon < Vec_IntSize(&p->vFonName) && (((NameId) = Vec_IntEntry(&p->vFonName, iFon)), 1); iFon++ ) if ( !NameId ) {} 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 /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Object APIs.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline int Cba_ObjAlloc( Cba_Ntk_t * p, Cba_ObjType_t Type, int nFins, int nFons ) { 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->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_ObjFinNum(p, i), Cba_ObjFonNum(p, i) ); Cba_ObjSetCopy( p, i, iObj ); return iObj; } static inline void Cba_ObjDelete( Cba_Ntk_t * p, int i ) { 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************************************************************* Synopsis [Network APIs.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ 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->pDesign = p; Vec_IntGrow( &pNew->vInputs, nIns ); Vec_IntGrow( &pNew->vOutputs, nOuts ); 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_NtkFree( Cba_Ntk_t * p ) { // interface Vec_IntErase( &p->vInputs ); Vec_IntErase( &p->vOutputs ); Vec_IntErase( &p->vOrder ); Vec_IntErase( &p->vSeq ); // 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->vFonPrev ); Vec_IntErase( &p->vFonNext ); Vec_IntErase( &p->vFinFon0 ); Vec_IntErase( &p->vFinObj ); Vec_IntErase( &p->vNtkObjs ); Vec_IntErase( &p->vFonBits ); // 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_NtkNewStrId( Cba_Ntk_t * pNtk, const char * format, ... ) { Abc_Nam_t * p = Cba_NtkNam( pNtk ); Vec_Str_t * vBuf = Abc_NamBuffer( p ); int nAdded, nSize = 1000; va_list args; va_start( args, format ); Vec_StrGrow( vBuf, Vec_StrSize(vBuf) + nSize ); nAdded = vsnprintf( Vec_StrLimit(vBuf), nSize, format, args ); if ( nAdded > nSize ) { Vec_StrGrow( vBuf, Vec_StrSize(vBuf) + nAdded + nSize ); nSize = vsnprintf( Vec_StrLimit(vBuf), nAdded, format, args ); assert( nSize == nAdded ); } va_end( args ); return Abc_NamStrFindOrAddLim( p, Vec_StrLimit(vBuf), Vec_StrLimit(vBuf) + nAdded, NULL ); } static inline int Cba_ManNewConstId( Cba_Ntk_t * p, Vec_Str_t * vBits ) { Vec_Str_t * vOut = Abc_NamBuffer(Cba_NtkNam(p)); Vec_StrPrintF( vOut, "%d\'b%s", Vec_StrSize(vBits)-1, Vec_StrArray(vBits) ); return Abc_NamStrFindOrAdd(p->pDesign->pFuns, Vec_StrArray(vOut), NULL); } static inline int Cba_ManNewConstZero( Cba_Ntk_t * p, int nBits ) { Vec_Str_t * vOut = Abc_NamBuffer(Cba_NtkNam(p)); Vec_StrPrintF( vOut, "%d\'b%0s", nBits, "" ); return Abc_NamStrFindOrAdd(p->pDesign->pFuns, Vec_StrArray(vOut), NULL); } static inline void Cba_NtkAdd( Cba_Man_t * p, Cba_Ntk_t * pNtk ) { int fFound, NtkId = Abc_NamStrFindOrAdd( p->pMods, Cba_NtkName(pNtk), &fFound ); if ( fFound ) printf( "Network with name \"%s\" already exists.\n", Cba_NtkName(pNtk) ); else assert( NtkId == pNtk->Id ); } static inline void Cba_NtkUpdate( Cba_Man_t * p, Cba_Ntk_t * pNtk ) { int fFound, NtkId = Abc_NamStrFindOrAdd( p->pMods, Cba_NtkName(pNtk), &fFound ); if ( !fFound ) printf( "Network with name \"%s\" does not exist.\n", Cba_NtkName(pNtk) ); else { Cba_NtkFree( Cba_ManNtk(p, NtkId) ); Vec_PtrWriteEntry( &p->vNtks, NtkId, pNtk ); } } static inline Vec_Int_t * Cba_NtkCollect( Cba_Ntk_t * p ) { int iObj; Vec_Int_t * vObjs = Vec_IntAlloc( Cba_NtkObjNum(p) ); Cba_NtkForEachObj( p, iObj ) Vec_IntPush( vObjs, iObj ); return vObjs; } static inline int Cba_NtkIsSeq( Cba_Ntk_t * p ) { int iObj; if ( p->fSeq ) return 1; if ( p->fComb ) return 0; assert( !p->fSeq && !p->fComb ); Cba_NtkForEachBox( p, iObj ) if ( Cba_ObjIsBoxUser(p, iObj) ) { if ( Cba_NtkIsSeq( Cba_ObjNtk(p, iObj) ) ) { p->fSeq = 1; return 1; } } else if ( Cba_ObjIsSeq(p, iObj) ) { p->fSeq = 1; return 1; } p->fComb = 1; return 0; } static inline void Cba_NtkPrepareSeq( Cba_Ntk_t * p ) { int iObj; assert( Cba_NtkBoxSeqNum(p) == 0 ); if ( !Cba_NtkIsSeq(p) ) return; Cba_NtkForEachBox( p, iObj ) if ( Cba_ObjIsSeq(p, iObj) ) Vec_IntPush( &p->vSeq, iObj ); // Cba_NtkObjOrder( p, &p->vSeq, 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 ) { *nPis += Cba_ObjIsPi(p, iObj); *nPos += Cba_ObjIsPo(p, iObj); *nFins += Cba_ObjFinNum(p, iObj); *nFons += Cba_ObjFonNum(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, Cba_NtkNameId(p), nPis, nPos, Vec_IntSize(vObjs), nFins, nFons ); 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 ); //Cba_NtkPrepareSeq( pNew ); return pNew; } static inline void Cba_NtkDupAttrs( Cba_Ntk_t * pNew, Cba_Ntk_t * p ) { int i, iObj; assert( Vec_IntSize(&pNew->vOrder) == 0 ); Cba_NtkForEachPioOrder( p, iObj, i ) Vec_IntPush( &pNew->vOrder, Cba_ObjCopy(p, iObj) ); // Vec_IntRemapArray( &p->vObjCopy, &p->vOrder, &pNew->vOrder, Cba_NtkPioOrderNum(p) ); // Vec_IntRemapArray( &p->vObjCopy, &p->vSeq, &pNew->vSeq, Cba_NtkBoxSeqNum(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 ); // 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 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->vOrder); nMem += (int)Vec_IntMemory(&p->vSeq); // 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->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 ); nMem += (int)Vec_IntMemory(&p->vFonBits ); // other nMem += (int)Vec_IntMemory(&p->vArray1 ); nMem += (int)Vec_IntMemory(&p->vArray1 ); return nMem; } static inline void Cba_NtkPrintStats( Cba_Ntk_t * p ) { printf( "pi =%5d ", Cba_NtkPiNum(p) ); printf( "po =%5d ", Cba_NtkPoNum(p) ); printf( "seq =%5d ", Cba_NtkBoxSeqNum(p) ); printf( "box =%5d ", Cba_NtkBoxNum(p) ); printf( "prim =%5d ", Cba_NtkBoxPrimNum(p) ); printf( "user =%5d ", Cba_NtkBoxUserNum(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" ); // Vec_StrIntPrint( &p->vObjType ); } static inline void Cba_NtkPrint( Cba_Ntk_t * p ) { 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 ); 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.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline Cba_Man_t * Cba_ManAlloc( char * pFileName, int nNtks, Abc_Nam_t * pStrs, Abc_Nam_t * pFuns, Abc_Nam_t * pMods, Hash_IntMan_t * vHash ) { Cba_Man_t * pNew = ABC_CALLOC( Cba_Man_t, 1 ); pNew->pName = Extra_FileDesignName( pFileName ); pNew->pSpec = Abc_UtilStrsav( pFileName ); pNew->pStrs = pStrs ? pStrs : Abc_NamStart( 1000, 24 ); pNew->pFuns = pFuns ? pFuns : Abc_NamStart( 100, 24 ); pNew->pMods = pMods ? pMods : Abc_NamStart( 100, 24 ); pNew->vHash = vHash ? vHash : Hash_IntManStart( 1000 ); if ( pFuns == NULL ) { Abc_NamStrFindOrAdd(pNew->pFuns, "1\'b0", NULL); Abc_NamStrFindOrAdd(pNew->pFuns, "1\'b1", NULL); Abc_NamStrFindOrAdd(pNew->pFuns, "1\'bx", NULL); Abc_NamStrFindOrAdd(pNew->pFuns, "1\'bz", NULL); } // if ( vHash == NULL ) // Hash_Int2ManInsert( pNew->vHash, 0, 0, 0 ); Vec_PtrGrow( &pNew->vNtks, nNtks+1 ); Vec_PtrPush( &pNew->vNtks, NULL ); // set default root module pNew->iRoot = 1; return pNew; } static inline void Cba_ManDupTypeNames( Cba_Man_t * pNew, Cba_Man_t * p ) { memcpy( pNew->pTypeNames, p->pTypeNames, sizeof(void *) * CBA_BOX_LAST ); } static inline Cba_Man_t * Cba_ManDup( Cba_Man_t * p, Vec_Int_t*(* pFuncOrder)(Cba_Ntk_t*) ) { 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->pFuns), Abc_NamStart(100, 24), Hash_IntManRef(p->vHash) ); Cba_ManDupTypeNames( pNew, p ); Cba_ManForEachNtk( p, pNtk, i ) { pNtkNew = Cba_NtkDupOrder( pNew, pNtk, pFuncOrder ); Cba_NtkAdd( pNew, pNtkNew ); 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_ManPrepareSeq( Cba_Man_t * p ) { Cba_Ntk_t * pNtk; int i; Cba_ManForEachNtk( p, pNtk, i ) Cba_NtkPrepareSeq( pNtk ); } static inline void Cba_ManFree( Cba_Man_t * p ) { Cba_Ntk_t * pNtk; int i; Cba_ManForEachNtk( p, pNtk, i ) Cba_NtkFree( pNtk ); ABC_FREE( p->vNtks.pArray ); Abc_NamDeref( p->pStrs ); Abc_NamDeref( p->pFuns ); Abc_NamDeref( p->pMods ); Hash_IntManDeref( p->vHash ); Vec_IntErase( &p->vNameMap ); Vec_IntErase( &p->vUsed ); Vec_IntErase( &p->vNameMap2 ); Vec_IntErase( &p->vUsed2 ); Vec_StrErase( &p->vOut ); Vec_StrErase( &p->vOut2 ); ABC_FREE( p->pName ); ABC_FREE( p->pSpec ); ABC_FREE( p ); } static inline int Cba_ManGetMap( Cba_Man_t * p, int i ) { return Vec_IntGetEntry(&p->vNameMap, i); } static inline void Cba_ManSetMap( Cba_Man_t * p, int i, int x ) { assert( Vec_IntGetEntry(&p->vNameMap, i) == 0 ); Vec_IntSetEntry( &p->vNameMap, i, x ); Vec_IntPush( &p->vUsed, i ); } static inline void Cba_ManUnsetMap( Cba_Man_t * p, int i ) { Vec_IntSetEntry( &p->vNameMap, i, 0 ); } static inline void Cba_ManCleanMap( Cba_Man_t * p ) { int i, Entry; Vec_IntForEachEntry( &p->vUsed, Entry, i ) Vec_IntWriteEntry( &p->vNameMap, Entry, 0 ); Vec_IntClear( &p->vUsed ); } static inline int Cba_NtkGetMap( Cba_Ntk_t * p, int i ) { return Cba_ManGetMap(p->pDesign, i); } static inline void Cba_NtkSetMap( Cba_Ntk_t * p, int i, int x ) { Cba_ManSetMap(p->pDesign, i, x); } static inline void Cba_NtkUnsetMap( Cba_Ntk_t * p, int i ) { Cba_ManUnsetMap(p->pDesign, i); } static inline void Cba_NtkCleanMap( Cba_Ntk_t * p ) { Cba_ManCleanMap(p->pDesign); } static inline int Cba_ManGetMap2( Cba_Man_t * p, int i ) { return Vec_IntGetEntry(&p->vNameMap2, i); } static inline void Cba_ManSetMap2( Cba_Man_t * p, int i, int x ) { assert( Vec_IntGetEntry(&p->vNameMap2, i) == 0 ); Vec_IntSetEntry( &p->vNameMap2, i, x ); Vec_IntPush( &p->vUsed2, i ); } static inline void Cba_ManUnsetMap2( Cba_Man_t * p, int i ) { Vec_IntSetEntry( &p->vNameMap2, i, 0 ); } static inline void Cba_ManCleanMap2( Cba_Man_t * p ) { int i, Entry; Vec_IntForEachEntry( &p->vUsed2, Entry, i ) Vec_IntWriteEntry( &p->vNameMap2, Entry, 0 ); Vec_IntClear( &p->vUsed2 ); } static inline int Cba_NtkGetMap2( Cba_Ntk_t * p, int i ) { return Cba_ManGetMap2(p->pDesign, i); } static inline void Cba_NtkSetMap2( Cba_Ntk_t * p, int i, int x ) { Cba_ManSetMap2(p->pDesign, i, x); } static inline void Cba_NtkUnsetMap2( Cba_Ntk_t * p, int i ) { Cba_ManUnsetMap2(p->pDesign, i); } static inline void Cba_NtkCleanMap2( Cba_Ntk_t * p ) { Cba_ManCleanMap2(p->pDesign); } static inline int Cba_ManMemory( Cba_Man_t * p ) { Cba_Ntk_t * pNtk; int i; int nMem = sizeof(Cba_Man_t); 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->pFuns); nMem += Abc_NamMemUsed(p->pMods); nMem += (int)Vec_IntMemory(&p->vNameMap ); nMem += (int)Vec_IntMemory(&p->vUsed ); nMem += (int)Vec_StrMemory(&p->vOut ); nMem += (int)Vec_StrMemory(&p->vOut2 ); nMem += (int)Vec_PtrMemory(&p->vNtks); Cba_ManForEachNtk( p, pNtk, i ) nMem += Cba_NtkMemory( pNtk ); return nMem; } static inline int Cba_ManObjNum( Cba_Man_t * p ) { Cba_Ntk_t * pNtk; int i, Count = 0; Cba_ManForEachNtk( p, pNtk, i ) Count += Cba_NtkObjNum(pNtk); return Count; } 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 void Cba_ManBoxNumRec_rec( Cba_Ntk_t * p, int * pCountP, int * pCountU ) { 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 void Cba_ManBoxNumRec( Cba_Man_t * p, int * pnPrims, int * pnUsers ) { 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, nPrims, nUsers; Cba_Ntk_t * pRoot = Cba_ManRoot( 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 =%5d ", 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_ManForEachNtk( p, pNtk, i ) { if ( i == nModules+1 ) break; printf( "Module %5d : ", i ); Cba_NtkPrintStats( pNtk ); } } /**Function************************************************************* Synopsis [Name handling.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline void Cba_NtkAddMissingFonNames( Cba_Ntk_t * p, char * pPref ) { int iFon, NameId, Index; // populate map Cba_ManCleanMap( p->pDesign ); Vec_IntForEachEntryStart( &p->vFonName, NameId, iFon, 1 ) if ( NameId ) Cba_ManSetMap( p->pDesign, NameId, iFon ); // check remaining ones Vec_IntForEachEntryStart( &p->vFonName, NameId, iFon, 1 ) { if ( NameId ) continue; NameId = Cba_NtkNewStrId(p, "%s%d", pPref, iFon); for ( Index = 1; Cba_ManGetMap(p->pDesign, NameId); Index++ ) NameId = Cba_NtkNewStrId(p, "%s%d_%d", pPref, iFon, Index); Cba_FonSetName( p, iFon, NameId ); Cba_ManSetMap( p->pDesign, NameId, iFon ); } } static inline void Cba_NtkCreateFonNames( Cba_Ntk_t * p, char * pPref ) { int i, iObj, iFon;//, NameId; Cba_NtkCleanFonNames( p ); Cba_NtkForEachPiFon( p, iObj, iFon, i ) if ( !Cba_FonName(p, iFon) ) Cba_FonSetName( p, iFon, Cba_ObjName(p, iObj) ); Cba_NtkForEachPoDriverFon( p, iObj, iFon, i ) if ( Cba_FonIsReal(iFon) && !Cba_FonName(p, iFon) ) Cba_FonSetName( p, iFon, Cba_ObjName(p, iObj) ); // Vec_IntForEachEntryStart( &p->vFonName, NameId, iFon, 1 ) // if ( NameId == 0 ) // Vec_IntWriteEntry( &p->vFonName, iFon, Cba_NtkNewStrId(p, "%s%d", pPref, iFon) ); Cba_NtkAddMissingFonNames( p, pPref ); } static inline void Cba_NtkMissingFonNames( Cba_Ntk_t * p, char * pPref ) { int i, iObj, iFon;//, NameId; Cba_NtkForEachPiFon( p, iObj, iFon, i ) if ( !Cba_FonName(p, iFon) ) Cba_FonSetName( p, iFon, Cba_ObjName(p, iObj) ); Cba_NtkForEachPoDriverFon( p, iObj, iFon, i ) if ( Cba_FonIsReal(iFon) && !Cba_FonName(p, iFon) ) Cba_FonSetName( p, iFon, Cba_ObjName(p, iObj) ); // Vec_IntForEachEntryStart( &p->vFonName, NameId, iFon, 1 ) // if ( NameId == 0 ) // Cba_FonSetName( p, iFon, Cba_NtkNewStrId(p, "%s%d", pPref, iFon) ); Cba_NtkAddMissingFonNames( p, pPref ); } /*=== cbaBlast.c =============================================================*/ extern Gia_Man_t * Cba_ManBlast( Cba_Man_t * p, int fBarBufs, int fSeq, int fVerbose ); extern Cba_Man_t * Cba_ManInsertGia( Cba_Man_t * p, Gia_Man_t * pGia ); extern Cba_Man_t * 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 void Cba_NtkPrintStatsFull( Cba_Ntk_t * p, int fDistrib, int fVerbose ); extern void Cba_NtkPrintNodes( Cba_Ntk_t * p, int Type ); extern void Cba_NtkPrintDistribOld( Cba_Ntk_t * p ); extern void Cba_ManPrintDistrib( Cba_Man_t * p ); //extern void Cba_ManPrepareTypeNames( Cba_Man_t * p ); extern void Cba_NtkObjOrder( Cba_Ntk_t * p, Vec_Int_t * vObjs, Vec_Int_t * vNameIds ); extern int Cba_NtkCiFonNum( Cba_Ntk_t * p ); extern int Cba_NtkCoFinNum( Cba_Ntk_t * p ); extern int Cba_NtkCheckComboLoop( Cba_Ntk_t * p ); extern int Cba_ManIsTopoOrder( Cba_Man_t * p ); extern Vec_Int_t * Cba_NtkCollectDfs( Cba_Ntk_t * p ); extern Cba_Man_t * Cba_ManCollapse( Cba_Man_t * p ); extern Cba_Man_t * Cba_ManExtractGroup( Cba_Man_t * p, Vec_Int_t * vObjs ); extern Cba_Man_t * Cba_ManDeriveFromGia( Cba_Man_t * p, Gia_Man_t * pGia, int fUseXor ); extern Cba_Man_t * Cba_ManInsertGroup( Cba_Man_t * p, Vec_Int_t * vObjs, Cba_Ntk_t * pSyn ); /*=== cbaReadBlif.c ==========================================================*/ extern Cba_Man_t * Prs_ManBuildCbaBlif( char * pFileName, Vec_Ptr_t * vDes ); extern void Prs_ManReadBlifTest( char * pFileName ); extern Cba_Man_t * Cba_ManReadBlif( char * pFileName ); /*=== cbaReadVer.c ===========================================================*/ extern Cba_Man_t * Prs_ManBuildCbaVerilog( char * pFileName, Vec_Ptr_t * vDes ); extern void Prs_ManReadVerilogTest( char * pFileName ); extern Cba_Man_t * Cba_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 ); /*=== cbaWriteVer.c ==========================================================*/ extern void Cba_ManCreatePrimMap( char ** pMap ); extern char * Cba_ManGetSliceName( Cba_Ntk_t * p, int iFon, int RangeId ); extern void Prs_ManWriteVerilog( char * pFileName, Vec_Ptr_t * p ); extern void Cba_ManWriteVerilog( char * pFileName, Cba_Man_t * p, int fInlineConcat ); ABC_NAMESPACE_HEADER_END #endif //////////////////////////////////////////////////////////////////////// /// END OF FILE /// ////////////////////////////////////////////////////////////////////////