mirror of https://github.com/YosysHQ/abc.git
Added quick GIG parser.
This commit is contained in:
parent
f98f610bab
commit
f04d32732b
|
|
@ -3775,6 +3775,10 @@ SOURCE=.\src\aig\gia\giaFx.c
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\src\aig\gia\giaGig.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\src\aig\gia\giaGlitch.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
@ -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 \
|
||||
|
|
|
|||
|
|
@ -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] <file>\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*************************************************************
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue