36static DdNode * Abc_NtkTransitionRelation( DdManager * dd,
Abc_Ntk_t * pNtk,
int fVerbose );
37static DdNode * Abc_NtkInitStateAndVarMap( DdManager * dd,
Abc_Ntk_t * pNtk,
int fVerbose );
38static DdNode * Abc_NtkComputeUnreachable( DdManager * dd,
Abc_Ntk_t * pNtk, DdNode * bRelation, DdNode * bInitial,
int fVerbose );
39static Abc_Ntk_t * Abc_NtkConstructExdc ( DdManager * dd,
Abc_Ntk_t * pNtk, DdNode * bUnreach );
60 DdNode * bRelation, * bInitial, * bUnreach;
74 printf(
"Shared BDD size = %6d nodes.\n", Cudd_ReadKeys(dd) - Cudd_ReadDead(dd) );
77 bRelation = Abc_NtkTransitionRelation( dd, pNtk, fVerbose ); Cudd_Ref( bRelation );
79 bInitial = Abc_NtkInitStateAndVarMap( dd, pNtk, fVerbose ); Cudd_Ref( bInitial );
81 bUnreach = Abc_NtkComputeUnreachable( dd, pNtk, bRelation, bInitial, fVerbose ); Cudd_Ref( bUnreach );
82 Cudd_RecursiveDeref( dd, bRelation );
83 Cudd_RecursiveDeref( dd, bInitial );
89 fprintf( stdout,
"BDD nodes in the unreachable states before reordering %d.\n", Cudd_DagSize(bUnreach) );
90 Cudd_ReduceHeap( dd, CUDD_REORDER_SYMM_SIFT, 1 );
91 Cudd_AutodynDisable( dd );
93 fprintf( stdout,
"BDD nodes in the unreachable states after reordering %d.\n", Cudd_DagSize(bUnreach) );
97 Cudd_zddVarsFromBddVars( dd, 2 );
101 pNtk->
pExdc = Abc_NtkConstructExdc( dd, pNtk, bUnreach );
102 Cudd_RecursiveDeref( dd, bUnreach );
109 printf(
"Abc_NtkExtractSequentialDcs: The network check has failed.\n" );
127DdNode * Abc_NtkTransitionRelation( DdManager * dd,
Abc_Ntk_t * pNtk,
int fVerbose )
129 DdNode * bRel, * bTemp, * bProd, * bVar, * bInputs;
135 assert( dd->size == Abc_NtkCiNum(pNtk) );
136 Cudd_bddIthVar( dd, Abc_NtkCiNum(pNtk) + Abc_NtkLatchNum(pNtk) - 1 );
140 Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT );
142 Cudd_AutodynDisable( dd );
145 bRel =
b1; Cudd_Ref( bRel );
148 bVar = Cudd_bddIthVar( dd, Abc_NtkCiNum(pNtk) + i );
150 bProd = Cudd_bddXnor( dd, bVar, (DdNode *)Abc_ObjGlobalBdd(Abc_ObjFanin0(pNode)) ); Cudd_Ref( bProd );
151 bRel = Cudd_bddAnd( dd, bTemp = bRel, bProd ); Cudd_Ref( bRel );
152 Cudd_RecursiveDeref( dd, bTemp );
153 Cudd_RecursiveDeref( dd, bProd );
161 bRel = Cudd_bddExistAbstract( dd, bTemp = bRel, bInputs ); Cudd_Ref( bRel );
162 Cudd_RecursiveDeref( dd, bTemp );
163 Cudd_RecursiveDeref( dd, bInputs );
169 fprintf( stdout,
"BDD nodes in the transition relation before reordering %d.\n", Cudd_DagSize(bRel) );
170 Cudd_ReduceHeap( dd, CUDD_REORDER_SYMM_SIFT, 100 );
171 Cudd_AutodynDisable( dd );
173 fprintf( stdout,
"BDD nodes in the transition relation after reordering %d.\n", Cudd_DagSize(bRel) );
190DdNode * Abc_NtkInitStateAndVarMap( DdManager * dd,
Abc_Ntk_t * pNtk,
int fVerbose )
192 DdNode ** pbVarsX, ** pbVarsY;
193 DdNode * bTemp, * bProd, * bVar;
198 pbVarsX =
ABC_ALLOC( DdNode *, dd->size );
199 pbVarsY =
ABC_ALLOC( DdNode *, dd->size );
200 bProd =
b1; Cudd_Ref( bProd );
203 pbVarsX[i] = dd->vars[ Abc_NtkPiNum(pNtk) + i ];
204 pbVarsY[i] = dd->vars[ Abc_NtkCiNum(pNtk) + i ];
206 bVar = Cudd_NotCond( pbVarsX[i], !Abc_LatchIsInit1(pLatch) );
207 bProd = Cudd_bddAnd( dd, bTemp = bProd, bVar ); Cudd_Ref( bProd );
208 Cudd_RecursiveDeref( dd, bTemp );
210 Cudd_SetVarMap( dd, pbVarsX, pbVarsY, Abc_NtkLatchNum(pNtk) );
229DdNode * Abc_NtkComputeUnreachable( DdManager * dd,
Abc_Ntk_t * pNtk, DdNode * bTrans, DdNode * bInitial,
int fVerbose )
231 DdNode * bRelation, * bReached, * bCubeCs;
232 DdNode * bCurrent, * bNext, * bTemp;
236 bCurrent = bInitial; Cudd_Ref( bCurrent );
237 bReached = bInitial; Cudd_Ref( bReached );
238 bRelation = bTrans; Cudd_Ref( bRelation );
240 for ( nIters = 1; ; nIters++ )
243 bNext = Cudd_bddAndAbstract( dd, bRelation, bCurrent, bCubeCs ); Cudd_Ref( bNext );
244 Cudd_RecursiveDeref( dd, bCurrent );
246 bNext = Cudd_bddVarMap( dd, bTemp = bNext ); Cudd_Ref( bNext );
247 Cudd_RecursiveDeref( dd, bTemp );
249 if ( Cudd_bddLeq( dd, bNext, bReached ) )
252 bCurrent = Cudd_bddAnd( dd, bNext, Cudd_Not(bReached) ); Cudd_Ref( bCurrent );
257 bReached = Cudd_bddOr( dd, bTemp = bReached, bNext ); Cudd_Ref( bReached );
258 Cudd_RecursiveDeref( dd, bTemp );
259 Cudd_RecursiveDeref( dd, bNext );
264 Cudd_RecursiveDeref( dd, bRelation );
265 Cudd_RecursiveDeref( dd, bCubeCs );
266 Cudd_RecursiveDeref( dd, bNext );
270 nMints = (int)Cudd_CountMinterm(dd, bReached, Abc_NtkLatchNum(pNtk) );
271 fprintf( stdout,
"Reachability analysis completed in %d iterations.\n", nIters );
272 fprintf( stdout,
"The number of minterms in the reachable state set = %d. (%6.2f %%)\n", nMints, 100.0*nMints/(1<<Abc_NtkLatchNum(pNtk)) );
275 Cudd_Deref( bReached );
276 return Cudd_Not( bReached );
290Abc_Ntk_t * Abc_NtkConstructExdc( DdManager * dd,
Abc_Ntk_t * pNtk, DdNode * bUnreach )
300 pNtkNew->
pSpec = NULL;
308 pNodeNew = Abc_NtkCreateNode(pNtkNew);
315 for ( i = 0; i < dd->size; i++ )
318 pPermute[Abc_NtkPiNum(pNtk) + i] = i;
326 if ( !Abc_ObjIsCi(Abc_ObjFanin0(pNode)) )
333 if ( !Abc_ObjIsCi(Abc_ObjFanin0(pNode)) )
347 printf(
"Abc_NtkConstructExdc(): Converting to SOPs has failed.\n" );
ABC_NAMESPACE_IMPL_START int Abc_NtkExtractSequentialDcs(Abc_Ntk_t *pNtk, int fVerbose)
DECLARATIONS ///.
struct Abc_Obj_t_ Abc_Obj_t
ABC_DLL Abc_Ntk_t * Abc_NtkAlloc(Abc_NtkType_t Type, Abc_NtkFunc_t Func, int fUseMemMan)
DECLARATIONS ///.
ABC_DLL void Abc_ObjAddFanin(Abc_Obj_t *pObj, Abc_Obj_t *pFanin)
#define Abc_NtkForEachPo(pNtk, pPo, i)
#define Abc_NtkForEachLatch(pNtk, pObj, i)
ABC_DLL int Abc_NtkCheck(Abc_Ntk_t *pNtk)
FUNCTION DEFINITIONS ///.
struct Abc_Aig_t_ Abc_Aig_t
ABC_DLL char * Abc_ObjName(Abc_Obj_t *pNode)
DECLARATIONS ///.
struct Abc_Ntk_t_ Abc_Ntk_t
ABC_DLL char * Abc_ObjAssignName(Abc_Obj_t *pObj, char *pName, char *pSuffix)
ABC_DLL void * Abc_NtkFreeGlobalBdds(Abc_Ntk_t *pNtk, int fFreeMan)
#define Abc_NtkForEachLatchOutput(pNtk, pObj, i)
ABC_DLL int Abc_NtkLogicMakeSimpleCos(Abc_Ntk_t *pNtk, int fDuplicate)
ABC_DLL int Abc_AigCleanup(Abc_Aig_t *pMan)
#define Abc_NtkForEachLatchInput(pNtk, pObj, i)
ABC_DLL void * Abc_NtkBuildGlobalBdds(Abc_Ntk_t *pNtk, int fBddSizeMax, int fDropInternal, int fReorder, int fReverse, int fVerbose)
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
ABC_DLL int Abc_NtkBddToSop(Abc_Ntk_t *pNtk, int fMode, int nCubeLimit, int fCubeSort)
ABC_DLL int Abc_NodeMinimumBase(Abc_Obj_t *pNode)
#define ABC_ALLOC(type, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END