summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2014-11-24 15:15:45 -0800
committerAlan Mishchenko <alanmi@berkeley.edu>2014-11-24 15:15:45 -0800
commit3368b2dda9d96918b5fd98a2f5ec6da1fe54c775 (patch)
tree6cbfc03e8831a2d2b14e53e1572fdaff5fa117f1
parentdf83fb5e0470cb54eb75dee47d629ee7b276b88c (diff)
downloadabc-3368b2dda9d96918b5fd98a2f5ec6da1fe54c775.tar.gz
abc-3368b2dda9d96918b5fd98a2f5ec6da1fe54c775.tar.bz2
abc-3368b2dda9d96918b5fd98a2f5ec6da1fe54c775.zip
Improvements to handling boxes and flops.
-rw-r--r--src/aig/gia/gia.h8
-rw-r--r--src/aig/gia/giaIf.c7
-rw-r--r--src/aig/gia/giaSweep.c234
-rw-r--r--src/aig/gia/giaTim.c60
-rw-r--r--src/base/abci/abc.c83
5 files changed, 319 insertions, 73 deletions
diff --git a/src/aig/gia/gia.h b/src/aig/gia/gia.h
index a8750afa..11496219 100644
--- a/src/aig/gia/gia.h
+++ b/src/aig/gia/gia.h
@@ -1317,7 +1317,8 @@ extern Gia_Man_t * Gia_ManSpeedup( Gia_Man_t * p, int Percentage, int De
extern void Gia_ManStgPrint( FILE * pFile, Vec_Int_t * vLines, int nIns, int nOuts, int nStates );
extern Gia_Man_t * Gia_ManStgRead( char * pFileName, int kHot, int fVerbose );
/*=== giaSweep.c ============================================================*/
-extern Gia_Man_t * Gia_ManFraigSweep( Gia_Man_t * p, void * pPars );
+extern Gia_Man_t * Gia_ManFraigSweepSimple( Gia_Man_t * p, void * pPars );
+extern Gia_Man_t * Gia_ManSweepWithBoxes( Gia_Man_t * p, void * pParsC, void * pParsS, int fConst, int fEquiv, int fVerbose );
/*=== giaSweeper.c ============================================================*/
extern Gia_Man_t * Gia_SweeperStart( Gia_Man_t * p );
extern void Gia_SweeperStop( Gia_Man_t * p );
@@ -1349,6 +1350,7 @@ extern Vec_Int_t * Gia_ManComputeSwitchProbs( Gia_Man_t * pGia, int nFra
extern Vec_Flt_t * Gia_ManPrintOutputProb( Gia_Man_t * p );
/*=== giaTim.c ===========================================================*/
extern int Gia_ManBoxNum( Gia_Man_t * p );
+extern int Gia_ManRegBoxNum( Gia_Man_t * p );
extern int Gia_ManIsSeqWithBoxes( Gia_Man_t * p );
extern int Gia_ManIsNormalized( Gia_Man_t * p );
extern Gia_Man_t * Gia_ManDupNormalize( Gia_Man_t * p );
@@ -1360,8 +1362,8 @@ extern void * Gia_ManUpdateTimMan( Gia_Man_t * p, Vec_Int_t * vBoxP
extern void * Gia_ManUpdateTimMan2( Gia_Man_t * p, Vec_Int_t * vBoxesLeft );
extern Gia_Man_t * Gia_ManUpdateExtraAig( void * pTime, Gia_Man_t * pAig, Vec_Int_t * vBoxPres );
extern Gia_Man_t * Gia_ManUpdateExtraAig2( void * pTime, Gia_Man_t * pAig, Vec_Int_t * vBoxesLeft );
-extern Gia_Man_t * Gia_ManDupCollapse( Gia_Man_t * p, Gia_Man_t * pBoxes, Vec_Int_t * vBoxPres );
-extern int Gia_ManVerifyWithBoxes( Gia_Man_t * pGia, void * pParsInit, char * pFileSpec );
+extern Gia_Man_t * Gia_ManDupCollapse( Gia_Man_t * p, Gia_Man_t * pBoxes, Vec_Int_t * vBoxPres, int fSeq );
+extern int Gia_ManVerifyWithBoxes( Gia_Man_t * pGia, int nBTLimit, int nTimeLim, int fSeq, int fVerbose, char * pFileSpec );
/*=== giaTruth.c ===========================================================*/
extern word Gia_ObjComputeTruthTable6Lut( Gia_Man_t * p, int iObj, Vec_Wrd_t * vTemp );
extern word Gia_ObjComputeTruthTable6( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t * vSupp, Vec_Wrd_t * vTruths );
diff --git a/src/aig/gia/giaIf.c b/src/aig/gia/giaIf.c
index 7b9c0a4a..8440b2ab 100644
--- a/src/aig/gia/giaIf.c
+++ b/src/aig/gia/giaIf.c
@@ -1885,9 +1885,10 @@ void Gia_ManTransferTiming( Gia_Man_t * p, Gia_Man_t * pGia )
{
if ( pGia->pManTime == NULL || p == pGia )
return;
- p->pManTime = pGia->pManTime; pGia->pManTime = NULL;
- p->pAigExtra = pGia->pAigExtra; pGia->pAigExtra = NULL;
- p->nAnd2Delay = pGia->nAnd2Delay; pGia->nAnd2Delay = 0;
+ p->pManTime = pGia->pManTime; pGia->pManTime = NULL;
+ p->pAigExtra = pGia->pAigExtra; pGia->pAigExtra = NULL;
+ p->vRegClasses = pGia->vRegClasses; pGia->vRegClasses = NULL;
+ p->nAnd2Delay = pGia->nAnd2Delay; pGia->nAnd2Delay = 0;
}
/**Function*************************************************************
diff --git a/src/aig/gia/giaSweep.c b/src/aig/gia/giaSweep.c
index 0094de88..2a51bf83 100644
--- a/src/aig/gia/giaSweep.c
+++ b/src/aig/gia/giaSweep.c
@@ -21,6 +21,8 @@
#include "gia.h"
#include "giaAig.h"
#include "proof/dch/dch.h"
+#include "misc/tim/tim.h"
+#include "proof/cec/cec.h"
ABC_NAMESPACE_IMPL_START
@@ -36,6 +38,160 @@ ABC_NAMESPACE_IMPL_START
Synopsis [Mark GIA nodes that feed into POs.]
+ Description [Returns the array of classes of remaining registers.]
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Gia_ManMarkSeqGiaWithBoxes_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t * vRoots )
+{
+ Tim_Man_t * pManTime = (Tim_Man_t *)p->pManTime;
+ int i, iBox, nBoxIns, nBoxOuts, iShift, nRealCis;
+ if ( Gia_ObjIsTravIdCurrent(p, pObj) )
+ return;
+ Gia_ObjSetTravIdCurrent(p, pObj);
+ if ( Gia_ObjIsAnd(pObj) )
+ {
+ Gia_ManMarkSeqGiaWithBoxes_rec( p, Gia_ObjFanin0(pObj), vRoots );
+ Gia_ManMarkSeqGiaWithBoxes_rec( p, Gia_ObjFanin1(pObj), vRoots );
+ return;
+ }
+ assert( Gia_ObjIsCi(pObj) );
+ nRealCis = Tim_ManPiNum(pManTime);
+ if ( Gia_ObjCioId(pObj) < nRealCis )
+ {
+ int nRegs = Gia_ManRegBoxNum(p);
+ int iFlop = Gia_ObjCioId(pObj) - (nRealCis - nRegs);
+ assert( iFlop >= 0 && iFlop < nRegs );
+ pObj = Gia_ManCo( p, Tim_ManPoNum(pManTime) - nRegs + iFlop );
+ Vec_IntPush( vRoots, Gia_ObjId(p, pObj) );
+ return;
+ }
+ // get the box
+ iBox = Tim_ManBoxForCi( pManTime, Gia_ObjCioId(pObj) );
+ nBoxIns = Tim_ManBoxInputNum(pManTime, iBox);
+ nBoxOuts = Tim_ManBoxOutputNum(pManTime, iBox);
+ // mark all outputs
+ iShift = Tim_ManBoxOutputFirst(pManTime, iBox);
+ for ( i = 0; i < nBoxOuts; i++ )
+ Gia_ObjSetTravIdCurrent(p, Gia_ManCi(p, iShift + i));
+ // traverse from inputs
+ iShift = Tim_ManBoxInputFirst(pManTime, iBox);
+ for ( i = 0; i < nBoxIns; i++ )
+ Gia_ObjSetTravIdCurrent(p, Gia_ManCo(p, iShift + i));
+ for ( i = 0; i < nBoxIns; i++ )
+ Gia_ManMarkSeqGiaWithBoxes_rec( p, Gia_ObjFanin0(Gia_ManCo(p, iShift + i)), vRoots );
+}
+void Gia_ManMarkSeqGiaWithBoxes( Gia_Man_t * p, int fSeq )
+{
+ // CI order: real PIs + flop outputs + box outputs
+ // CO order: box inputs + real POs + flop inputs
+ Tim_Man_t * pManTime = (Tim_Man_t *)p->pManTime;
+ Vec_Int_t * vRoots;
+ Gia_Obj_t * pObj;
+ int nRealCis = Tim_ManPiNum(pManTime);
+ int nRealCos = Tim_ManPoNum(pManTime);
+ int i, nRegs = fSeq ? Gia_ManRegBoxNum(p) : 0;
+ assert( Gia_ManRegNum(p) == 0 );
+ assert( Gia_ManBoxNum(p) > 0 );
+ // mark the terminals
+ Gia_ManIncrementTravId( p );
+ Gia_ObjSetTravIdCurrent( p, Gia_ManConst0(p) );
+ for ( i = 0; i < nRealCis - nRegs; i++ )
+ Gia_ObjSetTravIdCurrent( p, Gia_ManPi(p, i) );
+ // collect flops reachable from the POs
+ vRoots = Vec_IntAlloc( Gia_ManRegBoxNum(p) );
+ for ( i = Gia_ManPoNum(p) - nRealCos; i < Gia_ManPoNum(p) - nRegs; i++ )
+ Gia_ManMarkSeqGiaWithBoxes_rec( p, Gia_ObjFanin0(Gia_ManPo(p, i)), vRoots );
+ // collect flops reachable from roots
+ if ( fSeq )
+ Gia_ManForEachObjVec( vRoots, p, pObj, i )
+ {
+ assert( Gia_ObjIsCo(pObj) );
+ Gia_ManMarkSeqGiaWithBoxes_rec( p, Gia_ObjFanin0(pObj), vRoots );
+ }
+ Vec_IntFree( vRoots );
+}
+Gia_Man_t * Gia_ManDupWithBoxes( Gia_Man_t * p, int fSeq )
+{
+ Tim_Man_t * pManTime = (Tim_Man_t *)p->pManTime;
+ Gia_Man_t * pNew;
+ Gia_Obj_t * pObj;
+ Vec_Int_t * vBoxesLeft;
+ int curCi, curCo, nBoxIns, nBoxOuts;
+ int i, k, iShift, nMarked;
+ assert( Gia_ManBoxNum(p) > 0 );
+ assert( Gia_ManRegBoxNum(p) > 0 );
+ // mark useful boxes
+ Gia_ManMarkSeqGiaWithBoxes( p, fSeq );
+ // duplicate marked entries
+ pNew = Gia_ManStart( Gia_ManObjNum(p) );
+ pNew->pName = Abc_UtilStrsav( p->pName );
+ pNew->pSpec = Abc_UtilStrsav( p->pSpec );
+ Gia_ManConst0(p)->Value = 0;
+ Gia_ManForEachObj1( p, pObj, i )
+ {
+ if ( !Gia_ObjIsTravIdCurrent(p, pObj) )
+ continue;
+ if ( Gia_ObjIsCi(pObj) )
+ pObj->Value = Gia_ManAppendCi(pNew);
+ else if ( Gia_ObjIsAnd(pObj) )
+ pObj->Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
+ else if ( Gia_ObjIsCo(pObj) )
+ pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
+ else assert( 0 );
+ }
+ assert( !Gia_ManHasDangling(p) );
+ // collect remaining flops
+ if ( fSeq )
+ {
+ pNew->vRegClasses = Vec_IntAlloc( Gia_ManRegBoxNum(p) );
+ iShift = Gia_ManPoNum(p) - Gia_ManRegBoxNum(p);
+ for ( i = 0; i < Gia_ManRegBoxNum(p); i++ )
+ if ( Gia_ObjIsTravIdCurrent(p, Gia_ManCo(p, iShift + i)) )
+ Vec_IntPush( pNew->vRegClasses, Vec_IntEntry(p->vRegClasses, i) );
+ }
+ else if ( p->vRegClasses )
+ pNew->vRegClasses = Vec_IntDup( p->vRegClasses );
+ // collect remaining boxes
+ vBoxesLeft = Vec_IntAlloc( Gia_ManBoxNum(p) );
+ curCi = Tim_ManPiNum(pManTime);
+ curCo = 0;
+ for ( i = 0; i < Gia_ManBoxNum(p); i++ )
+ {
+ nBoxIns = Tim_ManBoxInputNum(pManTime, i);
+ nBoxOuts = Tim_ManBoxOutputNum(pManTime, i);
+ nMarked = 0;
+ for ( k = 0; k < nBoxIns; k++ )
+ nMarked += Gia_ObjIsTravIdCurrent( p, Gia_ManCo(p, curCo + k) );
+ for ( k = 0; k < nBoxOuts; k++ )
+ nMarked += Gia_ObjIsTravIdCurrent( p, Gia_ManCi(p, curCi + k) );
+ curCo += nBoxIns;
+ curCi += nBoxOuts;
+ // check presence
+ assert( nMarked == 0 || nMarked == nBoxIns + nBoxOuts );
+ if ( nMarked )
+ Vec_IntPush( vBoxesLeft, i );
+ }
+ curCo += Tim_ManPoNum(pManTime);
+ assert( curCi == Gia_ManCiNum(p) );
+ assert( curCo == Gia_ManCoNum(p) );
+ // update timing manager
+ pNew->pManTime = Gia_ManUpdateTimMan2( p, vBoxesLeft );
+ // update extra STG
+ assert( p->pAigExtra != NULL );
+ assert( pNew->pAigExtra == NULL );
+ pNew->pAigExtra = Gia_ManUpdateExtraAig2( p->pManTime, p->pAigExtra, vBoxesLeft );
+ Vec_IntFree( vBoxesLeft );
+ return pNew;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Mark GIA nodes that feed into POs.]
+
Description []
SideEffects []
@@ -215,11 +371,17 @@ int * Gia_ManFraigSelectReprs( Gia_Man_t * p, Gia_Man_t * pGia, int fVerbose )
int i, iLitGia, iLitGia2, iReprGia, fCompl;
int nConsts = 0, nReprs = 0;
pGia2Abc[0] = 0;
+ Gia_ManCleanMark0( p );
+ Gia_ManForEachCo( p, pObj, i )
+ if ( Gia_ObjIsCi(Gia_ObjFanin0(pObj)) ) // this CI is pointed by CO
+ Gia_ObjFanin0(pObj)->fMark0 = 1;
Gia_ManSetPhase( pGia );
Gia_ManForEachObj1( p, pObj, i )
{
if ( Gia_ObjIsCo(pObj) )
continue;
+ if ( Gia_ObjIsCi(pObj) && pObj->fMark0 ) // skip CI pointed by CO
+ continue;
assert( Gia_ObjIsCi(pObj) || Gia_ObjIsAnd(pObj) );
iLitGia = Gia_ObjValue(pObj);
if ( iLitGia == -1 )
@@ -243,6 +405,8 @@ int * Gia_ManFraigSelectReprs( Gia_Man_t * p, Gia_Man_t * pGia, int fVerbose )
}
}
ABC_FREE( pGia2Abc );
+ Gia_ManForEachCo( p, pObj, i )
+ Gia_ObjFanin0(pObj)->fMark0 = 0;
if ( fVerbose )
printf( "Found %d const reprs and %d other reprs.\n", nConsts, nReprs );
return pReprs;
@@ -271,6 +435,29 @@ void Gia_ManFraigSweepPerform( Gia_Man_t * p, void * pPars )
/**Function*************************************************************
+ Synopsis []
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+Gia_Man_t * Gia_ManFraigSweepSimple( Gia_Man_t * p, void * pPars )
+{
+ Gia_Man_t * pNew;
+ assert( p->pManTime == NULL || Gia_ManBoxNum(p) == 0 );
+ Gia_ManFraigSweepPerform( p, pPars );
+ pNew = Gia_ManEquivReduce( p, 1, 0, 0, 0 );
+ if ( pNew == NULL )
+ pNew = Gia_ManDup(p);
+ Gia_ManTransferTiming( pNew, p );
+ return pNew;
+}
+
+/**Function*************************************************************
+
Synopsis [Reduces root model with scorr.]
Description []
@@ -280,59 +467,42 @@ void Gia_ManFraigSweepPerform( Gia_Man_t * p, void * pPars )
SeeAlso []
***********************************************************************/
-Gia_Man_t * Gia_ManFraigSweep( Gia_Man_t * p, void * pPars )
+Gia_Man_t * Gia_ManSweepWithBoxes( Gia_Man_t * p, void * pParsC, void * pParsS, int fConst, int fEquiv, int fVerbose )
{
Gia_Man_t * pGia, * pNew, * pTemp;
int * pReprs;
assert( Gia_ManRegNum(p) == 0 );
- if ( p->pManTime == NULL )
- {
- Gia_ManFraigSweepPerform( p, pPars );
- pNew = Gia_ManEquivReduce( p, 1, 0, 0, 0 );
- if ( pNew == NULL )
- return Gia_ManDup(p);
- return pNew;
- }
- if ( p->pAigExtra == NULL )
- {
- printf( "Timing manager is given but there is no GIA of boxes.\n" );
- return NULL;
- }
+ assert( p->pAigExtra != NULL );
// order AIG objects
pNew = Gia_ManDupUnnormalize( p );
if ( pNew == NULL )
return NULL;
+ Gia_ManTransferTiming( pNew, p );
// find global equivalences
- pNew->pManTime = p->pManTime;
- pGia = Gia_ManDupCollapse( pNew, p->pAigExtra, NULL );
- pNew->pManTime = NULL;
- Gia_ManFraigSweepPerform( pGia, pPars );
+ pGia = Gia_ManDupCollapse( pNew, p->pAigExtra, NULL, pParsC ? 0 : 1 );
+ Gia_ManTransferTiming( pGia, pNew );
+ // compute equivalences
+ if ( pParsC )
+ Gia_ManFraigSweepPerform( pGia, pParsC );
+ else if ( pParsS )
+ Cec_ManLSCorrespondenceClasses( pGia, (Cec_ParCor_t *)pParsS );
+ else
+ Gia_ManSeqCleanupClasses( pGia, fConst, fEquiv, fVerbose );
// transfer equivalences
- pReprs = Gia_ManFraigSelectReprs( pNew, pGia, ((Dch_Pars_t *)pPars)->fVerbose );
+ pReprs = Gia_ManFraigSelectReprs( pNew, pGia, fVerbose );
Gia_ManStop( pGia );
// reduce AIG
pNew = Gia_ManFraigReduceGia( pTemp = pNew, pReprs );
+ Gia_ManTransferTiming( pNew, pTemp );
Gia_ManStop( pTemp );
ABC_FREE( pReprs );
// derive new AIG
- assert( pNew->pManTime == NULL );
- assert( pNew->pAigExtra == NULL );
- pNew->pManTime = p->pManTime;
- pNew->pAigExtra = p->pAigExtra;
- pNew->nAnd2Delay = p->nAnd2Delay;
- pNew = Gia_ManFraigCreateGia( pTemp = pNew );
- assert( pTemp->pManTime == p->pManTime );
- assert( pTemp->pAigExtra == p->pAigExtra );
- pTemp->pManTime = NULL;
- pTemp->pAigExtra = NULL;
+ pNew = Gia_ManDupWithBoxes( pTemp = pNew, pParsC ? 0 : 1 );
Gia_ManStop( pTemp );
// normalize the result
pNew = Gia_ManDupNormalize( pTemp = pNew );
Gia_ManTransferTiming( pNew, pTemp );
Gia_ManStop( pTemp );
- // return the result
- assert( pNew->pManTime != NULL );
- assert( pNew->pAigExtra != NULL );
return pNew;
}
diff --git a/src/aig/gia/giaTim.c b/src/aig/gia/giaTim.c
index 5640baa4..6e3c5d64 100644
--- a/src/aig/gia/giaTim.c
+++ b/src/aig/gia/giaTim.c
@@ -19,8 +19,10 @@
***********************************************************************/
#include "gia.h"
+#include "giaAig.h"
#include "misc/tim/tim.h"
#include "proof/cec/cec.h"
+#include "proof/fra/fra.h"
ABC_NAMESPACE_IMPL_START
@@ -48,6 +50,10 @@ int Gia_ManBoxNum( Gia_Man_t * p )
{
return p->pManTime ? Tim_ManBoxNum((Tim_Man_t *)p->pManTime) : 0;
}
+int Gia_ManRegBoxNum( Gia_Man_t * p )
+{
+ return p->vRegClasses ? Vec_IntSize(p->vRegClasses) : 0;
+}
/**Function*************************************************************
@@ -701,13 +707,14 @@ void Gia_ManDupCollapse_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Gia_Man_t * pNew )
if ( Gia_ObjSibl(p, Gia_ObjId(p, pObj)) )
pNew->pSibls[Abc_Lit2Var(pObj->Value)] = Abc_Lit2Var(Gia_ObjSiblObj(p, Gia_ObjId(p, pObj))->Value);
}
-Gia_Man_t * Gia_ManDupCollapse( Gia_Man_t * p, Gia_Man_t * pBoxes, Vec_Int_t * vBoxPres )
+Gia_Man_t * Gia_ManDupCollapse( Gia_Man_t * p, Gia_Man_t * pBoxes, Vec_Int_t * vBoxPres, int fSeq )
{
// this procedure assumes that sequential AIG with boxes is unshuffled to have valid boxes
Tim_Man_t * pManTime = (Tim_Man_t *)p->pManTime;
Gia_Man_t * pNew, * pTemp;
Gia_Obj_t * pObj, * pObjBox;
int i, k, curCi, curCo;
+ assert( !fSeq || p->vRegClasses );
//assert( Gia_ManRegNum(p) == 0 );
assert( Gia_ManCiNum(p) == Tim_ManPiNum(pManTime) + Gia_ManCoNum(pBoxes) );
pNew = Gia_ManStart( Gia_ManObjNum(p) );
@@ -790,7 +797,7 @@ Gia_Man_t * Gia_ManDupCollapse( Gia_Man_t * p, Gia_Man_t * pBoxes, Vec_Int_t * v
// verify counts
assert( curCi == Gia_ManCiNum(p) );
assert( curCo == Gia_ManCoNum(p) );
- Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
+ Gia_ManSetRegNum( pNew, (fSeq && p->vRegClasses) ? Vec_IntSize(p->vRegClasses) : Gia_ManRegNum(p) );
Gia_ManHashStop( pNew );
pNew = Gia_ManCleanup( pTemp = pNew );
Gia_ManCleanupRemap( p, pTemp );
@@ -811,9 +818,8 @@ Gia_Man_t * Gia_ManDupCollapse( Gia_Man_t * p, Gia_Man_t * pBoxes, Vec_Int_t * v
SeeAlso []
***********************************************************************/
-int Gia_ManVerifyWithBoxes( Gia_Man_t * pGia, void * pParsInit, char * pFileSpec )
+int Gia_ManVerifyWithBoxes( Gia_Man_t * pGia, int nBTLimit, int nTimeLim, int fSeq, int fVerbose, char * pFileSpec )
{
- int fVerbose = 1;
int Status = -1;
Gia_Man_t * pSpec, * pGia0, * pGia1, * pMiter;
Vec_Int_t * vBoxPres = NULL;
@@ -866,28 +872,48 @@ int Gia_ManVerifyWithBoxes( Gia_Man_t * pGia, void * pParsInit, char * pFileSpec
}
// collapse two designs
if ( Gia_ManBoxNum(pSpec) > 0 )
- pGia0 = Gia_ManDupCollapse( pSpec, pSpec->pAigExtra, vBoxPres );
+ pGia0 = Gia_ManDupCollapse( pSpec, pSpec->pAigExtra, vBoxPres, fSeq );
else
pGia0 = Gia_ManDup( pSpec );
if ( Gia_ManBoxNum(pGia) > 0 )
- pGia1 = Gia_ManDupCollapse( pGia, pGia->pAigExtra, NULL );
+ pGia1 = Gia_ManDupCollapse( pGia, pGia->pAigExtra, NULL, fSeq );
else
pGia1 = Gia_ManDup( pGia );
Vec_IntFreeP( &vBoxPres );
}
// compute the miter
- pMiter = Gia_ManMiter( pGia0, pGia1, 0, 1, 0, 0, fVerbose );
- if ( pMiter )
+ if ( fSeq )
+ {
+ pMiter = Gia_ManMiter( pGia0, pGia1, 0, 0, 1, 0, fVerbose );
+ if ( pMiter )
+ {
+ Aig_Man_t * pMan;
+ Fra_Sec_t SecPar, * pSecPar = &SecPar;
+ Fra_SecSetDefaultParams( pSecPar );
+ pSecPar->nBTLimit = nBTLimit;
+ pSecPar->TimeLimit = nTimeLim;
+ pSecPar->fVerbose = fVerbose;
+ pMan = Gia_ManToAig( pMiter, 0 );
+ Gia_ManStop( pMiter );
+ Status = Fra_FraigSec( pMan, pSecPar, NULL );
+ Aig_ManStop( pMan );
+ }
+ }
+ else
{
- Cec_ParCec_t ParsCec, * pPars = &ParsCec;
- Cec_ManCecSetDefaultParams( pPars );
- pPars->fVerbose = fVerbose;
- if ( pParsInit )
- memcpy( pPars, pParsInit, sizeof(Cec_ParCec_t) );
- Status = Cec_ManVerify( pMiter, pPars );
- Gia_ManStop( pMiter );
- if ( pPars->iOutFail >= 0 )
- Abc_Print( 1, "Verification failed for at least one output (%d).\n", pPars->iOutFail );
+ pMiter = Gia_ManMiter( pGia0, pGia1, 0, 1, 0, 0, fVerbose );
+ if ( pMiter )
+ {
+ Cec_ParCec_t ParsCec, * pPars = &ParsCec;
+ Cec_ManCecSetDefaultParams( pPars );
+ pPars->nBTLimit = nBTLimit;
+ pPars->TimeLimit = nTimeLim;
+ pPars->fVerbose = fVerbose;
+ Status = Cec_ManVerify( pMiter, pPars );
+ if ( pPars->iOutFail >= 0 )
+ Abc_Print( 1, "Verification failed for at least one output (%d).\n", pPars->iOutFail );
+ Gia_ManStop( pMiter );
+ }
}
Gia_ManStop( pGia0 );
Gia_ManStop( pGia1 );
diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c
index e97613b7..1e914309 100644
--- a/src/base/abci/abc.c
+++ b/src/base/abci/abc.c
@@ -20534,7 +20534,6 @@ int Abc_CommandDSec( Abc_Frame_t * pAbc, int argc, char ** argv )
int c;
int fIgnoreNames;
- extern void Fra_SecSetDefaultParams( Fra_Sec_t * p );
extern int Abc_NtkDarSec( Abc_Ntk_t * pNtk1, Abc_Ntk_t * pNtk2, Fra_Sec_t * p );
pNtk = Abc_FrameReadNtk(pAbc);
@@ -26544,12 +26543,12 @@ int Abc_CommandAbc9Strash( Abc_Frame_t * pAbc, int argc, char ** argv )
{
Gia_Man_t * pUnshuffled = Gia_ManDupUnshuffleInputs( pAbc->pGia );
Gia_ManTransferTiming( pUnshuffled, pAbc->pGia );
- pTemp = Gia_ManDupCollapse( pUnshuffled, pUnshuffled->pAigExtra, NULL );
+ pTemp = Gia_ManDupCollapse( pUnshuffled, pUnshuffled->pAigExtra, NULL, 0 );
Gia_ManTransferTiming( pAbc->pGia, pUnshuffled );
Gia_ManStop( pUnshuffled );
}
else
- pTemp = Gia_ManDupCollapse( pAbc->pGia, pAbc->pGia->pAigExtra, NULL );
+ pTemp = Gia_ManDupCollapse( pAbc->pGia, pAbc->pGia->pAigExtra, NULL, 0 );
if ( !Abc_FrameReadFlag("silentmode") )
printf( "Collapsed AIG with boxes and logic of the boxes.\n" );
}
@@ -29424,6 +29423,22 @@ int Abc_CommandAbc9Scl( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print( -1, "Abc_CommandAbc9Scl(): There is no AIG.\n" );
return 1;
}
+ if ( Gia_ManBoxNum(pAbc->pGia) && Gia_ManRegBoxNum(pAbc->pGia) )
+ {
+ if ( pAbc->pGia->pAigExtra == NULL )
+ {
+ printf( "Timing manager is given but there is no GIA of boxes.\n" );
+ return 0;
+ }
+ pTemp = Gia_ManSweepWithBoxes( pAbc->pGia, NULL, NULL, fConst, fEquiv, fVerbose );
+ Abc_FrameUpdateGia( pAbc, pTemp );
+ return 0;
+ }
+ if ( Gia_ManRegNum(pAbc->pGia) == 0 )
+ {
+ Abc_Print( -1, "The network is combinational.\n" );
+ return 0;
+ }
pTemp = Gia_ManSeqStructSweep( pAbc->pGia, fConst, fEquiv, fVerbose );
Abc_FrameUpdateGia( pAbc, pTemp );
return 0;
@@ -29512,6 +29527,17 @@ int Abc_CommandAbc9Lcorr( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print( -1, "Abc_CommandAbc9Lcorr(): There is no AIG.\n" );
return 1;
}
+ if ( Gia_ManBoxNum(pAbc->pGia) && Gia_ManRegBoxNum(pAbc->pGia) )
+ {
+ if ( pAbc->pGia->pAigExtra == NULL )
+ {
+ printf( "Timing manager is given but there is no GIA of boxes.\n" );
+ return 0;
+ }
+ pTemp = Gia_ManSweepWithBoxes( pAbc->pGia, NULL, pPars, 0, 0, pPars->fVerbose );
+ Abc_FrameUpdateGia( pAbc, pTemp );
+ return 0;
+ }
if ( Gia_ManRegNum(pAbc->pGia) == 0 )
{
Abc_Print( -1, "The network is combinational.\n" );
@@ -29619,6 +29645,17 @@ int Abc_CommandAbc9Scorr( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print( -1, "Abc_CommandAbc9Scorr(): There is no AIG.\n" );
return 1;
}
+ if ( Gia_ManBoxNum(pAbc->pGia) && Gia_ManRegBoxNum(pAbc->pGia) )
+ {
+ if ( pAbc->pGia->pAigExtra == NULL )
+ {
+ printf( "Timing manager is given but there is no GIA of boxes.\n" );
+ return 0;
+ }
+ pTemp = Gia_ManSweepWithBoxes( pAbc->pGia, NULL, pPars, 0, 0, pPars->fVerbose );
+ Abc_FrameUpdateGia( pAbc, pTemp );
+ return 0;
+ }
if ( Gia_ManRegNum(pAbc->pGia) == 0 )
{
Abc_Print( -1, "The network is combinational.\n" );
@@ -30735,11 +30772,9 @@ usage:
int Abc_CommandAbc9Verify( Abc_Frame_t * pAbc, int argc, char ** argv )
{
char * pFileSpec = NULL;
- Cec_ParCec_t ParsCec, * pPars = &ParsCec;
- int c;
- Cec_ManCecSetDefaultParams( pPars );
+ int c, nBTLimit = 1000, nTimeLim = 0, fSeq = 0, fVerbose = 0;
Extra_UtilGetoptReset();
- while ( ( c = Extra_UtilGetopt( argc, argv, "CTvh" ) ) != EOF )
+ while ( ( c = Extra_UtilGetopt( argc, argv, "CTsvh" ) ) != EOF )
{
switch ( c )
{
@@ -30749,9 +30784,9 @@ int Abc_CommandAbc9Verify( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print( -1, "Command line switch \"-C\" should be followed by an integer.\n" );
goto usage;
}
- pPars->nBTLimit = atoi(argv[globalUtilOptind]);
+ nBTLimit = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
- if ( pPars->nBTLimit < 0 )
+ if ( nBTLimit < 0 )
goto usage;
break;
case 'T':
@@ -30760,13 +30795,16 @@ int Abc_CommandAbc9Verify( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print( -1, "Command line switch \"-T\" should be followed by an integer.\n" );
goto usage;
}
- pPars->TimeLimit = atoi(argv[globalUtilOptind]);
+ nTimeLim = atoi(argv[globalUtilOptind]);
globalUtilOptind++;
- if ( pPars->TimeLimit < 0 )
+ if ( nTimeLim < 0 )
goto usage;
break;
+ case 's':
+ fSeq ^= 1;
+ break;
case 'v':
- pPars->fVerbose ^= 1;
+ fVerbose ^= 1;
break;
case 'h':
goto usage;
@@ -30780,15 +30818,16 @@ int Abc_CommandAbc9Verify( Abc_Frame_t * pAbc, int argc, char ** argv )
Extra_FileNameCorrectPath( pFileSpec );
printf( "Taking spec from file \"%s\".\n", pFileSpec );
}
- Gia_ManVerifyWithBoxes( pAbc->pGia, pPars, pFileSpec );
+ Gia_ManVerifyWithBoxes( pAbc->pGia, nBTLimit, nTimeLim, fSeq, fVerbose, pFileSpec );
return 0;
usage:
- Abc_Print( -2, "usage: &verify [-CT num] [-vh] <file>\n" );
+ Abc_Print( -2, "usage: &verify [-CT num] [-svh] <file>\n" );
Abc_Print( -2, "\t performs verification of combinational design\n" );
- Abc_Print( -2, "\t-C num : the max number of conflicts at a node [default = %d]\n", pPars->nBTLimit );
- Abc_Print( -2, "\t-T num : approximate runtime limit in seconds [default = %d]\n", pPars->TimeLimit );
- Abc_Print( -2, "\t-v : toggle verbose output [default = %s]\n", pPars->fVerbose? "yes":"no");
+ Abc_Print( -2, "\t-C num : the max number of conflicts at a node [default = %d]\n", nBTLimit );
+ Abc_Print( -2, "\t-T num : approximate runtime limit in seconds [default = %d]\n", nTimeLim );
+ Abc_Print( -2, "\t-s : toggle using sequential verification [default = %s]\n", fSeq? "yes":"no");
+ Abc_Print( -2, "\t-v : toggle verbose output [default = %s]\n", fVerbose? "yes":"no");
Abc_Print( -2, "\t-h : print the command usage\n");
Abc_Print( -2, "\t<file> : optional file name with the spec [default = not used\n" );
return 1;
@@ -30876,7 +30915,15 @@ int Abc_CommandAbc9Sweep( Abc_Frame_t * pAbc, int argc, char ** argv )
Abc_Print( -1, "Abc_CommandAbc9Sweep(): There is no AIG.\n" );
return 1;
}
- pTemp = Gia_ManFraigSweep( pAbc->pGia, pPars );
+ if ( Gia_ManBoxNum(pAbc->pGia) && pAbc->pGia->pAigExtra == NULL )
+ {
+ printf( "Timing manager is given but there is no GIA of boxes.\n" );
+ return 0;
+ }
+ if ( Gia_ManBoxNum(pAbc->pGia) )
+ pTemp = Gia_ManSweepWithBoxes( pAbc->pGia, pPars, NULL, 0, 0, pPars->fVerbose );
+ else
+ pTemp = Gia_ManFraigSweepSimple( pAbc->pGia, pPars );
Abc_FrameUpdateGia( pAbc, pTemp );
return 0;