diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2014-09-12 13:40:48 -0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2014-09-12 13:40:48 -0700 |
commit | dcb7d0d3fcf7f8736031b6966e47d71efe79450f (patch) | |
tree | 0982ed27132f7e04edc400b0b912c25312471b6c /src/base/wlc/wlcWriteVer.c | |
parent | ae7e286213a03babd7db9ff155f702999bf60b0d (diff) | |
download | abc-dcb7d0d3fcf7f8736031b6966e47d71efe79450f.tar.gz abc-dcb7d0d3fcf7f8736031b6966e47d71efe79450f.tar.bz2 abc-dcb7d0d3fcf7f8736031b6966e47d71efe79450f.zip |
New word-level representation package.
Diffstat (limited to 'src/base/wlc/wlcWriteVer.c')
-rw-r--r-- | src/base/wlc/wlcWriteVer.c | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/src/base/wlc/wlcWriteVer.c b/src/base/wlc/wlcWriteVer.c new file mode 100644 index 00000000..57d2654a --- /dev/null +++ b/src/base/wlc/wlcWriteVer.c @@ -0,0 +1,204 @@ +/**CFile**************************************************************** + + FileName [wlcWriteVer.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Verilog parser.] + + Synopsis [Writes word-level Verilog.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - August 22, 2014.] + + Revision [$Id: wlcWriteVer.c,v 1.00 2014/09/12 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "wlc.h" + +ABC_NAMESPACE_IMPL_START + + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Wlc_WriteVerIntVec( FILE * pFile, Wlc_Ntk_t * p, Vec_Int_t * vVec, int Start ) +{ + char * pName; + int LineLength = Start; + int NameCounter = 0; + int AddedLength, i, iObj; + Vec_IntForEachEntry( vVec, iObj, i ) + { + pName = Wlc_ObjName( p, iObj ); + // get the line length after this name is written + AddedLength = strlen(pName) + 2; + if ( NameCounter && LineLength + AddedLength + 3 > 70 ) + { // write the line extender + fprintf( pFile, "\n " ); + // reset the line length + LineLength = Start; + NameCounter = 0; + } + fprintf( pFile, " %s%s", pName, (i==Vec_IntSize(vVec)-1)? "" : "," ); + LineLength += AddedLength; + NameCounter++; + } +} +void Wlc_WriteVerInt( FILE * pFile, Wlc_Ntk_t * p ) +{ + Wlc_Obj_t * pObj; + int i, k, iFanin; + char Range[100]; + fprintf( pFile, "module %s ( ", p->pName ); + fprintf( pFile, "\n " ); + if ( Wlc_NtkPiNum(p) > 0 ) + { + Wlc_WriteVerIntVec( pFile, p, &p->vPis, 3 ); + fprintf( pFile, ",\n " ); + } + if ( Wlc_NtkPoNum(p) > 0 ) + Wlc_WriteVerIntVec( pFile, p, &p->vPos, 3 ); + fprintf( pFile, " );\n" ); + Wlc_NtkForEachObj( p, pObj, i ) + { + char * pName = Wlc_ObjName(p, i); + char * pName0 = Wlc_ObjFaninNum(pObj) ? Wlc_ObjName(p, Wlc_ObjFaninId0(pObj)) : NULL; + int nDigits = Abc_Base10Log(pObj->End+1) + Abc_Base10Log(pObj->Beg+1); + sprintf( Range, "%s[%d:%d]%*s", pObj->Signed ? "signed ":" ", pObj->End, pObj->Beg, 8-nDigits, "" ); + fprintf( pFile, " " ); + if ( pObj->Type == WLC_OBJ_PI ) + fprintf( pFile, "input wire %s %-16s", Range, pName ); + else if ( pObj->Type == WLC_OBJ_PO ) + fprintf( pFile, "output wire %s %-16s = %s", Range, pName, pName0 ); + else if ( pObj->Type == WLC_OBJ_CONST ) + { + fprintf( pFile, " wire %s %-16s = %d\'%sh", Range, pName, Wlc_ObjRange(pObj), pObj->Signed ? "s":"" ); + Abc_TtPrintHexArrayRev( pFile, (word *)Wlc_ObjConstValue(pObj), (Wlc_ObjRange(pObj) + 3) / 4 ); + } + else + { + fprintf( pFile, " wire %s %-16s = ", Range, Wlc_ObjName(p, i) ); + if ( pObj->Type == WLC_OBJ_BUF ) + fprintf( pFile, "%s", pName0 ); + else if ( pObj->Type == WLC_OBJ_MUX ) + fprintf( pFile, "%s ? %s : %s", pName0, Wlc_ObjName(p, Wlc_ObjFaninId1(pObj)), Wlc_ObjName(p, Wlc_ObjFaninId2(pObj)) ); + else if ( pObj->Type == WLC_OBJ_BIT_NOT ) + fprintf( pFile, "~%s", pName0 ); + else if ( pObj->Type == WLC_OBJ_LOGIC_NOT ) + fprintf( pFile, "!%s", pName0 ); + else if ( pObj->Type == WLC_OBJ_REDUCT_AND ) + fprintf( pFile, "&%s", pName0 ); + else if ( pObj->Type == WLC_OBJ_REDUCT_OR ) + fprintf( pFile, "|%s", pName0 ); + else if ( pObj->Type == WLC_OBJ_REDUCT_XOR ) + fprintf( pFile, "^%s", pName0 ); + else if ( pObj->Type == WLC_OBJ_BIT_SELECT ) + fprintf( pFile, "%s [%d:%d]", pName0, Wlc_ObjRangeEnd(pObj), Wlc_ObjRangeBeg(pObj) ); + else if ( pObj->Type == WLC_OBJ_BIT_SIGNEXT ) + fprintf( pFile, "{ {%d{%s[%d]}}, %s }", Wlc_ObjRange(pObj) - Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)), pName0, Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)) - 1, pName0 ); + else if ( pObj->Type == WLC_OBJ_BIT_ZEROPAD ) + fprintf( pFile, "{ {%d{1\'b0}}, %s }", Wlc_ObjRange(pObj) - Wlc_ObjRange(Wlc_ObjFanin0(p, pObj)), pName0 ); + else if ( pObj->Type == WLC_OBJ_BIT_CONCAT ) + { + fprintf( pFile, "{" ); + Wlc_ObjForEachFanin( pObj, iFanin, k ) + fprintf( pFile, " %s%s", Wlc_ObjName(p, Wlc_ObjFaninId(pObj, k)), k == Wlc_ObjFaninNum(pObj)-1 ? "":"," ); + fprintf( pFile, " }" ); + } + else + { + fprintf( pFile, "%s ", Wlc_ObjName(p, Wlc_ObjFaninId(pObj, 0)) ); + if ( pObj->Type == WLC_OBJ_SHIFT_R ) + fprintf( pFile, ">>" ); + else if ( pObj->Type == WLC_OBJ_SHIFT_RA ) + fprintf( pFile, ">>>" ); + else if ( pObj->Type == WLC_OBJ_SHIFT_L ) + fprintf( pFile, "<<" ); + else if ( pObj->Type == WLC_OBJ_SHIFT_LA ) + fprintf( pFile, "<<<" ); + else if ( pObj->Type == WLC_OBJ_BIT_AND ) + fprintf( pFile, "&" ); + else if ( pObj->Type == WLC_OBJ_BIT_OR ) + fprintf( pFile, "|" ); + else if ( pObj->Type == WLC_OBJ_BIT_XOR ) + fprintf( pFile, "^" ); + else if ( pObj->Type == WLC_OBJ_LOGIC_AND ) + fprintf( pFile, "&&" ); + else if ( pObj->Type == WLC_OBJ_LOGIC_OR ) + fprintf( pFile, "||" ); + else if ( pObj->Type == WLC_OBJ_COMP_EQU ) + fprintf( pFile, "==" ); + else if ( pObj->Type == WLC_OBJ_COMP_NOT ) + fprintf( pFile, "!=" ); + else if ( pObj->Type == WLC_OBJ_COMP_LESS ) + fprintf( pFile, "<" ); + else if ( pObj->Type == WLC_OBJ_COMP_MORE ) + fprintf( pFile, ">" ); + else if ( pObj->Type == WLC_OBJ_COMP_LESSEQU ) + fprintf( pFile, "<=" ); + else if ( pObj->Type == WLC_OBJ_COMP_MOREEQU ) + fprintf( pFile, ">=" ); + else if ( pObj->Type == WLC_OBJ_ARI_ADD ) + fprintf( pFile, "+" ); + else if ( pObj->Type == WLC_OBJ_ARI_SUB ) + fprintf( pFile, "-" ); + else if ( pObj->Type == WLC_OBJ_ARI_MULTI ) + fprintf( pFile, "*" ); + else if ( pObj->Type == WLC_OBJ_ARI_DIVIDE ) + fprintf( pFile, "//" ); + else if ( pObj->Type == WLC_OBJ_ARI_MODULUS ) + fprintf( pFile, "%" ); + else if ( pObj->Type == WLC_OBJ_ARI_POWER ) + fprintf( pFile, "**" ); + else assert( 0 ); + fprintf( pFile, " %s", Wlc_ObjName(p, Wlc_ObjFaninId(pObj, 1)) ); + } + } + fprintf( pFile, " ;\n" ); + } + fprintf( pFile, "endmodule\n\n" ); +} +void Wlc_WriteVer( Wlc_Ntk_t * p, char * pFileName ) +{ + FILE * pFile; + pFile = fopen( pFileName, "w" ); + if ( pFile == NULL ) + { + fprintf( stdout, "Wlc_WriteVer(): Cannot open the output file \"%s\".\n", pFileName ); + return; + } + fprintf( pFile, "// Benchmark \"%s\" written by ABC on %s\n", p->pName, Extra_TimeStamp() ); + fprintf( pFile, "\n" ); + Wlc_WriteVerInt( pFile, p ); + fprintf( pFile, "\n" ); + fclose( pFile ); +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + |