diff options
Diffstat (limited to 'src/base/cba/cbaWriteVer.c')
-rw-r--r-- | src/base/cba/cbaWriteVer.c | 121 |
1 files changed, 57 insertions, 64 deletions
diff --git a/src/base/cba/cbaWriteVer.c b/src/base/cba/cbaWriteVer.c index cabc8111..c6f7b2ac 100644 --- a/src/base/cba/cbaWriteVer.c +++ b/src/base/cba/cbaWriteVer.c @@ -49,8 +49,7 @@ void Cba_ManCreatePrimMap( char ** pMap ) memset( pMap, 0, sizeof(char *) * CBA_BOX_LAST ); pMap[ CBA_BOX_SLICE ] = "sli"; - pMap[ CBA_BOX_CATIN ] = "icc"; - pMap[ CBA_BOX_CATOUT ] = "occ"; + pMap[ CBA_BOX_CONCAT ] = "icc"; pMap[ CBA_BOX_BUF ] = ""; pMap[ CBA_BOX_INV ] = "~"; @@ -63,7 +62,7 @@ void Cba_ManCreatePrimMap( char ** pMap ) pMap[ CBA_BOX_SHARP ] = "&"; pMap[ CBA_BOX_SHARPL ] = "&"; pMap[ CBA_BOX_MUX ] = "?"; - pMap[ CBA_BOX_MAJ ] = NULL; + pMap[ CBA_BOX_MAJ ] = "maj"; pMap[ CBA_BOX_RAND ] = "&"; pMap[ CBA_BOX_RNAND ] = "~&"; pMap[ CBA_BOX_ROR ] = "|"; @@ -72,18 +71,18 @@ void Cba_ManCreatePrimMap( char ** pMap ) pMap[ CBA_BOX_RXNOR ] = "~^"; pMap[ CBA_BOX_LNOT ] = "!"; pMap[ CBA_BOX_LAND ] = "&&"; - pMap[ CBA_BOX_LNAND ] = NULL; + pMap[ CBA_BOX_LNAND ] = "logic nand"; pMap[ CBA_BOX_LOR ] = "||"; - pMap[ CBA_BOX_LNOR ] = NULL; + pMap[ CBA_BOX_LNOR ] = "logic nor"; pMap[ CBA_BOX_LXOR ] = "^^"; - pMap[ CBA_BOX_LXNOR ] = NULL; + pMap[ CBA_BOX_LXNOR ] = "logic xnor"; pMap[ CBA_BOX_NMUX ] = "nmux"; pMap[ CBA_BOX_SEL ] = "sel"; - pMap[ CBA_BOX_PSEL ] = NULL; - pMap[ CBA_BOX_ENC ] = NULL; - pMap[ CBA_BOX_PENC ] = NULL; + pMap[ CBA_BOX_PSEL ] = "prio-select"; + pMap[ CBA_BOX_ENC ] = "enc"; + pMap[ CBA_BOX_PENC ] = "prio-enc"; pMap[ CBA_BOX_DEC ] = "dec"; - pMap[ CBA_BOX_EDEC ] = NULL; + pMap[ CBA_BOX_EDEC ] = "enable-dec"; pMap[ CBA_BOX_ADD ] = "+"; pMap[ CBA_BOX_SUB ] = "-"; pMap[ CBA_BOX_MUL ] = "*"; @@ -93,7 +92,7 @@ void Cba_ManCreatePrimMap( char ** pMap ) pMap[ CBA_BOX_POW ] = "**"; pMap[ CBA_BOX_MIN ] = "-"; pMap[ CBA_BOX_SQRT ] = "@"; - pMap[ CBA_BOX_ABS ] = NULL; + pMap[ CBA_BOX_ABS ] = "abs"; pMap[ CBA_BOX_LTHAN ] = "<"; pMap[ CBA_BOX_LETHAN ] = "<="; pMap[ CBA_BOX_METHAN ] = ">="; @@ -131,6 +130,33 @@ void Cba_ManCreatePrimMap( char ** pMap ) SeeAlso [] ***********************************************************************/ +static inline int Prs_NameIsLegalInVerilog( char * pName, int NameId ) +{ + // identifier ::= simple_identifier | escaped_identifier + // simple_identifier ::= [a-zA-Z_][a-zA-Z0-9_$] + // escaped_identifier ::= \ {Any_ASCII_character_except_white_space} white_space + // white_space ::= space | tab | newline + assert( pName != NULL && *pName != '\0' ); + if ( *pName == '\\' ) + return 1; + if ( NameId < 13 ) // see PRS_VER_UNKNOWN in cbaReadVer.c + return 0; + if ( (*pName < 'a' || *pName > 'z') && (*pName < 'A' || *pName > 'Z') && *pName != '_' ) + return 0; + while ( *(++pName) ) + if ( (*pName < 'a' || *pName > 'z') && (*pName < 'A' || *pName > 'Z') && (*pName < '0' || *pName > '9') && *pName != '_' && *pName != '$' ) + return 0; + return 1; +} +char * Prs_ObjGetName( Prs_Ntk_t * p, int NameId ) +{ + char * pName = Prs_NtkStr(p, NameId); + if ( pName == NULL ) + return pName; + if ( Prs_NameIsLegalInVerilog(pName, NameId) ) + return pName; + return Vec_StrPrintF( Abc_NamBuffer(p->pStrs), "\\%s ", pName ); +} static inline char * Prs_ManWriteRange( Prs_Ntk_t * p, int RangeId, int fSlice ) { int Left = RangeId ? Hash_IntObjData0( p->vHash, RangeId ) : 0; @@ -153,11 +179,11 @@ static void Prs_ManWriteVerilogSignal( FILE * pFile, Prs_Ntk_t * p, int Sig ) int Value = Abc_Lit2Var2( Sig ); Prs_ManType_t Type = (Prs_ManType_t)Abc_Lit2Att2( Sig ); if ( Type == CBA_PRS_NAME ) - fprintf( pFile, "%s", Prs_NtkStr(p, Value) ); + fprintf( pFile, "%s", Prs_ObjGetName(p, Value) ); else if ( Type == CBA_PRS_CONST ) fprintf( pFile, "%s", Prs_NtkConst(p, Value) ); else if ( Type == CBA_PRS_SLICE ) - fprintf( pFile, "%s%s", Prs_NtkStr(p, Prs_SliceName(p, Value)), Prs_ManWriteRange(p, Prs_SliceRange(p, Value), 1) ); + fprintf( pFile, "%s%s", Prs_ObjGetName(p, Prs_SliceName(p, Value)), Prs_ManWriteRange(p, Prs_SliceRange(p, Value), 1) ); else if ( Type == CBA_PRS_CONCAT ) Prs_ManWriteVerilogConcat( pFile, p, Value ); else assert( 0 ); @@ -182,7 +208,7 @@ static void Prs_ManWriteVerilogArray2( FILE * pFile, Prs_Ntk_t * p, Vec_Int_t * Vec_IntForEachEntryDouble( vSigs, FormId, ActSig, i ) { fprintf( pFile, "." ); - fprintf( pFile, "%s", Prs_NtkStr(p, FormId) ); + fprintf( pFile, "%s", Prs_ObjGetName(p, FormId) ); fprintf( pFile, "(" ); Prs_ManWriteVerilogSignal( pFile, p, ActSig ); fprintf( pFile, ")%s", (i == Vec_IntSize(vSigs) - 2) ? "" : ", " ); @@ -208,8 +234,8 @@ static void Prs_ManWriteVerilogBoxes( FILE * pFile, Prs_Ntk_t * p, char ** pType Prs_NtkForEachBox( p, vBox, i ) { Cba_ObjType_t NtkId = Prs_BoxNtk(p, i); - //char * pNtkName = Prs_NtkStr(p, Prs_BoxName(p, i)); - if ( NtkId == CBA_BOX_MUX ) + //char * pNtkName = Prs_ObjGetName(p, Prs_BoxName(p, i)); + if ( NtkId == CBA_BOX_MUX && Prs_BoxIsNode(p, i) ) Prs_ManWriteVerilogMux( pFile, p, vBox ); else if ( Prs_BoxIsNode(p, i) ) // node { @@ -252,7 +278,7 @@ static void Prs_ManWriteVerilogBoxes( FILE * pFile, Prs_Ntk_t * p, char ** pType } else // box { - fprintf( pFile, " %s %s ( ", Prs_NtkStr(p, NtkId), Prs_BoxName(p, i) ? Prs_NtkStr(p, Prs_BoxName(p, i)) : "" ); + fprintf( pFile, " %s %s ( ", Prs_ObjGetName(p, NtkId), Prs_BoxName(p, i) ? Prs_ObjGetName(p, Prs_BoxName(p, i)) : "" ); Prs_ManWriteVerilogArray2( pFile, p, vBox ); fprintf( pFile, " );\n" ); } @@ -267,19 +293,22 @@ static void Prs_ManWriteVerilogIos( FILE * pFile, Prs_Ntk_t * p, int SigType ) if ( SigType == 3 ) fprintf( pFile, "\n" ); Vec_IntForEachEntryTwo( vSigs[SigType], vSigsR[SigType], NameId, RangeId, i ) - fprintf( pFile, " %s %s%s%s;\n", pSigNames[SigType], Abc_LitIsCompl(RangeId) ? "signed " : "", RangeId ? Prs_ManWriteRange(p, Abc_Lit2Var(RangeId), 0) : "", Prs_NtkStr(p, NameId) ); + { + fprintf( pFile, " %s %s%s", pSigNames[SigType], Abc_LitIsCompl(RangeId) ? "signed " : "", RangeId ? Prs_ManWriteRange(p, Abc_Lit2Var(RangeId), 0) : "" ); + fprintf( pFile, "%s;\n", Prs_ObjGetName(p, NameId) ); + } } static void Prs_ManWriteVerilogIoOrder( FILE * pFile, Prs_Ntk_t * p, Vec_Int_t * vOrder ) { int i, NameId; Vec_IntForEachEntry( vOrder, NameId, i ) - fprintf( pFile, "%s%s", Prs_NtkStr(p, Abc_Lit2Var2(NameId)), i == Vec_IntSize(vOrder) - 1 ? "" : ", " ); + fprintf( pFile, "%s%s", Prs_ObjGetName(p, Abc_Lit2Var2(NameId)), i == Vec_IntSize(vOrder) - 1 ? "" : ", " ); } static void Prs_ManWriteVerilogNtk( FILE * pFile, Prs_Ntk_t * p, char ** pTypeNames ) { int s; // write header - fprintf( pFile, "module %s (\n ", Prs_NtkStr(p, p->iModuleName) ); + fprintf( pFile, "module %s (\n ", Prs_ObjGetName(p, p->iModuleName) ); Prs_ManWriteVerilogIoOrder( pFile, p, &p->vOrder ); fprintf( pFile, "\n );\n" ); // write declarations @@ -377,13 +406,13 @@ void Cba_ManWriteFonRange( Cba_Ntk_t * p, int iFon ) } void Cba_ManWriteFonName( Cba_Ntk_t * p, int iFon, int fInlineConcat, int fInput ) { - extern void Cba_ManWriteCatIn( Cba_Ntk_t * p, int iObj ); + extern void Cba_ManWriteConcat( Cba_Ntk_t * p, int iObj ); Vec_Str_t * vStr = &p->pDesign->vOut; if ( !iFon || (!Cba_FonIsConst(iFon) && !Cba_FonName(p, iFon)) ) Vec_StrPrintF( vStr, "Open_%d", Cba_NtkMan(p)->nOpens++ ); // Vec_StrPrintF( vStr, "1\'b0" ); - else if ( fInlineConcat && !Cba_FonIsConst(iFon) && Cba_ObjIsCatIn(p, Cba_FonObj(p, iFon)) ) - Cba_ManWriteCatIn( p, Cba_FonObj(p, iFon) ); + else if ( fInlineConcat && !Cba_FonIsConst(iFon) && Cba_ObjIsConcat(p, Cba_FonObj(p, iFon)) ) + Cba_ManWriteConcat( p, Cba_FonObj(p, iFon) ); else { int Range = fInput ? Cba_FonRangeSize( p, iFon ) : 0; @@ -394,11 +423,11 @@ void Cba_ManWriteFonName( Cba_Ntk_t * p, int iFon, int fInlineConcat, int fInput Vec_StrPush( vStr, '}' ); } } -void Cba_ManWriteCatIn( Cba_Ntk_t * p, int iObj ) +void Cba_ManWriteConcat( Cba_Ntk_t * p, int iObj ) { int i, iFin, iFon; Vec_Str_t * vStr = &p->pDesign->vOut; - assert( Cba_ObjIsCatIn(p, iObj) ); + assert( Cba_ObjIsConcat(p, iObj) ); Vec_StrPush( vStr, '{' ); Cba_ObjForEachFinFon( p, iObj, iFin, iFon, i ) { @@ -407,21 +436,6 @@ void Cba_ManWriteCatIn( Cba_Ntk_t * p, int iObj ) } Vec_StrPush( vStr, '}' ); } -void Cba_ManWriteCatOut( Cba_Ntk_t * p, int iObj ) -{ - int i, iFon; - Vec_Str_t * vStr = &p->pDesign->vOut; - assert( Cba_ObjIsCatOut(p, iObj) ); - if ( Cba_ObjFonNum(p, iObj) > 1 ) - Vec_StrPush( vStr, '{' ); - Cba_ObjForEachFon( p, iObj, iFon, i ) - { - Vec_StrPrintStr( vStr, i ? ", " : "" ); - Cba_ManWriteFonName( p, iFon, 0, 0 ); - } - if ( Cba_ObjFonNum(p, iObj) > 1 ) - Vec_StrPush( vStr, '}' ); -} int Cba_ManWriteLineFile( Cba_Ntk_t * p, int iObj, int FileAttr, int LineAttr ) { Vec_Str_t * vStr = &p->pDesign->vOut; @@ -485,7 +499,7 @@ void Cba_ManWriteVerilogNtk( Cba_Ntk_t * p, int fInlineConcat ) int Type = Cba_ObjType(p, iObj); if ( Cba_ObjIsSlice(p, iObj) ) continue; - if ( fInlineConcat && Cba_ObjIsCatIn(p, iObj) ) + if ( fInlineConcat && Cba_ObjIsConcat(p, iObj) ) continue; if ( Cba_ObjIsBoxUser(p, iObj) ) { @@ -552,27 +566,6 @@ void Cba_ManWriteVerilogNtk( Cba_Ntk_t * p, int fInlineConcat ) Cba_ManWriteFonName( p, iFonOut, 0, 1 ); Vec_StrPrintStr( vStr, ") );" ); } - else if ( Type == CBA_BOX_CATOUT ) - { - // write declarations - Cba_ObjForEachFon( p, iObj, iFon, i ) - { - if ( !Cba_FonName(p, iFon) ) - continue; - if ( Vec_BitEntry(vPoFons, iFon) ) - continue; - Vec_StrPrintStr( vStr, " wire " ); - Cba_ManWriteFonRange( p, iFon ); - Cba_ManWriteFonName( p, iFon, 0, 0 ); - Vec_StrPrintStr( vStr, ";\n" ); - } - // write output concatenation - Vec_StrPrintStr( vStr, " assign " ); - Cba_ManWriteCatOut( p, iObj ); - Vec_StrPrintStr( vStr, " = " ); - Cba_ManWriteFonName( p, Cba_ObjFinFon(p, iObj, 0), 0, 0 ); - Vec_StrPush( vStr, ';' ); - } else if ( Type == CBA_BOX_NMUX || Type == CBA_BOX_SEL ) { int fUseSel = Type == CBA_BOX_SEL; @@ -878,8 +871,8 @@ void Cba_ManWriteVerilogNtk( Cba_Ntk_t * p, int fInlineConcat ) } Cba_ManWriteFonName( p, Cba_ObjFon0(p, iObj), 0, 0 ); Vec_StrPrintStr( vStr, " = " ); - if ( Cba_ObjIsCatIn(p, iObj) ) - Cba_ManWriteCatIn( p, iObj ); + if ( Cba_ObjIsConcat(p, iObj) ) + Cba_ManWriteConcat( p, iObj ); else if ( Type == CBA_BOX_MUX ) { Cba_ManWriteFonName( p, Cba_ObjFinFon(p, iObj, 0), fInlineConcat, 0 ); |