mirror of https://github.com/YosysHQ/abc.git
Feat(write_hmetis): Write out hMetis file format
This commit is contained in:
parent
14d46bfef8
commit
17652cfda6
|
|
@ -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 IoCommandWriteDot ( Abc_Frame_t * pAbc, int argc, char **argv );
|
||||||
static int IoCommandWriteEqn ( 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 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 IoCommandWriteList ( Abc_Frame_t * pAbc, int argc, char **argv );
|
||||||
static int IoCommandWritePla ( 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 );
|
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_edgelist",IoCommandWriteEdgelist, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "I/O", "write_gml", IoCommandWriteGml, 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_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_pla", IoCommandWritePla, 0 );
|
||||||
Cmd_CommandAdd( pAbc, "I/O", "write_verilog", IoCommandWriteVerilog, 0 );
|
Cmd_CommandAdd( pAbc, "I/O", "write_verilog", IoCommandWriteVerilog, 0 );
|
||||||
// Cmd_CommandAdd( pAbc, "I/O", "write_verlib", IoCommandWriteVerLib, 0 );
|
// Cmd_CommandAdd( pAbc, "I/O", "write_verlib", IoCommandWriteVerLib, 0 );
|
||||||
|
|
@ -3398,6 +3400,73 @@ usage:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
int IoCommandWriteHMetis( Abc_Frame_t * pAbc, int argc, char **argv )
|
||||||
|
{
|
||||||
|
char * pFileName;
|
||||||
|
int fVerbose;
|
||||||
|
int fSkipPo;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
fSkipPo = 1;
|
||||||
|
fVerbose = 0;
|
||||||
|
Extra_UtilGetoptReset();
|
||||||
|
while ( ( c = Extra_UtilGetopt( argc, argv, "svh" ) ) != EOF )
|
||||||
|
{
|
||||||
|
switch ( c )
|
||||||
|
{
|
||||||
|
case 's':
|
||||||
|
fSkipPo ^= 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_WriteAiger( pAbc->pNtkCur, pFileName, fWriteSymbols, fCompact, fUnique );
|
||||||
|
Io_WriteHMetis( pAbc->pNtkCur, pFileName, fSkipPo, 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-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*************************************************************
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,7 @@ typedef enum {
|
||||||
IO_FILE_EDIF,
|
IO_FILE_EDIF,
|
||||||
IO_FILE_EQN,
|
IO_FILE_EQN,
|
||||||
IO_FILE_GML,
|
IO_FILE_GML,
|
||||||
|
IO_FILE_HMETIS,
|
||||||
IO_FILE_JSON,
|
IO_FILE_JSON,
|
||||||
IO_FILE_LIST,
|
IO_FILE_LIST,
|
||||||
IO_FILE_PLA,
|
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);
|
extern void Io_WriteEdgelist( Abc_Ntk_t * pNtk, char * pFileName, int fWriteLatches, int fBb2Wb, int fSeq , int fName);
|
||||||
/*=== abcWriteGml.c ===========================================================*/
|
/*=== abcWriteGml.c ===========================================================*/
|
||||||
extern void Io_WriteGml( Abc_Ntk_t * pNtk, char * pFileName );
|
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 fVerbose );
|
||||||
/*=== abcWriteList.c ==========================================================*/
|
/*=== abcWriteList.c ==========================================================*/
|
||||||
extern void Io_WriteList( Abc_Ntk_t * pNtk, char * pFileName, int fUseHost );
|
extern void Io_WriteList( Abc_Ntk_t * pNtk, char * pFileName, int fUseHost );
|
||||||
/*=== abcWritePla.c ===========================================================*/
|
/*=== abcWritePla.c ===========================================================*/
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
/**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 "base/abc/abc.h"
|
||||||
|
#include "ioAbc.h"
|
||||||
|
#include "misc/vec/vecInt.h"
|
||||||
|
#include "misc/vec/vecPtr.h"
|
||||||
|
|
||||||
|
|
||||||
|
ABC_NAMESPACE_IMPL_START
|
||||||
|
|
||||||
|
void Io_WriteHMetis( Abc_Ntk_t * pNtk, char * pFileName, int fSkipPo, int fVerbose)
|
||||||
|
{
|
||||||
|
Abc_Obj_t * pObj;
|
||||||
|
Abc_Obj_t * pFanout;
|
||||||
|
int i, j;
|
||||||
|
Vec_Int_t * vHyperEdgeEachWrite;
|
||||||
|
int Entry;
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
//write the number of hyperedges and the number of vertices
|
||||||
|
fprintf(pFHMetis, "%d %d\n", Vec_PtrSize(vHyperEdges), Abc_NtkObjNum(pNtk));
|
||||||
|
//write the hyperedges
|
||||||
|
Vec_PtrForEachEntry(Vec_Int_t *, vHyperEdges, vHyperEdgeEachWrite, i)
|
||||||
|
{
|
||||||
|
Vec_IntForEachEntry(vHyperEdgeEachWrite, Entry, j)
|
||||||
|
{
|
||||||
|
if (j == Vec_IntSize(vHyperEdgeEachWrite) - 1)
|
||||||
|
{
|
||||||
|
fprintf(pFHMetis, "%d", Entry);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(pFHMetis, "%d ", Entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(pFHMetis, "\n");
|
||||||
|
}
|
||||||
|
fprintf( pFHMetis, "\nThis 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
|
||||||
|
|
@ -26,6 +26,7 @@ SRC += src/base/io/io.c \
|
||||||
src/base/io/ioWriteEqn.c \
|
src/base/io/ioWriteEqn.c \
|
||||||
src/base/io/ioWriteEdgelist.c \
|
src/base/io/ioWriteEdgelist.c \
|
||||||
src/base/io/ioWriteGml.c \
|
src/base/io/ioWriteGml.c \
|
||||||
|
src/base/io/ioWriteHMetis.c \
|
||||||
src/base/io/ioWriteList.c \
|
src/base/io/ioWriteList.c \
|
||||||
src/base/io/ioWritePla.c \
|
src/base/io/ioWritePla.c \
|
||||||
src/base/io/ioWriteVerilog.c \
|
src/base/io/ioWriteVerilog.c \
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue