Merge pull request #354 from wjrforcyber/write_hmetis

Feat(write_hmetis): Enable hMetis format
This commit is contained in:
alanminko 2025-02-15 05:28:50 +07:00 committed by GitHub
commit 8a96d02e33
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 194 additions and 1 deletions

View File

@ -691,6 +691,10 @@ SOURCE=.\src\base\io\ioWriteGml.c
# End Source File
# Begin Source File
SOURCE=.\src\base\io\ioWriteHMetis.c
# End Source File
# Begin Source File
SOURCE=.\src\base\io\ioWriteList.c
# End Source File
# Begin Source File

View File

@ -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 );
@ -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 );
@ -3399,6 +3401,78 @@ usage:
}
/**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*************************************************************

View File

@ -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,
@ -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 ===========================================================*/

111
src/base/io/ioWriteHMetis.c Normal file
View File

@ -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

View File

@ -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 \