diff options
Diffstat (limited to 'src/base/cba/cbaOper.c')
-rw-r--r-- | src/base/cba/cbaOper.c | 365 |
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 + |