From f04d32732b309715b12c4ad503234fdcaefd6094 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Thu, 19 Jun 2014 21:16:30 -0700 Subject: Added quick GIG parser. --- src/aig/gia/giaGig.c | 199 ++++++++++++++++++++++++++++++++++++++++++++++++ src/aig/gia/module.make | 1 + src/base/io/io.c | 59 ++++++++++++++ 3 files changed, 259 insertions(+) create mode 100644 src/aig/gia/giaGig.c (limited to 'src') diff --git a/src/aig/gia/giaGig.c b/src/aig/gia/giaGig.c new file mode 100644 index 00000000..b3ea1770 --- /dev/null +++ b/src/aig/gia/giaGig.c @@ -0,0 +1,199 @@ +/**CFile**************************************************************** + + FileName [giaGig.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Scalable AIG package.] + + Synopsis [Parser for Gate-Inverter Graph by Niklas Een.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - June 20, 2005.] + + Revision [$Id: giaGig.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "gia.h" +#include "misc/extra/extra.h" +#include "misc/util/utilTruth.h" + +ABC_NAMESPACE_IMPL_START + + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +typedef enum { + GIG_NONE = 0, + GIG_RESET = 1, + GIG_PI = 2, + GIG_PO = 3, + GIG_SEQ = 4, + GIG_LUT = 5, + GIG_DELAY = 6, + GIG_BOX = 7, + GIG_SEL = 8, + GIG_BAR = 9, + GIG_UNUSED = 10 +}; + +static char * s_GigNames[GIG_UNUSED] = +{ + "NONE", // GIG_NONE = 0 + "Reset", // GIG_RESET = 1 + "PI", // GIG_PI = 2 + "PO", // GIG_PO = 3 + "Seq", // GIG_SEQ = 4 + "Lut4", // GIG_LUT = 5 + "Delay", // GIG_DELAY = 6 + "Box", // GIG_BOX = 7 + "Sel", // GIG_SEL = 8 + "Bar" // GIG_BAR = 9 +}; + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Gia_Man_t * Gia_ManBuildGig( Vec_Int_t * vObjs, Vec_Int_t * vStore ) +{ + int i, Type, nObjs[GIG_UNUSED] = {0}; + printf( "Parsed %d objects and %d tokens.\n", Vec_IntSize(vObjs), Vec_IntSize(vStore) ); + for ( i = 0; i < Vec_IntSize(vObjs); i++ ) + { + Type = Vec_IntEntry( vStore, Vec_IntEntry(vObjs,i) + 1 ); + nObjs[Type]++; + } + printf( "Statistics: " ); + for ( i = 1; i < GIG_UNUSED; i++ ) + printf( "%s = %d ", s_GigNames[i], nObjs[i] ); + printf( "\n" ); + return NULL; +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Gia_Man_t * Gia_ManReadGig( char * pFileName ) +{ + Gia_Man_t * pNew; + int Type, Offset, fEndOfLine, Digit, nObjs; + char * pChars = " w(-,)]\r\t"; + char * pBuffer = Extra_FileReadContents( pFileName ); + char * pStart = pBuffer, * pToken; + Vec_Int_t * vObjs, * vStore; + if ( pBuffer == NULL ) + printf( "Cannot open input file %s\n", pFileName ); + // count objects + for ( nObjs = 0, pToken = pBuffer; *pToken; pToken++ ) + nObjs += (int)(*pToken == '\n'); + // read objects + vObjs = Vec_IntAlloc( nObjs ); + vStore = Vec_IntAlloc( 10*nObjs ); + while ( 1 ) + { + // read net ID + pToken = strtok( pStart, pChars ); + pStart = NULL; + if ( pToken == NULL ) + break; + // start new object + Vec_IntPush( vObjs, Vec_IntSize(vStore) ); + // save net ID + assert( pToken[0] >= '0' && pToken[0] <= '9' ); + Vec_IntPush( vStore, atoi(pToken) ); + // read equal + pToken = strtok( pStart, pChars ); + assert( pToken[0] == '=' ); + // read type + pToken = strtok( pStart, pChars ); + fEndOfLine = 0; + if ( pToken[strlen(pToken)-1] == '\n' ) + { + pToken[strlen(pToken)-1] = 0; + fEndOfLine = 1; + } + for ( Type = GIG_RESET; Type < GIG_UNUSED; Type++ ) + if ( !strcmp(pToken, s_GigNames[Type]) ) + break; + assert( Type < GIG_UNUSED ); + Vec_IntPush( vStore, Type ); + if ( fEndOfLine ) + continue; + // read fanins + Offset = Vec_IntSize(vStore); + Vec_IntPush( vStore, 0 ); + while ( 1 ) + { + pToken = strtok( pStart, pChars ); + if ( pToken == NULL || pToken[0] == '\n' || pToken[0] == '[' ) + break; + assert( pToken[0] >= '0' && pToken[0] <= '9' ); + Vec_IntPush( vStore, atoi(pToken) ); + Vec_IntAddToEntry( vStore, Offset, 1 ); + } + assert( pToken != NULL ); + if ( pToken[0] == '\n' ) + continue; + assert( pToken[0] == '[' ); + // read attribute + pToken++; + if ( Type == GIG_LUT ) + { + assert( strlen(pToken) == 4 ); + Digit = Abc_TtReadHexDigit(pToken[0]); + Digit |= Abc_TtReadHexDigit(pToken[1]) << 4; + Digit |= Abc_TtReadHexDigit(pToken[2]) << 8; + Digit |= Abc_TtReadHexDigit(pToken[3]) << 12; + Vec_IntPush( vStore, Digit ); + } + else + { + assert( Type == GIG_DELAY ); + Vec_IntPush( vStore, atoi(pToken) ); + } + // read end of line + pToken = strtok( pStart, pChars ); + assert( pToken[0] == '\n' ); + } + ABC_FREE( pBuffer ); + // create AIG + pNew = Gia_ManBuildGig( vObjs, vStore ); + // cleanup + Vec_IntFree( vObjs ); + Vec_IntFree( vStore ); + return pNew; +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + diff --git a/src/aig/gia/module.make b/src/aig/gia/module.make index 8cd50ce8..9664c78d 100644 --- a/src/aig/gia/module.make +++ b/src/aig/gia/module.make @@ -24,6 +24,7 @@ SRC += src/aig/gia/giaAig.c \ src/aig/gia/giaFrames.c \ src/aig/gia/giaFront.c \ src/aig/gia/giaFx.c \ + src/aig/gia/giaGig.c \ src/aig/gia/giaGlitch.c \ src/aig/gia/giaHash.c \ src/aig/gia/giaIf.c \ diff --git a/src/base/io/io.c b/src/base/io/io.c index 82b050c3..d5ef65b8 100644 --- a/src/base/io/io.c +++ b/src/base/io/io.c @@ -45,6 +45,7 @@ static int IoCommandReadPla ( Abc_Frame_t * pAbc, int argc, char **argv ); static int IoCommandReadTruth ( Abc_Frame_t * pAbc, int argc, char **argv ); static int IoCommandReadVerilog ( Abc_Frame_t * pAbc, int argc, char **argv ); static int IoCommandReadStatus ( Abc_Frame_t * pAbc, int argc, char **argv ); +static int IoCommandReadGig ( Abc_Frame_t * pAbc, int argc, char **argv ); static int IoCommandWrite ( Abc_Frame_t * pAbc, int argc, char **argv ); static int IoCommandWriteHie ( Abc_Frame_t * pAbc, int argc, char **argv ); @@ -108,6 +109,7 @@ void Io_Init( Abc_Frame_t * pAbc ) Cmd_CommandAdd( pAbc, "I/O", "read_truth", IoCommandReadTruth, 1 ); Cmd_CommandAdd( pAbc, "I/O", "read_verilog", IoCommandReadVerilog, 1 ); Cmd_CommandAdd( pAbc, "I/O", "read_status", IoCommandReadStatus, 0 ); + Cmd_CommandAdd( pAbc, "I/O", "&read_gig", IoCommandReadGig, 0 ); Cmd_CommandAdd( pAbc, "I/O", "write", IoCommandWrite, 0 ); Cmd_CommandAdd( pAbc, "I/O", "write_hie", IoCommandWriteHie, 0 ); @@ -1132,6 +1134,63 @@ usage: return 1; } +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int IoCommandReadGig( Abc_Frame_t * pAbc, int argc, char ** argv ) +{ + extern Gia_Man_t * Gia_ManReadGig( char * pFileName ); + Gia_Man_t * pAig; + char * pFileName; + FILE * pFile; + int c; + + Extra_UtilGetoptReset(); + while ( ( c = Extra_UtilGetopt( argc, argv, "h" ) ) != EOF ) + { + switch ( c ) + { + case 'h': + goto usage; + default: + goto usage; + } + } + if ( argc != globalUtilOptind + 1 ) + { + goto usage; + } + + // get the input file name + pFileName = argv[globalUtilOptind]; + if ( (pFile = fopen( pFileName, "r" )) == NULL ) + { + fprintf( pAbc->Err, "Cannot open input file \"%s\". \n", pFileName ); + return 1; + } + fclose( pFile ); + + // set the new network + pAig = Gia_ManReadGig( pFileName ); + //Abc_FrameUpdateGia( pAbc, pAig ); + return 0; + +usage: + fprintf( pAbc->Err, "usage: &read_gig [-h] \n" ); + fprintf( pAbc->Err, "\t reads design in GIG format\n" ); + fprintf( pAbc->Err, "\t-h : prints the command summary\n" ); + fprintf( pAbc->Err, "\tfile : the name of a file to read\n" ); + return 1; +} + /**Function************************************************************* -- cgit v1.2.3