Commit 0806dd22 by Alan Mishchenko

Updates to the Cba data-structure.

parent e0630f83
...@@ -822,6 +822,7 @@ static inline void Cba_ManPrintStats( Cba_Man_t * p, int nModules, int fVerbose ...@@ -822,6 +822,7 @@ static inline void Cba_ManPrintStats( Cba_Man_t * p, int nModules, int fVerbose
/*=== cbaCba.c ===============================================================*/ /*=== cbaCba.c ===============================================================*/
/*=== cbaCom.c ===============================================================*/ /*=== cbaCom.c ===============================================================*/
/*=== cbaNtk.c ===============================================================*/ /*=== cbaNtk.c ===============================================================*/
extern int Cba_NtkCheckComboLoop( Cba_Ntk_t * p );
extern int Cba_ManIsTopOrder( Cba_Man_t * p, int(* pFuncIsSeq)(Cba_Ntk_t*, int) ); extern int Cba_ManIsTopOrder( Cba_Man_t * p, int(* pFuncIsSeq)(Cba_Ntk_t*, int) );
extern Vec_Int_t * Cba_NtkCollectDfs( Cba_Ntk_t * p ); extern Vec_Int_t * Cba_NtkCollectDfs( Cba_Ntk_t * p );
extern Cba_Man_t * Cba_ManCollapse( Cba_Man_t * p, int TypeBuf ); extern Cba_Man_t * Cba_ManCollapse( Cba_Man_t * p, int TypeBuf );
......
...@@ -28,6 +28,7 @@ ABC_NAMESPACE_IMPL_START ...@@ -28,6 +28,7 @@ ABC_NAMESPACE_IMPL_START
/// DECLARATIONS /// /// DECLARATIONS ///
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
/*
static int Cba_CommandRead ( Abc_Frame_t * pAbc, int argc, char ** argv ); static int Cba_CommandRead ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int Cba_CommandWrite ( Abc_Frame_t * pAbc, int argc, char ** argv ); static int Cba_CommandWrite ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int Cba_CommandPs ( Abc_Frame_t * pAbc, int argc, char ** argv ); static int Cba_CommandPs ( Abc_Frame_t * pAbc, int argc, char ** argv );
...@@ -36,6 +37,7 @@ static int Cba_CommandGet ( Abc_Frame_t * pAbc, int argc, char ** argv ); ...@@ -36,6 +37,7 @@ static int Cba_CommandGet ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int Cba_CommandClp ( Abc_Frame_t * pAbc, int argc, char ** argv ); static int Cba_CommandClp ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int Cba_CommandCec ( Abc_Frame_t * pAbc, int argc, char ** argv ); static int Cba_CommandCec ( Abc_Frame_t * pAbc, int argc, char ** argv );
static int Cba_CommandTest ( Abc_Frame_t * pAbc, int argc, char ** argv ); static int Cba_CommandTest ( Abc_Frame_t * pAbc, int argc, char ** argv );
*/
static inline Cba_Man_t * Cba_AbcGetMan( Abc_Frame_t * pAbc ) { return (Cba_Man_t *)pAbc->pAbcCba; } static inline Cba_Man_t * Cba_AbcGetMan( Abc_Frame_t * pAbc ) { return (Cba_Man_t *)pAbc->pAbcCba; }
static inline void Cba_AbcFreeMan( Abc_Frame_t * pAbc ) { if ( pAbc->pAbcCba ) Cba_ManFree(Cba_AbcGetMan(pAbc)); } static inline void Cba_AbcFreeMan( Abc_Frame_t * pAbc ) { if ( pAbc->pAbcCba ) Cba_ManFree(Cba_AbcGetMan(pAbc)); }
...@@ -58,6 +60,7 @@ static inline void Cba_AbcUpdateMan( Abc_Frame_t * pAbc, Cba_Man_t * p ) ...@@ -58,6 +60,7 @@ static inline void Cba_AbcUpdateMan( Abc_Frame_t * pAbc, Cba_Man_t * p )
******************************************************************************/ ******************************************************************************/
void Cba_Init( Abc_Frame_t * pAbc ) void Cba_Init( Abc_Frame_t * pAbc )
{ {
/*
Cmd_CommandAdd( pAbc, "New word level", "@read", Cba_CommandRead, 0 ); Cmd_CommandAdd( pAbc, "New word level", "@read", Cba_CommandRead, 0 );
Cmd_CommandAdd( pAbc, "New word level", "@write", Cba_CommandWrite, 0 ); Cmd_CommandAdd( pAbc, "New word level", "@write", Cba_CommandWrite, 0 );
Cmd_CommandAdd( pAbc, "New word level", "@ps", Cba_CommandPs, 0 ); Cmd_CommandAdd( pAbc, "New word level", "@ps", Cba_CommandPs, 0 );
...@@ -66,6 +69,7 @@ void Cba_Init( Abc_Frame_t * pAbc ) ...@@ -66,6 +69,7 @@ void Cba_Init( Abc_Frame_t * pAbc )
Cmd_CommandAdd( pAbc, "New word level", "@clp", Cba_CommandClp, 0 ); Cmd_CommandAdd( pAbc, "New word level", "@clp", Cba_CommandClp, 0 );
Cmd_CommandAdd( pAbc, "New word level", "@cec", Cba_CommandCec, 0 ); Cmd_CommandAdd( pAbc, "New word level", "@cec", Cba_CommandCec, 0 );
Cmd_CommandAdd( pAbc, "New word level", "@test", Cba_CommandTest, 0 ); Cmd_CommandAdd( pAbc, "New word level", "@test", Cba_CommandTest, 0 );
*/
} }
/**Function******************************************************************** /**Function********************************************************************
...@@ -85,6 +89,8 @@ void Cba_End( Abc_Frame_t * pAbc ) ...@@ -85,6 +89,8 @@ void Cba_End( Abc_Frame_t * pAbc )
} }
#if 0
/**Function******************************************************************** /**Function********************************************************************
Synopsis [] Synopsis []
...@@ -696,6 +702,8 @@ usage: ...@@ -696,6 +702,8 @@ usage:
return 1; return 1;
} }
#endif
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
/// END OF FILE /// /// END OF FILE ///
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
......
...@@ -84,6 +84,49 @@ int Cba_ManIsTopOrder( Cba_Man_t * p, int(* pFuncIsSeq)(Cba_Ntk_t*, int) ) ...@@ -84,6 +84,49 @@ int Cba_ManIsTopOrder( Cba_Man_t * p, int(* pFuncIsSeq)(Cba_Ntk_t*, int) )
/**Function************************************************************* /**Function*************************************************************
Synopsis [Collects user boxes in the DFS order.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int Cba_NtkCheckComboLoop_rec( Cba_Ntk_t * p, int iObj )
{
int k, iFin, iFanin;
if ( Cba_ObjIsPi(p, iObj) )
return 1;
if ( Cba_ObjCopy(p, iObj) == 1 ) // visited
return 1;
if ( Cba_ObjCopy(p, iObj) == 0 ) // loop
return 0;
Cba_ObjSetCopy( p, iObj, 0 );
Cba_ObjForEachFinFaninReal( p, iObj, iFin, iFanin, k )
// if ( !Clr_NtkObjIsSeq(p, iFanin) )
if ( !Cba_NtkCheckComboLoop_rec( p, iFanin ) )
return 0;
//Cba_ObjSetCopy( p, iObj, 1 );
Vec_IntSetEntry( &p->vObjCopy, iObj, 1 );
return 1;
}
int Cba_NtkCheckComboLoop( Cba_Ntk_t * p )
{
int iObj;
Cba_NtkCleanObjCopies( p ); // -1 = not visited; 0 = on the path; 1 = finished
Cba_NtkForEachBox( p, iObj )
// if ( !Clr_NtkObjIsSeq(p, iObj) )
if ( !Cba_NtkCheckComboLoop_rec( p, iObj ) )
{
printf( "Cyclic dependency of user boxes is detected.\n" );
return 0;
}
return 1;
}
/**Function*************************************************************
Synopsis [Collect nodes in the DFS order.] Synopsis [Collect nodes in the DFS order.]
Description [] Description []
...@@ -585,6 +628,8 @@ void Cba_NtkInsertGroup( Cba_Ntk_t * p, Vec_Int_t * vObjs, Cba_Ntk_t * pSyn ) ...@@ -585,6 +628,8 @@ void Cba_NtkInsertGroup( Cba_Ntk_t * p, Vec_Int_t * vObjs, Cba_Ntk_t * pSyn )
} }
// connect output fons // connect output fons
Cba_NtkCleanFonCopies( p ); Cba_NtkCleanFonCopies( p );
if ( Cba_NtkHasFonNames(p) )
Vec_IntFillExtra( &p->vFonName, Cba_NtkFonNum(p) + 1, 0 );
Cba_NtkForEachPoDriverFon( pSyn, iObj, iFon, k ) Cba_NtkForEachPoDriverFon( pSyn, iObj, iFon, k )
{ {
assert( Cba_FonIsReal(Cba_FonCopy(pSyn, iFon)) ); assert( Cba_FonIsReal(Cba_FonCopy(pSyn, iFon)) );
...@@ -598,27 +643,12 @@ void Cba_NtkInsertGroup( Cba_Ntk_t * p, Vec_Int_t * vObjs, Cba_Ntk_t * pSyn ) ...@@ -598,27 +643,12 @@ void Cba_NtkInsertGroup( Cba_Ntk_t * p, Vec_Int_t * vObjs, Cba_Ntk_t * pSyn )
} }
Vec_IntFree( vFonOuts ); Vec_IntFree( vFonOuts );
// delete nodes // delete nodes
Vec_IntForEachEntry( vObjs, iObj, k ) // Vec_IntForEachEntry( vObjs, iObj, k )
Cba_ObjDelete( p, iObj ); // Cba_ObjDelete( p, iObj );
// update fins pointing to output fons to point to the new fons // update fins pointing to output fons to point to the new fons
if ( Cba_NtkHasFonNames(p) )
Vec_IntFillExtra( &p->vFonName, Cba_NtkFonNum(p) + 1, 0 );
Cba_NtkForEachFinFon( p, iFon, iFin ) Cba_NtkForEachFinFon( p, iFon, iFin )
if ( Cba_FonIsReal(iFon) && Cba_FonCopy(p, iFon) ) if ( Cba_FonIsReal(iFon) && Cba_FonCopy(p, iFon) )
{
Cba_PatchFinFon( p, iFin, Cba_FonCopy(p, iFon) ); Cba_PatchFinFon( p, iFin, Cba_FonCopy(p, iFon) );
/*
if ( Cba_NtkHasFonNames(p) && Cba_FonIsReal(Cba_FonCopy(p, iFon)) )
{
if ( !Cba_FonName(p, Cba_FonCopy(p, iFon)) )
{
Cba_FonSetName( p, Cba_FonCopy(p, iFon), Cba_FonName(p, iFon) );
Cba_FonCleanName( p, iFon );
}
}
*/
}
Cba_NtkMissingFonNames( p, "j" ); Cba_NtkMissingFonNames( p, "j" );
/* /*
// duplicate in DFS order // duplicate in DFS order
...@@ -633,6 +663,8 @@ Cba_Man_t * Cba_ManInsertGroup( Cba_Man_t * p, Vec_Int_t * vObjs, Cba_Ntk_t * pS ...@@ -633,6 +663,8 @@ Cba_Man_t * Cba_ManInsertGroup( Cba_Man_t * p, Vec_Int_t * vObjs, Cba_Ntk_t * pS
{ {
extern Vec_Int_t * Clr_NtkCollectDfs( Cba_Ntk_t * p ); extern Vec_Int_t * Clr_NtkCollectDfs( Cba_Ntk_t * p );
Cba_NtkInsertGroup( Cba_ManRoot(p), vObjs, pSyn ); Cba_NtkInsertGroup( Cba_ManRoot(p), vObjs, pSyn );
// if ( Cba_NtkCheckComboLoop( Cba_ManRoot(p) ) )
// printf( "There is no combo loop!\n" );
return Cba_ManDup( p, Clr_NtkCollectDfs ); return Cba_ManDup( p, Clr_NtkCollectDfs );
} }
......
...@@ -1957,7 +1957,7 @@ static inline void Vec_IntRemapArray( Vec_Int_t * vOld2New, Vec_Int_t * vOld, Ve ...@@ -1957,7 +1957,7 @@ static inline void Vec_IntRemapArray( Vec_Int_t * vOld2New, Vec_Int_t * vOld, Ve
return; return;
Vec_IntFill( vNew, nNew, 0 ); Vec_IntFill( vNew, nNew, 0 );
Vec_IntForEachEntry( vOld2New, iNew, iOld ) Vec_IntForEachEntry( vOld2New, iNew, iOld )
if ( iNew > 0 && iNew < nNew && Vec_IntEntry(vOld, iOld) != 0 ) if ( iNew > 0 && iNew < nNew && iOld < Vec_IntSize(vOld) && Vec_IntEntry(vOld, iOld) != 0 )
Vec_IntWriteEntry( vNew, iNew, Vec_IntEntry(vOld, iOld) ); Vec_IntWriteEntry( vNew, iNew, Vec_IntEntry(vOld, iOld) );
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment