summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/aig/gia/gia.h2
-rw-r--r--src/aig/gia/giaMan.c12
-rw-r--r--src/aig/gia/giaMfs.c2
-rw-r--r--src/aig/gia/giaSweep.c145
-rw-r--r--src/aig/gia/giaTim.c4
-rw-r--r--src/misc/tim/tim.h4
-rw-r--r--src/misc/tim/timBox.c32
-rw-r--r--src/misc/tim/timMan.c22
8 files changed, 162 insertions, 61 deletions
diff --git a/src/aig/gia/gia.h b/src/aig/gia/gia.h
index 11496219..1e9bf6ef 100644
--- a/src/aig/gia/gia.h
+++ b/src/aig/gia/gia.h
@@ -1359,7 +1359,7 @@ extern Gia_Man_t * Gia_ManDupUnshuffleInputs( Gia_Man_t * p );
extern int Gia_ManLevelWithBoxes( Gia_Man_t * p );
extern int Gia_ManLutLevelWithBoxes( Gia_Man_t * p );
extern void * Gia_ManUpdateTimMan( Gia_Man_t * p, Vec_Int_t * vBoxPres );
-extern void * Gia_ManUpdateTimMan2( Gia_Man_t * p, Vec_Int_t * vBoxesLeft );
+extern void * Gia_ManUpdateTimMan2( Gia_Man_t * p, Vec_Int_t * vBoxesLeft, int nTermsDiff );
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, int fSeq );
diff --git a/src/aig/gia/giaMan.c b/src/aig/gia/giaMan.c
index c9836b96..0a7b1352 100644
--- a/src/aig/gia/giaMan.c
+++ b/src/aig/gia/giaMan.c
@@ -408,6 +408,8 @@ void Gia_ManPrintStats( Gia_Man_t * p, Gps_Par_t * pPars )
Abc_Print( 1, "(c=%d)", Gia_ManConstrNum(p) );
if ( Gia_ManRegNum(p) )
Abc_Print( 1, " ff =%7d", Gia_ManRegNum(p) );
+ if ( p->vRegClasses )
+ Abc_Print( 1, " boxff =%d(%d)", Vec_IntSize(p->vRegClasses), Vec_IntFindMax(p->vRegClasses) );
#ifdef WIN32
{
@@ -466,11 +468,11 @@ void Gia_ManPrintStats( Gia_Man_t * p, Gps_Par_t * pPars )
Gia_ManPrintFlopClasses( p );
Gia_ManPrintGateClasses( p );
Gia_ManPrintObjClasses( p );
- if ( p->vRegClasses )
- {
- printf( "The design has %d flops with the following class info: ", Vec_IntSize(p->vRegClasses) );
- Vec_IntPrint( p->vRegClasses );
- }
+// if ( p->vRegClasses )
+// {
+// printf( "The design has %d flops with the following class info: ", Vec_IntSize(p->vRegClasses) );
+// Vec_IntPrint( p->vRegClasses );
+// }
if ( p->vInitClasses )
Gia_ManPrintInitClasses( p->vInitClasses );
if ( pPars && pPars->fTents )
diff --git a/src/aig/gia/giaMfs.c b/src/aig/gia/giaMfs.c
index 4f919a58..3fd9d04c 100644
--- a/src/aig/gia/giaMfs.c
+++ b/src/aig/gia/giaMfs.c
@@ -341,7 +341,7 @@ Gia_Man_t * Gia_ManInsertMfs( Gia_Man_t * p, Sfm_Ntk_t * pNtk )
// create new timing manager and extra AIG
if ( pManTime )
- pNew->pManTime = Gia_ManUpdateTimMan2( p, vBoxesLeft );
+ pNew->pManTime = Gia_ManUpdateTimMan2( p, vBoxesLeft, 0 );
// update extra STG
if ( p->pAigExtra )
pNew->pAigExtra = Gia_ManUpdateExtraAig2( p->pManTime, p->pAigExtra, vBoxesLeft );
diff --git a/src/aig/gia/giaSweep.c b/src/aig/gia/giaSweep.c
index 2a51bf83..8c5405e4 100644
--- a/src/aig/gia/giaSweep.c
+++ b/src/aig/gia/giaSweep.c
@@ -65,7 +65,7 @@ void Gia_ManMarkSeqGiaWithBoxes_rec( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t
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 );
+ pObj = Gia_ManCo( p, Gia_ManPoNum(p) - nRegs + iFlop );
Vec_IntPush( vRoots, Gia_ObjId(p, pObj) );
return;
}
@@ -104,13 +104,20 @@ void Gia_ManMarkSeqGiaWithBoxes( Gia_Man_t * p, int fSeq )
// 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_ObjSetTravIdCurrent( p, Gia_ManPo(p, 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 );
+ Gia_ManForEachObjVec( vRoots, p, pObj, i )
+ {
+ assert( Gia_ObjIsCo(pObj) );
+ Gia_ObjSetTravIdCurrent( p, pObj );
+ Gia_ManMarkSeqGiaWithBoxes_rec( p, Gia_ObjFanin0(pObj), vRoots );
+ }
+ //printf( "Explored %d flops\n", Vec_IntSize(vRoots) );
}
Vec_IntFree( vRoots );
}
@@ -122,6 +129,7 @@ Gia_Man_t * Gia_ManDupWithBoxes( Gia_Man_t * p, int fSeq )
Vec_Int_t * vBoxesLeft;
int curCi, curCo, nBoxIns, nBoxOuts;
int i, k, iShift, nMarked;
+ int CiLeft = 0, CoLeft = 0;
assert( Gia_ManBoxNum(p) > 0 );
assert( Gia_ManRegBoxNum(p) > 0 );
// mark useful boxes
@@ -143,7 +151,7 @@ Gia_Man_t * Gia_ManDupWithBoxes( Gia_Man_t * p, int fSeq )
pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
else assert( 0 );
}
- assert( !Gia_ManHasDangling(p) );
+ assert( !Gia_ManHasDangling(pNew) );
// collect remaining flops
if ( fSeq )
{
@@ -173,17 +181,29 @@ Gia_Man_t * Gia_ManDupWithBoxes( Gia_Man_t * p, int fSeq )
// check presence
assert( nMarked == 0 || nMarked == nBoxIns + nBoxOuts );
if ( nMarked )
+ {
Vec_IntPush( vBoxesLeft, i );
+
+ CoLeft += nBoxIns;
+ CiLeft += nBoxOuts;
+ }
}
curCo += Tim_ManPoNum(pManTime);
assert( curCi == Gia_ManCiNum(p) );
assert( curCo == Gia_ManCoNum(p) );
// update timing manager
- pNew->pManTime = Gia_ManUpdateTimMan2( p, vBoxesLeft );
+ pNew->pManTime = Gia_ManUpdateTimMan2( p, vBoxesLeft, Vec_IntSize(p->vRegClasses) - Vec_IntSize(pNew->vRegClasses) );
// update extra STG
assert( p->pAigExtra != NULL );
assert( pNew->pAigExtra == NULL );
pNew->pAigExtra = Gia_ManUpdateExtraAig2( p->pManTime, p->pAigExtra, vBoxesLeft );
+ {
+ int a = Gia_ManCiNum(pNew);
+ int b = Tim_ManPiNum(pNew->pManTime);
+ int c = Gia_ManCoNum(pNew->pAigExtra);
+ int d = b + c;
+ assert( Gia_ManCiNum(pNew) == Tim_ManPiNum(pNew->pManTime) + Gia_ManCoNum(pNew->pAigExtra) );
+ }
Vec_IntFree( vBoxesLeft );
return pNew;
}
@@ -363,19 +383,62 @@ Gia_Man_t * Gia_ManFraigReduceGia( Gia_Man_t * p, int * pReprs )
SeeAlso []
***********************************************************************/
-int * Gia_ManFraigSelectReprs( Gia_Man_t * p, Gia_Man_t * pGia, int fVerbose )
+int * Gia_ManFraigSelectReprs( Gia_Man_t * p, Gia_Man_t * pClp, int fVerbose )
{
Gia_Obj_t * pObj;
+ Tim_Man_t * pManTime = (Tim_Man_t *)p->pManTime;
int * pReprs = ABC_FALLOC( int, Gia_ManObjNum(p) );
- int * pGia2Abc = ABC_FALLOC( int, Gia_ManObjNum(pGia) );
- int i, iLitGia, iLitGia2, iReprGia, fCompl;
- int nConsts = 0, nReprs = 0;
- pGia2Abc[0] = 0;
+ int * pClp2Gia = ABC_FALLOC( int, Gia_ManObjNum(pClp) );
+ int i, nBoxes, iLast, iBox, iLitClp, iLitClp2, iReprClp, fCompl;
+ int nConsts = 0, nReprs = 0, Count1 = 0, Count2 = 0;
+ assert( pManTime != NULL );
+ // count the number of equivalent objects
+ Gia_ManForEachObj1( pClp, pObj, i )
+ {
+ if ( Gia_ObjIsCo(pObj) )
+ continue;
+ if ( i == Gia_ObjReprSelf(pClp, i) )
+ continue;
+ if ( Gia_ObjReprSelf(pClp, i) == 0 )
+ nConsts++;
+ else
+ nReprs++;
+ }
+ if ( fVerbose )
+ printf( "Computed %d const objects and %d other objects.\n", nConsts, nReprs );
+ nConsts = nReprs = 0;
+
+ // mark flop input boxes
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 );
+ for ( i = Gia_ManPoNum(p) - Gia_ManRegBoxNum(p); i < Gia_ManPoNum(p); i++ )
+ {
+ pObj = Gia_ObjFanin0( Gia_ManPo(p, i) );
+ assert( Gia_ObjIsCi(pObj) );
+ pObj->fMark0 = 1;
+ Count1++;
+ }
+ // mark connects between last box inputs and first box outputs
+ nBoxes = Tim_ManBoxNum( pManTime );
+ for ( i = 0; i < nBoxes; i++ )
+ {
+ iLast = Tim_ManBoxInputLast( pManTime, i );
+ pObj = Gia_ObjFanin0( Gia_ManCo(p, iLast) );
+ if ( !Gia_ObjIsCi(pObj) )
+ continue;
+ iBox = Tim_ManBoxForCi( pManTime, Gia_ObjCioId(pObj) );
+ if ( iBox == -1 )
+ continue;
+ assert( Gia_ObjIsCi(pObj) );
+ if ( Gia_ObjCioId(pObj) == Tim_ManBoxOutputLast(pManTime, iBox) )
+ pObj->fMark0 = 1, Count2++;
+ }
+ if ( fVerbose )
+ printf( "Fixed %d flop inputs and %d box/box connections (out of %d boxes).\n",
+ Count1, Count2, nBoxes - Gia_ManRegBoxNum(p) );
+
+ // compute representatives
+ pClp2Gia[0] = 0;
+ Gia_ManSetPhase( pClp );
Gia_ManForEachObj1( p, pObj, i )
{
if ( Gia_ObjIsCo(pObj) )
@@ -383,32 +446,32 @@ int * Gia_ManFraigSelectReprs( Gia_Man_t * p, Gia_Man_t * pGia, int fVerbose )
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 )
+ iLitClp = Gia_ObjValue(pObj);
+ if ( iLitClp == -1 )
continue;
- iReprGia = Gia_ObjReprSelf( pGia, Abc_Lit2Var(iLitGia) );
- if ( pGia2Abc[iReprGia] == -1 )
- pGia2Abc[iReprGia] = i;
+ iReprClp = Gia_ObjReprSelf( pClp, Abc_Lit2Var(iLitClp) );
+ if ( pClp2Gia[iReprClp] == -1 )
+ pClp2Gia[iReprClp] = i;
else
{
- iLitGia2 = Gia_ObjValue( Gia_ManObj(p, pGia2Abc[iReprGia]) );
- assert( Gia_ObjReprSelf(pGia, Abc_Lit2Var(iLitGia)) == Gia_ObjReprSelf(pGia, Abc_Lit2Var(iLitGia2)) );
- fCompl = Abc_LitIsCompl(iLitGia) ^ Abc_LitIsCompl(iLitGia2);
- fCompl ^= Gia_ManObj(pGia, Abc_Lit2Var(iLitGia))->fPhase;
- fCompl ^= Gia_ManObj(pGia, Abc_Lit2Var(iLitGia2))->fPhase;
- pReprs[i] = Abc_Var2Lit( pGia2Abc[iReprGia], fCompl );
+ iLitClp2 = Gia_ObjValue( Gia_ManObj(p, pClp2Gia[iReprClp]) );
+ assert( Gia_ObjReprSelf(pClp, Abc_Lit2Var(iLitClp)) == Gia_ObjReprSelf(pClp, Abc_Lit2Var(iLitClp2)) );
+ fCompl = Abc_LitIsCompl(iLitClp) ^ Abc_LitIsCompl(iLitClp2);
+ fCompl ^= Gia_ManObj(pClp, Abc_Lit2Var(iLitClp))->fPhase;
+ fCompl ^= Gia_ManObj(pClp, Abc_Lit2Var(iLitClp2))->fPhase;
+ pReprs[i] = Abc_Var2Lit( pClp2Gia[iReprClp], fCompl );
assert( Abc_Lit2Var(pReprs[i]) < i );
- if ( pGia2Abc[iReprGia] == 0 )
+ if ( pClp2Gia[iReprClp] == 0 )
nConsts++;
else
nReprs++;
}
}
- ABC_FREE( pGia2Abc );
- Gia_ManForEachCo( p, pObj, i )
- Gia_ObjFanin0(pObj)->fMark0 = 0;
+ ABC_FREE( pClp2Gia );
+ Gia_ManForEachCi( p, pObj, i )
+ pObj->fMark0 = 0;
if ( fVerbose )
- printf( "Found %d const reprs and %d other reprs.\n", nConsts, nReprs );
+ printf( "Found %d const objects and %d other objects.\n", nConsts, nReprs );
return pReprs;
}
@@ -469,7 +532,7 @@ Gia_Man_t * Gia_ManFraigSweepSimple( 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;
+ Gia_Man_t * pClp, * pNew, * pTemp;
int * pReprs;
assert( Gia_ManRegNum(p) == 0 );
assert( p->pAigExtra != NULL );
@@ -477,23 +540,23 @@ Gia_Man_t * Gia_ManSweepWithBoxes( Gia_Man_t * p, void * pParsC, void * pParsS,
pNew = Gia_ManDupUnnormalize( p );
if ( pNew == NULL )
return NULL;
- Gia_ManTransferTiming( pNew, p );
// find global equivalences
- pGia = Gia_ManDupCollapse( pNew, p->pAigExtra, NULL, pParsC ? 0 : 1 );
- Gia_ManTransferTiming( pGia, pNew );
+ Gia_ManTransferTiming( pNew, p );
+ pClp = Gia_ManDupCollapse( pNew, pNew->pAigExtra, NULL, pParsC ? 0 : 1 );
// compute equivalences
if ( pParsC )
- Gia_ManFraigSweepPerform( pGia, pParsC );
+ Gia_ManFraigSweepPerform( pClp, pParsC );
else if ( pParsS )
- Cec_ManLSCorrespondenceClasses( pGia, (Cec_ParCor_t *)pParsS );
+ Cec_ManLSCorrespondenceClasses( pClp, (Cec_ParCor_t *)pParsS );
else
- Gia_ManSeqCleanupClasses( pGia, fConst, fEquiv, fVerbose );
+ Gia_ManSeqCleanupClasses( pClp, fConst, fEquiv, fVerbose );
// transfer equivalences
- pReprs = Gia_ManFraigSelectReprs( pNew, pGia, fVerbose );
- Gia_ManStop( pGia );
+ pReprs = Gia_ManFraigSelectReprs( pNew, pClp, fVerbose );
+ Gia_ManStop( pClp );
// reduce AIG
+ Gia_ManTransferTiming( p, pNew );
pNew = Gia_ManFraigReduceGia( pTemp = pNew, pReprs );
- Gia_ManTransferTiming( pNew, pTemp );
+ Gia_ManTransferTiming( pNew, p );
Gia_ManStop( pTemp );
ABC_FREE( pReprs );
// derive new AIG
diff --git a/src/aig/gia/giaTim.c b/src/aig/gia/giaTim.c
index 6e3c5d64..e1054fa9 100644
--- a/src/aig/gia/giaTim.c
+++ b/src/aig/gia/giaTim.c
@@ -623,12 +623,12 @@ void * Gia_ManUpdateTimMan( Gia_Man_t * p, Vec_Int_t * vBoxPres )
assert( Vec_IntSize(vBoxPres) == Tim_ManBoxNum(pManTime) );
return Tim_ManTrim( pManTime, vBoxPres );
}
-void * Gia_ManUpdateTimMan2( Gia_Man_t * p, Vec_Int_t * vBoxesLeft )
+void * Gia_ManUpdateTimMan2( Gia_Man_t * p, Vec_Int_t * vBoxesLeft, int nTermsDiff )
{
Tim_Man_t * pManTime = (Tim_Man_t *)p->pManTime;
assert( pManTime != NULL );
assert( Vec_IntSize(vBoxesLeft) <= Tim_ManBoxNum(pManTime) );
- return Tim_ManReduce( pManTime, vBoxesLeft );
+ return Tim_ManReduce( pManTime, vBoxesLeft, nTermsDiff );
}
/**Function*************************************************************
diff --git a/src/misc/tim/tim.h b/src/misc/tim/tim.h
index df69ae36..04ef6706 100644
--- a/src/misc/tim/tim.h
+++ b/src/misc/tim/tim.h
@@ -114,7 +114,9 @@ extern void Tim_ManCreateBox( Tim_Man_t * p, int firstIn, int nIns, i
extern int Tim_ManBoxForCi( Tim_Man_t * p, int iCo );
extern int Tim_ManBoxForCo( Tim_Man_t * p, int iCi );
extern int Tim_ManBoxInputFirst( Tim_Man_t * p, int iBox );
+extern int Tim_ManBoxInputLast( Tim_Man_t * p, int iBox );
extern int Tim_ManBoxOutputFirst( Tim_Man_t * p, int iBox );
+extern int Tim_ManBoxOutputLast( Tim_Man_t * p, int iBox );
extern int Tim_ManBoxInputNum( Tim_Man_t * p, int iBox );
extern int Tim_ManBoxOutputNum( Tim_Man_t * p, int iBox );
extern int Tim_ManBoxDelayTableId( Tim_Man_t * p, int iBox );
@@ -130,7 +132,7 @@ extern Tim_Man_t * Tim_ManLoad( Vec_Str_t * p, int fHieOnly );
extern Tim_Man_t * Tim_ManStart( int nCis, int nCos );
extern Tim_Man_t * Tim_ManDup( Tim_Man_t * p, int fUnitDelay );
extern Tim_Man_t * Tim_ManTrim( Tim_Man_t * p, Vec_Int_t * vBoxPres );
-extern Tim_Man_t * Tim_ManReduce( Tim_Man_t * p, Vec_Int_t * vBoxesLeft );
+extern Tim_Man_t * Tim_ManReduce( Tim_Man_t * p, Vec_Int_t * vBoxesLeft, int nTermsDiff );
extern Vec_Int_t * Tim_ManAlignTwo( Tim_Man_t * pSpec, Tim_Man_t * pImpl );
extern void Tim_ManCreate( Tim_Man_t * p, void * pLib, Vec_Flt_t * vInArrs, Vec_Flt_t * vOutReqs );
extern float * Tim_ManGetArrTimes( Tim_Man_t * p );
diff --git a/src/misc/tim/timBox.c b/src/misc/tim/timBox.c
index bff7b39c..a1526673 100644
--- a/src/misc/tim/timBox.c
+++ b/src/misc/tim/timBox.c
@@ -126,6 +126,22 @@ int Tim_ManBoxInputFirst( Tim_Man_t * p, int iBox )
/**Function*************************************************************
+ Synopsis [Returns the last input of the box.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Tim_ManBoxInputLast( Tim_Man_t * p, int iBox )
+{
+ return Tim_ManBox(p, iBox)->Inouts[0] + Tim_ManBoxInputNum(p, iBox) - 1;
+}
+
+/**Function*************************************************************
+
Synopsis [Returns the first output of the box.]
Description []
@@ -142,6 +158,22 @@ int Tim_ManBoxOutputFirst( Tim_Man_t * p, int iBox )
/**Function*************************************************************
+ Synopsis [Returns the last output of the box.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Tim_ManBoxOutputLast( Tim_Man_t * p, int iBox )
+{
+ return Tim_ManBox(p, iBox)->Inouts[Tim_ManBox(p, iBox)->nInputs] + Tim_ManBoxOutputNum(p, iBox) - 1;
+}
+
+/**Function*************************************************************
+
Synopsis [Returns the number of box inputs.]
Description []
diff --git a/src/misc/tim/timMan.c b/src/misc/tim/timMan.c
index f6b97fe6..27dd8bdb 100644
--- a/src/misc/tim/timMan.c
+++ b/src/misc/tim/timMan.c
@@ -248,25 +248,27 @@ Tim_Man_t * Tim_ManTrim( Tim_Man_t * p, Vec_Int_t * vBoxPres )
SeeAlso []
***********************************************************************/
-Tim_Man_t * Tim_ManReduce( Tim_Man_t * p, Vec_Int_t * vBoxesLeft )
+Tim_Man_t * Tim_ManReduce( Tim_Man_t * p, Vec_Int_t * vBoxesLeft, int nTermsDiff )
{
Tim_Man_t * pNew;
Tim_Box_t * pBox;
Tim_Obj_t * pObj;
float * pDelayTable, * pDelayTableNew;
int i, k, iBox, nNewCis, nNewCos, nInputs, nOutputs;
+ int nNewPiNum = Tim_ManPiNum(p) - nTermsDiff;
+ int nNewPoNum = Tim_ManPoNum(p) - nTermsDiff;
assert( Vec_IntSize(vBoxesLeft) <= Tim_ManBoxNum(p) );
// count the number of CIs and COs in the trimmed manager
- nNewCis = Tim_ManPiNum(p);
- nNewCos = Tim_ManPoNum(p);
+ nNewCis = nNewPiNum;
+ nNewCos = nNewPoNum;
Vec_IntForEachEntry( vBoxesLeft, iBox, i )
{
pBox = Tim_ManBox( p, iBox );
nNewCis += pBox->nOutputs;
nNewCos += pBox->nInputs;
}
- assert( nNewCis <= Tim_ManCiNum(p) );
- assert( nNewCos <= Tim_ManCoNum(p) );
+ assert( nNewCis <= Tim_ManCiNum(p) - nTermsDiff );
+ assert( nNewCos <= Tim_ManCoNum(p) - nTermsDiff );
// clear traversal IDs
Tim_ManForEachCi( p, pObj, i )
pObj->TravId = 0;
@@ -275,10 +277,10 @@ Tim_Man_t * Tim_ManReduce( Tim_Man_t * p, Vec_Int_t * vBoxesLeft )
// create new manager
pNew = Tim_ManStart( nNewCis, nNewCos );
// copy box connectivity information
- memcpy( pNew->pCis, p->pCis, sizeof(Tim_Obj_t) * Tim_ManPiNum(p) );
- memcpy( pNew->pCos + nNewCos - Tim_ManPoNum(p),
+ memcpy( pNew->pCis, p->pCis, sizeof(Tim_Obj_t) * nNewPiNum );
+ memcpy( pNew->pCos + nNewCos - nNewPoNum,
p->pCos + Tim_ManCoNum(p) - Tim_ManPoNum(p),
- sizeof(Tim_Obj_t) * Tim_ManPoNum(p) );
+ sizeof(Tim_Obj_t) * nNewPoNum );
// duplicate delay tables
if ( Tim_ManDelayTableNum(p) > 0 )
{
@@ -304,7 +306,7 @@ Tim_Man_t * Tim_ManReduce( Tim_Man_t * p, Vec_Int_t * vBoxesLeft )
// duplicate boxes
if ( Tim_ManBoxNum(p) > 0 )
{
- int curPi = Tim_ManPiNum(p);
+ int curPi = nNewPiNum;
int curPo = 0;
pNew->vBoxes = Vec_PtrAlloc( Tim_ManBoxNum(p) );
Vec_IntForEachEntry( vBoxesLeft, iBox, i )
@@ -315,7 +317,7 @@ Tim_Man_t * Tim_ManReduce( Tim_Man_t * p, Vec_Int_t * vBoxesLeft )
curPi += pBox->nOutputs;
curPo += pBox->nInputs;
}
- curPo += Tim_ManPoNum(p);
+ curPo += nNewPoNum;
assert( curPi == Tim_ManCiNum(pNew) );
assert( curPo == Tim_ManCoNum(pNew) );
}