summaryrefslogtreecommitdiffstats
path: root/src/aig/gia/giaAbs.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2011-10-27 14:20:47 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2011-10-27 14:20:47 -0700
commitbc81cf2dae1ab28a04285ee77825728ba3751f29 (patch)
tree9397d63542c4b51969323ef7858b4956838a5d28 /src/aig/gia/giaAbs.c
parent1dcdba1bee240fe8621f1ad67a093c47a2a852ae (diff)
downloadabc-bc81cf2dae1ab28a04285ee77825728ba3751f29.tar.gz
abc-bc81cf2dae1ab28a04285ee77825728ba3751f29.tar.bz2
abc-bc81cf2dae1ab28a04285ee77825728ba3751f29.zip
Improvements to the new abstraction code.
Diffstat (limited to 'src/aig/gia/giaAbs.c')
-rw-r--r--src/aig/gia/giaAbs.c77
1 files changed, 59 insertions, 18 deletions
diff --git a/src/aig/gia/giaAbs.c b/src/aig/gia/giaAbs.c
index 54b65484..2432bdbf 100644
--- a/src/aig/gia/giaAbs.c
+++ b/src/aig/gia/giaAbs.c
@@ -379,25 +379,29 @@ int Gia_ManPbaPerform( Gia_Man_t * pGia, int nStart, int nFrames, int nConfLimit
***********************************************************************/
int Gia_ManGlaCbaPerform( Gia_Man_t * pGia, void * pPars, int fNaiveCnf )
{
- extern Vec_Int_t * Aig_Gla1ManTest( Aig_Man_t * pAig, int nFramesMax, int nConfLimit, int TimeLimit, int fNaiveCnf, int fVerbose );
+ extern Vec_Int_t * Aig_Gla1ManTest( Aig_Man_t * pAig, Vec_Int_t * vGateClassesOld, int nStart, int nFramesMax, int nConfLimit, int TimeLimit, int fNaiveCnf, int fVerbose );
Saig_ParBmc_t * p = (Saig_ParBmc_t *)pPars;
- Vec_Int_t * vGateClasses;
+ Vec_Int_t * vGateClasses, * vGateClassesOld = NULL;
Aig_Man_t * pAig;
-/*
+
// check if flop classes are given
if ( pGia->vGateClasses == NULL )
+ Abc_Print( 0, "Initial gate map is not given. Abstraction begins from scratch.\n" );
+ else
{
- Abc_Print( 0, "Initial gate map is not given. Trivial abstraction is assumed.\n" );
- pGia->vGateClasses = Vec_IntStart( Gia_ManObjNum(pGia) );
+ Abc_Print( 0, "Initial gate map is given. Abstraction refines this map.\n" );
+ vGateClassesOld = pGia->vGateClasses; pGia->vGateClasses = NULL;
+ fNaiveCnf = 1;
}
-*/
+
// perform abstraction
pAig = Gia_ManToAigSimple( pGia );
- vGateClasses = Aig_Gla1ManTest( pAig, p->nFramesMax, p->nConfLimit, p->nTimeOut, fNaiveCnf, p->fVerbose );
+ assert( vGateClassesOld == NULL || Vec_IntSize(vGateClassesOld) == Aig_ManObjNumMax(pAig) );
+ vGateClasses = Aig_Gla1ManTest( pAig, vGateClassesOld, p->nStart, p->nFramesMax, p->nConfLimit, p->nTimeOut, fNaiveCnf, p->fVerbose );
Aig_ManStop( pAig );
// update the map
- Vec_IntFreeP( &pGia->vGateClasses );
+ Vec_IntFreeP( &vGateClassesOld );
pGia->vGateClasses = vGateClasses;
return 1;
}
@@ -415,26 +419,63 @@ int Gia_ManGlaCbaPerform( Gia_Man_t * pGia, void * pPars, int fNaiveCnf )
***********************************************************************/
int Gia_ManGlaPbaPerform( Gia_Man_t * pGia, void * pPars )
{
- extern Vec_Int_t * Aig_Gla2ManTest( Aig_Man_t * pAig, int nFramesMax, int nConfLimit, int TimeLimit, int fVerbose );
+ extern Vec_Int_t * Aig_Gla2ManTest( Aig_Man_t * pAig, int nStart, int nFramesMax, int nConfLimit, int TimeLimit, int fVerbose );
Saig_ParBmc_t * p = (Saig_ParBmc_t *)pPars;
Vec_Int_t * vGateClasses;
Aig_Man_t * pAig;
-/*
+
// check if flop classes are given
if ( pGia->vGateClasses == NULL )
{
- Abc_Print( 0, "Initial gate map is not given. Trivial abstraction is assumed.\n" );
- pGia->vGateClasses = Vec_IntStart( Gia_ManObjNum(pGia) );
+ Abc_Print( 0, "Initial gate map is not given. Abstraction begins from scratch.\n" );
+ pAig = Gia_ManToAigSimple( pGia );
}
-*/
+ else
+ {
+ Gia_Man_t * pGiaAbs;
+ Abc_Print( 0, "Initial gate map is given. Abstraction refines this map.\n" );
+ pGiaAbs = Gia_ManDupAbsGates( pGia, pGia->vGateClasses );
+ pAig = Gia_ManToAigSimple( pGiaAbs );
+ Gia_ManStop( pGiaAbs );
+ }
+
// perform abstraction
- pAig = Gia_ManToAigSimple( pGia );
- vGateClasses = Aig_Gla2ManTest( pAig, p->nFramesMax, p->nConfLimit, p->nTimeOut, p->fVerbose );
+ vGateClasses = Aig_Gla2ManTest( pAig, p->nStart, p->nFramesMax, p->nConfLimit, p->nTimeOut, p->fVerbose );
Aig_ManStop( pAig );
- // update the map
- Vec_IntFreeP( &pGia->vGateClasses );
- pGia->vGateClasses = vGateClasses;
+ // update the BMC depth
+ if ( vGateClasses )
+ p->iFrame = p->nFramesMax;
+
+ // update the abstraction map (hint: AIG and GIA have one-to-one obj ID match)
+ if ( pGia->vGateClasses && vGateClasses )
+ {
+ Gia_Obj_t * pObj;
+ int i, Counter = 0;
+ Gia_ManForEachObj1( pGia, pObj, i )
+ {
+ if ( !~pObj->Value )
+ continue;
+ if ( !Vec_IntEntry(pGia->vGateClasses, i) )
+ continue;
+ // this obj was abstracted before
+ assert( Gia_ObjIsAnd(pObj) || Gia_ObjIsRo(pGia, pObj) );
+ // if corresponding AIG object is not abstracted, remove abstraction
+ if ( !Vec_IntEntry(vGateClasses, Gia_Lit2Var(pObj->Value)) )
+ {
+ Vec_IntWriteEntry( pGia->vGateClasses, i, 0 );
+ Counter++;
+ }
+ }
+ Vec_IntFree( vGateClasses );
+ if ( p->fVerbose )
+ Abc_Print( 1, "Repetition of abstraction removed %d entries from the old abstraction map.\n", Counter );
+ }
+ else
+ {
+ Vec_IntFreeP( &pGia->vGateClasses );
+ pGia->vGateClasses = vGateClasses;
+ }
return 1;
}