summaryrefslogtreecommitdiffstats
path: root/src/base/cba/cbaNtk.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/cba/cbaNtk.c')
-rw-r--r--src/base/cba/cbaNtk.c66
1 files changed, 49 insertions, 17 deletions
diff --git a/src/base/cba/cbaNtk.c b/src/base/cba/cbaNtk.c
index 8812cbac..a5491dc2 100644
--- a/src/base/cba/cbaNtk.c
+++ b/src/base/cba/cbaNtk.c
@@ -84,6 +84,49 @@ int Cba_ManIsTopOrder( Cba_Man_t * p, int(* pFuncIsSeq)(Cba_Ntk_t*, int) )
/**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.]
Description []
@@ -585,6 +628,8 @@ void Cba_NtkInsertGroup( Cba_Ntk_t * p, Vec_Int_t * vObjs, Cba_Ntk_t * pSyn )
}
// connect output fons
Cba_NtkCleanFonCopies( p );
+ if ( Cba_NtkHasFonNames(p) )
+ Vec_IntFillExtra( &p->vFonName, Cba_NtkFonNum(p) + 1, 0 );
Cba_NtkForEachPoDriverFon( pSyn, iObj, iFon, k )
{
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 )
}
Vec_IntFree( vFonOuts );
// delete nodes
- Vec_IntForEachEntry( vObjs, iObj, k )
- Cba_ObjDelete( p, iObj );
+// Vec_IntForEachEntry( vObjs, iObj, k )
+// Cba_ObjDelete( p, iObj );
// 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 )
if ( Cba_FonIsReal(iFon) && 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" );
/*
// 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
{
extern Vec_Int_t * Clr_NtkCollectDfs( Cba_Ntk_t * p );
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 );
}