summaryrefslogtreecommitdiffstats
path: root/src/base/cba/cba.h
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2015-01-15 18:21:02 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2015-01-15 18:21:02 -0800
commite27edf5e1ee777d9a4256d94dce849155d85fdd3 (patch)
treeec95c73fa4e6cf10c2c4e6a5d37a821e0d0b7d33 /src/base/cba/cba.h
parent8ac8923a91a108718bd8af8b83a9671fc2d33900 (diff)
downloadabc-e27edf5e1ee777d9a4256d94dce849155d85fdd3.tar.gz
abc-e27edf5e1ee777d9a4256d94dce849155d85fdd3.tar.bz2
abc-e27edf5e1ee777d9a4256d94dce849155d85fdd3.zip
Various transformations of Cba_Ntk_t.
Diffstat (limited to 'src/base/cba/cba.h')
-rw-r--r--src/base/cba/cba.h115
1 files changed, 95 insertions, 20 deletions
diff --git a/src/base/cba/cba.h b/src/base/cba/cba.h
index 56db6f29..15e94461 100644
--- a/src/base/cba/cba.h
+++ b/src/base/cba/cba.h
@@ -61,19 +61,22 @@ typedef enum {
// Verilog predefined models
typedef enum {
CBA_NODE_NONE = 0, // 0: unused
- CBA_NODE_CONST, // 1: constant
- CBA_NODE_BUF, // 2: buffer
- CBA_NODE_INV, // 3: inverter
- CBA_NODE_AND, // 4: AND
- CBA_NODE_NAND, // 5: NAND
- CBA_NODE_OR, // 6: OR
- CBA_NODE_NOR, // 7: NOR
- CBA_NODE_XOR, // 8: XOR
- CBA_NODE_XNOR, // 9 .XNOR
- CBA_NODE_MUX, // 10: MUX
- CBA_NODE_MAJ, // 11: MAJ
- CBA_NODE_KNOWN, // 12: unknown
- CBA_NODE_UNKNOWN // 13: unknown
+ CBA_NODE_C0, // 1: logic node
+ CBA_NODE_C1, // 2: logic node
+ 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_MUX, // 11: MUX
+ CBA_NODE_MAJ, // 12: MAJ
+ CBA_NODE_AND00, // 13: AND00
+ CBA_NODE_AND01, // 14: AND01
+ CBA_NODE_AND10, // 15: AND10
+ CBA_NODE_UNKNOWN // 16: unknown
} Cba_NodeType_t;
@@ -150,7 +153,8 @@ static inline char * Cba_NtkFuncStr( Cba_Ntk_t * p, int i ) { r
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_NtkHost( Cba_Ntk_t * p ) { return Cba_ManNtk(p->pDesign, p->iBoxNtk); }
+static inline Cba_Ntk_t * Cba_NtkHostNtk( Cba_Ntk_t * p ) { return Cba_ManNtk(p->pDesign, p->iBoxNtk); }
+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 ); }
@@ -175,15 +179,17 @@ static inline int Cba_ObjIsCo( Cba_Ntk_t * p, int i ) { r
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_ObjFuncId(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_ObjFaninId(p, i); }
+static inline Cba_NodeType_t Cba_ObjNodeType( Cba_Ntk_t * p, int i ) { assert(Cba_ObjIsNode(p, i)); return 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; }
@@ -253,7 +259,7 @@ static inline int Cba_ManHandleBuffer( Cba_Man_t * p, int iFanin )
{
int h = Vec_SetFetchH( Cba_ManMem(p), sizeof(int) * 2 );
int * pArray = (int *)Vec_SetEntry( Cba_ManMem(p), h );
- pArray[0] = 1;
+ pArray[0] = (iFanin >= 0) ? 1 : 0;
pArray[1] = iFanin;
return h;
}
@@ -289,6 +295,14 @@ static inline Cba_Ntk_t * Cba_NtkAlloc( Cba_Man_t * p, char * pName )
printf( "Model with name %s already exists.\n", pName );
return pNtk;
}
+static inline void Cba_NtkResize( Cba_Ntk_t * p, int nObjs )
+{
+ 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 );
+}
static inline Cba_Man_t * Cba_ManAlloc( char * pFileName )
{
Cba_Man_t * p = ABC_CALLOC( Cba_Man_t, 1 );
@@ -304,15 +318,25 @@ static inline Cba_Man_t * Cba_ManAlloc( char * pFileName )
}
static inline Cba_Man_t * Cba_ManClone( Cba_Man_t * pOld )
{
+ Cba_Ntk_t * pNtk, * pNtkNew; int i;
Cba_Man_t * p = ABC_CALLOC( Cba_Man_t, 1 );
p->pName = Extra_FileDesignName( pOld->pName );
p->pSpec = Abc_UtilStrsav( pOld->pSpec );
p->pNames = Abc_NamRef( pOld->pNames );
p->pModels = Abc_NamRef( pOld->pModels );
p->pFuncs = Abc_NamRef( pOld->pFuncs );
+ p->iRoot = 1;
Vec_SetAlloc_( &p->Mem, 20 );
Vec_PtrPush( &p->vNtks, NULL );
- p->iRoot = 1;
+ 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) );
+ Cba_ManFetchArray( p, &pNtkNew->vBoxes, Cba_NtkBoxNum(pNtk) );
+ Vec_IntShrink( &pNtkNew->vBoxes, 0 );
+ }
+ assert( Cba_ManNtkNum(p) == Cba_ManNtkNum(pOld) );
return p;
}
@@ -343,6 +367,58 @@ static inline int Cba_ManMemory( Cba_Man_t * p )
return nMem;
}
+static inline Cba_NodeType_t Ptr_SopToType( 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_AND00;
+ if ( !strcmp(pSop, "01 1\n") ) return CBA_NODE_AND01;
+ if ( !strcmp(pSop, "10 1\n") ) return CBA_NODE_AND10;
+ 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;
+ assert( 0 );
+ return CBA_NODE_NONE;
+}
+static inline char * Ptr_TypeToName( Cba_NodeType_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_AND00 ) return "and00";
+ if ( Type == CBA_NODE_AND01 ) return "and01";
+ if ( Type == CBA_NODE_AND10 ) return "and10";
+ if ( Type == CBA_NODE_OR ) return "or";
+ if ( Type == CBA_NODE_XOR ) return "xor";
+ if ( Type == CBA_NODE_XNOR ) return "xnor";
+ assert( 0 );
+ return "???";
+}
+static inline char * Ptr_TypeToSop( Cba_NodeType_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_AND00 ) return "00 1\n";
+ if ( Type == CBA_NODE_AND01 ) return "01 1\n";
+ if ( Type == CBA_NODE_AND10 ) return "10 1\n";
+ if ( Type == CBA_NODE_OR ) return "00 0\n";
+ if ( Type == CBA_NODE_XOR ) return "01 1\n10 1\n";
+ if ( Type == CBA_NODE_XNOR ) return "00 1\n11 1\n";
+ assert( 0 );
+ return "???";
+}
/*=== cbaBuild.c =========================================================*/
extern Cba_Man_t * Cba_ManBuild( Cba_Man_t * p );
@@ -359,8 +435,7 @@ extern void Cba_PrsWriteVerilog( char * pFileName, Cba_Man_t * p );
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 void Cba_ManSetNtkBoxes( Cba_Man_t * p );
-extern Cba_Man_t * Cba_ManDupStart( Cba_Man_t * p, Vec_Int_t * vObjCounts );
+extern Cba_Man_t * Cba_ManDupStart( Cba_Man_t * p, Vec_Int_t * vNtkSizes );
extern Cba_Man_t * Cba_ManDup( Cba_Man_t * p );