Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat(write_hmetis): Enable hMetis format #354

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions abclib.dsp

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

74 changes: 74 additions & 0 deletions src/base/io/io.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ static int IoCommandWriteCex ( Abc_Frame_t * pAbc, int argc, char **argv );
static int IoCommandWriteDot ( Abc_Frame_t * pAbc, int argc, char **argv );
static int IoCommandWriteEqn ( Abc_Frame_t * pAbc, int argc, char **argv );
static int IoCommandWriteGml ( Abc_Frame_t * pAbc, int argc, char **argv );
static int IoCommandWriteHMetis ( Abc_Frame_t * pAbc, int argc, char **argv );
static int IoCommandWriteList ( Abc_Frame_t * pAbc, int argc, char **argv );
static int IoCommandWritePla ( Abc_Frame_t * pAbc, int argc, char **argv );
static int IoCommandWriteVerilog( Abc_Frame_t * pAbc, int argc, char **argv );
Expand Down Expand Up @@ -155,6 +156,7 @@ void Io_Init( Abc_Frame_t * pAbc )
Cmd_CommandAdd( pAbc, "I/O", "write_edgelist",IoCommandWriteEdgelist, 0 );
Cmd_CommandAdd( pAbc, "I/O", "write_gml", IoCommandWriteGml, 0 );
// Cmd_CommandAdd( pAbc, "I/O", "write_list", IoCommandWriteList, 0 );
Cmd_CommandAdd( pAbc, "I/O", "write_hmetis", IoCommandWriteHMetis, 0 );
Cmd_CommandAdd( pAbc, "I/O", "write_pla", IoCommandWritePla, 0 );
Cmd_CommandAdd( pAbc, "I/O", "write_verilog", IoCommandWriteVerilog, 0 );
// Cmd_CommandAdd( pAbc, "I/O", "write_verlib", IoCommandWriteVerLib, 0 );
Expand Down Expand Up @@ -3398,6 +3400,78 @@ int IoCommandWriteEdgelist( Abc_Frame_t * pAbc, int argc, char **argv )
}


/**Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

***********************************************************************/
int IoCommandWriteHMetis( Abc_Frame_t * pAbc, int argc, char **argv )
{
char * pFileName;
int fVerbose;
int fSkipPo;
int fWeightEdges;
int c;

fSkipPo = 1;
fWeightEdges = 0;
fVerbose = 0;
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "swvh" ) ) != EOF )
{
switch ( c )
{
case 's':
fSkipPo ^= 1;
break;
case 'w':
fWeightEdges ^= 1;
break;
case 'v':
fVerbose ^= 1;
break;
case 'h':
goto usage;
default:
goto usage;
}
}
if ( pAbc->pNtkCur == NULL )
{
fprintf( pAbc->Out, "Empty network.\n" );
return 0;
}
if ( argc != globalUtilOptind + 1 )
goto usage;
// get the output file name
pFileName = argv[globalUtilOptind];
// call the corresponding file writer
if ( !Abc_NtkIsStrash(pAbc->pNtkCur) )
{
fprintf( stdout, "Writing this format is only possible for structurally hashed AIGs.\n" );
return 1;
}
Io_WriteHMetis( pAbc->pNtkCur, pFileName, fSkipPo, fWeightEdges, fVerbose );
return 0;

usage:
fprintf( pAbc->Err, "usage: write_hmetis <file>\n" );
fprintf( pAbc->Err, "\t writes the network in the hMetis format (https://karypis.github.io/glaros/files/sw/hmetis/manual.pdf)\n" );
fprintf( pAbc->Err, "\t-s : skip PO as sink explictly [default = %s]\n", fSkipPo? "yes" : "no" );
fprintf( pAbc->Err, "\t-w : simulate weight on hyperedges [default = %s]\n", fWeightEdges? "yes" : "no" );
fprintf( pAbc->Err, "\t-v : toggle printing verbose information [default = %s]\n", fVerbose? "yes" : "no" );
fprintf( pAbc->Err, "\t-h : print the help massage\n" );
fprintf( pAbc->Err, "\tfile : the name of the file to write\n" );
return 1;
}



/**Function*************************************************************

Expand Down
5 changes: 4 additions & 1 deletion src/base/io/ioAbc.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ typedef enum {
IO_FILE_DOT,
IO_FILE_EDIF,
IO_FILE_EQN,
IO_FILE_GML,
IO_FILE_GML,
IO_FILE_HMETIS,
IO_FILE_JSON,
IO_FILE_LIST,
IO_FILE_PLA,
Expand Down Expand Up @@ -129,6 +130,8 @@ extern void Io_WriteEqn( Abc_Ntk_t * pNtk, char * pFileName );
extern void Io_WriteEdgelist( Abc_Ntk_t * pNtk, char * pFileName, int fWriteLatches, int fBb2Wb, int fSeq , int fName);
/*=== abcWriteGml.c ===========================================================*/
extern void Io_WriteGml( Abc_Ntk_t * pNtk, char * pFileName );
/*=== abcWriteHMetis.c ===========================================================*/
extern void Io_WriteHMetis( Abc_Ntk_t * pNtk, char * pFileName, int fSkipPo, int fWeightEdges, int fVerbose );
/*=== abcWriteList.c ==========================================================*/
extern void Io_WriteList( Abc_Ntk_t * pNtk, char * pFileName, int fUseHost );
/*=== abcWritePla.c ===========================================================*/
Expand Down
111 changes: 111 additions & 0 deletions src/base/io/ioWriteHMetis.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/**CFile****************************************************************

FileName [ioWriteHMetis.c]

SystemName [ABC: Logic synthesis and verification system.]

PackageName [Command processing package.]

Synopsis [Procedures to write hMetis format developed by
George Karypis and Vipin Kumar from the University of
Minnesota(https://karypis.github.io/glaros/files/sw/hmetis/manual.pdf)]

Author [Jingren Wang]

Affiliation []

Date [Ver. 1.0. Started - December 16, 2006.]

Revision []

***********************************************************************/
#include "ioAbc.h"

