mirror of https://github.com/YosysHQ/abc.git
219 lines
6.6 KiB
C
219 lines
6.6 KiB
C
/**CFile****************************************************************
|
|
|
|
FileName [llb1Man.c]
|
|
|
|
SystemName [ABC: Logic synthesis and verification system.]
|
|
|
|
PackageName [BDD based reachability.]
|
|
|
|
Synopsis [Reachability manager.]
|
|
|
|
Author [Alan Mishchenko]
|
|
|
|
Affiliation [UC Berkeley]
|
|
|
|
Date [Ver. 1.0. Started - June 20, 2005.]
|
|
|
|
Revision [$Id: llb1Man.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 []
|
|
|
|
***********************************************************************/
|
|
void Llb_ManPrepareVarMap( Llb_Man_t * p )
|
|
{
|
|
Aig_Obj_t * pObjLi, * pObjLo;
|
|
int i, iVarLi, iVarLo;
|
|
assert( p->vNs2Glo == NULL );
|
|
assert( p->vCs2Glo == NULL );
|
|
assert( p->vGlo2Cs == NULL );
|
|
assert( p->vGlo2Ns == NULL );
|
|
p->vNs2Glo = Vec_IntStartFull( Vec_IntSize(p->vVar2Obj) );
|
|
p->vCs2Glo = Vec_IntStartFull( Vec_IntSize(p->vVar2Obj) );
|
|
p->vGlo2Cs = Vec_IntStartFull( Aig_ManRegNum(p->pAig) );
|
|
p->vGlo2Ns = Vec_IntStartFull( Aig_ManRegNum(p->pAig) );
|
|
Saig_ManForEachLiLo( p->pAig, pObjLi, pObjLo, i )
|
|
{
|
|
iVarLi = Vec_IntEntry(p->vObj2Var, Aig_ObjId(pObjLi));
|
|
iVarLo = Vec_IntEntry(p->vObj2Var, Aig_ObjId(pObjLo));
|
|
assert( iVarLi >= 0 && iVarLi < Vec_IntSize(p->vVar2Obj) );
|
|
assert( iVarLo >= 0 && iVarLo < Vec_IntSize(p->vVar2Obj) );
|
|
Vec_IntWriteEntry( p->vNs2Glo, iVarLi, i );
|
|
Vec_IntWriteEntry( p->vCs2Glo, iVarLo, i );
|
|
Vec_IntWriteEntry( p->vGlo2Cs, i, iVarLo );
|
|
Vec_IntWriteEntry( p->vGlo2Ns, i, iVarLi );
|
|
}
|
|
// add mapping of the PIs
|
|
Saig_ManForEachPi( p->pAig, pObjLo, i )
|
|
{
|
|
iVarLo = Vec_IntEntry(p->vObj2Var, Aig_ObjId(pObjLo));
|
|
Vec_IntWriteEntry( p->vCs2Glo, iVarLo, Aig_ManRegNum(p->pAig)+i );
|
|
Vec_IntWriteEntry( p->vNs2Glo, iVarLo, Aig_ManRegNum(p->pAig)+i );
|
|
}
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Llb_ManPrepareVarLimits( Llb_Man_t * p )
|
|
{
|
|
Llb_Grp_t * pGroup;
|
|
Aig_Obj_t * pVar;
|
|
int i, k;
|
|
assert( p->vVarBegs == NULL );
|
|
assert( p->vVarEnds == NULL );
|
|
p->vVarEnds = Vec_IntStart( Aig_ManObjNumMax(p->pAig) );
|
|
p->vVarBegs = Vec_IntStart( Aig_ManObjNumMax(p->pAig) );
|
|
Vec_IntFill( p->vVarBegs, Aig_ManObjNumMax(p->pAig), p->pMatrix->nCols );
|
|
|
|
for ( i = 0; i < p->pMatrix->nCols; i++ )
|
|
{
|
|
pGroup = p->pMatrix->pColGrps[i];
|
|
|
|
Vec_PtrForEachEntry( Aig_Obj_t *, pGroup->vIns, pVar, k )
|
|
if ( Vec_IntEntry(p->vVarBegs, pVar->Id) > i )
|
|
Vec_IntWriteEntry( p->vVarBegs, pVar->Id, i );
|
|
Vec_PtrForEachEntry( Aig_Obj_t *, pGroup->vOuts, pVar, k )
|
|
if ( Vec_IntEntry(p->vVarBegs, pVar->Id) > i )
|
|
Vec_IntWriteEntry( p->vVarBegs, pVar->Id, i );
|
|
|
|
Vec_PtrForEachEntry( Aig_Obj_t *, pGroup->vIns, pVar, k )
|
|
if ( Vec_IntEntry(p->vVarEnds, pVar->Id) < i )
|
|
Vec_IntWriteEntry( p->vVarEnds, pVar->Id, i );
|
|
Vec_PtrForEachEntry( Aig_Obj_t *, pGroup->vOuts, pVar, k )
|
|
if ( Vec_IntEntry(p->vVarEnds, pVar->Id) < i )
|
|
Vec_IntWriteEntry( p->vVarEnds, pVar->Id, i );
|
|
}
|
|
}
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
void Llb_ManStop( Llb_Man_t * p )
|
|
{
|
|
Llb_Grp_t * pGrp;
|
|
DdNode * bTemp;
|
|
int i;
|
|
|
|
// Vec_IntFreeP( &p->vMem );
|
|
// Vec_PtrFreeP( &p->vTops );
|
|
// Vec_PtrFreeP( &p->vBots );
|
|
// Vec_VecFreeP( (Vec_Vec_t **)&p->vCuts );
|
|
|
|
if ( p->pMatrix )
|
|
Llb_MtrFree( p->pMatrix );
|
|
Vec_PtrForEachEntry( Llb_Grp_t *, p->vGroups, pGrp, i )
|
|
Llb_ManGroupStop( pGrp );
|
|
if ( p->dd )
|
|
{
|
|
// printf( "Manager dd\n" );
|
|
Extra_StopManager( p->dd );
|
|
}
|
|
if ( p->ddG )
|
|
{
|
|
// printf( "Manager ddG\n" );
|
|
if ( p->ddG->bFunc )
|
|
Cudd_RecursiveDeref( p->ddG, p->ddG->bFunc );
|
|
Extra_StopManager( p->ddG );
|
|
}
|
|
if ( p->ddR )
|
|
{
|
|
// printf( "Manager ddR\n" );
|
|
if ( p->ddR->bFunc )
|
|
Cudd_RecursiveDeref( p->ddR, p->ddR->bFunc );
|
|
Vec_PtrForEachEntry( DdNode *, p->vRings, bTemp, i )
|
|
Cudd_RecursiveDeref( p->ddR, bTemp );
|
|
Extra_StopManager( p->ddR );
|
|
}
|
|
Aig_ManStop( p->pAig );
|
|
Vec_PtrFreeP( &p->vGroups );
|
|
Vec_IntFreeP( &p->vVar2Obj );
|
|
Vec_IntFreeP( &p->vObj2Var );
|
|
Vec_IntFreeP( &p->vVarBegs );
|
|
Vec_IntFreeP( &p->vVarEnds );
|
|
Vec_PtrFreeP( &p->vRings );
|
|
Vec_IntFreeP( &p->vNs2Glo );
|
|
Vec_IntFreeP( &p->vCs2Glo );
|
|
Vec_IntFreeP( &p->vGlo2Cs );
|
|
Vec_IntFreeP( &p->vGlo2Ns );
|
|
// Vec_IntFreeP( &p->vHints );
|
|
ABC_FREE( p );
|
|
}
|
|
|
|
|
|
/**Function*************************************************************
|
|
|
|
Synopsis []
|
|
|
|
Description []
|
|
|
|
SideEffects []
|
|
|
|
SeeAlso []
|
|
|
|
***********************************************************************/
|
|
Llb_Man_t * Llb_ManStart( Aig_Man_t * pAigGlo, Aig_Man_t * pAig, Gia_ParLlb_t * pPars )
|
|
{
|
|
Llb_Man_t * p;
|
|
Aig_ManCleanMarkA( pAig );
|
|
p = ABC_CALLOC( Llb_Man_t, 1 );
|
|
p->pAigGlo = pAigGlo;
|
|
p->pPars = pPars;
|
|
p->pAig = pAig;
|
|
p->vVar2Obj = Llb_ManMarkPivotNodes( p->pAig, pPars->fUsePivots );
|
|
p->vObj2Var = Vec_IntInvert( p->vVar2Obj, -1 );
|
|
p->vRings = Vec_PtrAlloc( 100 );
|
|
Llb_ManPrepareVarMap( p );
|
|
Llb_ManPrepareGroups( p );
|
|
Aig_ManCleanMarkA( pAig );
|
|
p->pMatrix = Llb_MtrCreate( p );
|
|
p->pMatrix->pMan = p;
|
|
return p;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
/// END OF FILE ///
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
ABC_NAMESPACE_IMPL_END
|
|
|