summaryrefslogtreecommitdiffstats
path: root/src/map/amap
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2019-10-26 16:29:05 +0300
committerAlan Mishchenko <alanmi@berkeley.edu>2019-10-26 16:29:05 +0300
commitfeb3e7943de06c7c5ba16c53a23df00aa3c46cd0 (patch)
tree50162430a1f6274617bd01681b28e64e1f9ba997 /src/map/amap
parent35c2b4216499e26242ed36a77d6bde5aab88363d (diff)
downloadabc-feb3e7943de06c7c5ba16c53a23df00aa3c46cd0.tar.gz
abc-feb3e7943de06c7c5ba16c53a23df00aa3c46cd0.tar.bz2
abc-feb3e7943de06c7c5ba16c53a23df00aa3c46cd0.zip
Adding limit on the depth of recursion when counting exact area in 'amap'.
Diffstat (limited to 'src/map/amap')
-rw-r--r--src/map/amap/amapInt.h1
-rw-r--r--src/map/amap/amapMan.c2
-rw-r--r--src/map/amap/amapMatch.c60
3 files changed, 62 insertions, 1 deletions
diff --git a/src/map/amap/amapInt.h b/src/map/amap/amapInt.h
index 3a6432de..2dfcafb6 100644
--- a/src/map/amap/amapInt.h
+++ b/src/map/amap/amapInt.h
@@ -103,6 +103,7 @@ struct Amap_Man_t_
Vec_Ptr_t * vCuts0;
Vec_Ptr_t * vCuts1;
Vec_Ptr_t * vCuts2;
+ Vec_Ptr_t * vTempP;
// statistics
int nCutsUsed;
int nCutsTried;
diff --git a/src/map/amap/amapMan.c b/src/map/amap/amapMan.c
index 6304c078..02c6227e 100644
--- a/src/map/amap/amapMan.c
+++ b/src/map/amap/amapMan.c
@@ -57,6 +57,7 @@ Amap_Man_t * Amap_ManStart( int nNodes )
p->vCuts0 = Vec_PtrAlloc( 100 );
p->vCuts1 = Vec_PtrAlloc( 100 );
p->vCuts2 = Vec_PtrAlloc( 100 );
+ p->vTempP = Vec_PtrAlloc( 100 );
// prepare the memory manager
p->pMemObj = Aig_MmFixedStart( sizeof(Amap_Obj_t), nNodes );
p->pMemCuts = Aig_MmFlexStart();
@@ -84,6 +85,7 @@ void Amap_ManStop( Amap_Man_t * p )
Vec_PtrFree( p->vCuts0 );
Vec_PtrFree( p->vCuts1 );
Vec_PtrFree( p->vCuts2 );
+ Vec_PtrFree( p->vTempP );
Vec_IntFree( p->vTemp );
Aig_MmFixedStop( p->pMemObj, 0 );
Aig_MmFlexStop( p->pMemCuts, 0 );
diff --git a/src/map/amap/amapMatch.c b/src/map/amap/amapMatch.c
index 2276cfc2..a8df3aeb 100644
--- a/src/map/amap/amapMatch.c
+++ b/src/map/amap/amapMatch.c
@@ -299,6 +299,63 @@ static inline float Amap_CutAreaDeref( Amap_Man_t * p, Amap_Mat_t * pM )
SeeAlso []
***********************************************************************/
+static inline float Amap_CutAreaRef2( Amap_Man_t * p, Amap_Mat_t * pM, Vec_Ptr_t * vTemp, int Limit )
+{
+ Amap_Obj_t * pFanin;
+ int i, fCompl;
+ float Area = Amap_LibGate( p->pLib, pM->pSet->iGate )->dArea;
+ if ( Limit == 0 ) return Area;
+ Amap_MatchForEachFaninCompl( p, pM, pFanin, fCompl, i )
+ {
+ Vec_PtrPush( vTemp, pFanin->nFouts + fCompl );
+ assert( Amap_ObjRefsTotal(pFanin) >= 0 );
+ if ( (int)pFanin->fPolar != fCompl && pFanin->nFouts[fCompl] == 0 )
+ Area += p->fAreaInv;
+ if ( pFanin->nFouts[fCompl]++ + pFanin->nFouts[!fCompl] == 0 && Amap_ObjIsNode(pFanin) )
+ Area += Amap_CutAreaRef2( p, &pFanin->Best, vTemp, Limit-1 );
+ }
+ return Area;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Derives area of the match for a non-referenced node.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+static inline float Amap_CutAreaDerefed2( Amap_Man_t * p, Amap_Obj_t * pNode, Amap_Mat_t * pM )
+{
+ int nRecurLevels = 8;
+ int fComplNew, i, * pInt;
+ float aResult;
+ Vec_PtrClear( p->vTempP );
+ aResult = Amap_CutAreaRef2( p, pM, p->vTempP, nRecurLevels );
+ //Amap_CutAreaDeref( p, pM );
+ Vec_PtrForEachEntry( int *, p->vTempP, pInt, i )
+ (*pInt)--;
+ // if node is needed in another polarity, add inverter
+ fComplNew = pM->pCut->fInv ^ pM->pSet->fInv;
+ if ( pNode->nFouts[fComplNew] == 0 && pNode->nFouts[!fComplNew] > 0 )
+ aResult += p->fAreaInv;
+ return aResult;
+}
+
+/**Function*************************************************************
+
+ Synopsis [Counts area while referencing the match.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
static inline float Amap_CutAreaRef( Amap_Man_t * p, Amap_Mat_t * pM )
{
Amap_Obj_t * pFanin;
@@ -444,7 +501,8 @@ static inline void Amap_ManMatchGetExacts( Amap_Man_t * p, Amap_Obj_t * pNode, A
}
pM->AveFan /= pGate->nPins;
pM->Delay += 1.0;
- pM->Area = Amap_CutAreaDerefed( p, pNode, pM );
+ //pM->Area = Amap_CutAreaDerefed( p, pNode, pM );
+ pM->Area = Amap_CutAreaDerefed2( p, pNode, pM );
}
/**Function*************************************************************