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
c44cc5de
Commit
c44cc5de
authored
Jan 20, 2012
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Deleting file added by mistake.
parent
2c50c2c5
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
0 additions
and
357 deletions
+0
-357
src/base/abci/fahout cut.c
+0
-357
No files found.
src/base/abci/fahout cut.c
deleted
100644 → 0
View file @
2c50c2c5
/**CFile****************************************************************
FileName [abcMerge.c]
SystemName [ABC: Logic synthesis and verification system.]
PackageName [Network and node package.]
Synopsis [LUT merging algorithm.]
Author [Alan Mishchenko]
Affiliation [UC Berkeley]
Date [Ver. 1.0. Started - June 20, 2005.]
Revision [$Id: abcMerge.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
***********************************************************************/
#include "abc.h"
#include "aig.h"
#include "nwkMerge.h"
ABC_NAMESPACE_IMPL_START
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
/// FUNCTION DEFINITIONS ///
////////////////////////////////////////////////////////////////////////
/**Function*************************************************************
Synopsis [Marks the fanins of the node with the current trav ID.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Abc_NtkMarkFanins_rec
(
Abc_Obj_t
*
pLut
,
int
nLevMin
)
{
Abc_Obj_t
*
pNext
;
int
i
;
if
(
!
Abc_ObjIsNode
(
pLut
)
)
return
;
if
(
Abc_NodeIsTravIdCurrent
(
pLut
)
)
return
;
Abc_NodeSetTravIdCurrent
(
pLut
);
if
(
Abc_ObjLevel
(
pLut
)
<
nLevMin
)
return
;
Abc_ObjForEachFanin
(
pLut
,
pNext
,
i
)
Abc_NtkMarkFanins_rec
(
pNext
,
nLevMin
);
}
/**Function*************************************************************
Synopsis [Marks the fanouts of the node with the current trav ID.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Abc_NtkMarkFanouts_rec
(
Abc_Obj_t
*
pLut
,
int
nLevMax
,
int
nFanMax
)
{
Abc_Obj_t
*
pNext
;
int
i
;
if
(
!
Abc_ObjIsNode
(
pLut
)
)
return
;
if
(
Abc_NodeIsTravIdCurrent
(
pLut
)
)
return
;
Abc_NodeSetTravIdCurrent
(
pLut
);
if
(
Abc_ObjLevel
(
pLut
)
>
nLevMax
)
return
;
if
(
Abc_ObjFanoutNum
(
pLut
)
>
nFanMax
)
return
;
Abc_ObjForEachFanout
(
pLut
,
pNext
,
i
)
Abc_NtkMarkFanouts_rec
(
pNext
,
nLevMax
,
nFanMax
);
}
/**Function*************************************************************
Synopsis [Collects the circle of nodes around the given set.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Abc_NtkCollectCircle
(
Vec_Ptr_t
*
vStart
,
Vec_Ptr_t
*
vNext
,
int
nFanMax
)
{
Abc_Obj_t
*
pObj
,
*
pNext
;
int
i
,
k
;
Vec_PtrClear
(
vNext
);
Vec_PtrForEachEntry
(
Vec_Int_t
*
,
vStart
,
pObj
,
i
)
{
Abc_ObjForEachFanin
(
pObj
,
pNext
,
k
)
{
if
(
!
Abc_ObjIsNode
(
pNext
)
)
continue
;
if
(
Abc_NodeIsTravIdCurrent
(
pNext
)
)
continue
;
Abc_NodeSetTravIdCurrent
(
pNext
);
Vec_PtrPush
(
vNext
,
pNext
);
}
Abc_ObjForEachFanout
(
pObj
,
pNext
,
k
)
{
if
(
!
Abc_ObjIsNode
(
pNext
)
)
continue
;
if
(
Abc_NodeIsTravIdCurrent
(
pNext
)
)
continue
;
Abc_NodeSetTravIdCurrent
(
pNext
);
if
(
Abc_ObjFanoutNum
(
pNext
)
>
nFanMax
)
continue
;
Vec_PtrPush
(
vNext
,
pNext
);
}
}
}
/**Function*************************************************************
Synopsis [Collects the circle of nodes removes from the given one.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Abc_NtkCollectNonOverlapCands
(
Abc_Obj_t
*
pLut
,
Vec_Ptr_t
*
vStart
,
Vec_Ptr_t
*
vNext
,
Vec_Ptr_t
*
vCands
,
Nwk_LMPars_t
*
pPars
)
{
Vec_Ptr_t
*
vTemp
;
Abc_Obj_t
*
pObj
;
int
i
,
k
;
Vec_PtrClear
(
vCands
);
if
(
pPars
->
nMaxSuppSize
-
Abc_ObjFaninNum
(
pLut
)
<=
1
)
return
;
// collect nodes removed by this distance
assert
(
pPars
->
nMaxDistance
>
0
);
Vec_PtrClear
(
vStart
);
Vec_PtrPush
(
vStart
,
pLut
);
Abc_NtkIncrementTravId
(
pLut
->
pNtk
);
Abc_NodeSetTravIdCurrent
(
pLut
);
for
(
i
=
1
;
i
<=
pPars
->
nMaxDistance
;
i
++
)
{
Abc_NtkCollectCircle
(
vStart
,
vNext
,
pPars
->
nMaxFanout
);
vTemp
=
vStart
;
vStart
=
vNext
;
vNext
=
vTemp
;
// collect the nodes in vStart
Vec_PtrForEachEntry
(
Vec_Int_t
*
,
vStart
,
pObj
,
k
)
Vec_PtrPush
(
vCands
,
pObj
);
}
// mark the TFI/TFO nodes
Abc_NtkIncrementTravId
(
pLut
->
pNtk
);
if
(
pPars
->
fUseTfiTfo
)
Abc_NodeSetTravIdCurrent
(
pLut
);
else
{
Abc_NodeSetTravIdPrevious
(
pLut
);
Abc_NtkMarkFanins_rec
(
pLut
,
Abc_ObjLevel
(
pLut
)
-
pPars
->
nMaxDistance
);
Abc_NodeSetTravIdPrevious
(
pLut
);
Abc_NtkMarkFanouts_rec
(
pLut
,
Abc_ObjLevel
(
pLut
)
+
pPars
->
nMaxDistance
,
pPars
->
nMaxFanout
);
}
// collect nodes satisfying the following conditions:
// - they are close enough in terms of distance
// - they are not in the TFI/TFO of the LUT
// - they have no more than the given number of fanins
// - they have no more than the given diff in delay
k
=
0
;
Vec_PtrForEachEntry
(
Vec_Int_t
*
,
vCands
,
pObj
,
i
)
{
if
(
Abc_NodeIsTravIdCurrent
(
pObj
)
)
continue
;
if
(
Abc_ObjFaninNum
(
pLut
)
+
Abc_ObjFaninNum
(
pObj
)
>
pPars
->
nMaxSuppSize
)
continue
;
if
(
Abc_ObjLevel
(
pLut
)
-
Abc_ObjLevel
(
pObj
)
>
pPars
->
nMaxLevelDiff
||
Abc_ObjLevel
(
pObj
)
-
Abc_ObjLevel
(
pLut
)
>
pPars
->
nMaxLevelDiff
)
continue
;
Vec_PtrWriteEntry
(
vCands
,
k
++
,
pObj
);
}
Vec_PtrShrink
(
vCands
,
k
);
}
/**Function*************************************************************
Synopsis [Count the total number of fanins.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Abc_NtkCountTotalFanins
(
Abc_Obj_t
*
pLut
,
Abc_Obj_t
*
pCand
)
{
Abc_Obj_t
*
pFanin
;
int
i
,
nCounter
=
Abc_ObjFaninNum
(
pLut
);
Abc_ObjForEachFanin
(
pCand
,
pFanin
,
i
)
nCounter
+=
!
pFanin
->
fMarkC
;
return
nCounter
;
}
/**Function*************************************************************
Synopsis [Collects overlapping candidates.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Abc_NtkCollectOverlapCands
(
Abc_Obj_t
*
pLut
,
Vec_Ptr_t
*
vCands
,
Nwk_LMPars_t
*
pPars
)
{
Abc_Obj_t
*
pFanin
,
*
pObj
;
int
i
,
k
;
// mark fanins of pLut
Abc_ObjForEachFanin
(
pLut
,
pFanin
,
i
)
pFanin
->
fMarkC
=
1
;
// collect the matching fanouts of each fanin of the node
Vec_PtrClear
(
vCands
);
Abc_NtkIncrementTravId
(
pLut
->
pNtk
);
Abc_NodeSetTravIdCurrent
(
pLut
);
Abc_ObjForEachFanin
(
pLut
,
pFanin
,
i
)
{
if
(
!
Abc_ObjIsNode
(
pFanin
)
)
continue
;
if
(
Abc_ObjFanoutNum
(
pFanin
)
>
pPars
->
nMaxFanout
)
continue
;
Abc_ObjForEachFanout
(
pFanin
,
pObj
,
k
)
{
if
(
!
Abc_ObjIsNode
(
pObj
)
)
continue
;
if
(
Abc_NodeIsTravIdCurrent
(
pObj
)
)
continue
;
Abc_NodeSetTravIdCurrent
(
pObj
);
// check the difference in delay
if
(
Abc_ObjLevel
(
pLut
)
-
Abc_ObjLevel
(
pObj
)
>
pPars
->
nMaxLevelDiff
||
Abc_ObjLevel
(
pObj
)
-
Abc_ObjLevel
(
pLut
)
>
pPars
->
nMaxLevelDiff
)
continue
;
// check the total number of fanins of the node
if
(
Abc_NtkCountTotalFanins
(
pLut
,
pObj
)
>
pPars
->
nMaxSuppSize
)
continue
;
Vec_PtrPush
(
vCands
,
pObj
);
}
}
// unmark fanins of pLut
Abc_ObjForEachFanin
(
pLut
,
pFanin
,
i
)
pFanin
->
fMarkC
=
0
;
}
/**Function*************************************************************
Synopsis [Performs LUT merging with parameters.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
Vec_Int_t
*
Abc_NtkLutMerge
(
Abc_Ntk_t
*
pNtk
,
Nwk_LMPars_t
*
pPars
)
{
Nwk_Grf_t
*
p
;
Vec_Int_t
*
vResult
;
Vec_Ptr_t
*
vStart
,
*
vNext
,
*
vCands1
,
*
vCands2
;
Abc_Obj_t
*
pLut
,
*
pCand
;
int
i
,
k
,
nVertsMax
,
nCands
,
clk
=
clock
();
// count the number of vertices
nVertsMax
=
0
;
Abc_NtkForEachNode
(
pNtk
,
pLut
,
i
)
nVertsMax
+=
(
int
)(
Abc_ObjFaninNum
(
pLut
)
<=
pPars
->
nMaxLutSize
);
p
=
Nwk_ManGraphAlloc
(
nVertsMax
);
// create graph
vStart
=
Vec_PtrAlloc
(
1000
);
vNext
=
Vec_PtrAlloc
(
1000
);
vCands1
=
Vec_PtrAlloc
(
1000
);
vCands2
=
Vec_PtrAlloc
(
1000
);
nCands
=
0
;
Abc_NtkForEachNode
(
pNtk
,
pLut
,
i
)
{
if
(
Abc_ObjFaninNum
(
pLut
)
>
pPars
->
nMaxLutSize
)
continue
;
Abc_NtkCollectOverlapCands
(
pLut
,
vCands1
,
pPars
);
if
(
pPars
->
fUseDiffSupp
)
Abc_NtkCollectNonOverlapCands
(
pLut
,
vStart
,
vNext
,
vCands2
,
pPars
);
if
(
Vec_PtrSize
(
vCands1
)
==
0
&&
Vec_PtrSize
(
vCands2
)
==
0
)
continue
;
nCands
+=
Vec_PtrSize
(
vCands1
)
+
Vec_PtrSize
(
vCands2
);
// save candidates
Vec_PtrForEachEntry
(
Vec_Int_t
*
,
vCands1
,
pCand
,
k
)
Nwk_ManGraphHashEdge
(
p
,
Abc_ObjId
(
pLut
),
Abc_ObjId
(
pCand
)
);
Vec_PtrForEachEntry
(
Vec_Int_t
*
,
vCands2
,
pCand
,
k
)
Nwk_ManGraphHashEdge
(
p
,
Abc_ObjId
(
pLut
),
Abc_ObjId
(
pCand
)
);
// print statistics about this node
if
(
pPars
->
fVeryVerbose
)
printf
(
"Node %6d : Fanins = %d. Fanouts = %3d. Cand1 = %3d. Cand2 = %3d.
\n
"
,
Abc_ObjId
(
pLut
),
Abc_ObjFaninNum
(
pLut
),
Abc_ObjFaninNum
(
pLut
),
Vec_PtrSize
(
vCands1
),
Vec_PtrSize
(
vCands2
)
);
}
Vec_PtrFree
(
vStart
);
Vec_PtrFree
(
vNext
);
Vec_PtrFree
(
vCands1
);
Vec_PtrFree
(
vCands2
);
if
(
pPars
->
fVerbose
)
{
printf
(
"Mergable LUTs = %6d. Total cands = %6d. "
,
p
->
nVertsMax
,
nCands
);
ABC_PRT
(
"Deriving graph"
,
clock
()
-
clk
);
}
// solve the graph problem
clk
=
clock
();
Nwk_ManGraphSolve
(
p
);
if
(
pPars
->
fVerbose
)
{
printf
(
"GRAPH: Nodes = %6d. Edges = %6d. Pairs = %6d. "
,
p
->
nVerts
,
p
->
nEdges
,
Vec_IntSize
(
p
->
vPairs
)
/
2
);
ABC_PRT
(
"Solving"
,
clock
()
-
clk
);
Nwk_ManGraphReportMemoryUsage
(
p
);
}
vResult
=
p
->
vPairs
;
p
->
vPairs
=
NULL
;
/*
for ( i = 0; i < vResult->nSize; i += 2 )
printf( "(%d,%d) ", vResult->pArray[i], vResult->pArray[i+1] );
printf( "\n" );
*/
Nwk_ManGraphFree
(
p
);
return
vResult
;
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
ABC_NAMESPACE_IMPL_END
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