mirror of https://github.com/YosysHQ/abc.git
Feat(write_hmetis): Add weight on hyperedges and format
This commit is contained in:
parent
7a5a0ad8b3
commit
0dff4dbc4b
|
|
@ -3416,18 +3416,23 @@ 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, "svh" ) ) != EOF )
|
||||
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;
|
||||
|
|
@ -3452,14 +3457,14 @@ int IoCommandWriteHMetis( Abc_Frame_t * pAbc, int argc, char **argv )
|
|||
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 );
|
||||
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" );
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ extern void Io_WriteEdgelist( Abc_Ntk_t * pNtk, char * pFileName,
|
|||
/*=== 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 fVerbose );
|
||||
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 ===========================================================*/
|
||||
|
|
|
|||
|
|
@ -23,76 +23,89 @@ Minnesota(https://karypis.github.io/glaros/files/sw/hmetis/manual.pdf)]
|
|||
|
||||
ABC_NAMESPACE_IMPL_START
|
||||
|
||||
void Io_WriteHMetis( Abc_Ntk_t * pNtk, char * pFileName, int fSkipPo, int fVerbose )
|
||||
void Io_WriteHMetis( Abc_Ntk_t *pNtk, char *pFileName, int fSkipPo, int fWeightEdges, int fVerbose )
|
||||
{
|
||||
Abc_Obj_t * pObj;
|
||||
Abc_Obj_t * pFanout;
|
||||
Abc_Obj_t *pObj;
|
||||
Abc_Obj_t *pFanout;
|
||||
int i, j;
|
||||
Vec_Int_t * vHyperEdgeEachWrite;
|
||||
int Entry;
|
||||
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);
|
||||
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);
|
||||
ABC_FREE( pFHMetis );
|
||||
return;
|
||||
}
|
||||
|
||||
//show pi/po/and number
|
||||
|
||||
// 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_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) )
|
||||
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)
|
||||
Abc_ObjForEachFanout( pObj, pFanout, j )
|
||||
{
|
||||
Vec_IntPush(vHyperEdgeEach, Abc_ObjId(pFanout));
|
||||
Vec_IntPush( vHyperEdgeEach, Abc_ObjId( pFanout ) );
|
||||
}
|
||||
}
|
||||
else{
|
||||
} else
|
||||
{
|
||||
if ( fSkipPo )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
Vec_IntPush(vHyperEdgeEach, Abc_ObjId(Abc_ObjFanin0(pObj)));
|
||||
Vec_IntPush( vHyperEdgeEach, Abc_ObjId( Abc_ObjFanin0( pObj ) ) );
|
||||
}
|
||||
Vec_PtrPush(vHyperEdges, vHyperEdgeEach);
|
||||
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)
|
||||
nHyperNodesNum = fSkipPo ? Abc_NtkObjNum( pNtk ) - Abc_NtkPoNum( pNtk ) : Abc_NtkObjNum( pNtk );
|
||||
|
||||
// write the number of hyperedges and the number of vertices
|
||||
if ( fWeightEdges )
|
||||
{
|
||||
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, "%d %d 1\n", Vec_PtrSize( vHyperEdges ), nHyperNodesNum );
|
||||
} else
|
||||
{
|
||||
fprintf( pFHMetis, "%d %d\n", Vec_PtrSize( vHyperEdges ), nHyperNodesNum );
|
||||
}
|
||||
//comments should be started with "%" in hMetis format
|
||||
// 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);
|
||||
Vec_PtrFreeFree( vHyperEdges );
|
||||
}
|
||||
|
||||
ABC_NAMESPACE_IMPL_END
|
||||
Loading…
Reference in New Issue