summaryrefslogtreecommitdiffstats
path: root/src/base/cba/cbaOper.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/cba/cbaOper.c')
-rw-r--r--src/base/cba/cbaOper.c365
1 files changed, 365 insertions, 0 deletions
diff --git a/src/base/cba/cbaOper.c b/src/base/cba/cbaOper.c
new file mode 100644
index 00000000..bc160fd3
--- /dev/null
+++ b/src/base/cba/cbaOper.c
@@ -0,0 +1,365 @@
+/**CFile****************************************************************
+
+ FileName [cbaOper.c]
+
+ SystemName [ABC: Logic synthesis and verification system.]
+
+ PackageName [Hierarchical word-level netlist.]
+
+ Synopsis [Operator procedures.]
+
+ Author [Alan Mishchenko]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - November 29, 2014.]
+
+ Revision [$Id: cbaOper.c,v 1.00 2014/11/29 00:00:00 alanmi Exp $]
+
+***********************************************************************/
+
+#include "cba.h"
+
+ABC_NAMESPACE_IMPL_START
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFINITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Cba_BoxCreate( Cba_Ntk_t * p, Cba_ObjType_t Type, Vec_Int_t * vFanins, int nInA, int nInB, int nOuts )
+{
+ char pName[100]; int i, iObj, iFanin;
+ assert( CBA_OBJ_BOX < Type && Type < CBA_BOX_UNKNOWN );
+ if ( CBA_BOX_CF <= Type && Type <= CBA_BOX_CZ )
+ {
+ sprintf( pName, "ABCCTo%d", nOuts );
+ assert( 0 == Vec_IntSize(vFanins) );
+ iObj = Cba_BoxAlloc( p, Type, 0, nOuts, Abc_NamStrFindOrAdd(p->pDesign->pMods, pName, NULL) );
+ }
+ else if ( CBA_BOX_BUF <= Type && Type <= CBA_BOX_INV )
+ {
+ char * pPref[2] = { "ABCBUF", "ABCINV" };
+ assert( nInA == nOuts );
+ assert( nInA == Vec_IntSize(vFanins) );
+ sprintf( pName, "%sa%do%d", pPref[Type - CBA_BOX_BUF], nInA, nOuts );
+ iObj = Cba_BoxAlloc( p, Type, Vec_IntSize(vFanins), nOuts, Abc_NamStrFindOrAdd(p->pDesign->pMods, pName, NULL) );
+ }
+ else if ( CBA_BOX_AND <= Type && Type <= CBA_BOX_XNOR )
+ {
+ char * pPref[6] = { "ABCAND", "ABCNAND", "ABCOR", "ABCNOR", "ABCXOR", "ABCXNOR" };
+ assert( nInA == nOuts && nInB == nOuts );
+ assert( nInA + nInB == Vec_IntSize(vFanins) );
+ sprintf( pName, "%sa%db%do%d", pPref[Type - CBA_BOX_AND], nInA, nInB, nOuts );
+ iObj = Cba_BoxAlloc( p, Type, Vec_IntSize(vFanins), nOuts, Abc_NamStrFindOrAdd(p->pDesign->pMods, pName, NULL) );
+ }
+ else if ( Type == CBA_BOX_MUX )
+ {
+ char * pPref[1] = { "ABCMUX" };
+ assert( nInA == nOuts && nInB == nOuts );
+ assert( 1 + nInA + nInB == Vec_IntSize(vFanins) );
+ sprintf( pName, "%sc%da%db%do%d", pPref[Type - CBA_BOX_MUX], 1, nInA, nInB, nOuts );
+ iObj = Cba_BoxAlloc( p, Type, Vec_IntSize(vFanins), nOuts, Abc_NamStrFindOrAdd(p->pDesign->pMods, pName, NULL) );
+ }
+ else if ( Type == CBA_BOX_MAJ )
+ {
+ char * pPref[1] = { "ABCMAJ" };
+ assert( nInA == 1 && nInB == 1 && nOuts == 1 );
+ assert( 3 == Vec_IntSize(vFanins) );
+ sprintf( pName, "%sa%db%dc%do%d", pPref[Type - CBA_BOX_MAJ], 1, 1, 1, 1 );
+ iObj = Cba_BoxAlloc( p, Type, Vec_IntSize(vFanins), nOuts, Abc_NamStrFindOrAdd(p->pDesign->pMods, pName, NULL) );
+ }
+ else if ( CBA_BOX_RAND <= Type && Type <= CBA_BOX_RXNOR )
+ {
+ char * pPref[6] = { "ABCRAND", "ABCRNAND", "ABCROR", "ABCRNOR", "ABCRXOR", "ABCRXNOR" };
+ assert( nInA == nInB && 1 == nOuts );
+ assert( nInA + nInB == Vec_IntSize(vFanins) );
+ sprintf( pName, "%sa%db%do%d", pPref[Type - CBA_BOX_RAND], nInA, nInB, nOuts );
+ iObj = Cba_BoxAlloc( p, Type, Vec_IntSize(vFanins), nOuts, Abc_NamStrFindOrAdd(p->pDesign->pMods, pName, NULL) );
+ }
+ else if ( Type == CBA_BOX_SEL )
+ {
+ char * pPref[1] = { "ABCSEL" };
+ assert( nInA * nOuts == nInB );
+ assert( nInA + nInB == Vec_IntSize(vFanins) );
+ sprintf( pName, "%sa%db%do%d", pPref[Type - CBA_BOX_SEL], nInA, nInB, nOuts );
+ iObj = Cba_BoxAlloc( p, Type, Vec_IntSize(vFanins), nOuts, Abc_NamStrFindOrAdd(p->pDesign->pMods, pName, NULL) );
+ }
+ else if ( Type == CBA_BOX_PSEL )
+ {
+ char * pPref[1] = { "ABCPSEL" };
+ assert( nInA * nOuts == nInB );
+ assert( 1 + nInA + nInB == Vec_IntSize(vFanins) );
+ sprintf( pName, "%si%da%db%do%d", pPref[Type - CBA_BOX_SEL], 1, nInA, nInB, nOuts );
+ iObj = Cba_BoxAlloc( p, Type, Vec_IntSize(vFanins), nOuts, Abc_NamStrFindOrAdd(p->pDesign->pMods, pName, NULL) );
+ }
+ // add fanins
+ Vec_IntForEachEntry( vFanins, iFanin, i )
+ Cba_ObjSetFanin( p, Cba_BoxBi(p, iObj, i), iFanin );
+ return iObj;
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Cba_ObjClpWide( Cba_Ntk_t * p, int iBox )
+{
+ Cba_ObjType_t Type = Cba_ObjType( p, iBox );
+ int nBis = Cba_BoxBiNum(p, iBox);
+ int nBos = Cba_BoxBoNum(p, iBox);
+ int i, k, iObj;
+ assert( nBos > 1 );
+ Vec_IntClear( &p->vArray );
+ if ( CBA_BOX_BUF <= Type && Type <= CBA_BOX_INV )
+ {
+ for ( i = 0; i < nBos; i++ )
+ {
+ Vec_IntFill( &p->vArray2, 1, Cba_BoxFanin(p, iBox, i) );
+ iObj = Cba_BoxCreate( p, Type, &p->vArray2, 1, -1, 1 );
+ Vec_IntPush( &p->vArray, Cba_BoxBo(p, iObj, 0) );
+ }
+ }
+ else if ( CBA_BOX_AND <= Type && Type <= CBA_BOX_XNOR )
+ {
+ assert( nBis == 2 * nBos );
+ for ( i = 0; i < nBos; i++ )
+ {
+ Vec_IntFillTwo( &p->vArray2, 2, Cba_BoxFanin(p, iBox, i), Cba_BoxFanin(p, iBox, nBos+i) );
+ iObj = Cba_BoxCreate( p, Type, &p->vArray2, 1, 1, 1 );
+ Vec_IntPush( &p->vArray, Cba_BoxBo(p, iObj, 0) );
+ }
+ }
+ else if ( Type == CBA_BOX_MUX )
+ {
+ assert( nBis - 1 == 2 * nBos );
+ for ( i = 0; i < nBos; i++ )
+ {
+ Vec_IntFill( &p->vArray2, 1, Cba_BoxFanin(p, iBox, 0) );
+ Vec_IntPushTwo( &p->vArray2, Cba_BoxFanin(p, iBox, 1+i), Cba_BoxFanin(p, iBox, 1+nBos+i) );
+ iObj = Cba_BoxCreate( p, Type, &p->vArray2, 1, 1, 1 );
+ Vec_IntPush( &p->vArray, Cba_BoxBo(p, iObj, 0) );
+ }
+ }
+ else if ( Type == CBA_BOX_NMUX )
+ {
+ int n, nIns = nBis / nBos;
+ assert( nBis % nBos == 0 );
+ for ( n = 1; n < 32; n++ )
+ if ( n + (1 << n) == nIns )
+ break;
+ assert( n > 1 && n < 32 );
+ for ( i = 0; i < nBos; i++ )
+ {
+ Vec_IntClear( &p->vArray2 );
+ for ( k = 0; k < n; k++ )
+ Vec_IntPush( &p->vArray2, Cba_BoxFanin(p, iBox, k) );
+ for ( k = 0; k < (1 << n); k++ )
+ Vec_IntPush( &p->vArray2, Cba_BoxFanin(p, iBox, n + (1 << n) * i + k) );
+ iObj = Cba_BoxCreate( p, Type, &p->vArray2, n, (1 << n), 1 );
+ Vec_IntPush( &p->vArray, Cba_BoxBo(p, iObj, 0) );
+ }
+ }
+ else if ( Type == CBA_BOX_SEL )
+ {
+ }
+ else if ( Type == CBA_BOX_PSEL )
+ {
+ }
+ else if ( Type == CBA_BOX_DFF || Type == CBA_BOX_LATCH )
+ {
+ }
+ else if ( Type == CBA_BOX_DFFRS || Type == CBA_BOX_LATCHRS )
+ {
+ }
+ else assert( 0 );
+ Cba_BoxReplace( p, iBox, Vec_IntArray(&p->vArray), Vec_IntSize(&p->vArray) );
+ return iBox;
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Cba_ObjClpArith( Cba_Ntk_t * p, int iBox )
+{
+ Cba_ObjType_t Type = Cba_ObjType( p, iBox );
+ int i, iObj = -1;
+ int nBis = Cba_NtkReadRangesPrim( Cba_BoxNtkName(p, iObj), &p->vArray, 0 );
+ assert( nBis == Cba_BoxBiNum(p, iBox) );
+ if ( Type == CBA_BOX_ADD )
+ {
+ int Carry = Cba_BoxFanin(p, iBox, 0);
+ int nBits = Vec_IntEntry(&p->vArray, 1);
+ assert( Vec_IntSize(&p->vArray) == 3 );
+ assert( Vec_IntEntry(&p->vArray, 0) == 1 );
+ assert( Vec_IntEntry(&p->vArray, 2) == nBits );
+ Vec_IntClear( &p->vArray );
+ for ( i = 0; i < nBits; i++ )
+ {
+ Vec_IntFill( &p->vArray2, 1, Carry );
+ Vec_IntPushTwo( &p->vArray2, Cba_BoxFanin(p, iBox, 1+i), Cba_BoxFanin(p, iBox, 1+nBits+i) );
+ iObj = Cba_BoxCreate( p, CBA_BOX_ADD, &p->vArray2, 1, 1, 1 );
+ Carry = Cba_BoxBo(p, iObj, 1);
+ Vec_IntPush( &p->vArray, Cba_BoxBo(p, iObj, 0) );
+ }
+ Vec_IntPush( &p->vArray, Carry );
+ }
+ else if ( Type == CBA_BOX_SUB )
+ {
+ int iConst, nBits = Vec_IntEntry(&p->vArray, 0);
+ assert( Vec_IntSize(&p->vArray) == 2 );
+ assert( Vec_IntEntry(&p->vArray, 1) == nBits );
+ // create inverter
+ Vec_IntClear( &p->vArray2 );
+ for ( i = 0; i < nBits; i++ )
+ Vec_IntPush( &p->vArray2, Cba_BoxFanin(p, iBox, nBits+i) );
+ iObj = Cba_BoxCreate( p, CBA_BOX_INV, &p->vArray2, nBits, -1, nBits );
+ // create constant
+ Vec_IntClear( &p->vArray2 );
+ iConst = Cba_BoxCreate( p, CBA_BOX_CT, &p->vArray2, -1, -1, 1 );
+ // collect fanins
+ Vec_IntFill( &p->vArray2, 1, iConst+1 );
+ for ( i = 0; i < nBits; i++ )
+ Vec_IntPush( &p->vArray2, Cba_BoxFanin(p, iBox, i) );
+ for ( i = 0; i < nBits; i++ )
+ Vec_IntPush( &p->vArray2, Cba_BoxBo(p, iObj, i) );
+ // create adder
+ iObj = Cba_BoxCreate( p, CBA_BOX_ADD, &p->vArray2, nBits, nBits, nBits );
+ // collect fanins
+ Vec_IntClear( &p->vArray );
+ for ( i = 0; i < nBits; i++ )
+ Vec_IntPush( &p->vArray, Cba_BoxBo(p, iObj, i) );
+ }
+ else if ( Type == CBA_BOX_MUL )
+ {
+ }
+ else if ( Type == CBA_BOX_DIV )
+ {
+ }
+ else if ( Type == CBA_BOX_MOD )
+ {
+ }
+ else if ( Type == CBA_BOX_REM )
+ {
+ }
+ else if ( Type == CBA_BOX_POW )
+ {
+ }
+ else if ( Type == CBA_BOX_MIN )
+ {
+ }
+ else if ( Type == CBA_BOX_ABS )
+ {
+ }
+
+ else if ( Type == CBA_BOX_LTHAN )
+ {
+ }
+ else if ( Type == CBA_BOX_LETHAN )
+ {
+ }
+ else if ( Type == CBA_BOX_METHAN )
+ {
+ }
+ else if ( Type == CBA_BOX_MTHAN )
+ {
+ }
+ else if ( Type == CBA_BOX_EQU )
+ {
+ }
+ else if ( Type == CBA_BOX_NEQU )
+ {
+ }
+
+ else if ( Type == CBA_BOX_SHIL )
+ {
+ }
+ else if ( Type == CBA_BOX_SHIR )
+ {
+ }
+ else if ( Type == CBA_BOX_ROTL )
+ {
+ }
+ else if ( Type == CBA_BOX_ROTR )
+ {
+ }
+ Cba_BoxReplace( p, iBox, Vec_IntArray(&p->vArray), Vec_IntSize(&p->vArray) );
+ return 1;
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Cba_ObjClpMemory( Cba_Ntk_t * p, int iBox )
+{
+ int i, En, iNext, nItems = Cba_BoxBiNum(p, iBox);
+ assert( Cba_ObjType(p, iBox) == CBA_BOX_RAMBOX );
+ assert( Cba_BoxBiNum(p, iBox) == Cba_BoxBoNum(p, iBox) );
+ // for each fanin of RAMBOX, make sure address width is the same
+ Cba_BoxForEachFaninBox( p, iBox, iNext, i )
+ assert( Cba_ObjType(p, iNext) == CBA_BOX_RAMWC );
+
+ // create decoders, selectors and flops
+ for ( i = 0; i < nItems; i++ )
+ {
+ int BoxW = Cba_ObjFanin(p, Cba_BoxBi(p, iBox, i));
+ int BoxR = Cba_ObjFanout(p, Cba_BoxBo(p, iBox, 0));
+ assert( Cba_ObjType(p, BoxW) == CBA_BOX_RAMWC );
+ assert( Cba_ObjType(p, BoxR) == CBA_BOX_RAMR );
+ // create enable
+ Vec_IntFillTwo( &p->vArray2, 2, Cba_BoxFanin(p, BoxW, 1), Cba_BoxFanin(p, BoxR, 0) );
+ En = Cba_BoxCreate( p, CBA_BOX_AND, &p->vArray2, 1, 1, 1 );
+ En = Cba_BoxBo( p, En, 0 );
+ // collect address
+ }
+ // for each fanout of RAMBOX, makes ure address width is the same
+ Cba_BoxForEachFanoutBox( p, iBox, iNext, i )
+ assert( Cba_ObjType(p, iNext) == CBA_BOX_RAMR );
+ // create selectors and connect them
+ return 1;
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+
+ABC_NAMESPACE_IMPL_END
+