summaryrefslogtreecommitdiffstats
path: root/src/base/io
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2011-07-20 18:23:10 +0700
committerAlan Mishchenko <alanmi@berkeley.edu>2011-07-20 18:23:10 +0700
commitee261ef3f21851ea8aab05c89f81fdab8c3f5c71 (patch)
treefba36e049db605cf3b8f799196f6ddec605d06c8 /src/base/io
parentbb86d9142ebb31d31392c3472d6b49f7989e46b6 (diff)
downloadabc-ee261ef3f21851ea8aab05c89f81fdab8c3f5c71.tar.gz
abc-ee261ef3f21851ea8aab05c89f81fdab8c3f5c71.tar.bz2
abc-ee261ef3f21851ea8aab05c89f81fdab8c3f5c71.zip
Other changes to enable new features in the mapper (bug fix).
Diffstat (limited to 'src/base/io')
-rw-r--r--src/base/io/ioReadBlifMv.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/base/io/ioReadBlifMv.c b/src/base/io/ioReadBlifMv.c
index e41b78b8..8564331d 100644
--- a/src/base/io/ioReadBlifMv.c
+++ b/src/base/io/ioReadBlifMv.c
@@ -120,6 +120,8 @@ static Io_MvVar_t * Abc_NtkMvVarDup( Abc_Ntk_t * pNtk, Io_MvVar_t * pVar );
static int Io_MvCharIsSpace( char s ) { return s == ' ' || s == '\t' || s == '\r' || s == '\n'; }
static int Io_MvCharIsMvSymb( char s ) { return s == '(' || s == ')' || s == '{' || s == '}' || s == '-' || s == ',' || s == '!'; }
+static Vec_Vec_t * Io_MvExtractBoxInfo( Abc_Ntk_t * pNtk );
+
extern void Abc_NtkStartMvVars( Abc_Ntk_t * pNtk );
////////////////////////////////////////////////////////////////////////
@@ -233,6 +235,8 @@ Abc_Ntk_t * Io_ReadBlifMv( char * pFileName, int fBlifMv, int fCheck )
Vec_PtrForEachEntry( char *, vGlobalLtlArray, pLtlProp, i )
Vec_PtrPush( pNtk->vLtlProperties, pLtlProp );
Vec_PtrFreeP( &vGlobalLtlArray );
+
+ pNtk->vRealPos = Io_MvExtractBoxInfo( pNtk );
return pNtk;
}
@@ -2105,6 +2109,106 @@ static int Io_MvParseLineGateBlif( Io_MvMod_t * p, Vec_Ptr_t * vTokens )
return 1;
}
+/**Function*************************************************************
+
+ Synopsis [Box mapping procedures.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+static inline void Abc_MapBoxSetPrevNext( Vec_Ptr_t * vDrivers, Vec_Int_t * vMapIn, Vec_Int_t * vMapOut, int Id )
+{
+ Abc_Obj_t * pNode;
+ pNode = (Abc_Obj_t *)Vec_PtrEntry(vDrivers, Id+2);
+ Vec_IntWriteEntry( vMapIn, Abc_ObjId(Abc_ObjFanin0(Abc_ObjFanin0(pNode))), Id );
+ pNode = (Abc_Obj_t *)Vec_PtrEntry(vDrivers, Id+4);
+ Vec_IntWriteEntry( vMapOut, Abc_ObjId(Abc_ObjFanin0(Abc_ObjFanin0(pNode))), Id );
+}
+static inline int Abc_MapBox2Next( Vec_Ptr_t * vDrivers, Vec_Int_t * vMapIn, Vec_Int_t * vMapOut, int Id )
+{
+ Abc_Obj_t * pNode = (Abc_Obj_t *)Vec_PtrEntry(vDrivers, Id+4);
+ return Vec_IntEntry( vMapIn, Abc_ObjId(Abc_ObjFanin0(Abc_ObjFanin0(pNode))) );
+}
+static inline int Abc_MapBox2Prev( Vec_Ptr_t * vDrivers, Vec_Int_t * vMapIn, Vec_Int_t * vMapOut, int Id )
+{
+ Abc_Obj_t * pNode = (Abc_Obj_t *)Vec_PtrEntry(vDrivers, Id+2);
+ return Vec_IntEntry( vMapOut, Abc_ObjId(Abc_ObjFanin0(Abc_ObjFanin0(pNode))) );
+}
+
+/**Function*************************************************************
+
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+static Vec_Vec_t * Io_MvExtractBoxInfo( Abc_Ntk_t * pNtk )
+{
+ Vec_Int_t * vMapIn, * vMapOut, * vList;
+ Vec_Ptr_t * vBoxInfo, * vDrivers;
+ Abc_Obj_t * pObj;
+ int i, boxId;
+
+ // quit if there is no boxes
+ if ( pNtk->nRealPos == 0 || (Abc_NtkPoNum(pNtk) - pNtk->nRealPos) % 5 != 0 )
+ return NULL;
+
+ // allocate
+ vBoxInfo = Vec_PtrAlloc( 10 );
+ vDrivers = Vec_PtrAlloc( Abc_NtkPoNum(pNtk) );
+ vMapIn = Vec_IntStartFull( Abc_NtkObjNumMax(pNtk) );
+ vMapOut = Vec_IntStartFull( Abc_NtkObjNumMax(pNtk) );
+
+ // collect drivers
+ Abc_NtkForEachPo( pNtk, pObj, i )
+ Vec_PtrPush( vDrivers, Abc_ObjFanin0(Abc_ObjFanin0(pObj)) );
+
+ // map box signals into box numbers
+ for ( i = pNtk->nRealPos; i < Abc_NtkPoNum(pNtk); i += 5 )
+ {
+// int k;
+// for ( k = 0; k < 5; k++ )
+// printf( "%d ", Abc_ObjFanin0(Abc_ObjFanin0(Abc_ObjFanin0(Abc_NtkPo(pNtk,i+k))))->Id );
+// printf( "\n" );
+ Abc_MapBoxSetPrevNext( vDrivers, vMapIn, vMapOut, i );
+ }
+
+ // find those that do not have input mapped
+ for ( i = pNtk->nRealPos; i < Abc_NtkPoNum(pNtk); i += 5 )
+ {
+ if ( Abc_MapBox2Prev( vDrivers, vMapIn, vMapOut, i ) != ~0 )
+ continue;
+ // create new list
+ vList = Vec_IntAlloc( 32 );
+ boxId = i;
+ while ( boxId != ~0 )
+ {
+ Vec_IntPush( vList, boxId );
+ boxId = Abc_MapBox2Next( vDrivers, vMapIn, vMapOut, boxId );
+ }
+ Vec_PtrPush( vBoxInfo, vList );
+//printf( " %d", Vec_IntSize(vList) );
+ }
+//printf( "\n" );
+ if ( 5 * Vec_VecSizeSize((Vec_Vec_t *)vBoxInfo) != (Abc_NtkPoNum(pNtk) - pNtk->nRealPos) )
+ printf( "Mismatch in the number of boxes!!!\n" );
+
+ // clean up
+ Vec_IntFree( vMapIn );
+ Vec_IntFree( vMapOut );
+ Vec_PtrFree( vDrivers );
+ return (Vec_Vec_t *)vBoxInfo;
+}
+
+
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////