diff options
-rw-r--r-- | src/base/abc/abcHieNew.c | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/src/base/abc/abcHieNew.c b/src/base/abc/abcHieNew.c index be41c07a..ab54f225 100644 --- a/src/base/abc/abcHieNew.c +++ b/src/base/abc/abcHieNew.c @@ -200,6 +200,8 @@ static inline int Au_ObjIsTravIdCurrentId( Au_Ntk_t * p, int Id ) { re for ( i = 0; (i < Vec_IntSize(&p->vPos)) && (((pObj) = Au_NtkPo(p, i)), 1); i++ ) #define Au_NtkForEachObj( p, pObj, i ) \ for ( i = 0; (i < Vec_IntSize(&p->vObjs)) && (((pObj) = Au_NtkObjI(p, i)), 1); i++ ) +#define Au_NtkForEachBox( p, pObj, i ) \ + for ( i = 0; (i < Vec_IntSize(&p->vObjs)) && (((pObj) = Au_NtkObjI(p, i)), 1); i++ ) if ( !Au_ObjIsBox(pObj) ) {} else extern void Au_ManAddNtk( Au_Man_t * pMan, Au_Ntk_t * p ); @@ -549,6 +551,220 @@ int Au_NtkCreateBox( Au_Ntk_t * pNtk, Vec_Int_t * vFanins, int nFanouts, int iMo } + +/**Function************************************************************* + + Synopsis [Reads one entry.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline int Au_NtkRemapNum( Vec_Int_t * vNum2Obj, int Num ) +{ + return Au_Var2Lit(Vec_IntEntry(vNum2Obj, Au_Lit2Var(Num)), Au_LitIsCompl(Num)); +} +/**Function************************************************************* + + Synopsis [Reads one entry.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline void Au_NtkParseCBlifNum( Vec_Int_t * vFanins, char * pToken, Vec_Int_t * vNum2Obj ) +{ + char * pCur; + int Num1, Num2, i; + assert( pToken[0] >= '0' && pToken[0] <= '9' ); + Num1 = atoi( pToken ); + for ( pCur = pToken; *pCur; pCur++ ) + if ( *pCur == ':' ) + { + Num2 = atoi( pCur+1 ); + for ( i = 0; i < Num2; i++ ) + Vec_IntPush( vFanins, Au_NtkRemapNum(vNum2Obj, Num1 + 2 * i) ); + } + else if ( *pCur == '*' ) + { + Num2 = atoi( pCur+1 ); + for ( i = 0; i < Num2; i++ ) + Vec_IntPush( vFanins, Au_NtkRemapNum(vNum2Obj, Num1) ); + } + if ( *pCur == 0 ) + Vec_IntPush( vFanins, Au_NtkRemapNum(vNum2Obj, Num1) ); +} + +/**Function************************************************************* + + Synopsis [Parses CBLIF file.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Au_Ntk_t * Au_NtkParseCBlif( char * pFileName ) +{ + extern char * Extra_FileRead( FILE * pFile ); + FILE * pFile; + Au_Man_t * pMan; + Au_Ntk_t * pRoot; + Au_Obj_t * pBox; + char * pBuffer, * pCur; + Vec_Int_t * vLines, * vNum2Obj, * vFanins; + int i, k, Id, nInputs, nOutputs; + int Line, Num, Func; + // read the file + pFile = fopen( pFileName, "rb" ); + if ( pFile == NULL ) + { + printf( "Cannot open file \"%s\".\n", pFileName ); + return NULL; + } + pBuffer = Extra_FileRead( pFile ); + fclose( pFile ); + // split into lines + vLines = Vec_IntAlloc( 1000 ); + Vec_IntPush( vLines, 0 ); + for ( pCur = pBuffer; *pCur; pCur++ ) + if ( *pCur == '\n' ) + { + *pCur = 0; + Vec_IntPush( vLines, pCur - pBuffer + 1 ); + } + // start the manager + pMan = Au_ManAlloc( pFileName ); + // parse the lines + vNum2Obj = Vec_IntAlloc( 1000 ); + vFanins = Vec_IntAlloc( 1000 ); + Vec_IntForEachEntry( vLines, Line, i ) + { + pCur = strtok( pBuffer + Line, " \t\r" ); + if ( pCur == NULL ) + continue; + if ( *pCur == '#' ) + continue; + if ( *pCur != '.' ) + { + printf( "Cannot read directive in line %d: \"%s\".\n", i, pBuffer + Line ); + continue; + } + if ( !strcmp(pCur, ".and") ) + { + Vec_IntClear( vFanins ); + for ( k = 0; k < 2; k++ ) + { + pCur = strtok( NULL, " \t\r" ); + Num = atoi( pCur ); + Vec_IntPush( vFanins, Au_NtkRemapNum(vNum2Obj, Num) ); + } + Id = Au_NtkCreateNode( pRoot, vFanins, 1 ); + Vec_IntPush( vNum2Obj, Id ); + } + else if ( !strcmp(pCur, ".xor") ) + { + Vec_IntClear( vFanins ); + for ( k = 0; k < 2; k++ ) + { + pCur = strtok( NULL, " \t\r" ); + Num = atoi( pCur ); + Vec_IntPush( vFanins, Au_NtkRemapNum(vNum2Obj, Num) ); + } + Id = Au_NtkCreateNode( pRoot, vFanins, 2 ); + Vec_IntPush( vNum2Obj, Id ); + } + else if ( !strcmp(pCur, ".mux") ) + { + Vec_IntClear( vFanins ); + for ( k = 0; k < 3; k++ ) + { + pCur = strtok( NULL, " \t\r" ); + Num = atoi( pCur ); + Vec_IntPush( vFanins, Au_NtkRemapNum(vNum2Obj, Num) ); + } + Id = Au_NtkCreateNode( pRoot, vFanins, 3 ); + Vec_IntPush( vNum2Obj, Id ); + } + else if ( !strcmp(pCur, ".subckt") ) + { + pCur = strtok( NULL, " \t\r" ); + Func = pCur - pBuffer; + pCur = strtok( NULL, " \t\r" ); + nInputs = atoi( pCur ); + pCur = strtok( NULL, " \t\r" ); + nOutputs = atoi( pCur ); + Vec_IntClear( vFanins ); + while ( 1 ) + { + pCur = strtok( NULL, " \t\r" ); + if ( pCur == NULL ) + break; + Au_NtkParseCBlifNum( vFanins, pCur, vNum2Obj ); + } + assert( Vec_IntSize(vFanins) == nInputs ); + Id = Au_NtkCreateBox( pRoot, vFanins, nOutputs, Func ); + for ( k = 0; k < nOutputs; k++ ) + Vec_IntPush( vNum2Obj, Id + 1 + k ); + } + else if ( !strcmp(pCur, ".model") ) + { + pCur = strtok( NULL, " \t\r" ); + pRoot = Au_NtkAlloc( pMan, pCur ); + Id = Au_NtkCreateConst0( pRoot ); + Vec_IntClear( vNum2Obj ); + Vec_IntPush( vNum2Obj, Id ); + } + else if ( !strcmp(pCur, ".inputs") ) + { + pCur = strtok( NULL, " \t\r" ); + Num = atoi( pCur ); + for ( k = 0; k < Num; k++ ) + { + Id = Au_NtkCreatePi( pRoot ); + Vec_IntPush( vNum2Obj, Id ); + } + } + else if ( !strcmp(pCur, ".outputs") ) + { + Vec_IntClear( vFanins ); + while ( 1 ) + { + pCur = strtok( NULL, " \t\r" ); + if ( pCur == NULL ) + break; + Au_NtkParseCBlifNum( vFanins, pCur, vNum2Obj ); + } + Vec_IntForEachEntry( vFanins, Num, k ) + Vec_IntPush( vNum2Obj, Au_NtkCreatePo(pRoot, Num) ); + } + else if ( strcmp(pCur, ".end") ) + printf( "Unknown directive in line %d: \"%s\".\n", i, pBuffer + Line ); + } + Vec_IntFree( vFanins ); + Vec_IntFree( vNum2Obj ); + Vec_IntFree( vLines ); + ABC_FREE( pBuffer ); + // set pointers to models + Au_ManForEachNtk( pMan, pRoot, i ) + Au_NtkForEachBox( pRoot, pBox, k ) + { + pBox->Func = Au_ManFindNtk( pMan, pBuffer + pBox->Func ); + assert( pBox->Func > 0 ); + } + // return the root network + return (Au_Ntk_t *)Vec_PtrEntry( &pMan->vNtks, 0 ); +} + + #include "abc.h" #include "gia.h" |