summaryrefslogtreecommitdiffstats
path: root/src/base/io/ioReadBlifMv.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2011-12-21 12:56:28 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2011-12-21 12:56:28 -0800
commitb3c9609e822afeb5758ca2c756e42810ed83d86a (patch)
tree50933151597e92ffdedc84cf18d0bf972a30bda7 /src/base/io/ioReadBlifMv.c
parent3418a8820a4928d1b825001ec4c5c17a5ab2caba (diff)
downloadabc-b3c9609e822afeb5758ca2c756e42810ed83d86a.tar.gz
abc-b3c9609e822afeb5758ca2c756e42810ed83d86a.tar.bz2
abc-b3c9609e822afeb5758ca2c756e42810ed83d86a.zip
Improvements to hierarchical BLIF parser.
Diffstat (limited to 'src/base/io/ioReadBlifMv.c')
-rw-r--r--src/base/io/ioReadBlifMv.c41
1 files changed, 34 insertions, 7 deletions
diff --git a/src/base/io/ioReadBlifMv.c b/src/base/io/ioReadBlifMv.c
index edf68ad6..10a18ac8 100644
--- a/src/base/io/ioReadBlifMv.c
+++ b/src/base/io/ioReadBlifMv.c
@@ -30,6 +30,7 @@ ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
#define IO_BLIFMV_MAXVALUES 256
+#define IO_VERBOSE_OUTPUT
typedef struct Io_MvVar_t_ Io_MvVar_t; // parsing var
typedef struct Io_MvMod_t_ Io_MvMod_t; // parsing model
@@ -735,6 +736,12 @@ static int Io_MvReadInterfaces( Io_MvMan_t * p )
Vec_PtrForEachEntry( char *, pMod->vLtlProperties, pLine, k )
if ( !Io_MvParseLineLtlProperty( pMod, pLine ) )
return 0;
+ // report the results
+#ifdef IO_VERBOSE_OUTPUT
+ printf( "Parsed %-32s: PI =%6d PO =%6d ND =%8d FF =%6d B =%6d\n",
+ pMod->pNtk->pName, Abc_NtkPiNum(pMod->pNtk), Abc_NtkPoNum(pMod->pNtk),
+ Vec_PtrSize(pMod->vNames), Vec_PtrSize(pMod->vLatches), Vec_PtrSize(pMod->vSubckts) );
+#endif
}
return 1;
}
@@ -760,6 +767,10 @@ static Abc_Lib_t * Io_MvParse( Io_MvMan_t * p )
// iterate through the models
Vec_PtrForEachEntry( Io_MvMod_t *, p->vModels, pMod, i )
{
+#ifdef IO_VERBOSE_OUTPUT
+printf( "Parsing model %s...\n", pMod->pNtk->pName );
+#endif
+
// check if there any MV lines
if ( Vec_PtrSize(pMod->vMvs) > 0 )
Abc_NtkStartMvVars( pMod->pNtk );
@@ -1191,14 +1202,15 @@ static int Io_MvParseLineSubckt( Io_MvMod_t * p, char * pLine )
Vec_Ptr_t * vTokens = p->pMan->vTokens;
Abc_Ntk_t * pModel;
Abc_Obj_t * pBox, * pNet, * pTerm;
- char * pToken, * pName, ** ppNames;
- int nEquals, i, k;
+ char * pToken, * pName, * pName2, ** ppNames;
+ int nEquals, Last, i, k;
// split the line into tokens
nEquals = Io_MvCountChars( pLine, '=' );
Io_MvSplitIntoTokensAndClear( vTokens, pLine, '\0', '=' );
pToken = (char *)Vec_PtrEntry(vTokens,0);
assert( !strcmp(pToken, "subckt") );
+//printf( "%d ", nEquals );
// get the model for this box
pName = (char *)Vec_PtrEntry(vTokens,1);
@@ -1237,13 +1249,19 @@ static int Io_MvParseLineSubckt( Io_MvMod_t * p, char * pLine )
if ( p->pMan->fBlifMv )
Abc_ObjAssignName( pBox, (char *)Vec_PtrEntry(vTokens,2), NULL );
// go through formal inputs
+ Last = 0;
Abc_NtkForEachPi( pModel, pTerm, i )
{
// find this terminal among the actual inputs of the subcircuit
+ pName2 = NULL;
pName = Abc_ObjName(Abc_ObjFanout0(pTerm));
for ( k = 0; k < nEquals; k++ )
- if ( !strcmp( ppNames[2*k], pName ) )
+ if ( !strcmp( ppNames[2*((k+Last)%nEquals)], pName ) )
+ {
+ pName2 = ppNames[2*((k+Last)%nEquals)+1];
+ Last = k+Last+1;
break;
+ }
/*
if ( k == nEquals )
{
@@ -1263,21 +1281,28 @@ static int Io_MvParseLineSubckt( Io_MvMod_t * p, char * pLine )
Abc_ObjAddFanin( pTerm, pNet );
continue;
}
-
+ assert( pName2 != NULL );
+
// create the BI with the actual name
- pNet = Abc_NtkFindOrCreateNet( p->pNtk, ppNames[2*k+1] );
+ pNet = Abc_NtkFindOrCreateNet( p->pNtk, pName2 );
pTerm = Abc_NtkCreateBi( p->pNtk );
Abc_ObjAddFanin( pBox, pTerm );
Abc_ObjAddFanin( pTerm, pNet );
}
// go through formal outputs
+ Last = 0;
Abc_NtkForEachPo( pModel, pTerm, i )
{
// find this terminal among the actual outputs of the subcircuit
+ pName2 = NULL;
pName = Abc_ObjName(Abc_ObjFanin0(pTerm));
for ( k = 0; k < nEquals; k++ )
- if ( !strcmp( ppNames[2*k], pName ) )
+ if ( !strcmp( ppNames[2*((k+Last)%nEquals)], pName ) )
+ {
+ pName2 = ppNames[2*((k+Last)%nEquals)+1];
+ Last = k+Last+1;
break;
+ }
/*
if ( k == nEquals )
{
@@ -1286,9 +1311,11 @@ static int Io_MvParseLineSubckt( Io_MvMod_t * p, char * pLine )
return 0;
}
*/
+ assert( pName2 != NULL );
+
// create the BI with the actual name
pTerm = Abc_NtkCreateBo( p->pNtk );
- pNet = Abc_NtkFindOrCreateNet( p->pNtk, k == nEquals ? Abc_ObjNameSuffix(pTerm, "abc") : ppNames[2*k+1] );
+ pNet = Abc_NtkFindOrCreateNet( p->pNtk, k == nEquals ? Abc_ObjNameSuffix(pTerm, "abc") : pName2 );
Abc_ObjAddFanin( pNet, pTerm );
Abc_ObjAddFanin( pTerm, pBox );
}