Commit aa78ce56 by Alan Mishchenko

Updated code for lazy man's synthesis.

parent e53ffc64
......@@ -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;
......
......@@ -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
......
......@@ -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
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment