summaryrefslogtreecommitdiffstats
path: root/src/base/io/ioReadBlifMv.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2012-09-19 16:28:06 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2012-09-19 16:28:06 -0700
commit3af0f719afa368cafbe7c8178d0995819b47be90 (patch)
treed7d4bb682fc4d3b9607569580810c9c229b48266 /src/base/io/ioReadBlifMv.c
parent60c661488507d3ff5866e795979bdef64b10f58f (diff)
downloadabc-3af0f719afa368cafbe7c8178d0995819b47be90.tar.gz
abc-3af0f719afa368cafbe7c8178d0995819b47be90.tar.bz2
abc-3af0f719afa368cafbe7c8178d0995819b47be90.zip
Extending BLIF parser/write to hangle multi-output cells.
Diffstat (limited to 'src/base/io/ioReadBlifMv.c')
-rw-r--r--src/base/io/ioReadBlifMv.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/src/base/io/ioReadBlifMv.c b/src/base/io/ioReadBlifMv.c
index 57cbb915..bbaad423 100644
--- a/src/base/io/ioReadBlifMv.c
+++ b/src/base/io/ioReadBlifMv.c
@@ -2090,7 +2090,7 @@ static char * Io_ReadBlifCleanName( char * pName )
***********************************************************************/
static int Io_MvParseLineGateBlif( Io_MvMod_t * p, Vec_Ptr_t * vTokens )
{
- extern int Io_ReadBlifReorderFormalNames( Vec_Ptr_t * vTokens, Mio_Gate_t * pGate );
+ extern int Io_ReadBlifReorderFormalNames( Vec_Ptr_t * vTokens, Mio_Gate_t * pGate, Mio_Gate_t * pTwin );
Mio_Library_t * pGenlib;
Mio_Gate_t * pGate;
Abc_Obj_t * pNode;
@@ -2115,7 +2115,7 @@ static int Io_MvParseLineGateBlif( Io_MvMod_t * p, Vec_Ptr_t * vTokens )
}
// get the gate
- pGate = Mio_LibraryReadGateByName( pGenlib, (char *)vTokens->pArray[1] );
+ pGate = Mio_LibraryReadGateByName( pGenlib, (char *)vTokens->pArray[1], NULL );
if ( pGate == NULL )
{
sprintf( p->pMan->sError, "Line %d: Cannot find gate \"%s\" in the library.", Io_MvGetLine(p->pMan, pName), (char*)vTokens->pArray[1] );
@@ -2132,7 +2132,7 @@ static int Io_MvParseLineGateBlif( Io_MvMod_t * p, Vec_Ptr_t * vTokens )
}
// reorder the formal inputs to be in the same order as in the gate
- if ( !Io_ReadBlifReorderFormalNames( vTokens, pGate ) )
+ if ( !Io_ReadBlifReorderFormalNames( vTokens, pGate, Mio_GateReadTwin(pGate) ) )
{
sprintf( p->pMan->sError, "Line %d: Mismatch in the fanins of gate \"%s\".", Io_MvGetLine(p->pMan, pName), (char*)vTokens->pArray[1] );
return 0;
@@ -2141,6 +2141,8 @@ static int Io_MvParseLineGateBlif( Io_MvMod_t * p, Vec_Ptr_t * vTokens )
// remove the formal parameter names
for ( i = 2; i < vTokens->nSize; i++ )
{
+ if ( vTokens->pArray[i] == NULL )
+ continue;
vTokens->pArray[i] = Io_ReadBlifCleanName( (char *)vTokens->pArray[i] );
if ( vTokens->pArray[i] == NULL )
{
@@ -2150,12 +2152,30 @@ static int Io_MvParseLineGateBlif( Io_MvMod_t * p, Vec_Ptr_t * vTokens )
}
// create the node
- ppNames = (char **)vTokens->pArray + 2;
- nNames = vTokens->nSize - 3;
- pNode = Io_ReadCreateNode( p->pNtk, ppNames[nNames], ppNames, nNames );
+ if ( Mio_GateReadTwin(pGate) == NULL )
+ {
+ nNames = vTokens->nSize - 3;
+ ppNames = (char **)vTokens->pArray + 2;
+ pNode = Io_ReadCreateNode( p->pNtk, ppNames[nNames], ppNames, nNames );
+ Abc_ObjSetData( pNode, pGate );
+ }
+ else
+ {
+ nNames = vTokens->nSize - 4;
+ ppNames = (char **)vTokens->pArray + 2;
+ assert( ppNames[nNames] != NULL || ppNames[nNames+1] != NULL );
+ if ( ppNames[nNames] )
+ {
+ pNode = Io_ReadCreateNode( p->pNtk, ppNames[nNames], ppNames, nNames );
+ Abc_ObjSetData( pNode, pGate );
+ }
+ if ( ppNames[nNames+1] )
+ {
+ pNode = Io_ReadCreateNode( p->pNtk, ppNames[nNames+1], ppNames, nNames );
+ Abc_ObjSetData( pNode, Mio_GateReadTwin(pGate) );
+ }
+ }
- // set the pointer to the functionality of the node
- Abc_ObjSetData( pNode, pGate );
return 1;
}