Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
abc
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
abc
Commits
160b196a
Commit
160b196a
authored
Jul 25, 2012
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updated code for lazy man's synthesis.
parent
7dc8c81f
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
46 additions
and
34 deletions
+46
-34
src/base/abci/abcRec2.c
+46
-34
No files found.
src/base/abci/abcRec2.c
View file @
160b196a
...
...
@@ -51,7 +51,7 @@ struct Rec_Obj_t_2
{
int
pNext
;
// link to the next structure of the same functional class
int
pCopy
;
// link to the next functional class in the same bucket
//int Id; // structure's
ID
int
truthID
;
// structure's Truth
ID
int
nFrequency
;
// appear times of this functional class among benchmarks
unsigned
char
cost
;
// structure's cost
char
pinToPinDelay
[
0
];
// structure's pin-to-pin delay
...
...
@@ -630,7 +630,7 @@ static int * Abc_NtkRecTableLookup2(Abc_ManRec_t2* p, int * pBins, int nBins, u
ppSpot
=
pBins
+
Abc_NtkRecTableHash
(
pTruth
,
nVars
,
nBins
,
s_Primes
);
for
(
pEntry
=
*
ppSpot
;
pEntry
!=
REC_EMPTY_ID
;
ppSpot
=
&
(
Rec_Obj
(
p
,
pEntry
)
->
pCopy
),
pEntry
=
Rec_Obj
(
p
,
pEntry
)
->
pCopy
)
// if ( Kit_TruthIsEqualWithPhase((unsigned *)Vec_PtrEntry(p->vTtNodes, pEntry), pTruth, nVars) )
if
(
Kit_TruthIsEqualWithPhase
(
Rec_MemReadEntry
(
p
,
pEntry
),
pTruth
,
nVars
)
)
if
(
Kit_TruthIsEqualWithPhase
(
Rec_MemReadEntry
(
p
,
Rec_Obj
(
p
,
pEntry
)
->
truthID
),
pTruth
,
nVars
)
)
return
ppSpot
;
return
ppSpot
;
}
...
...
@@ -665,7 +665,7 @@ static void Abc_NtkRecResizeHash2(Abc_ManRec_t2* p)
{
pTemp
=
Rec_Obj
(
p
,
pEntry
)
->
pCopy
;
// ppSpot = Abc_NtkRecTableLookup2(p, pBinsNew, nBinsNew, (unsigned *)Vec_PtrEntry(p->vTtNodes, pEntry), p->nVars);
ppSpot
=
Abc_NtkRecTableLookup2
(
p
,
pBinsNew
,
nBinsNew
,
Rec_MemReadEntry
(
p
,
pEntry
),
p
->
nVars
);
ppSpot
=
Abc_NtkRecTableLookup2
(
p
,
pBinsNew
,
nBinsNew
,
Rec_MemReadEntry
(
p
,
Rec_Obj
(
p
,
pEntry
)
->
truthID
),
p
->
nVars
);
assert
(
*
ppSpot
==
REC_EMPTY_ID
);
*
ppSpot
=
pEntry
;
Rec_Obj
(
p
,
pEntry
)
->
pCopy
=
REC_EMPTY_ID
;
...
...
@@ -871,7 +871,7 @@ void Abc_NtkRecReplaceCurrentEntry(int previous, int * current, int entry, int *
SeeAlso []
***********************************************************************/
void
Abc_NtkRecInsertToLookUpTable2
(
Abc_ManRec_t2
*
p
,
int
*
ppSpot
,
Gia_Obj_t
*
pPO
,
int
nVars
,
int
fTrim
)
void
Abc_NtkRecInsertToLookUpTable2
(
Abc_ManRec_t2
*
p
,
int
*
ppSpot
,
Gia_Obj_t
*
pPO
,
int
nVars
,
unsigned
*
pTruth
,
int
fTrim
)
{
char
delayFromStruct
[
16
];
int
i
,
hasRealloced
=
0
;
...
...
@@ -890,8 +890,17 @@ void Abc_NtkRecInsertToLookUpTable2(Abc_ManRec_t2* p, int* ppSpot, Gia_Obj_t* pP
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 );
ppSpot
=
Abc_NtkRecTableLookup2
(
p
,
p
->
pBins
,
p
->
nBins
,
Rec_MemReadEntry
(
p
,
Gia_ObjCioId
(
pPO
))
,
p
->
nVars
);
ppSpot
=
Abc_NtkRecTableLookup2
(
p
,
p
->
pBins
,
p
->
nBins
,
pTruth
,
p
->
nVars
);
assert
(
Rec_ObjID
(
p
,
pRecObj
)
==
Gia_ObjCioId
(
pPO
));
if
(
current
==
REC_EMPTY_ID
)
{
pRecObj
->
truthID
=
p
->
nAddedFuncs
;
Rec_MemSetEntry
(
p
,
pRecObj
->
truthID
,
pTruth
);
}
else
pRecObj
->
truthID
=
Rec_Obj
(
p
,
current
)
->
truthID
;
if
(
fTrim
)
{
while
(
1
)
...
...
@@ -1020,7 +1029,7 @@ void Abc_NtkRecStart2( Gia_Man_t * pGia, int nVars, int nCuts, int fTrim )
Abc_ManRec_t2
*
p
;
Gia_Obj_t
*
pObj
,
*
pFanin
;
int
*
ppSpot
;
unsigned
*
pTruth
Src
,
*
pTruth
;
//, * pTruthDst
;
unsigned
*
pTruth
;
int
i
,
j
=
0
;
int
clkTotal
=
clock
(),
clk
,
timeInsert
;
...
...
@@ -1095,13 +1104,13 @@ void Abc_NtkRecStart2( Gia_Man_t * pGia, int nVars, int nCuts, int fTrim )
memset
(
p
->
pBins
,
-
1
,
sizeof
(
int
)
*
p
->
nBins
);
clk
=
clock
();
Gia_ManForEachPo
(
pGia
,
pObj
,
i
)
{
pTruthSrc
=
Gia_ObjComputeTruthTable
(
pGia
,
pObj
);
// pTruthDst = (unsigned *)Vec_PtrEntry( p->vTtNodes, Gia_ObjCioId(pObj) );
// Kit_TruthCopy(pTruthDst, pTruthSrc, p->nVars);
Rec_MemSetEntry
(
p
,
Gia_ObjCioId
(
pObj
),
pTruthSrc
);
}
//
Gia_ManForEachPo( pGia, pObj, i )
//
{
//
pTruthSrc = Gia_ObjComputeTruthTable(pGia, pObj);
//
//
pTruthDst = (unsigned *)Vec_PtrEntry( p->vTtNodes, Gia_ObjCioId(pObj) );
//
//
Kit_TruthCopy(pTruthDst, pTruthSrc, p->nVars);
//
Rec_MemSetEntry( p, Gia_ObjCioId(pObj), pTruthSrc );
//
}
p
->
timeTruth
+=
clock
()
-
clk
;
// insert the PO nodes into the table
...
...
@@ -1115,12 +1124,14 @@ timeInsert = clock();
assert
(
pFanin
->
fMark1
==
0
);
pFanin
->
fMark1
=
1
;
// pTruth = (unsigned *)Vec_PtrEntry( p->vTtNodes, Gia_ObjCioId(pObj) );
pTruth
=
Rec_MemReadEntry
(
p
,
Gia_ObjCioId
(
pObj
)
);
pTruth
=
Gia_ObjComputeTruthTable
(
pGia
,
pObj
);
//pTruth = Rec_MemReadEntry( p, Gia_ObjCioId(pObj) );
// add the resulting truth table to the hash table
if
(
p
->
nAddedFuncs
>
2
*
p
->
nBins
)
Abc_NtkRecResizeHash2
(
p
);
ppSpot
=
Abc_NtkRecTableLookup2
(
p
,
p
->
pBins
,
p
->
nBins
,
pTruth
,
p
->
nVars
);
Abc_NtkRecInsertToLookUpTable2
(
p
,
ppSpot
,
pObj
,
Abc_ObjGetMax2
(
p
->
vInputs
,
pGia
,
pFanin
),
p
->
fTrim
);
Abc_NtkRecInsertToLookUpTable2
(
p
,
ppSpot
,
pObj
,
Abc_ObjGetMax2
(
p
->
vInputs
,
pGia
,
pFanin
),
p
Truth
,
p
->
fTrim
);
}
p
->
timeInsert
+=
clock
()
-
timeInsert
;
...
...
@@ -1173,7 +1184,7 @@ for ( i = 0; i < p->nBins; i++ )
{
int
tmp
=
0
;
// pTruth = (unsigned*)Vec_PtrEntry(p->vTtNodes, entry);
pTruth
=
Rec_MemReadEntry
(
p
,
entry
);
pTruth
=
Rec_MemReadEntry
(
p
,
Rec_Obj
(
p
,
pEntry
)
->
truthID
);
/*if ( (int)Kit_TruthSupport(pTruth, nVars) != (1<<nVars)-1 )
continue;*/
Extra_PrintHex
(
pFile
,
pTruth
,
nVars
);
...
...
@@ -1459,7 +1470,7 @@ int Abc_NtkRecAddCut2( If_Man_t * pIfMan, If_Obj_t * pRoot, If_Cut_t * pCut )
Vec_Ptr_t
*
vNodes
=
s_pMan
->
vNodes
;
unsigned
*
pInOut
=
s_pMan
->
pTemp1
;
unsigned
*
pTemp
=
s_pMan
->
pTemp2
;
unsigned
*
pTruth
Src
;
//, *pTruthDst;
unsigned
*
pTruth
;
//, *pTruthDst;
int
objectID
=
0
;
int
i
,
RetValue
,
nNodes
,
nNodesBeg
,
nInputs
=
s_pMan
->
nVars
,
nLeaves
=
If_CutLeaveNum
(
pCut
);
unsigned
uCanonPhase
;
...
...
@@ -1474,8 +1485,6 @@ int Abc_NtkRecAddCut2( If_Man_t * pIfMan, If_Obj_t * pRoot, If_Cut_t * pCut )
s_pMan
->
nFilterSize
++
;
return
1
;
}
if
(
pRoot
->
Id
==
9
&&
pCut
->
nLeaves
==
3
)
i
=
0
;
// collect internal nodes and skip redundant cuts
clk
=
clock
();
RetValue
=
Abc_NtkRecCollectNodes
(
pIfMan
,
pRoot
,
pCut
,
vNodes
);
...
...
@@ -1551,10 +1560,10 @@ timeBuild = clock();
}
//assert(pObj);
pObj
=
Gia_ManObj
(
pAig
,
Abc_Lit2Var
(
iRecObj
));
pTruth
Src
=
Gia_ObjComputeTruthTable
(
pAig
,
pObj
);
pTruth
=
Gia_ObjComputeTruthTable
(
pAig
,
pObj
);
s_pMan
->
timeBuild
+=
clock
()
-
timeBuild
;
if
(
Kit_TruthSupport
(
pTruth
Src
,
nInputs
)
!=
Kit_BitMask
(
nLeaves
)
)
if
(
Kit_TruthSupport
(
pTruth
,
nInputs
)
!=
Kit_BitMask
(
nLeaves
)
)
{
s_pMan
->
nFilterError
++
;
printf
(
"S"
);
...
...
@@ -1562,7 +1571,7 @@ s_pMan->timeBuild += clock() - timeBuild;
}
// compare the truth tables
if
(
!
Kit_TruthIsEqualWithPhase
(
pTruth
Src
,
pInOut
,
nInputs
)
)
if
(
!
Kit_TruthIsEqualWithPhase
(
pTruth
,
pInOut
,
nInputs
)
)
{
s_pMan
->
nFilterError
++
;
printf
(
"F"
);
...
...
@@ -1573,7 +1582,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_NtkRecResizeHash2
(
s_pMan
);
ppSpot
=
Abc_NtkRecTableLookup2
(
s_pMan
,
s_pMan
->
pBins
,
s_pMan
->
nBins
,
pTruth
Src
,
nInputs
);
ppSpot
=
Abc_NtkRecTableLookup2
(
s_pMan
,
s_pMan
->
pBins
,
s_pMan
->
nBins
,
pTruth
,
nInputs
);
Abc_NtkRecFrequencyInc
(
*
ppSpot
);
// if not new nodes were added and the node has a CO fanout
...
...
@@ -1599,11 +1608,11 @@ s_pMan->timeBuild += clock() - timeBuild;
// pTruthDst = (unsigned *)Vec_PtrEntry( s_pMan->vTtNodes, Gia_ObjCioId(pPO));
// Kit_TruthCopy(pTruthDst, pTruthSrc, s_pMan->nVars);
Rec_MemSetEntry
(
s_pMan
,
Gia_ObjCioId
(
pPO
),
pTruthSrc
);
//
Rec_MemSetEntry( s_pMan, Gia_ObjCioId(pPO), pTruthSrc );
// add the resulting truth table to the hash table
timeInsert
=
clock
();
Abc_NtkRecInsertToLookUpTable2
(
s_pMan
,
ppSpot
,
pPO
,
nLeaves
,
s_pMan
->
fTrim
);
Abc_NtkRecInsertToLookUpTable2
(
s_pMan
,
ppSpot
,
pPO
,
nLeaves
,
pTruth
,
s_pMan
->
fTrim
);
s_pMan
->
timeInsert
+=
clock
()
-
timeInsert
;
// if (pIfMan->pPars->fDelayOpt)
// Abc_NtkRecAddSOPB(pIfMan, pCut, pTruth, pCanonPerm, uCanonPhase );
...
...
@@ -1663,7 +1672,7 @@ void Abc_NtkRecAdd2( Abc_Ntk_t * pNtk, int fUseSOPB)
}
else
{
pPars
->
fTruth
=
0
;
pPars
->
fTruth
=
1
;
pPars
->
fUsePerm
=
0
;
pPars
->
fDelayOpt
=
0
;
}
...
...
@@ -1885,7 +1894,7 @@ int If_CutDelayRecCost2(If_Man_t* p, If_Cut_t* pCut, If_Obj_t * pObj)
s_pMan
->
nFunsFound
++
;
// make sure the truth table is the same
// pTruthRec = (unsigned*)Vec_PtrEntry( s_pMan->vTtNodes, Rec_ObjID(s_pMan, pCandMin) );
pTruthRec
=
Rec_MemReadEntry
(
s_pMan
,
Rec_ObjID
(
s_pMan
,
pCandMin
)
);
pTruthRec
=
Rec_MemReadEntry
(
s_pMan
,
pCandMin
->
truthID
);
if
(
!
Kit_TruthIsEqualWithPhase
(
pTruthRec
,
pInOut
,
nLeaves
)
)
{
assert
(
0
);
...
...
@@ -2199,7 +2208,7 @@ void Abc_NtkRecAddFromLib2( Gia_Man_t * pGia2, Gia_Obj_t * pRoot, int nVars )
Vec_Ptr_t
*
vNodes
=
s_pMan
->
vNodes
;
unsigned
*
pInOut
=
s_pMan
->
pTemp1
;
//unsigned * pTemp = s_pMan->pTemp2;
unsigned
*
pTruth
Src
;
//, *pTruthDst;
unsigned
*
pTruth
;
//, *pTruthDst;
int
objectID
;
int
i
,
nNodes
,
nNodesBeg
,
nInputs
=
s_pMan
->
nVars
,
nLeaves
=
nVars
;
assert
(
nInputs
<=
16
);
...
...
@@ -2232,15 +2241,15 @@ void Abc_NtkRecAddFromLib2( Gia_Man_t * pGia2, Gia_Obj_t * pRoot, int nVars )
Gia_ObjSetCopyF
(
pGia2
,
0
,
pAbcObj
,
Gia_ObjId
(
pGia
,
pObj
));
}
assert
(
pObj
);
pTruth
Src
=
Gia_ObjComputeTruthTable
(
pGia
,
pObj
);
pTruth
=
Gia_ObjComputeTruthTable
(
pGia
,
pObj
);
//pTruth = (unsigned *)Vec_PtrEntry( s_pMan->vTtNodes, Gia_ObjId(pGia, pObj) );
assert
(
Kit_TruthSupport
(
pTruth
Src
,
nInputs
)
==
Kit_BitMask
(
nLeaves
)
);
assert
(
Kit_TruthSupport
(
pTruth
,
nInputs
)
==
Kit_BitMask
(
nLeaves
)
);
// compare the truth tables
assert
(
Kit_TruthIsEqual
(
pTruth
Src
,
pInOut
,
nInputs
)
);
assert
(
Kit_TruthIsEqual
(
pTruth
,
pInOut
,
nInputs
)
);
if
(
s_pMan
->
nAddedFuncs
>
2
*
s_pMan
->
nBins
)
Abc_NtkRecResizeHash2
(
s_pMan
);
ppSpot
=
Abc_NtkRecTableLookup2
(
s_pMan
,
s_pMan
->
pBins
,
s_pMan
->
nBins
,
pTruth
Src
,
nInputs
);
ppSpot
=
Abc_NtkRecTableLookup2
(
s_pMan
,
s_pMan
->
pBins
,
s_pMan
->
nBins
,
pTruth
,
nInputs
);
// if not new nodes were added and the node has a CO fanout
if
(
nNodesBeg
==
Gia_ManObjNum
(
pGia
)
&&
pObj
->
fMark1
==
1
)
...
...
@@ -2265,10 +2274,10 @@ void Abc_NtkRecAddFromLib2( Gia_Man_t * pGia2, Gia_Obj_t * pRoot, int nVars )
// pTruthDst = (unsigned *)Vec_PtrEntry( s_pMan->vTtNodes, Gia_ObjCioId(pPO));
// Kit_TruthCopy(pTruthDst, pTruthSrc, s_pMan->nVars);
Rec_MemSetEntry
(
s_pMan
,
Gia_ObjCioId
(
pPO
),
pTruthSrc
);
//
Rec_MemSetEntry( s_pMan, Gia_ObjCioId(pPO), pTruthSrc );
// add the resulting truth table to the hash table
Abc_NtkRecInsertToLookUpTable2
(
s_pMan
,
ppSpot
,
pPO
,
nLeaves
,
s_pMan
->
fTrim
);
Abc_NtkRecInsertToLookUpTable2
(
s_pMan
,
ppSpot
,
pPO
,
nLeaves
,
pTruth
,
s_pMan
->
fTrim
);
return
;
}
...
...
@@ -2295,6 +2304,9 @@ void Abc_NtkRecLibMerge2(Gia_Man_t* pGia2)
return
;
}
pGia2
->
pCopies
=
ABC_FALLOC
(
int
,
Gia_ManObjNum
(
pGia2
)
);
// create hash table if not available
if
(
s_pMan
->
pGia
->
pHTable
==
NULL
)
Gia_ManHashStart
(
s_pMan
->
pGia
);
Abc_NtkRecMarkInputs
(
p
,
pGia2
);
// insert the PO nodes into the table
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment