summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2012-07-20 11:52:51 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2012-07-20 11:52:51 -0700
commitaa78ce56e73427a2a30669a2bbedacc3bb8caa9d (patch)
tree92d9960d3525bd21aacf4327027dd4f9ea6f1fc8
parente53ffc640827d1c9d44f8fb24518d9bb87660f4a (diff)
downloadabc-aa78ce56e73427a2a30669a2bbedacc3bb8caa9d.tar.gz
abc-aa78ce56e73427a2a30669a2bbedacc3bb8caa9d.tar.bz2
abc-aa78ce56e73427a2a30669a2bbedacc3bb8caa9d.zip
Updated code for lazy man's synthesis.
-rw-r--r--src/base/abci/abc.c14
-rw-r--r--src/base/abci/abcRec2.c367
-rw-r--r--src/map/if/if.h4
3 files changed, 76 insertions, 309 deletions
diff --git a/src/base/abci/abc.c b/src/base/abci/abc.c
index 98297ad0..0471d441 100644
--- a/src/base/abci/abc.c
+++ b/src/base/abci/abc.c
@@ -12742,7 +12742,7 @@ int Abc_CommandRecStart2( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0;
usage:
- Abc_Print( -2, "usage: rec_start [-K num] [-C num] [-th]\n" );
+ Abc_Print( -2, "usage: rec_start2 [-K num] [-C num] [-th]\n" );
Abc_Print( -2, "\t starts recording AIG subgraphs (should be called for\n" );
Abc_Print( -2, "\t an empty network or after reading in a previous record)\n" );
Abc_Print( -2, "\t-K num : the largest number of inputs [default = %d]\n", nVars );
@@ -12789,7 +12789,7 @@ int Abc_CommandRecStop2( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0;
usage:
- Abc_Print( -2, "usage: rec_stop [-h]\n" );
+ Abc_Print( -2, "usage: rec_stop2 [-h]\n" );
Abc_Print( -2, "\t cleans the internal storage for AIG subgraphs\n" );
Abc_Print( -2, "\t-h : print the command usage\n");
return 1;
@@ -12841,7 +12841,7 @@ int Abc_CommandRecAdd2( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0;
usage:
- Abc_Print( -2, "usage: rec_add [-h]\n" );
+ Abc_Print( -2, "usage: rec_add2 [-h]\n" );
Abc_Print( -2, "\t adds subgraphs from the current network to the set\n" );
Abc_Print( -2, "\t-h : print the command usage\n");
return 1;
@@ -12887,7 +12887,7 @@ int Abc_CommandRecPs2( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0;
usage:
- Abc_Print( -2, "usage: rec_ps [-h]\n" );
+ Abc_Print( -2, "usage: rec_ps2 [-h]\n" );
Abc_Print( -2, "\t prints statistics about the recorded AIG subgraphs\n" );
Abc_Print( -2, "\t-h : print the command usage\n");
return 1;
@@ -12955,7 +12955,7 @@ int Abc_CommandRecDump2( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0;
usage:
- Abc_Print( -2, "usage: rec_dump [-h] <file>\n" );
+ Abc_Print( -2, "usage: rec_dump2 [-h] <file>\n" );
Abc_Print( -2, "\t-h : print the command usage\n");
return 1;
}
@@ -13010,7 +13010,7 @@ int Abc_CommandRecFilter2( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0;
usage:
- Abc_Print( -2, "usage: rec_filter [-h]\n" );
+ Abc_Print( -2, "usage: rec_filter2 [-h]\n" );
Abc_Print( -2, "\t filter the library of the recorder\n" );
Abc_Print( -2, "\t-F num : the limit number of function class [default = %d]\n", nLimit );
Abc_Print( -2, "\t-h : print the command usage\n");
@@ -13090,7 +13090,7 @@ int Abc_CommandRecMerge2( Abc_Frame_t * pAbc, int argc, char ** argv )
return 0;
usage:
- Abc_Print( -2, "usage: rec_merge [-h]\n" );
+ Abc_Print( -2, "usage: rec_merge2 [-h]\n" );
Abc_Print( -2, "\t merge libraries\n" );
Abc_Print( -2, "\t-h : print the command usage\n");
return 1;
diff --git a/src/base/abci/abcRec2.c b/src/base/abci/abcRec2.c
index 4f3b56f4..e0a33f0d 100644
--- a/src/base/abci/abcRec2.c
+++ b/src/base/abci/abcRec2.c
@@ -80,18 +80,10 @@ struct Abc_ManRec_t_2
int * pMints; // temporary storage for minterm counters
unsigned * pTemp1; // temporary truth table
unsigned * pTemp2; // temporary truth table
- unsigned * pTempTruth; // temporary truth table
- char * pTempDepths; // temporary depths
- int * pTempleaves; // temporary leaves
- unsigned tempUsign;
- unsigned tempNleaves;
- unsigned currentCost;
- int currentDelay;
+
Vec_Ptr_t * vNodes; // the temporary nodes
Vec_Ptr_t * vTtTemps; // the truth tables for the internal nodes of the cut
Vec_Ptr_t * vLabels; // temporary storage for AIG node labels
- Vec_Str_t * vCosts; // temporary storage for costs
- Vec_Int_t * vMemory; // temporary memory for truth tables
Vec_Int_t * vUselessPos;
// statistics
int nTried; // the number of cuts tried
@@ -103,7 +95,6 @@ struct Abc_ManRec_t_2
int nFilterSame; // the number of same structures
int nAdded; // the number of subgraphs added
int nAddedFuncs; // the number of functions added
- int nIfMapTried;
int nIfMapError;
int nTrimed; // the number of structures filtered
// rewriting
@@ -151,6 +142,7 @@ static inline Rec_Obj_t2 * Rec_Obj(Abc_ManRec_t2 *p, int v)
return (Rec_Obj_t2 *)(p->pRecObjs + v * p->recObjSize);
}
+
/**Function*************************************************************
Synopsis [Alloc the Rec object from its manger.]
@@ -162,51 +154,24 @@ static inline Rec_Obj_t2 * Rec_Obj(Abc_ManRec_t2 *p, int v)
SeeAlso []
***********************************************************************/
-static inline Rec_Obj_t2 * Rec_AppendObj( Abc_ManRec_t2 * p )
+static inline int Rec_AppendObj( Abc_ManRec_t2 * p, Rec_Obj_t2 ** pObj )
{
- Rec_Obj_t2 * pObj;
+ //Rec_Obj_t2 * pObj;
+ int hasRealloced = 0;
if ( p->nRecObjs == p->nRecObjsAlloc )
{
assert( p->nRecObjs > 0 );
p->pRecObjs = realloc(p->pRecObjs, 2 * p->nRecObjsAlloc * p->recObjSize );
memset( p->pRecObjs + p->nRecObjsAlloc * p->recObjSize, 0, p->recObjSize * p->nRecObjsAlloc );
p->nRecObjsAlloc *= 2;
+ hasRealloced = 1;
}
- pObj = Rec_Obj( p, p->nRecObjs++ );
- pObj->pCopy = REC_EMPTY_ID;
- pObj->pNext = REC_EMPTY_ID;
- return Rec_Obj( p, p->nRecObjs++ );
+ *pObj = Rec_Obj( p, p->nRecObjs++ );
+ (*pObj)->pCopy = REC_EMPTY_ID;
+ (*pObj)->pNext = REC_EMPTY_ID;
+ return hasRealloced;
}
-/**Function*************************************************************
-
- Synopsis [Alloc the Rec object from its manger.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-
-/*Rec_Obj_t2* Rec_ObjAlloc2(Abc_ManRec_t2* p, Gia_Obj_t* pObj, char* pinToPinDelay, char cost, int nVar)
-{
- int i;
- Rec_Obj_t2 * pRecObj;
-
- pRecObj = Rec_AppendObj(p);
- //pRecObj->pinToPinDelay = (char*)(pRecObj + 1);
- pRecObj->pNext = NULL;
- pRecObj->pCopy = NULL;
- //pRecObj->obj = pObj;
- pRecObj->Id = Gia_ObjId(p->pGia, pObj);
- for (i = 0; i < nVar; i++)
- pRecObj->pinToPinDelay[i] = pinToPinDelay[i];
- pRecObj->cost = cost;
- pRecObj->nFrequency = 0;
- return pRecObj;
-}*/
/**Function*************************************************************
@@ -436,32 +401,6 @@ void Abc_NtkRecDeleteSubGragh2(Gia_Obj_t* pObj)
/**Function*************************************************************
- Synopsis [Filter the library.]
-
- Description []
-
- SideEffects []
-
- SeeAlso []
-
-***********************************************************************/
-/*void Abc_RecUpdateHashTable2(Gia_Man_t * pOldGia, Gia_Man_t * pNewGia)
-{
- Abc_ManRec_t2 * p = s_pMan;
- int pEntry, pTemp;
- Gia_Obj_t * pObj;
- int i;
- for ( i = 0; i < p->nBins; i++ )
- for ( pEntry = p->pBins[i]; pEntry; pEntry = pEntry->pCopy )
- for ( pTemp = pEntry; pTemp; pTemp = pTemp->pNext )
- {
- pObj = Gia_ManObj(pOldGia, pTemp->Id);
- pTemp->Id = pObj->Value >> 1;
- }
-}*/
-
-/**Function*************************************************************
-
Synopsis [Mark NonDangling nodes.]
Description []
@@ -512,37 +451,6 @@ void Abc_NtkRecMarkCompl(Gia_Man_t * pGia)
Gia_ManForEachObj1(pGia, pObj,i)
pObj->fMark0 = !pObj->fMark0;
}
-/*
-void Check_Network(Gia_Man_t * pGia)
-{
- int i, j = 0;
- Gia_Obj_t * pObj, *pFanin0, *pFanin1;
- Gia_ManForEachObj1(pGia, pObj, i)
- {
- if(Gia_ObjIsPi(pGia, pObj))
- {
- assert(pObj->fMark0);
- continue;
- }
- if (pObj->fMark0)
- {
- pFanin0 = Gia_ObjFanin0(pObj);
- if (pFanin0->fMark0 == 0)
- {
- j++;
- }
- pFanin1 = Gia_ObjFanin1(pObj);
- if (pFanin1->fMark0 == 0)
- {
- j++;
- }
-
- }
-
- }
-}
-*/
-
/**Function*************************************************************
@@ -588,51 +496,6 @@ void Abc_NtkRecMarkNonDanglingNodes(Gia_Man_t * pGia)
}
}
-// Gia_ManForEachObjReverse(pGia, pObj,i)
-// {
-// if (pObj->fMark0)
-// {
-// if(Gia_ObjIsPo(pGia, pObj))
-// {
-// pFanin0 = Gia_ObjFanin0(pObj);
-// pFanin0->fMark0 = 1;
-// continue;
-// }
-// if (Gia_ObjIsPi(pGia, pObj))
-// {
-// //pObj->fMark0 = 1;
-// continue;
-// }
-// pFanin0 = Gia_ObjFanin0(pObj);
-// pFanin0->fMark0 = 1;
-// pFanin1 = Gia_ObjFanin1(pObj);
-// pFanin1->fMark0 = 1;
-// }
-//
-// }
-// Vec_IntForEachEntry(s_pMan->vUselessPos, Id, i)
-// {
-// pObj = Gia_ManObj(pGia, Id);
-// pObj->fMark1 = 1;
-// }
-
-// Gia_ManForEachPo(pGia, pObj,i)
-// {
-// pFanin = Gia_ObjFanin0(pObj);
-// if ((pFanin->fMark1 && pFanin->fMark0 == 0) || (pFanin->fMark1 && pFanin->fMark0))
-// {
-// pFanin->fMark0 = 0;
-// counter++;
-// }
-// else
-// {
-// pObj->fMark0 = 1;
-// if(pFanin->fMark0 == 0)
-// Abc_NtkRecMarkNonDanglingNodes_Rec(pGia, pFanin);
-//
-// }
-// }
- //Check_Network(pGia);
Vec_IntClear(s_pMan->vUselessPos);
Abc_NtkRecMarkCompl(pGia);
}
@@ -651,18 +514,8 @@ void Abc_NtkRecMarkNonDanglingNodes(Gia_Man_t * pGia)
Gia_Man_t * Abc_NtkDupWithoutDangling2( Gia_Man_t * pGia )
{
Gia_Man_t * pGiaNew;
- Gia_Obj_t * pObj;
- int i;
Abc_NtkRecMarkNonDanglingNodes(pGia);
pGiaNew = Gia_ManDupMarked(pGia);
- Gia_ManHashStart(pGiaNew);
- Gia_ManForEachPo(pGiaNew, pObj, i)
- {
- pObj = Gia_ObjFanin0(pObj);
- // mark the nodes with CO fanout.
- assert(pObj->fMark1 == 0);
- pObj->fMark1 = 1;
- }
return pGiaNew;
}
@@ -682,11 +535,11 @@ void Abc_NtkRecFilter2(int nLimit)
{
int previous = REC_EMPTY_ID, entry = REC_EMPTY_ID, pTemp;
int i;
- Gia_Man_t * pGia = s_pMan->pGia;
- int time = clock();
+ Gia_Man_t * pGia = s_pMan->pGia, *newPGia;
+ //int time = clock();
Abc_ManRec_t2 *p = s_pMan;
- Gia_Obj_t * pObj;
- unsigned * pTruthSrc, *pTruthDst;
+// Gia_Obj_t * pObj;
+ char fileName[256];
if (nLimit > 0)
{
for ( i = 0; i < s_pMan->nBins; i++ )
@@ -724,23 +577,17 @@ void Abc_NtkRecFilter2(int nLimit)
}
// remove dangling nodes and POs driven by constants
- s_pMan->pGia = Abc_NtkDupWithoutDangling2(pGia);
-
- Gia_ManForEachPo( s_pMan->pGia, pObj, i )
- {
- //RetValue = Abc_NtkRecComputeTruth2( pObj, p->vTtNodes, p->nVars );
- //assert( RetValue );
- pTruthSrc = Gia_ObjComputeTruthTable(s_pMan->pGia, pObj);
- pTruthDst = (unsigned *)Vec_PtrEntry( p->vTtNodes, Gia_ObjCioId(pObj) );
- Kit_TruthCopy(pTruthDst, pTruthSrc, p->nVars);
- }
- //Abc_RecUpdateHashTable2(pGia, s_pMan->pGia);
- Gia_ManHashStop(pGia);
- Gia_ManStop(pGia);
-
+ newPGia = Abc_NtkDupWithoutDangling2(pGia);
+ sprintf( fileName, "RecLib%d_Filtered%d.aig", p->nVars, nLimit);
+ Gia_WriteAiger( newPGia, fileName, 0, 0 );
+ Abc_Print(1, "Library %s was written.");
+ //Gia_ManHashStop(newPGia);
+ Gia_ManStop(newPGia);
+ Abc_NtkRecStop2();
+ Abc_Print(1, "Record stopped.");
// collect runtime stats
- s_pMan->timeTrim += clock() - time;
- s_pMan->timeTotal += clock() - time;
+ //s_pMan->timeTrim += clock() - time;
+ //s_pMan->timeTotal += clock() - time;
}
@@ -797,7 +644,7 @@ static int * Abc_NtkRecTableLookup2(Abc_ManRec_t2* p, int * pBins, int nBins, u
SeeAlso []
***********************************************************************/
-static void Abc_NtkRecRezieHash2(Abc_ManRec_t2* p)
+static void Abc_NtkRecResizeHash2(Abc_ManRec_t2* p)
{
int * pBinsNew, *ppSpot;
int pEntry, pTemp;
@@ -992,20 +839,21 @@ static void Abc_NtkRecSweepDominance(Abc_ManRec_t2* p, int previous, int current
SeeAlso []
***********************************************************************/
-void Abc_NtkRecReplaceCurrentEntry(int previous, int current, int entry, int * ppSpot)
+void Abc_NtkRecReplaceCurrentEntry(int previous, int * current, int entry, int * ppSpot)
{
Abc_ManRec_t2 * p = s_pMan;
- Rec_Obj(p,entry)->pCopy = Rec_Obj(p,current)->pCopy;
- Rec_Obj(p,entry)->pNext = Rec_Obj(p,current)->pNext;
+ Rec_Obj(p,entry)->pCopy = Rec_Obj(p, *current)->pCopy;
+ Rec_Obj(p,entry)->pNext = Rec_Obj(p, *current)->pNext;
if (previous == REC_EMPTY_ID)
{
*ppSpot = entry;
- Rec_Obj(p,entry)->nFrequency = Rec_Obj(p,current)->nFrequency;
+ Rec_Obj(p,entry)->nFrequency = Rec_Obj(p, *current)->nFrequency;
}
else
{
Rec_Obj(p,previous)->pNext = entry;
}
+ *current = entry;
}
@@ -1023,7 +871,7 @@ void Abc_NtkRecReplaceCurrentEntry(int previous, int current, int entry, int * p
void Abc_NtkRecInsertToLookUpTable2(Abc_ManRec_t2* p, int* ppSpot, Gia_Obj_t* pPO, int nVars, int fTrim)
{
char delayFromStruct[16];
- int i;
+ int i, hasRealloced = 0;
Gia_Obj_t* pLeaf, *pObj = Gia_ObjFanin0(pPO);
int entry, previous = REC_EMPTY_ID, current = * ppSpot;
unsigned char costFromStruct = Abc_NtkRecArea2(pObj);
@@ -1036,7 +884,9 @@ void Abc_NtkRecInsertToLookUpTable2(Abc_ManRec_t2* p, int* ppSpot, Gia_Obj_t* pP
pLeaf =Gia_Regular(pLeaf);
delayFromStruct[i] = If_CutDepthRecComput_rec2(pObj, Gia_ObjId(p->pGia, pLeaf));
}
- pRecObj = Rec_AppendObj(p);
+ hasRealloced = Rec_AppendObj(p, &pRecObj);
+ if(hasRealloced)
+ ppSpot = Abc_NtkRecTableLookup2(p, p->pBins, p->nBins, (unsigned *)Vec_PtrEntry( p->vTtNodes, Gia_ObjCioId(pPO)), p->nVars );
assert(Rec_ObjID(p, pRecObj) == Gia_ObjCioId(pPO));
if(fTrim)
{
@@ -1064,11 +914,11 @@ void Abc_NtkRecInsertToLookUpTable2(Abc_ManRec_t2* p, int* ppSpot, Gia_Obj_t* pP
if(result == REC_EQUAL)
{
// when delay profile is equal, replace only if it has smaller cost.
- if(costFromStruct < Rec_Obj(p, current)->cost)
+ if(costFromStruct < (Rec_Obj(p, current)->cost))
{
Abc_NtkRecDeleteSubGragh2(Abc_NtkRecGetObj(current));
entry = Rec_ObjSet2(p, pRecObj, delayFromStruct, costFromStruct, nVars);
- Abc_NtkRecReplaceCurrentEntry(previous, current, entry, ppSpot);
+ Abc_NtkRecReplaceCurrentEntry(previous, &current, entry, ppSpot);
}
else
@@ -1080,7 +930,7 @@ void Abc_NtkRecInsertToLookUpTable2(Abc_ManRec_t2* p, int* ppSpot, Gia_Obj_t* pP
{
Abc_NtkRecDeleteSubGragh2(Abc_NtkRecGetObj(current));
entry = Rec_ObjSet2(p, pRecObj, delayFromStruct, costFromStruct, nVars);
- Abc_NtkRecReplaceCurrentEntry(previous, current, entry, ppSpot);
+ Abc_NtkRecReplaceCurrentEntry(previous, &current, entry, ppSpot);
Abc_NtkRecSweepDominance(p,current,Rec_Obj(p, current)->pNext,delayFromStruct, nVars);
break;
}
@@ -1167,7 +1017,7 @@ void Abc_NtkRecStart2( Gia_Man_t * pGia, int nVars, int nCuts, int fTrim )
Gia_Obj_t * pObj, *pFanin;
int * ppSpot;
unsigned * pTruthDst, *pTruthSrc, *pTruth;
- int i;
+ int i, j = 0;
int clkTotal = clock(), clk, timeInsert;
assert( s_pMan == NULL );
@@ -1199,10 +1049,6 @@ void Abc_NtkRecStart2( Gia_Man_t * pGia, int nVars, int nCuts, int fTrim )
for ( i = Gia_ManPiNum(pGia); i < nVars; i++ )
{
Gia_ManAppendCi(pGia);
-// pObj = Gia_ManAppendCi(pGia);
-// Buffer[0] = 'a' + i;
-// Buffer[1] = 0;
-// Vec_PtrEntry( pGia->vNamesIn, Gia_ObjCioId(pObj)) = Extra_UtilStrsav(Buffer);
}
p = ABC_ALLOC( Abc_ManRec_t2, 1 );
@@ -1231,8 +1077,6 @@ void Abc_NtkRecStart2( Gia_Man_t * pGia, int nVars, int nCuts, int fTrim )
p->vInputs = Vec_StrStart( 1 << 16 );
p->pMmTruth = Mem_FixedStart( sizeof(unsigned)*p->nWords );
p->vUselessPos = Vec_IntAlloc(1 << 16);
-// for ( i = 0; i < Gia_ManObjNum(pGia); i++ )
-// Vec_PtrPush( p->vTtNodes, Mem_FixedEntryFetch(p->pMmTruth) );
for ( i = 0; i < Gia_ManPoNum(pGia); i++ )
Vec_PtrPush( p->vTtNodes, Mem_FixedEntryFetch(p->pMmTruth) );
@@ -1241,17 +1085,11 @@ void Abc_NtkRecStart2( Gia_Man_t * pGia, int nVars, int nCuts, int fTrim )
//p->nBins = 50011;
p->nBins =500011;
p->pBins = ABC_ALLOC( int, p->nBins );
- memset( p->pBins, -1, sizeof(int *) * p->nBins );
-
- //Kit_TruthFill( (unsigned *)Vec_PtrEntry(p->vTtNodes, 0), p->nVars );
- //Gia_ManForEachPi( pGia, pObj, i )
- // Kit_TruthCopy( (unsigned *)Vec_PtrEntry(p->vTtNodes, Gia_ObjId(pGia, pObj)), (unsigned *)Vec_PtrEntry(p->vTtElems, i), p->nVars );
+ memset( p->pBins, -1, sizeof(int) * p->nBins );
clk = clock();
Gia_ManForEachPo( pGia, pObj, i )
{
- //RetValue = Abc_NtkRecComputeTruth2( pObj, p->vTtNodes, p->nVars );
- //assert( RetValue );
pTruthSrc = Gia_ObjComputeTruthTable(pGia, pObj);
pTruthDst = (unsigned *)Vec_PtrEntry( p->vTtNodes, Gia_ObjCioId(pObj) );
Kit_TruthCopy(pTruthDst, pTruthSrc, p->nVars);
@@ -1263,13 +1101,7 @@ timeInsert = clock();
Abc_NtkRecMarkInputs(p, pGia);
Gia_ManForEachPo( pGia, pObj, i )
{
- p->nTried++;
- //if the PO's input is a constant, skip it.
- //if (Gia_ObjChild0(pObj) == Gia_ManConst0(pGia))
- //{
- // p->nTrimed++;
- // continue;
- //}
+ p->nTried++;
pFanin = Gia_ObjFanin0(pObj);
// mark the nodes with CO fanout.
assert(pFanin->fMark1 == 0);
@@ -1277,9 +1109,9 @@ timeInsert = clock();
pTruth = (unsigned *)Vec_PtrEntry( p->vTtNodes, Gia_ObjCioId(pObj) );
// add the resulting truth table to the hash table
if(p->nAddedFuncs > 2 * p->nBins)
- Abc_NtkRecRezieHash2(p);
+ Abc_NtkRecResizeHash2(p);
ppSpot = Abc_NtkRecTableLookup2(p, p->pBins, p->nBins, pTruth, p->nVars );
- Abc_NtkRecInsertToLookUpTable2(p, ppSpot, pObj, Abc_ObjGetMax2(p->vInputs, pGia, pObj), p->fTrim);
+ Abc_NtkRecInsertToLookUpTable2(p, ppSpot, pObj, Abc_ObjGetMax2(p->vInputs, pGia, pFanin), p->fTrim);
}
p->timeInsert += clock() - timeInsert;
@@ -1288,12 +1120,8 @@ p->timeInsert += clock() - timeInsert;
p->pMints = ABC_ALLOC( int, 2*p->nVars );
p->pTemp1 = ABC_ALLOC( unsigned, p->nWords );
p->pTemp2 = ABC_ALLOC( unsigned, p->nWords );
- p->pTempTruth = ABC_ALLOC( unsigned, p->nWords );
- p->pTempDepths = ABC_ALLOC( char, p->nVars );
- p->pTempleaves = ABC_ALLOC( int, p->nVars );
p->vNodes = Vec_PtrAlloc( 100 );
p->vTtTemps = Vec_PtrAllocSimInfo( 1024, p->nWords );
- p->vMemory = Vec_IntAlloc( Abc_TruthWordNum(p->nVars) * 1000 );
p->vLabels = Vec_PtrStart( 1000);
@@ -1361,7 +1189,7 @@ for ( i = 0; i < p->nBins; i++ )
// go through the table
Counter = CounterS = 0;
for ( i = 0; i < p->nBins; i++ )
- for ( pEntry = p->pBins[i]; pEntry; pEntry = Rec_Obj(p, pEntry)->pCopy )
+ for ( pEntry = p->pBins[i]; pEntry != REC_EMPTY_ID; pEntry = Rec_Obj(p, pEntry)->pCopy )
{
assert(Abc_ObjGetMax2(s_pMan->vInputs, s_pMan->pGia, Abc_NtkRecGetObj(pEntry)) >= 2);
Counters[ Abc_ObjGetMax2(s_pMan->vInputs, s_pMan->pGia, Abc_NtkRecGetObj(pEntry))]++;
@@ -1496,22 +1324,6 @@ static int Abc_NtkRecCollectNodes( If_Man_t * pIfMan, If_Obj_t * pRoot, If_Cut_t
// clean the mark
Vec_PtrForEachEntry( If_Obj_t *, vNodes, pLeaf, i )
pLeaf->fMark = 0;
-/*
- if ( pRoot->Id == 2639 )
- {
- // print the cut
- Vec_PtrForEachEntry( If_Obj_t *, vNodes, pLeaf, i )
- {
- if ( If_ObjIsAnd(pLeaf) )
- printf( "%4d = %c%4d & %c%4d\n", pLeaf->Id,
- (If_ObjFaninC0(pLeaf)? '-':'+'), If_ObjFanin0(pLeaf)->Id,
- (If_ObjFaninC1(pLeaf)? '-':'+'), If_ObjFanin1(pLeaf)->Id );
- else
- printf( "%4d = pi\n", pLeaf->Id );
- }
- printf( "\n" );
- }
-*/
return RetValue;
}
@@ -1629,15 +1441,16 @@ int Abc_NtkRecAddCut2( If_Man_t * pIfMan, If_Obj_t * pRoot, If_Cut_t * pCut )
{
static int s_MaxSize[16] = { 0 };
char pCanonPerm[16];
- Gia_Obj_t * pObj = NULL, * pFanin0, * pFanin1, *pPO;
- int * ppSpot;
+ Gia_Obj_t * pObj = NULL, *pPO;
+ int iFanin0, iFanin1, iRecObj;
+ int * ppSpot, lit;//, test;
Gia_Man_t * pAig = s_pMan->pGia;
If_Obj_t * pIfObj;
Vec_Ptr_t * vNodes = s_pMan->vNodes;
unsigned * pInOut = s_pMan->pTemp1;
unsigned * pTemp = s_pMan->pTemp2;
unsigned *pTruthSrc, *pTruthDst;
- int objectID;
+ int objectID = 0;
int i, RetValue, nNodes, nNodesBeg, nInputs = s_pMan->nVars, nLeaves = If_CutLeaveNum(pCut);
unsigned uCanonPhase;
int clk, timeInsert, timeBuild;
@@ -1670,6 +1483,7 @@ s_pMan->timeCollect += clock() - clk;
s_pMan->nFilterVolume++;
return 1;
}
+
// compute truth table and skip the redundant structures
clk = clock();
@@ -1705,26 +1519,28 @@ timeBuild = clock();
pIfObj = If_ManObj( pIfMan, pCut->pLeaves[(int)pCanonPerm[i]] );
// get hold of the corresponding new node
pObj = Gia_ManPi( pAig, i );
- pObj = Gia_NotCond( pObj, ((uCanonPhase & (1 << i)) != 0) );
+ lit = Gia_ObjId(pAig, pObj);
+ lit = Abc_Var2Lit( lit, ((uCanonPhase & (1 << i)) != 0) );
// map them
- pIfObj->pCopy = pObj;
+ pIfObj->iCopy = lit;
}
// build the node and compute its truth table
nNodesBeg = Gia_ManObjNum( pAig );
Vec_PtrForEachEntryStart( If_Obj_t *, vNodes, pIfObj, i, nLeaves )
{
- pFanin0 = Gia_NotCond( (Gia_Obj_t *)If_ObjFanin0(pIfObj)->pCopy, If_ObjFaninC0(pIfObj) );
- pFanin1 = Gia_NotCond( (Gia_Obj_t *)If_ObjFanin1(pIfObj)->pCopy, If_ObjFaninC1(pIfObj) );
+ iFanin0 = Abc_LitNotCond( If_ObjFanin0(pIfObj)->iCopy, If_ObjFaninC0(pIfObj) );
+ iFanin1 = Abc_LitNotCond( If_ObjFanin1(pIfObj)->iCopy, If_ObjFaninC1(pIfObj) );
nNodes = Gia_ManObjNum( pAig );
- pObj = Gia_ObjFromLit(pAig, Gia_ManHashAnd(pAig, Gia_ObjToLit(pAig,pFanin0), Gia_ObjToLit(pAig,pFanin1) )) ;
+ iRecObj = Gia_ManHashAnd(pAig, iFanin0, iFanin1 );
//assert( !Gia_IsComplement(pObj) );
- pObj = Gia_Regular(pObj);
- pIfObj->pCopy = pObj;
+ //pObj = Gia_Regular(pObj);
+ pIfObj->iCopy = iRecObj;
}
- assert(pObj);
+ //assert(pObj);
+ pObj = Gia_ManObj(pAig, Abc_Lit2Var(iRecObj));
pTruthSrc = Gia_ObjComputeTruthTable(pAig, pObj);
s_pMan->timeBuild += clock() - timeBuild;
@@ -1746,7 +1562,7 @@ s_pMan->timeBuild += clock() - timeBuild;
// look up in the hash table and increase the hit number of the functional class
if(s_pMan->nAddedFuncs > 2 * s_pMan->nBins)
- Abc_NtkRecRezieHash2(s_pMan);
+ Abc_NtkRecResizeHash2(s_pMan);
ppSpot = Abc_NtkRecTableLookup2(s_pMan, s_pMan->pBins,s_pMan->nBins , pTruthSrc, nInputs );
Abc_NtkRecFrequencyInc(*ppSpot);
// if not new nodes were added and the node has a CO fanout
@@ -2061,39 +1877,7 @@ int If_CutDelayRecCost2(If_Man_t* p, If_Cut_t* pCut, If_Obj_t * pObj)
}
// mark as user cut.
pCut->fUser = 1;
-
-
-// if ( fVerbose )
-// Kit_DsdPrintFromTruth( pInOut, nLeaves ), printf( " Subgraphs: " );
-
- //find the best structure of the functional class.
-// Counter = 0;
-// for ( pCand = *ppSpot; pCand; pCand = pCand->pNext )
-// {
-// Counter++;
-// if ( fVerbose )
-// {
-// printf( "%s(", Abc_ObjIsComplement(pCand->obj)? "!" : "" );
-// Abc_RecPrint_rec( Abc_ObjRegular(pCand->obj) );
-// printf( ") " );
-// }
-// s_pMan->nFunsDelayComput++;
-// Delay = If_CutComputDelay(p, pCand, pCut, pCanonPerm ,nLeaves);
-// if ( DelayMin > Delay )
-// {
-// // printf( "%d ", Cost );
-// DelayMin = Delay;
-// pCandMin = pCand;
-// }
-// else if(Delay == DelayMin)
-// {
-// if(pCand->cost < pCandMin->cost)
-// pCandMin = pCand;
-// }
-// }
-// if ( fVerbose )
-// printf( "Printed %d subgraphs.\n", Counter );
-
+
//assert( pCandMin != NULL );
for ( i = 0; i < nLeaves; i++ )
{
@@ -2116,9 +1900,9 @@ int If_CutDelayRecCost2(If_Man_t* p, If_Cut_t* pCut, If_Obj_t * pObj)
SeeAlso []
***********************************************************************/
- Hop_Obj_t * Abc_NtkRecBuildUp_rec2(Hop_Man_t* pMan, Gia_Obj_t* pObj, Vec_Ptr_t * vNodes)
- {
- Hop_Obj_t * pRes0, *pRes1, *pRes;
+Hop_Obj_t * Abc_NtkRecBuildUp_rec2(Hop_Man_t* pMan, Gia_Obj_t* pObj, Vec_Ptr_t * vNodes)
+{
+ Hop_Obj_t * pRes0, *pRes1, *pRes;
Gia_Obj_t *pRegular = Gia_Regular(pObj);
if (Gia_ObjIsTravIdCurrent(s_pMan->pGia, pRegular) || Gia_ObjIsPi(s_pMan->pGia, pRegular))
return (Hop_Obj_t *)Vec_PtrEntry(vNodes, Gia_ObjId(s_pMan->pGia, pRegular));
@@ -2130,7 +1914,7 @@ int If_CutDelayRecCost2(If_Man_t* p, If_Cut_t* pCut, If_Obj_t * pObj)
pRes = Hop_And(pMan, pRes0, pRes1);
Vec_PtrWriteEntry(vNodes,Gia_ObjId(s_pMan->pGia, pRegular),pRes);
return pRes;
- }
+}
/**Function*************************************************************
@@ -2229,17 +2013,12 @@ void Abc_NtkRecStop2()
ABC_FREE( s_pMan->pMints );
ABC_FREE( s_pMan->pTemp1 );
ABC_FREE( s_pMan->pTemp2 );
- ABC_FREE( s_pMan->pTempTruth );
- ABC_FREE( s_pMan->pTempDepths );
Vec_PtrFree( s_pMan->vNodes );
Vec_PtrFree( s_pMan->vTtTemps );
if ( s_pMan->vLabels )
Vec_PtrFree( s_pMan->vLabels );
- if ( s_pMan->vCosts )
- Vec_StrFree( s_pMan->vCosts );
//if(s_pMan->pMemObj)
// Mem_FixedStop(s_pMan->pMemObj, 0);
- Vec_IntFree( s_pMan->vMemory );
Vec_IntFree( s_pMan->vUselessPos);
ABC_FREE(s_pMan->pRecObjs);
// if(s_pMan->vFiltered)
@@ -2387,22 +2166,6 @@ void Abc_NtkRecAddFromLib2( Gia_Man_t * pGia2, Gia_Obj_t * pRoot, int nVars )
//assert( !Gia_IsComplement(pObj) );
pObj = Gia_Regular(pObj);
Gia_ObjSetCopyF(pGia2, 0, pAbcObj, Gia_ObjId(pGia,pObj));
- //pIfObj->pCopy = pObj;
-
-// if ( Gia_ObjId(pGia, pObj) == nNodes )
-// {
-// while ( Vec_PtrSize(s_pMan->vTtNodes) <= Gia_ObjId(pGia, pObj) )
-// Vec_PtrPush( s_pMan->vTtNodes, Mem_FixedEntryFetch(s_pMan->pMmTruth) );
-//
-// // compute the truth table
-// RetValue = Abc_NtkRecComputeTruth2( pObj, s_pMan->vTtNodes, nInputs );
-// if ( RetValue == 0 )
-// {
-// s_pMan->nFilterError++;
-// printf( "T" );
-// return;
-// }
-// }
}
assert(pObj);
pTruthSrc = Gia_ObjComputeTruthTable(pGia, pObj);
@@ -2412,7 +2175,7 @@ void Abc_NtkRecAddFromLib2( Gia_Man_t * pGia2, Gia_Obj_t * pRoot, int nVars )
assert (Kit_TruthIsEqual( pTruthSrc, pInOut, nInputs ) );
if(s_pMan->nAddedFuncs > 2 * s_pMan->nBins)
- Abc_NtkRecRezieHash2(s_pMan);
+ Abc_NtkRecResizeHash2(s_pMan);
ppSpot = Abc_NtkRecTableLookup2(s_pMan, s_pMan->pBins,s_pMan->nBins , pTruthSrc, nInputs );
// if not new nodes were added and the node has a CO fanout
diff --git a/src/map/if/if.h b/src/map/if/if.h
index cff9adfe..37cea625 100644
--- a/src/map/if/if.h
+++ b/src/map/if/if.h
@@ -280,7 +280,11 @@ struct If_Obj_t_
float EstRefs; // estimated reference counter
float Required; // required time of the onde
float LValue; // sequential arrival time of the node
+ union{
void * pCopy; // used for object duplication
+ int iCopy;
+ };
+
If_Set_t * pCutSet; // the pointer to the cutset
If_Cut_t CutBest; // the best cut selected
};