diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2015-01-31 19:52:32 -0800 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2015-01-31 19:52:32 -0800 |
commit | 77dbe2b6565dbc68a04a315fb51b50a35b763228 (patch) | |
tree | 8b8c4bddbd01a69314178d33a8b739867d38f78d /src/base/cba/cba.h | |
parent | a523ab792c4627c11a57fce9a002f3a5bd4bae45 (diff) | |
download | abc-77dbe2b6565dbc68a04a315fb51b50a35b763228.tar.gz abc-77dbe2b6565dbc68a04a315fb51b50a35b763228.tar.bz2 abc-77dbe2b6565dbc68a04a315fb51b50a35b763228.zip |
Major rehash of the CBA code.
Diffstat (limited to 'src/base/cba/cba.h')
-rw-r--r-- | src/base/cba/cba.h | 939 |
1 files changed, 578 insertions, 361 deletions
diff --git a/src/base/cba/cba.h b/src/base/cba/cba.h index 847a6dc5..16565c8b 100644 --- a/src/base/cba/cba.h +++ b/src/base/cba/cba.h @@ -4,7 +4,7 @@ SystemName [ABC: Logic synthesis and verification system.] - PackageName [Verilog parser.] + PackageName [Hierarchical word-level netlist.] Synopsis [External declarations.] @@ -28,9 +28,6 @@ #include "aig/gia/gia.h" #include "misc/extra/extra.h" #include "misc/util/utilNam.h" -#include "misc/extra/extra.h" -#include "misc/util/utilTruth.h" -#include "misc/vec/vecSet.h" //////////////////////////////////////////////////////////////////////// /// PARAMETERS /// @@ -45,212 +42,225 @@ ABC_NAMESPACE_HEADER_START // network objects typedef enum { CBA_OBJ_NONE = 0, // 0: unused - CBA_OBJ_BI, // 1: box input - CBA_OBJ_BO, // 2: box output - CBA_OBJ_PI, // 3: input - CBA_OBJ_PO, // 4: output - CBA_OBJ_NODE, // 5: node - CBA_OBJ_BOX, // 6: box - CBA_OBJ_LATCH, // 7: latch - CBA_OBJ_CONCAT, // 8: concatenation - CBA_OBJ_UNKNOWN // 9: unknown + 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_C0, + CBA_BOX_C1, + CBA_BOX_CX, + CBA_BOX_CZ, + CBA_BOX_BUF, + CBA_BOX_INV, + CBA_BOX_AND, + CBA_BOX_NAND, + CBA_BOX_OR, + CBA_BOX_NOR, + CBA_BOX_XOR, + CBA_BOX_XNOR, + CBA_BOX_SHARP, + CBA_BOX_MUX, + CBA_BOX_MAJ, + + CBA_BOX_RAND, + CBA_BOX_RNAND, + CBA_BOX_ROR, + CBA_BOX_RNOR, + CBA_BOX_RXOR, + CBA_BOX_RXNOR, + + CBA_BOX_SEL, + CBA_BOX_PSEL, + CBA_BOX_ENC, + CBA_BOX_PENC, + CBA_BOX_DEC, + + CBA_BOX_ADD, + CBA_BOX_SUB, + CBA_BOX_MUL, + CBA_BOX_DIV, + CBA_BOX_MOD, + CBA_BOX_REM, + CBA_BOX_POW, + CBA_BOX_ABS, + + CBA_BOX_LTHAN, + CBA_BOX_LETHAN, + CBA_BOX_METHAN, + CBA_BOX_MTHAN, + CBA_BOX_EQU, + CBA_BOX_NEQU, + + CBA_BOX_SHIL, + CBA_BOX_SHIR, + CBA_BOX_ROTL, + CBA_BOX_ROTR, + + CBA_BOX_GATE, + CBA_BOX_LUT, + CBA_BOX_ASSIGN, + + CBA_BOX_TRI, + CBA_BOX_RAM, + CBA_BOX_RAMR, + CBA_BOX_RAMW, + CBA_BOX_RAMWC, + + CBA_BOX_LATCH, + CBA_BOX_LATCHRS, + CBA_BOX_DFF, + CBA_BOX_DFFRS, + + CBA_BOX_UNKNOWN // 50 } Cba_ObjType_t; -// Verilog predefined models -typedef enum { - CBA_NODE_NONE = 0, // 0: unused - CBA_NODE_C0, // 1: constant 0 - CBA_NODE_C1, // 2: constant 1 - CBA_NODE_CX, // 2: constant X - CBA_NODE_CZ, // 2: constant Z - CBA_NODE_BUF, // 3: buffer - CBA_NODE_INV, // 4: inverter - CBA_NODE_AND, // 5: AND - CBA_NODE_NAND, // 6: NAND - CBA_NODE_OR, // 7: OR - CBA_NODE_NOR, // 8: NOR - CBA_NODE_XOR, // 9: XOR - CBA_NODE_XNOR, // 10 XNOR - CBA_NODE_SHARP, // 11: SHARP - CBA_NODE_MUX, // 12: MUX - CBA_NODE_MAJ, // 13: MAJ - CBA_NODE_LUT, // 14: LUT - - CBA_NODE_RAND, - CBA_NODE_RNAND, - CBA_NODE_ROR, - CBA_NODE_RNOR, - CBA_NODE_RXOR, - CBA_NODE_RXNOR, - - CBA_NODE_SEL, - CBA_NODE_PSEL, - CBA_NODE_ENC, - CBA_NODE_PENC, - CBA_NODE_DEC, - - CBA_NODE_ADD, - CBA_NODE_SUB, - CBA_NODE_MUL, - CBA_NODE_DIV, - CBA_NODE_MOD, - CBA_NODE_REM, - CBA_NODE_POW, - CBA_NODE_ABS, - - CBA_NODE_LTHEN, - CBA_NODE_MTHEN, - CBA_NODE_EQU, - CBA_NODE_NEQU, - - CBA_NODE_SHIL, - CBA_NODE_SHIR, - CBA_NODE_ROTL, - CBA_NODE_ROTR, - - CBA_NODE_TRI, - CBA_NODE_RAM, - CBA_NODE_RAMR, - CBA_NODE_RAMW, - CBA_NODE_RAMWC, - - CBA_NODE_LATCH, - CBA_NODE_LATCHRS, - CBA_NODE_DFF, - CBA_NODE_DFFRS, - - CBA_NODE_UNKNOWN // 50 -} Cba_NodeType_t; +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 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 + // object attributes + Vec_Str_t vType; // types + Vec_Int_t vIndex; // index + Vec_Int_t vFanin; // fanin + Vec_Int_t vName; // original NameId or InstId + Vec_Int_t vRange; // range + Vec_Int_t vCopy; // copy + // other + Vec_Int_t vArray; +}; // design -typedef struct Cba_Man_t_ Cba_Man_t; struct Cba_Man_t_ { // design names char * pName; // design name char * pSpec; // spec file name - Abc_Nam_t * pNames; // name manager - Abc_Nam_t * pModels; // model name manager - Abc_Nam_t * pFuncs; // functionality manager - Cba_Man_t * pLib; // library + Abc_Nam_t * pStrs; // string manager + Abc_Nam_t * pMods; // module name manager // internal data - Vec_Set_t Mem; // memory - Vec_Ptr_t vNtks; // networks int iRoot; // root network - Vec_Int_t vCopies; // copies + int nNtks; // number of current networks + Cba_Ntk_t * pNtks; // networks + // user data Vec_Int_t * vBuf2RootNtk; Vec_Int_t * vBuf2RootObj; Vec_Int_t * vBuf2LeafNtk; Vec_Int_t * vBuf2LeafObj; void * pMioLib; void ** ppGraphs; + int ElemGates[4]; }; -// network -typedef struct Cba_Ntk_t_ Cba_Ntk_t; -struct Cba_Ntk_t_ -{ - Cba_Man_t * pDesign; // design - int Id; // network ID - int iBoxNtk; // instance network ID - int iBoxObj; // instance object ID - int nObjs; // object counter - int iObjStart;// first object in global order - // interface - Vec_Int_t vInouts; // inouts (used by parser to store signals as NameId) - Vec_Int_t vInputs; // inputs (used by parser to store signals as NameId) - Vec_Int_t vOutputs; // outputs (used by parser to store signals as NameId) - Vec_Int_t vWires; // wires (used by parser to store signals as NameId) - // objects - Vec_Int_t vTypes; // types (used by parser to store Cba_PrsType_t) - Vec_Int_t vFuncs; // functions (used by parser to store function) (node: function; box: model; CI/CO: index) - Vec_Int_t vFanins; // fanins (used by parser to store fanin/fanout/range as NameId) (node: handle; CO/BI fanin0) - // attributes - Vec_Int_t vInstIds; // instance names (used by parser to store instance name as NameId) - Vec_Int_t vNameIds; // original names as NameId -}; - - 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_ManNtkId( Cba_Man_t * p, char * pName ) { return Abc_NamStrFind(p->pModels, pName); } -static inline Cba_Ntk_t * Cba_ManNtk( Cba_Man_t * p, int i ) { assert( i > 0 ); return (Cba_Ntk_t *)Vec_PtrEntry(&p->vNtks, i); } -static inline Cba_Ntk_t * Cba_ManNtkFind( Cba_Man_t * p, char * pName ) { return Cba_ManNtk( p, Cba_ManNtkId(p, pName) ); } +static inline int Cba_ManNtkNum( Cba_Man_t * p ) { return p->nNtks; } +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 int Cba_ManNtkFindId( Cba_Man_t * p, char * pName ) { return Abc_NamStrFind(p->pMods, pName) - 1; } +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 Vec_Set_t * Cba_ManMem( Cba_Man_t * p ) { return &p->Mem; } -static inline int Cba_ManMemSave( Cba_Man_t * p, int * d, int s ) { return Vec_SetAppend(Cba_ManMem(p), d, s); } -static inline int * Cba_ManMemRead( Cba_Man_t * p, int h ) { return h ? (int *)Vec_SetEntry(Cba_ManMem(p), h) : NULL; } +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_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_NtkId( Cba_Ntk_t * p ) { return p->Id; } -static inline char * Cba_NtkName( Cba_Ntk_t * p ) { return Abc_NamStr(Cba_NtkMan(p)->pModels, Cba_NtkId(p)); } -static inline int Cba_NtkObjNum( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vFanins); } -static inline int Cba_NtkPioNum( Cba_Ntk_t * p ) { return Vec_IntSize(&p->vInouts); } +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 int Cba_NtkCopy( Cba_Ntk_t * p ) { return p->iCopy; } +static inline void Cba_NtkSetCopy( Cba_Ntk_t * p, int i ) { assert(p->iCopy == -1); p->iCopy = i; } + +static inline int Cba_NtkObjNum( Cba_Ntk_t * p ) { return Vec_StrSize(&p->vType); } +static inline int Cba_NtkAllocNum( 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_NtkNodeNum( Cba_Ntk_t * p ) { return Vec_IntCountEntry(&p->vTypes, CBA_OBJ_NODE); } -static inline int Cba_NtkBoxNum( Cba_Ntk_t * p ) { return Vec_IntCountEntry(&p->vTypes, CBA_OBJ_BOX); } - -static inline int Cba_NtkPio( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vInouts, i); } +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_StrCountEntry(&p->vType, (char)CBA_OBJ_BI); } +static inline int Cba_NtkBoNum( Cba_Ntk_t * p ) { return Vec_StrCountEntry(&p->vType, (char)CBA_OBJ_BO); } +static inline int Cba_NtkBoxNum( Cba_Ntk_t * p ) { return Cba_NtkObjNum(p) - Vec_StrCountSmaller(&p->vType, (char)CBA_OBJ_BOX); } +static inline int Cba_NtkPrimNum( Cba_Ntk_t * p ) { return Vec_StrCountLarger(&p->vType, (char)CBA_OBJ_BOX); } +static inline int Cba_NtkUserNum( Cba_Ntk_t * p ) { return Vec_StrCountEntry(&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 Abc_NamStr(p->pDesign->pNames, i); } -static inline char * Cba_NtkModelStr( Cba_Ntk_t * p, int i ) { return Abc_NamStr(p->pDesign->pModels, i); } -static inline char * Cba_NtkFuncStr( Cba_Ntk_t * p, int i ) { return Abc_NamStr(p->pDesign->pFuncs, i); } -static inline Vec_Set_t * Cba_NtkMem( Cba_Ntk_t * p ) { return Cba_ManMem(p->pDesign); } -static inline int Cba_NtkMemSave( Cba_Ntk_t * p, int * d, int s ) { return Cba_ManMemSave(p->pDesign, d, s); } -static inline int * Cba_NtkMemRead( Cba_Ntk_t * p, int h ) { return Cba_ManMemRead(p->pDesign, h); } -static inline Cba_Ntk_t * Cba_NtkHostNtk( Cba_Ntk_t * p ) { return Cba_ManNtk(p->pDesign, p->iBoxNtk); } +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 ) { p->iBoxNtk = n; p->iBoxObj = i; } -static inline Vec_Int_t * Cba_NtkCopies( Cba_Ntk_t * p ) { return &p->pDesign->vCopies; } -static inline int Cba_NtkCopy( Cba_Ntk_t * p, int i ) { return Vec_IntEntry( Cba_NtkCopies(p), p->iObjStart + i ); } -static inline void Cba_NtkSetCopy( Cba_Ntk_t * p, int i, int x ) { Vec_IntWriteEntry( Cba_NtkCopies(p), p->iObjStart + i, x ); } +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 Cba_ObjType_t Cba_ObjType( Cba_Ntk_t * p, int i ) { return (Cba_ObjType_t)Vec_IntEntry(&p->vTypes, i); } -static inline int Cba_ObjFuncId( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vFuncs, i); } -static inline int Cba_ObjFaninId( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vFanins, i); } -static inline int Cba_ObjInstId( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vInstIds, i); } -static inline int Cba_ObjNameId( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vNameIds, i); } +static inline void Cba_NtkStartNames( Cba_Ntk_t * p ) { assert(Cba_NtkAllocNum(p)); Vec_IntFill(&p->vName, Cba_NtkAllocNum(p), 0); } +static inline void Cba_NtkStartRanges( Cba_Ntk_t * p ) { assert(Cba_NtkAllocNum(p)); Vec_IntFill(&p->vRange, Cba_NtkAllocNum(p), 0); } +static inline void Cba_NtkStartCopies( Cba_Ntk_t * p ) { assert(Cba_NtkAllocNum(p)); Vec_IntFill(&p->vCopy, Cba_NtkAllocNum(p), -1); } +static inline void Cba_NtkFreeNames( Cba_Ntk_t * p ) { Vec_IntErase(&p->vName); } +static inline void Cba_NtkFreeRanges( Cba_Ntk_t * p ) { Vec_IntErase(&p->vRange); } +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_NtkHasRanges( Cba_Ntk_t * p ) { return p->vRange.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_ObjType_t Cba_ObjType( Cba_Ntk_t * p, int i ) { return (Cba_ObjType_t)Vec_StrEntry(&p->vType, i); } 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_ObjIsNode( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) == CBA_OBJ_NODE; } -static inline int Cba_ObjIsBox( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) == CBA_OBJ_BOX; } -static inline int Cba_ObjIsConcat( Cba_Ntk_t * p, int i ) { return Cba_ObjType(p, i) == CBA_OBJ_CONCAT; } +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_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_ObjIsCi(p, i) || Cba_ObjIsCo(p, i); } -static inline int Cba_ObjIsBio( Cba_Ntk_t * p, int i ) { return Cba_ObjIsBi(p, i) || Cba_ObjIsBo(p, i); } -static inline int Cba_ObjFanin0( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsPo(p, i) || Cba_ObjIsBio(p, i)); return Cba_ObjFaninId(p, i); } -static inline int * Cba_ObjFaninArray( Cba_Ntk_t * p, int i ) { assert(Cba_ObjType(p, i) >= CBA_OBJ_NODE); return Cba_NtkMemRead(p, Cba_ObjFaninId(p, i)); } -static inline int Cba_ObjFaninNum( Cba_Ntk_t * p, int i ) { return *Cba_ObjFaninArray(p, i); } -static inline int * Cba_ObjFanins( Cba_Ntk_t * p, int i ) { return Cba_ObjFaninArray(p, i) + 1; } -static inline Vec_Int_t * Cba_ObjFaninVec( Cba_Ntk_t * p, int i ) { static Vec_Int_t V; V.pArray = Cba_ObjFaninArray(p, i); V.nSize = V.nCap = V.pArray ? *V.pArray++ : 0; return &V; } -static inline Vec_Int_t * Cba_ObjFaninVec2( Cba_Ntk_t * p, int i ) { static Vec_Int_t W; W.pArray = Cba_ObjFaninArray(p, i); W.nSize = W.nCap = W.pArray ? *W.pArray++ : 0; return &W; } -static inline Cba_NodeType_t Cba_ObjNodeType( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsNode(p, i)); return (Cba_NodeType_t)Cba_ObjFuncId(p, i); } -static inline int Cba_ObjBoxModelId( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBox(p, i)); return Cba_ObjFuncId(p, i); } -static inline Cba_Ntk_t * Cba_ObjBoxModel( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBox(p, i)); return Cba_ManNtk(p->pDesign, Cba_ObjBoxModelId(p, i)); } -static inline int Cba_ObjBoxSize( Cba_Ntk_t * p, int i ) { return 1 + Cba_NtkPiNum(Cba_ObjBoxModel(p, i)) + Cba_NtkPoNum(Cba_ObjBoxModel(p, i)); } - -static inline int Cba_ObjBoxBiNum( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBox(p, i)); return Cba_NtkPiNum(Cba_ObjBoxModel(p, i)); } -static inline int Cba_ObjBoxBoNum( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBox(p, i)); return Cba_NtkPoNum(Cba_ObjBoxModel(p, i)); } -static inline int Cba_ObjBoxBi( Cba_Ntk_t * p, int b, int i ) { assert(Cba_ObjIsBox(p, b)); return b - Cba_ObjBoxBiNum(p, b) + i; } -static inline int Cba_ObjBoxBo( Cba_Ntk_t * p, int b, int i ) { assert(Cba_ObjIsBox(p, b)); return b + 1 + i; } -static inline int Cba_ObjBiModelId( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBi(p, i)); while (!Cba_ObjIsBox(p, i)) i++; return Cba_ObjBoxModelId(p, i); } -static inline int Cba_ObjBoModelId( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBo(p, i)); return Cba_ObjBoxModelId(p, Cba_ObjFanin0(p, i)); } -static inline Cba_Ntk_t * Cba_ObjBiModel( Cba_Ntk_t * p, int i ) { return Cba_ManNtk( p->pDesign, Cba_ObjBiModelId(p, i) ); } -static inline Cba_Ntk_t * Cba_ObjBoModel( Cba_Ntk_t * p, int i ) { return Cba_ManNtk( p->pDesign, Cba_ObjBoModelId(p, i) ); } -static inline int Cba_ObjCioIndex( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsCio(p, i) || Cba_ObjIsBio(p, i)); return Cba_ObjFuncId(p, i); } - -static inline char * Cba_ObjFuncStr( Cba_Ntk_t * p, int i ) { return Cba_NtkStr(p, Cba_ObjFuncId(p, i)); } -static inline char * Cba_ObjInstStr( Cba_Ntk_t * p, int i ) { return Cba_NtkStr(p, Cba_ObjInstId(p, i)); } -static inline char * Cba_ObjNameStr( Cba_Ntk_t * p, int i ) { return Cba_NtkStr(p, Cba_ObjNameId(p, i)); } +static inline int Cba_ObjIndex( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vIndex, 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_ObjFaninTwo( Cba_Ntk_t * p, int i ) { return Cba_ObjFanin(p, Cba_ObjFanin(p, i)); } +static inline int Cba_ObjName( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vName, i); } +static inline int Cba_ObjRange( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vRange, i); } +static inline int Cba_ObjCopy( Cba_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vCopy, i); } +static inline char * Cba_ObjNameStr( Cba_Ntk_t * p, int i ) { return Cba_NtkStr(p, Cba_ObjName(p, i)); } +static inline char * Cba_ObjRangeStr( Cba_Ntk_t * p, int i ) { return Cba_NtkStr(p, Cba_ObjRange(p, i)); } +static inline void Cba_ObjSetFanin( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjFanin(p, i) == -1); Vec_IntWriteEntry( &p->vFanin, i, x ); } +static inline void Cba_ObjSetName( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjName(p, i) == 0); Vec_IntWriteEntry( &p->vName, i, x ); } +static inline void Cba_ObjSetRange( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjRange(p, i) == 0); Vec_IntWriteEntry( &p->vRange, i, x ); } +static inline void Cba_ObjSetCopy( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ObjCopy(p, i) == -1); Vec_IntWriteEntry( &p->vCopy, i, x ); } + +static inline int Cba_BoxBiNum( Cba_Ntk_t * p, int i ) { int s = i-1; assert(Cba_ObjIsBox(p, i)); while (i < Cba_NtkObjNum(p) && 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_BoxNtkId( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsBox(p, i)); return Cba_ObjIndex(p, i); } +static inline void Cba_BoxSetNtkId( Cba_Ntk_t * p, int i, int x ) { assert(Cba_ManNtkIsOk(p->pDesign, x));Vec_IntWriteEntry(&p->vIndex, 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) ); } //////////////////////////////////////////////////////////////////////// @@ -262,7 +272,7 @@ static inline char * Cba_ObjNameStr( Cba_Ntk_t * p, int i ) { r //////////////////////////////////////////////////////////////////////// #define Cba_ManForEachNtk( p, pNtk, i ) \ - for ( i = 1; (i <= Cba_ManNtkNum(p)) && (((pNtk) = Cba_ManNtk(p, i)), 1); i++ ) + for ( i = 0; (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) = Vec_IntEntry(&p->vInputs, i)), 1); i++ ) @@ -273,273 +283,480 @@ static inline char * Cba_ObjNameStr( Cba_Ntk_t * p, int i ) { r for ( i = 0; (i < Cba_NtkObjNum(p)) && (((Type) = Cba_ObjType(p, i)), 1); i++ ) #define Cba_NtkForEachBox( p, i ) \ - for ( i = 0; (i < Cba_NtkObjNum(p)); i++ ) if ( Cba_ObjType(p, i) != CBA_OBJ_BOX ) {} else -#define Cba_NtkForEachNode( p, i ) \ - for ( i = 0; (i < Cba_NtkObjNum(p)); i++ ) if ( Cba_ObjType(p, i) != CBA_OBJ_NODE ) {} else + for ( i = 0; (i < Cba_NtkObjNum(p)); 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 +#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_ObjType(p, i) != CBA_OBJ_PI && Cba_ObjType(p, i) != CBA_OBJ_BO ) {} else + 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_ObjType(p, i) != CBA_OBJ_PO && Cba_ObjType(p, i) != CBA_OBJ_BI ) {} else + 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 - Cba_ObjBoxBiNum(p, iBox), i = 0; iTerm < 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 < iBox + 1 + Cba_ObjBoxBoNum(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_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++ ) //////////////////////////////////////////////////////////////////////// /// FUNCTION DECLARATIONS /// //////////////////////////////////////////////////////////////////////// -// copy contents to the vector -static inline int Cba_ManHandleArray( Cba_Man_t * p, Vec_Int_t * vFrom ) +/**Function************************************************************* + + Synopsis [Object APIs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline int Cba_ObjAlloc( Cba_Ntk_t * p, Cba_ObjType_t Type, int Index, int Fanin ) { - int h = Vec_SetFetchH( Cba_ManMem(p), sizeof(int) * (Vec_IntSize(vFrom) + 1) ); - int * pArray = (int *)Vec_SetEntry( Cba_ManMem(p), h ); - pArray[0] = Vec_IntSize(vFrom); - memcpy( pArray+1, Vec_IntArray(vFrom), sizeof(int) * Vec_IntSize(vFrom) ); - Vec_IntClear( vFrom ); - return h; + int iObj = Cba_NtkObjNum(p); + assert( iObj == Vec_IntSize(&p->vIndex) ); + assert( iObj == Vec_IntSize(&p->vFanin) ); + if ( Type == CBA_OBJ_PI ) + { + assert( Index == -1 || Index == Vec_IntSize(&p->vInputs) ); + Vec_IntPush( &p->vIndex, Vec_IntSize(&p->vInputs) ); + Vec_IntPush( &p->vInputs, iObj ); + } + else if ( Type == CBA_OBJ_PO ) + { + assert( Index == -1 || Index == Vec_IntSize(&p->vOutputs) ); + Vec_IntPush( &p->vIndex, Vec_IntSize(&p->vOutputs) ); + Vec_IntPush( &p->vOutputs, iObj ); + } + else + { + assert( Type >= CBA_OBJ_BOX || Index >= 0 ); + Vec_IntPush( &p->vIndex, Index ); + } + Vec_StrPush( &p->vType, (char)Type ); + Vec_IntPush( &p->vFanin, Fanin ); + return iObj; } -static inline int Cba_ManHandleBuffer( Cba_Man_t * p, int iFanin ) +static inline int Cba_ObjDup( Cba_Ntk_t * pNew, Cba_Ntk_t * p, int i ) { - int h = Vec_SetFetchH( Cba_ManMem(p), sizeof(int) * 2 ); - int * pArray = (int *)Vec_SetEntry( Cba_ManMem(p), h ); - pArray[0] = (iFanin >= 0) ? 1 : 0; - pArray[1] = iFanin; - return h; + int iObj = Cba_ObjAlloc( pNew, Cba_ObjType(p, i), Cba_ObjIndex(p, i), -1 ); + if ( Cba_ObjIsBox(p, i) && Cba_BoxNtk(p, i) ) + Cba_BoxSetNtkId( pNew, iObj, Cba_NtkCopy(Cba_BoxNtk(p, i)) ); + if ( Cba_NtkHasNames(p) && Cba_NtkHasNames(pNew) ) + Cba_ObjSetName( pNew, iObj, Cba_ObjName(p, i) ); + if ( Cba_NtkHasRanges(p) && Cba_NtkHasRanges(pNew) ) + Cba_ObjSetRange( pNew, iObj, Cba_ObjRange(p, i) ); + Cba_ObjSetCopy( p, i, iObj ); + return iObj; } -static inline void Cba_ManAllocArray( Cba_Man_t * p, Vec_Int_t * vTo, int nSize ) +static inline int Cba_BoxAlloc( Cba_Ntk_t * p, Cba_ObjType_t Type, int nIns, int nOuts, int iNtk ) { - if ( nSize == 0 ) - return; - vTo->nSize = 0; - vTo->nCap = nSize; - vTo->pArray = (int *)Vec_SetFetch( Cba_ManMem(p), sizeof(int) * nSize ); + int i, iObj; + for ( i = nIns - 1; i >= 0; i-- ) + Cba_ObjAlloc( p, CBA_OBJ_BI, i, -1 ); + iObj = Cba_ObjAlloc( p, Type, iNtk, -1 ); + for ( i = 0; i < nOuts; i++ ) + Cba_ObjAlloc( p, CBA_OBJ_BO, i, iObj ); + return iObj; } -static inline void Cba_ManFetchArray( Cba_Man_t * p, Vec_Int_t * vTo, int nSize ) +static inline int Cba_BoxDup( Cba_Ntk_t * pNew, Cba_Ntk_t * p, int iBox ) { - if ( nSize == 0 ) - return; - vTo->nSize = vTo->nCap = nSize; - vTo->pArray = (int *)Vec_SetFetch( Cba_ManMem(p), sizeof(int) * nSize ); - memset( Vec_IntArray(vTo), 0xff, sizeof(int) * nSize ); + int i, iTerm, iBoxNew; + Cba_BoxForEachBiReverse( p, iBox, iTerm, i ) + Cba_ObjDup( pNew, p, iTerm ); + iBoxNew = Cba_ObjDup( pNew, p, iBox ); + Cba_BoxForEachBo( p, iBox, iTerm, i ) + Cba_ObjDup( pNew, p, iTerm ); + return iBoxNew; } -static inline void Cba_ManSetupArray( Cba_Man_t * p, Vec_Int_t * vTo, Vec_Int_t * vFrom ) + + +/**Function************************************************************* + + Synopsis [Network APIs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline void Cba_NtkAlloc( Cba_Ntk_t * pNew, int NameId, int nIns, int nOuts, int nObjs ) { - if ( Vec_IntSize(vFrom) == 0 ) - return; - vTo->nSize = vTo->nCap = Vec_IntSize(vFrom); - vTo->pArray = (int *)Vec_SetFetch( Cba_ManMem(p), sizeof(int) * Vec_IntSize(vFrom) ); - memcpy( Vec_IntArray(vTo), Vec_IntArray(vFrom), sizeof(int) * Vec_IntSize(vFrom) ); - Vec_IntClear( vFrom ); + int NtkId, fFound; + assert( pNew->pDesign != NULL ); + assert( Cba_NtkPiNum(pNew) == 0 ); + assert( Cba_NtkPoNum(pNew) == 0 ); + pNew->NameId = NameId; + pNew->iCopy = -1; + pNew->iBoxNtk = -1; + pNew->iBoxObj = -1; + Vec_IntGrow( &pNew->vInputs, nIns ); + Vec_IntGrow( &pNew->vOutputs, nOuts ); + Vec_StrGrow( &pNew->vType, nObjs ); + Vec_IntGrow( &pNew->vIndex, nObjs ); + Vec_IntGrow( &pNew->vFanin, nObjs ); + // check if the network is unique + NtkId = Abc_NamStrFindOrAdd( pNew->pDesign->pMods, Cba_NtkStr(pNew, NameId), &fFound ); + if ( fFound ) + printf( "Network with name %s already exists.\n", Cba_NtkStr(pNew, NameId) ); + else + assert( NtkId == Cba_NtkId(pNew) + 1 ); } - -// constructors desctructors -static inline int Cba_ObjAdd( Cba_Ntk_t * p, int i, Cba_ObjType_t Type, int Func, int Fanin, int NameId ) +static inline void Cba_NtkDup( Cba_Ntk_t * pNew, Cba_Ntk_t * p ) { - if ( Type == CBA_OBJ_PI ) - Vec_IntWriteEntry( &p->vInputs, Func, i ); - if ( Type == CBA_OBJ_PO ) - Vec_IntWriteEntry( &p->vOutputs, Func, i ); - if ( Type >= 0 ) - Vec_IntWriteEntry( &p->vTypes, i, Type ); - if ( Func >= 0 ) - Vec_IntWriteEntry( &p->vFuncs, i, Func ); - if ( Fanin >= 0 ) - Vec_IntWriteEntry( &p->vFanins, i, Fanin ); - if ( NameId >= 0 ) - Vec_IntWriteEntry( &p->vNameIds, i, NameId ); - return i; + int i, iObj; + assert( pNew != p ); + Cba_NtkAlloc( pNew, Cba_NtkNameId(p), Cba_NtkPiNum(p), Cba_NtkPoNum(p), Cba_NtkObjNum(p) ); + Cba_NtkStartCopies( p ); + if ( Cba_NtkHasNames(p) ) + Cba_NtkStartNames( pNew ); + Cba_NtkForEachPi( p, iObj, i ) + Cba_ObjDup( pNew, p, iObj ); + Cba_NtkForEachBox( p, iObj ) + Cba_BoxDup( pNew, p, iObj ); + 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 ); + assert( Cba_NtkObjNum(pNew) == Cba_NtkAllocNum(pNew) ); } -static inline int Cba_BoxAdd( Cba_Ntk_t * p, Cba_Ntk_t * pBox, int NameId ) +static inline void Cba_NtkDupUserBoxes( Cba_Ntk_t * pNew, Cba_Ntk_t * p ) { - int i, ObjId; - for ( i = 0; i < Cba_NtkPiNum(pBox); i++ ) - Cba_ObjAdd( p, p->nObjs++, CBA_OBJ_BI, i, -1, -1 ); - ObjId = Cba_ObjAdd( p, p->nObjs++, CBA_OBJ_BOX, Cba_NtkId(pBox), -1, NameId ); - for ( i = 0; i < Cba_NtkPoNum(pBox); i++ ) - Cba_ObjAdd( p, p->nObjs++, CBA_OBJ_BO, i, ObjId, -1 ); - Cba_NtkSetHost( pBox, Cba_NtkId(p), ObjId ); - return ObjId; + int i, iObj; + assert( pNew != p ); + Cba_NtkAlloc( pNew, Cba_NtkNameId(p), Cba_NtkPiNum(p), Cba_NtkPoNum(p), Cba_NtkObjNum(p) ); + Cba_NtkStartCopies( p ); + if ( Cba_NtkHasNames(p) ) + Cba_NtkStartNames( pNew ); + Cba_NtkForEachPi( p, iObj, i ) + Cba_ObjDup( pNew, p, iObj ); + Cba_NtkForEachPo( p, iObj, i ) + Cba_ObjDup( pNew, p, iObj ); + Cba_NtkForEachBoxUser( p, iObj ) + Cba_BoxDup( pNew, p, iObj ); } -static inline Cba_Ntk_t * Cba_NtkAlloc( Cba_Man_t * p, char * pName ) +static inline void Cba_NtkFree( Cba_Ntk_t * p ) { - int iModelId = Abc_NamStrFindOrAdd( p->pModels, pName, NULL ); - Cba_Ntk_t * pNtk = (Cba_Ntk_t *)Vec_SetFetch( Cba_ManMem(p), sizeof(Cba_Ntk_t) ); - memset( pNtk, 0, sizeof(Cba_Ntk_t) ); - pNtk->pDesign = p; - pNtk->Id = Vec_PtrSize(&p->vNtks); - Vec_PtrPush( &p->vNtks, pNtk ); - assert( iModelId <= pNtk->Id ); - if ( iModelId < pNtk->Id ) - printf( "Model with name %s already exists.\n", pName ); - return pNtk; + Vec_IntErase( &p->vInputs ); + Vec_IntErase( &p->vOutputs ); + Vec_StrErase( &p->vType ); + Vec_IntErase( &p->vIndex ); + Vec_IntErase( &p->vFanin ); + Vec_IntErase( &p->vName ); + Vec_IntErase( &p->vRange ); + Vec_IntErase( &p->vCopy ); + Vec_IntErase( &p->vArray ); } -static inline void Cba_NtkResize( Cba_Ntk_t * p, int nObjs ) +static inline int Cba_NtkMemory( Cba_Ntk_t * p ) { - assert( Vec_IntSize(&p->vTypes) == 0 ); - Cba_ManFetchArray( p->pDesign, &p->vTypes, nObjs ); - Cba_ManFetchArray( p->pDesign, &p->vFuncs, nObjs ); - Cba_ManFetchArray( p->pDesign, &p->vFanins, nObjs ); - Cba_ManFetchArray( p->pDesign, &p->vNameIds, nObjs ); + int nMem = sizeof(Cba_Ntk_t); + nMem += Vec_IntMemory(&p->vInputs); + nMem += Vec_IntMemory(&p->vOutputs); + nMem += Vec_StrMemory(&p->vType); + nMem += Vec_IntMemory(&p->vIndex); + nMem += Vec_IntMemory(&p->vFanin); + nMem += Vec_IntMemory(&p->vName); + nMem += Vec_IntMemory(&p->vRange); + nMem += Vec_IntMemory(&p->vCopy); + return nMem; } -static inline Cba_Man_t * Cba_ManAlloc( Cba_Man_t * pOld, char * pFileName ) +static inline void Cba_NtkPrintStats( Cba_Ntk_t * p ) { - Cba_Man_t * p = ABC_CALLOC( Cba_Man_t, 1 ); - p->pName = pOld ? Abc_UtilStrsav( Cba_ManName(pOld) ) : Extra_FileDesignName( pFileName ); - p->pSpec = pOld ? Abc_UtilStrsav( Cba_ManSpec(pOld) ) : Abc_UtilStrsav( pFileName ); - p->pNames = pOld ? Abc_NamRef( pOld->pNames ) : Abc_NamStart( 1000, 24 ); - p->pModels = pOld ? Abc_NamRef( pOld->pModels ) : Abc_NamStart( 1000, 24 ); - p->pFuncs = pOld ? Abc_NamRef( pOld->pFuncs ) : Abc_NamStart( 1000, 24 ); - p->iRoot = 1; - Vec_SetAlloc_( &p->Mem, 18 ); - Vec_PtrPush( &p->vNtks, NULL ); - return 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) ) + printf( "-> %s", Cba_NtkName(Cba_NtkHostNtk(p)) ); + printf( "\n" ); } -static inline Cba_Man_t * Cba_ManClone( Cba_Man_t * pOld ) + + +/**Function************************************************************* + + Synopsis [Manager APIs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline Cba_Man_t * Cba_ManAlloc( char * pFileName, int nNtks ) { - Cba_Ntk_t * pNtk, * pNtkNew; int i; - Cba_Man_t * p = Cba_ManAlloc( pOld, NULL ); - Cba_ManForEachNtk( pOld, pNtk, i ) - { - pNtkNew = Cba_NtkAlloc( p, Cba_NtkName(pNtk) ); - Cba_ManFetchArray( p, &pNtkNew->vInputs, Cba_NtkPiNum(pNtk) ); - Cba_ManFetchArray( p, &pNtkNew->vOutputs, Cba_NtkPoNum(pNtk) ); - } - assert( Cba_ManNtkNum(p) == Cba_ManNtkNum(pOld) ); - return p; + 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 = 0; + pNew->nNtks = nNtks; + pNew->pNtks = ABC_CALLOC( Cba_Ntk_t, pNew->nNtks ); + Cba_ManForEachNtk( pNew, pNtk, i ) + pNtk->pDesign = pNew; + 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 = 0; + pNew->nNtks = nNtks; + pNew->pNtks = ABC_CALLOC( Cba_Ntk_t, nNtks ); + Cba_ManForEachNtk( pNew, pNtk, i ) + pNtk->pDesign = pNew; + return pNew; +} +static inline Cba_Man_t * Cba_ManDup( Cba_Man_t * p ) +{ + Cba_Ntk_t * pNtk; 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_NtkDup( Cba_ManNtk(pNew, i), pNtk ); + return pNew; +} +static inline Cba_Man_t * Cba_ManDupUserBoxes( Cba_Man_t * p ) +{ + Cba_Ntk_t * pNtk; 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_ManNtk(pNew, i), pNtk ); + return pNew; +} + static inline void Cba_ManFree( Cba_Man_t * p ) { + Cba_Ntk_t * pNtk; int i; + Cba_ManForEachNtk( p, pNtk, i ) + Cba_NtkFree( pNtk ); Vec_IntFreeP( &p->vBuf2LeafNtk ); Vec_IntFreeP( &p->vBuf2LeafObj ); Vec_IntFreeP( &p->vBuf2RootNtk ); Vec_IntFreeP( &p->vBuf2RootObj ); - ABC_FREE( p->vCopies.pArray ); - ABC_FREE( p->vNtks.pArray ); - Vec_SetFree_( &p->Mem ); - Abc_NamDeref( p->pNames ); - Abc_NamDeref( p->pModels ); - Abc_NamDeref( p->pFuncs ); + Abc_NamDeref( p->pStrs ); + Abc_NamDeref( p->pMods ); ABC_FREE( p->pName ); ABC_FREE( p->pSpec ); + ABC_FREE( p->pNtks ); ABC_FREE( p ); } static inline int Cba_ManMemory( Cba_Man_t * p ) { + Cba_Ntk_t * pNtk; int i; int nMem = sizeof(Cba_Man_t); - nMem += Abc_NamMemUsed(p->pNames); - nMem += Abc_NamMemUsed(p->pModels); - nMem += Abc_NamMemUsed(p->pFuncs); - nMem += Vec_SetMemoryAll(&p->Mem); - nMem += (int)Vec_PtrMemory(&p->vNtks); + if ( p->pName ) + nMem += (int)strlen(p->pName); + if ( p->pSpec ) + nMem += (int)strlen(p->pSpec); + nMem += Abc_NamMemUsed(p->pStrs); + nMem += Abc_NamMemUsed(p->pMods); + Cba_ManForEachNtk( p, pNtk, i ) + nMem += Cba_NtkMemory( pNtk ); return nMem; } - -static inline void Cba_NtkPrintStats( Cba_Ntk_t * p ) +static inline int Cba_ManObjNum( Cba_Man_t * p ) { - printf( "%-32s ", Cba_NtkName(p) ); - printf( "pi =%5d ", Cba_NtkPiNum(p) ); - printf( "pi =%5d ", Cba_NtkPoNum(p) ); - printf( "box =%6d ", Cba_NtkBoxNum(p) ); - printf( "node =%6d ", Cba_NtkNodeNum(p) ); - printf( "obj =%6d ", Cba_NtkObjNum(p) ); - printf( "\n" ); + Cba_Ntk_t * pNtk; int i, Count = 0; + Cba_ManForEachNtk( p, pNtk, i ) + Count += Cba_NtkObjNum(pNtk); + return Count; +} +static inline int Cba_ManNodeNum( 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 ) +{ + 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); +} +static inline int Cba_ManBoxNum( Cba_Man_t * p ) +{ + Cba_Ntk_t * pNtk; int i; + Cba_ManForEachNtk( p, pNtk, i ) + pNtk->Count = -1; + return Cba_ManBoxNum_rec( Cba_ManRoot(p) ); } static inline void Cba_ManPrintStats( Cba_Man_t * p, int fVerbose ) { Cba_Ntk_t * pNtk; int i; + Cba_Ntk_t * pRoot = Cba_ManRoot( p ); + printf( "%-12s : ", Cba_ManName(p) ); + printf( "pi =%5d ", Cba_NtkPiNum(pRoot) ); + printf( "pi =%5d ", Cba_NtkPoNum(pRoot) ); + printf( "mod =%6d ", Cba_ManNtkNum(p) ); + printf( "box =%7d ", Cba_ManNodeNum(p) ); + printf( "obj =%7d ", Cba_ManObjNum(p) ); + printf( "mem =%6.3f MB", 1.0*Cba_ManMemory(p)/(1<<20) ); + printf( "\n" ); + Cba_ManBoxNum( p ); Cba_ManForEachNtk( p, pNtk, i ) { - printf( "Module %4d : ", i ); + printf( "Module %5d : ", i ); Cba_NtkPrintStats( pNtk ); } } - -static inline Cba_NodeType_t Ptr_SopToType( char * pSop ) + + + +/**Function************************************************************* + + Synopsis [Other APIs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline Cba_ObjType_t Ptr_SopToType( 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; + assert( 0 ); + return CBA_OBJ_NONE; +} +static inline char * Ptr_SopToTypeName( char * pSop ) { - if ( !strcmp(pSop, " 1\n") ) return CBA_NODE_C0; - if ( !strcmp(pSop, " 0\n") ) return CBA_NODE_C1; - if ( !strcmp(pSop, "1 1\n") ) return CBA_NODE_BUF; - if ( !strcmp(pSop, "0 1\n") ) return CBA_NODE_INV; - if ( !strcmp(pSop, "11 1\n") ) return CBA_NODE_AND; - if ( !strcmp(pSop, "00 1\n") ) return CBA_NODE_NOR; - if ( !strcmp(pSop, "00 0\n") ) return CBA_NODE_OR; - if ( !strcmp(pSop, "-1 1\n1- 1\n") ) return CBA_NODE_OR; - if ( !strcmp(pSop, "1- 1\n-1 1\n") ) return CBA_NODE_OR; - if ( !strcmp(pSop, "01 1\n10 1\n") ) return CBA_NODE_XOR; - if ( !strcmp(pSop, "10 1\n01 1\n") ) return CBA_NODE_XOR; - if ( !strcmp(pSop, "11 1\n00 1\n") ) return CBA_NODE_XNOR; - if ( !strcmp(pSop, "00 1\n11 1\n") ) return CBA_NODE_XNOR; - if ( !strcmp(pSop, "10 1\n") ) return CBA_NODE_SHARP; + 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"; assert( 0 ); - return CBA_NODE_NONE; + return NULL; } -static inline char * Ptr_TypeToName( Cba_NodeType_t Type ) +static inline char * Ptr_TypeToName( Cba_ObjType_t Type ) { - if ( Type == CBA_NODE_C0 ) return "const0"; - if ( Type == CBA_NODE_C1 ) return "const1"; - if ( Type == CBA_NODE_BUF ) return "buf"; - if ( Type == CBA_NODE_INV ) return "not"; - if ( Type == CBA_NODE_AND ) return "and"; - if ( Type == CBA_NODE_NAND ) return "nand"; - if ( Type == CBA_NODE_OR ) return "or"; - if ( Type == CBA_NODE_NOR ) return "nor"; - if ( Type == CBA_NODE_XOR ) return "xor"; - if ( Type == CBA_NODE_XNOR ) return "xnor"; - if ( Type == CBA_NODE_MUX ) return "mux"; - if ( Type == CBA_NODE_MAJ ) return "maj"; - if ( Type == CBA_NODE_SHARP ) return "sharp"; + if ( Type == CBA_BOX_C0 ) return "const0"; + if ( Type == CBA_BOX_C1 ) return "const1"; + 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"; assert( 0 ); return "???"; } -static inline char * Ptr_TypeToSop( Cba_NodeType_t Type ) +static inline char * Ptr_TypeToSop( Cba_ObjType_t Type ) { - if ( Type == CBA_NODE_C0 ) return " 0\n"; - if ( Type == CBA_NODE_C1 ) return " 1\n"; - if ( Type == CBA_NODE_BUF ) return "1 1\n"; - if ( Type == CBA_NODE_INV ) return "0 1\n"; - if ( Type == CBA_NODE_AND ) return "11 1\n"; - if ( Type == CBA_NODE_NAND ) return "11 0\n"; - if ( Type == CBA_NODE_OR ) return "00 0\n"; - if ( Type == CBA_NODE_NOR ) return "00 1\n"; - if ( Type == CBA_NODE_XOR ) return "01 1\n10 1\n"; - if ( Type == CBA_NODE_XNOR ) return "00 1\n11 1\n"; - if ( Type == CBA_NODE_SHARP ) return "10 1\n"; - if ( Type == CBA_NODE_MUX ) return "11- 1\n0-1 1\n"; - if ( Type == CBA_NODE_MAJ ) return "11- 1\n1-1 1\n-11 1\n"; + if ( Type == CBA_BOX_C0 ) return " 0\n"; + if ( Type == CBA_BOX_C1 ) return " 1\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_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_FrameImportDes( Vec_Ptr_t * vDes ); +extern Vec_Ptr_t * Abc_FrameExportDes(); -/*=== cbaBlast.c =========================================================*/ +/*=== cbaBlast.c =============================================================*/ 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 ); -/*=== cbaBuild.c =========================================================*/ -extern Cba_Man_t * Cba_ManBuild( Cba_Man_t * p ); -/*=== cbaReadBlif.c =========================================================*/ -extern Cba_Man_t * Cba_PrsReadBlif( char * pFileName ); -/*=== cbaReadVer.c ==========================================================*/ -extern Cba_Man_t * Cba_PrsReadVerilog( char * pFileName, int fBinary ); -/*=== cbaWriteBlif.c ========================================================*/ -extern void Cba_PrsWriteBlif( char * pFileName, Cba_Man_t * p ); +/*=== cbaNtk.c ===============================================================*/ +extern void Cba_ManAssignInternNames( Cba_Man_t * p ); +extern Cba_Man_t * Cba_ManCollapse( Cba_Man_t * p ); +/*=== 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 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 ); +/*=== 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 ); -/*=== cbaWriteVer.c =========================================================*/ -extern void Cba_PrsWriteVerilog( 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 ); -/*=== cbaNtk.c =========================================================*/ -extern void Cba_ManAssignInternNames( Cba_Man_t * p ); -extern int Cba_NtkNodeNum( Cba_Ntk_t * p ); -extern int Cba_ManObjNum( Cba_Man_t * p ); -extern Cba_Man_t * Cba_ManDupStart( Cba_Man_t * p, Vec_Int_t * vNtkSizes ); -extern Cba_Man_t * Cba_ManDup( Cba_Man_t * p ); -/*=== cbaSimple.c =========================================================*/ -extern Cba_Man_t * Cba_PrsReadPtr( Vec_Ptr_t * vDes ); -extern void Ptr_ManFreeDes( Vec_Ptr_t * vDes ); ABC_NAMESPACE_HEADER_END |