ABC_NAMESPACE_IMPL_START

void Io_WriteHMetis( Abc_Ntk_t *pNtk, char *pFileName, int fSkipPo, int fWeightEdges, int fVerbose )
{
Abc_Obj_t *pObj;
Abc_Obj_t *pFanout;
int i, j;
Vec_Int_t *vHyperEdgeEachWrite;
int iEntry;
int nHyperNodesNum = 0;
// check that the network is valid
assert( Abc_NtkIsStrash( pNtk ) && Abc_NtkIsComb( pNtk ) );

FILE *pFHMetis = fopen( pFileName, "wb" );
Vec_Ptr_t *vHyperEdges = Vec_PtrAlloc( 1000 );
if ( pFHMetis == NULL )
{
fprintf( stdout, "Io_WriteHMetis(): Cannot open the output file \"%s\".\n", pFileName );
ABC_FREE( pFHMetis );
return;
}

// show pi/po/and number
if ( fVerbose )
{
Abc_Print( 1, "Writing hMetis file \"%s\" with %d nodes (%d pi, %d po, %d and nodes).\n", pFileName, Abc_NtkObjNum( pNtk ), Abc_NtkPiNum( pNtk ), Abc_NtkPoNum( pNtk ), Abc_NtkNodeNum( pNtk ) );
}

Abc_NtkForEachObj( pNtk, pObj, i )
{
Vec_Int_t *vHyperEdgeEach = Vec_IntAlloc( 20 );
// push the node itself, which is a source node
Vec_IntPush( vHyperEdgeEach, Abc_ObjId( pObj ) );
// iterate through all the fanouts(sink) of the node
if ( !Abc_ObjIsCo( pObj ) )
{
Abc_ObjForEachFanout( pObj, pFanout, j )
{
Vec_IntPush( vHyperEdgeEach, Abc_ObjId( pFanout ) );
}
} else
{
if ( fSkipPo )
{
continue;
}
Vec_IntPush( vHyperEdgeEach, Abc_ObjId( Abc_ObjFanin0( pObj ) ) );
}
Vec_PtrPush( vHyperEdges, vHyperEdgeEach );
}

nHyperNodesNum = fSkipPo ? Abc_NtkObjNum( pNtk ) - Abc_NtkPoNum( pNtk ) : Abc_NtkObjNum( pNtk );

// write the number of hyperedges and the number of vertices
if ( fWeightEdges )
{
fprintf( pFHMetis, "%d %d 1\n", Vec_PtrSize( vHyperEdges ), nHyperNodesNum );
} else
{
fprintf( pFHMetis, "%d %d\n", Vec_PtrSize( vHyperEdges ), nHyperNodesNum );
}
// write the hyperedges
Vec_PtrForEachEntry( Vec_Int_t *, vHyperEdges, vHyperEdgeEachWrite, i )
{
if ( fWeightEdges )
{
fprintf( pFHMetis, "%d ", Vec_IntSize( vHyperEdgeEachWrite ) );
}

Vec_IntForEachEntry( vHyperEdgeEachWrite, iEntry, j )
{
if ( j == Vec_IntSize( vHyperEdgeEachWrite ) - 1 )
{
fprintf( pFHMetis, "%d", iEntry );
} else
{
fprintf( pFHMetis, "%d ", iEntry );
}
}
fprintf( pFHMetis, "\n" );
}
// comments should be started with "%" in hMetis format
fprintf( pFHMetis, "\n%%This file was written by ABC on %s\n", Extra_TimeStamp() );
fprintf( pFHMetis, "%%For information about hMetis format, refer to %s\n", "https://karypis.github.io/glaros/files/sw/hmetis/manual.pdf" );
Vec_PtrFreeFree( vHyperEdges );
}

ABC_NAMESPACE_IMPL_END
1 change: 1 addition & 0 deletions src/base/io/module.make
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ SRC += src/base/io/io.c \
src/base/io/ioWriteEqn.c \
src/base/io/ioWriteEdgelist.c \
src/base/io/ioWriteGml.c \
src/base/io/ioWriteHMetis.c \
src/base/io/ioWriteList.c \
src/base/io/ioWritePla.c \
src/base/io/ioWriteVerilog.c \
Expand Down
Loading