mirror of https://github.com/YosysHQ/abc.git
255 lines
6.5 KiB
C
255 lines
6.5 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [llb1Pivot.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [BDD based reachability.]
|
|
|
|
Synopsis [Determining pivot variables.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
|
|
|
Revision [$Id: llb1Pivot.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
|
|
|
|
***********************************************************************/
|
|
|
|
#include "llbInt.h"
|
|
|
|
ABC_NAMESPACE_IMPL_START
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// DECLARATIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// FUNCTION DEFINITIONS ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Llb_ManTracePaths_rec( Aig_Man_t * p, Aig_Obj_t * pObj, Aig_Obj_t * pPivot )
|
|
{
|
|
Aig_Obj_t * pFanout;
|
|
int k, iFan = -1;
|
|
if ( Aig_ObjIsTravIdPrevious(p, pObj) )
|
|
return 0;
|
|
if ( Aig_ObjIsTravIdCurrent(p, pObj) )
|
|
return 1;
|
|
if ( Saig_ObjIsLi(p, pObj) )
|
|
return 0;
|
|
if ( Saig_ObjIsPo(p, pObj) )
|
|
return 0;
|
|
if ( pObj == pPivot )
|
|
return 1;
|
|
assert( Aig_ObjIsCand(pObj) );
|
|
Aig_ObjForEachFanout( p, pObj, pFanout, iFan, k )
|
|
if ( !Llb_ManTracePaths_rec( p, pFanout, pPivot ) )
|
|
{
|
|
Aig_ObjSetTravIdPrevious(p, pObj);
|
|
return 0;
|
|
}
|
|
Aig_ObjSetTravIdCurrent(p, pObj);
|
|
return 1;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
int Llb_ManTracePaths( Aig_Man_t * p, Aig_Obj_t * pPivot )
|
|
{
|
|
Aig_Obj_t * pObj;
|
|
int i, Counter = 0;
|
|
Aig_ManIncrementTravId( p ); // prev = visited with path to LI (value 0)
|
|
Aig_ManIncrementTravId( p ); // cur = visited w/o path to LI (value 1)
|
|
Saig_ManForEachLo( p, pObj, i )
|
|
Counter += Llb_ManTracePaths_rec( p, pObj, pPivot );
|
|
return Counter;
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Llb_ManTestCuts( Aig_Man_t * p )
|
|
{
|
|
Aig_Obj_t * pObj;
|
|
int i, Count;
|
|
Aig_ManFanoutStart( p );
|
|
Aig_ManForEachNode( p, pObj, i )
|
|
{
|
|
if ( Aig_ObjRefs(pObj) <= 1 )
|
|
continue;
|
|
Count = Llb_ManTracePaths( p, pObj );
|
|
printf( "Obj =%5d. Lev =%3d. Fanout =%5d. Count = %3d.\n",
|
|
i, Aig_ObjLevel(pObj), Aig_ObjRefs(pObj), Count );
|
|
}
|
|
Aig_ManFanoutStop( p );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Llb_ManLabelLiCones_rec( Aig_Man_t * p, Aig_Obj_t * pObj )
|
|
{
|
|
if ( pObj->fMarkB )
|
|
return;
|
|
pObj->fMarkB = 1;
|
|
assert( Aig_ObjIsNode(pObj) );
|
|
Llb_ManLabelLiCones_rec( p, Aig_ObjFanin0(pObj) );
|
|
Llb_ManLabelLiCones_rec( p, Aig_ObjFanin1(pObj) );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Determine starting cut-points.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Llb_ManLabelLiCones( Aig_Man_t * p )
|
|
{
|
|
Aig_Obj_t * pObj;
|
|
int i;
|
|
// mark const and PIs
|
|
Aig_ManConst1(p)->fMarkB = 1;
|
|
Aig_ManForEachCi( p, pObj, i )
|
|
pObj->fMarkB = 1;
|
|
// mark cones
|
|
Saig_ManForEachLi( p, pObj, i )
|
|
Llb_ManLabelLiCones_rec( p, Aig_ObjFanin0(pObj) );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Determine starting cut-points.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Llb_ManMarkInternalPivots( Aig_Man_t * p )
|
|
{
|
|
Vec_Ptr_t * vMuxes;
|
|
Aig_Obj_t * pObj;
|
|
int i, Counter = 0;
|
|
|
|
// remove refs due to MUXes
|
|
vMuxes = Aig_ManMuxesCollect( p );
|
|
Aig_ManMuxesDeref( p, vMuxes );
|
|
|
|
// mark nodes feeding into LIs
|
|
Aig_ManCleanMarkB( p );
|
|
Llb_ManLabelLiCones( p );
|
|
|
|
// mark internal nodes
|
|
Aig_ManFanoutStart( p );
|
|
Aig_ManForEachNode( p, pObj, i )
|
|
if ( pObj->fMarkB && pObj->nRefs > 1 )
|
|
{
|
|
if ( Llb_ManTracePaths(p, pObj) > 0 )
|
|
pObj->fMarkA = 1;
|
|
Counter++;
|
|
}
|
|
Aig_ManFanoutStop( p );
|
|
// printf( "TracePath tried = %d.\n", Counter );
|
|
|
|
// mark nodes feeding into LIs
|
|
Aig_ManCleanMarkB( p );
|
|
|
|
// add refs due to MUXes
|
|
Aig_ManMuxesRef( p, vMuxes );
|
|
Vec_PtrFree( vMuxes );
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis [Determine starting cut-points.]
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Vec_Int_t * Llb_ManMarkPivotNodes( Aig_Man_t * p, int fUseInternal )
|
|
{
|
|
Vec_Int_t * vVar2Obj;
|
|
Aig_Obj_t * pObj;
|
|
int i;
|
|
// mark inputs/outputs
|
|
Aig_ManForEachCi( p, pObj, i )
|
|
pObj->fMarkA = 1;
|
|
Saig_ManForEachLi( p, pObj, i )
|
|
pObj->fMarkA = 1;
|
|
|
|
// mark internal pivot nodes
|
|
if ( fUseInternal )
|
|
Llb_ManMarkInternalPivots( p );
|
|
|
|
// assign variable numbers
|
|
Aig_ManConst1(p)->fMarkA = 0;
|
|
vVar2Obj = Vec_IntAlloc( 100 );
|
|
Aig_ManForEachCi( p, pObj, i )
|
|
Vec_IntPush( vVar2Obj, Aig_ObjId(pObj) );
|
|
Aig_ManForEachNode( p, pObj, i )
|
|
if ( pObj->fMarkA )
|
|
Vec_IntPush( vVar2Obj, Aig_ObjId(pObj) );
|
|
Saig_ManForEachLi( p, pObj, i )
|
|
Vec_IntPush( vVar2Obj, Aig_ObjId(pObj) );
|
|
return vVar2Obj;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|