diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2021-12-16 11:30:06 +0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2021-12-16 11:30:06 +0700 |
commit | fb248e1ca1881e85abda65dafa143436d05035c6 (patch) | |
tree | 9b9cb7ecf3af03ee50486fc27cdc2f6223dd2a00 /src | |
parent | 8e72ac36d718cd0dc27f181dfa10746ad4a101ed (diff) | |
download | abc-fb248e1ca1881e85abda65dafa143436d05035c6.tar.gz abc-fb248e1ca1881e85abda65dafa143436d05035c6.tar.bz2 abc-fb248e1ca1881e85abda65dafa143436d05035c6.zip |
Adding new command %yosys.
Diffstat (limited to 'src')
-rw-r--r-- | src/base/wlc/wlcCom.c | 120 | ||||
-rw-r--r-- | src/base/wln/module.make | 1 | ||||
-rw-r--r-- | src/base/wln/wlnRtl.c | 163 |
3 files changed, 284 insertions, 0 deletions
diff --git a/src/base/wlc/wlcCom.c b/src/base/wlc/wlcCom.c index 39f1bebd..b6456ba4 100644 --- a/src/base/wlc/wlcCom.c +++ b/src/base/wlc/wlcCom.c @@ -32,6 +32,7 @@ ABC_NAMESPACE_IMPL_START static int Abc_CommandReadWlc ( Abc_Frame_t * pAbc, int argc, char ** argv ); static int Abc_CommandWriteWlc ( Abc_Frame_t * pAbc, int argc, char ** argv ); +static int Abc_CommandYosys ( Abc_Frame_t * pAbc, int argc, char ** argv ); static int Abc_CommandPs ( Abc_Frame_t * pAbc, int argc, char ** argv ); static int Abc_CommandCone ( Abc_Frame_t * pAbc, int argc, char ** argv ); static int Abc_CommandAbs ( Abc_Frame_t * pAbc, int argc, char ** argv ); @@ -79,6 +80,7 @@ void Wlc_Init( Abc_Frame_t * pAbc ) { Cmd_CommandAdd( pAbc, "Word level", "%read", Abc_CommandReadWlc, 0 ); Cmd_CommandAdd( pAbc, "Word level", "%write", Abc_CommandWriteWlc, 0 ); + Cmd_CommandAdd( pAbc, "Word level", "%yosys", Abc_CommandYosys, 0 ); Cmd_CommandAdd( pAbc, "Word level", "%ps", Abc_CommandPs, 0 ); Cmd_CommandAdd( pAbc, "Word level", "%cone", Abc_CommandCone, 0 ); Cmd_CommandAdd( pAbc, "Word level", "%abs", Abc_CommandAbs, 0 ); @@ -295,6 +297,124 @@ usage: return 1; } +/**Function******************************************************************** + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +******************************************************************************/ +int Abc_CommandYosys( Abc_Frame_t * pAbc, int argc, char ** argv ) +{ + extern Gia_Man_t * Wln_BlastSystemVerilog( char * pFileName, char * pTopModule, int fSkipStrash, int fInvert, int fVerbose ); + extern Wln_Ntk_t * Wln_ReadSystemVerilog( char * pFileName, char * pTopModule, int fVerbose ); + + FILE * pFile; + char * pFileName = NULL; + char * pTopModule= NULL; + int fCollapse = 0; + int fBlast = 0; + int fInvert = 0; + int fSkipStrash = 0; + int c, fVerbose = 0; + Extra_UtilGetoptReset(); + while ( ( c = Extra_UtilGetopt( argc, argv, "Tcaisvh" ) ) != EOF ) + { + switch ( c ) + { + case 'T': + if ( globalUtilOptind >= argc ) + { + Abc_Print( -1, "Command line switch \"-T\" should be followed by a file name.\n" ); + goto usage; + } + pTopModule = argv[globalUtilOptind]; + globalUtilOptind++; + break; + case 'c': + fCollapse ^= 1; + break; + case 'a': + fBlast ^= 1; + break; + case 'i': + fInvert ^= 1; + break; + case 's': + fSkipStrash ^= 1; + break; + case 'v': + fVerbose ^= 1; + break; + case 'h': + goto usage; + default: + goto usage; + } + } + if ( argc != globalUtilOptind + 1 ) + { + printf( "Abc_CommandReadWlc(): Input file name should be given on the command line.\n" ); + return 0; + } + // get the file name + pFileName = argv[globalUtilOptind]; + if ( (pFile = fopen( pFileName, "r" )) == NULL ) + { + Abc_Print( 1, "Cannot open input file \"%s\". ", pFileName ); + if ( (pFileName = Extra_FileGetSimilarName( pFileName, ".v", ".sv", NULL, NULL, NULL )) ) + Abc_Print( 1, "Did you mean \"%s\"?", pFileName ); + Abc_Print( 1, "\n" ); + return 0; + } + fclose( pFile ); + + // perform reading + if ( fBlast ) + { + Gia_Man_t * pNew = NULL; + if ( !strcmp( Extra_FileNameExtension(pFileName), "v" ) ) + pNew = Wln_BlastSystemVerilog( pFileName, pTopModule, fSkipStrash, fInvert, fVerbose ); + else if ( !strcmp( Extra_FileNameExtension(pFileName), "sv" ) ) + pNew = Wln_BlastSystemVerilog( pFileName, pTopModule, fSkipStrash, fInvert, fVerbose ); + else + { + printf( "Abc_CommandYosys(): Unknown file extension.\n" ); + return 0; + } + Abc_FrameUpdateGia( pAbc, pNew ); + } + else + { + Wln_Ntk_t * pNtk = NULL; + if ( !strcmp( Extra_FileNameExtension(pFileName), "v" ) ) + pNtk = Wln_ReadSystemVerilog( pFileName, pTopModule, fVerbose ); + else if ( !strcmp( Extra_FileNameExtension(pFileName), "sv" ) ) + pNtk = Wln_ReadSystemVerilog( pFileName, pTopModule, fVerbose ); + else + { + printf( "Abc_CommandYosys(): Unknown file extension.\n" ); + return 0; + } + //Wlc_AbcUpdateNtk( pAbc, pNtk ); + } + return 0; +usage: + Abc_Print( -2, "usage: %%yosys [-T <module>] [-caisvh] <file_name>\n" ); + Abc_Print( -2, "\t reads Verilog or SystemVerilog using Yosys\n" ); + Abc_Print( -2, "\t-T : specify the top module name (default uses \"-auto-top\"\n" ); + Abc_Print( -2, "\t-c : toggle collapsing the design using Yosys [default = %s]\n", fCollapse? "yes": "no" ); + Abc_Print( -2, "\t-a : toggle bit-blasting the design using Yosys [default = %s]\n", fBlast? "yes": "no" ); + Abc_Print( -2, "\t-i : toggle interting the outputs (useful for miters) [default = %s]\n", fInvert? "yes": "no" ); + Abc_Print( -2, "\t-s : toggle no structural hashing during bit-blasting [default = %s]\n", fSkipStrash? "no strash": "strash" ); + Abc_Print( -2, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes": "no" ); + Abc_Print( -2, "\t-h : print the command usage\n"); + return 1; +} /**Function******************************************************************** diff --git a/src/base/wln/module.make b/src/base/wln/module.make index 748c104c..308f7689 100644 --- a/src/base/wln/module.make +++ b/src/base/wln/module.make @@ -4,5 +4,6 @@ SRC += src/base/wln/wln.c \ src/base/wln/wlnNtk.c \ src/base/wln/wlnObj.c \ src/base/wln/wlnRetime.c \ + src/base/wln/wlnRtl.c \ src/base/wln/wlnWlc.c \ src/base/wln/wlnWriteVer.c diff --git a/src/base/wln/wlnRtl.c b/src/base/wln/wlnRtl.c new file mode 100644 index 00000000..90fc768e --- /dev/null +++ b/src/base/wln/wlnRtl.c @@ -0,0 +1,163 @@ +/**CFile**************************************************************** + + FileName [wlnRtl.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Word-level network.] + + Synopsis [Constructing WLN network from Rtl data structure.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - September 23, 2018.] + + Revision [$Id: wlnRtl.c,v 1.00 2018/09/23 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "wln.h" +#include "base/main/main.h" + +ABC_NAMESPACE_IMPL_START + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Wln_Ntk_t * Wln_ReadRtl( char * pFileName ) +{ + return NULL; +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +char * Wln_GetYosysName() +{ + char * pYosysName = NULL; + char * pYosysNameWin = "yosys.exe"; + char * pYosysNameUnix = "yosys"; + if ( Abc_FrameReadFlag("yosyswin") ) + pYosysNameWin = Abc_FrameReadFlag("yosyswin"); + if ( Abc_FrameReadFlag("yosysunix") ) + pYosysNameUnix = Abc_FrameReadFlag("yosysunix"); +#ifdef WIN32 + pYosysName = pYosysNameWin; +#else + pYosysName = pYosysNameUnix; +#endif + return pYosysName; +} +int Wln_ConvertToRtl( char * pCommand, char * pFileTemp ) +{ + FILE * pFile; + if ( system( pCommand ) == -1 ) + { + fprintf( stdout, "Cannot execute \"%s\".\n", pCommand ); + return 0; + } + if ( (pFile = fopen(pFileTemp, "r")) == NULL ) + { + fprintf( stdout, "Cannot open intermediate file \"%s\".\n", pFileTemp ); + return 0; + } + fclose( pFile ); + return 1; +} +Wln_Ntk_t * Wln_ReadSystemVerilog( char * pFileName, char * pTopModule, int fVerbose ) +{ + Wln_Ntk_t * pNtk = NULL; + char Command[1000]; + char * pFileTemp = "_temp_.rtlil"; + int fSVlog = strstr(pFileName, ".sv") != NULL; + sprintf( Command, "%s -qp \"read_verilog %s%s; hierarchy %s%s; flatten; proc; write_rtlil %s\"", + Wln_GetYosysName(), fSVlog ? "-sv ":"", pFileName, + pTopModule ? "-top " : "-auto-top", pTopModule ? pTopModule : "", pFileTemp ); + if ( fVerbose ) + printf( "%s\n", Command ); + if ( !Wln_ConvertToRtl(Command, pFileTemp) ) + { + return NULL; + } + pNtk = Wln_ReadRtl( pFileTemp ); + if ( pNtk == NULL ) + { + printf( "Dumped the design into file \"%s\".\n", pFileTemp ); + return NULL; + } +#ifdef WIN32 + _unlink( pFileTemp ); +#else + unlink( pFileTemp ); +#endif + return pNtk; +} +Gia_Man_t * Wln_BlastSystemVerilog( char * pFileName, char * pTopModule, int fSkipStrash, int fInvert, int fVerbose ) +{ + Gia_Man_t * pGia = NULL; + char Command[1000]; + char * pFileTemp = "_temp_.aig"; + int fSVlog = strstr(pFileName, ".sv") != NULL; + sprintf( Command, "%s -qp \"read_verilog %s%s; hierarchy %s%s; flatten; proc; aigmap; write_aiger %s\"", + Wln_GetYosysName(), fSVlog ? "-sv ":"", pFileName, + pTopModule ? "-top " : "-auto-top", pTopModule ? pTopModule : "", pFileTemp ); + if ( fVerbose ) + printf( "%s\n", Command ); + if ( !Wln_ConvertToRtl(Command, pFileTemp) ) + return NULL; + pGia = Gia_AigerRead( pFileTemp, 0, fSkipStrash, 0 ); + if ( pGia == NULL ) + { + printf( "Converting to AIG has failed.\n" ); + return NULL; + } + ABC_FREE( pGia->pName ); + pGia->pName = pTopModule ? Abc_UtilStrsav(pTopModule) : + Extra_FileNameGeneric( Extra_FileNameWithoutPath(pFileName) ); +#ifdef WIN32 + _unlink( pFileTemp ); +#else + unlink( pFileTemp ); +#endif + // complement the outputs + if ( fInvert ) + { + Gia_Obj_t * pObj; int i; + Gia_ManForEachPo( pGia, pObj, i ) + Gia_ObjFlipFaninC0( pObj ); + } + return pGia; +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + |