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
651a32cd
Commit
651a32cd
authored
Apr 11, 2008
by
Alan Mishchenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Version abc80411
parent
c645bac3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
310 additions
and
29 deletions
+310
-29
src/aig/aig/aig.h
+1
-0
src/aig/aig/aigRepr.c
+22
-0
src/aig/hop/hop.h
+5
-5
src/aig/mfx/mfxCore.c
+1
-0
src/aig/ntl/ntlExtract.c
+5
-5
src/aig/ntl/ntlFraig.c
+6
-0
src/aig/ntl/ntlWriteBlif.c
+6
-2
src/aig/nwk/nwk.h
+3
-0
src/aig/nwk/nwkCheck.c
+27
-1
src/aig/nwk/nwkFanio.c
+4
-4
src/aig/nwk/nwkMap.c
+19
-3
src/aig/nwk/nwkObj.c
+2
-4
src/aig/nwk/nwkTiming.c
+2
-0
src/aig/nwk/nwkUtil.c
+109
-0
src/base/abci/abc.c
+0
-0
src/base/abci/abcPrint.c
+1
-0
src/base/main/main.c
+1
-1
src/map/if/if.h
+4
-2
src/map/if/ifCut.c
+59
-1
src/map/if/ifLib.c
+31
-0
src/map/if/ifMap.c
+1
-1
src/map/if/ifReduce.c
+1
-0
No files found.
src/aig/aig/aig.h
View file @
651a32cd
...
...
@@ -548,6 +548,7 @@ extern void Aig_ManReprStop( Aig_Man_t * p );
extern
void
Aig_ObjCreateRepr
(
Aig_Man_t
*
p
,
Aig_Obj_t
*
pNode1
,
Aig_Obj_t
*
pNode2
);
extern
void
Aig_ManTransferRepr
(
Aig_Man_t
*
pNew
,
Aig_Man_t
*
p
);
extern
Aig_Man_t
*
Aig_ManDupRepr
(
Aig_Man_t
*
p
,
int
fOrdered
);
extern
int
Aig_ManCountReprs
(
Aig_Man_t
*
p
);
extern
Aig_Man_t
*
Aig_ManRehash
(
Aig_Man_t
*
p
);
extern
int
Aig_ObjCheckTfi
(
Aig_Man_t
*
p
,
Aig_Obj_t
*
pNew
,
Aig_Obj_t
*
pOld
);
extern
void
Aig_ManMarkValidChoices
(
Aig_Man_t
*
p
);
...
...
src/aig/aig/aigRepr.c
View file @
651a32cd
...
...
@@ -329,6 +329,28 @@ int Aig_ManRemapRepr( Aig_Man_t * p )
/**Function*************************************************************
Synopsis [Transfer representatives and return the number of critical fanouts.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
Aig_ManCountReprs
(
Aig_Man_t
*
p
)
{
Aig_Obj_t
*
pObj
;
int
i
,
Counter
=
0
;
if
(
p
->
pReprs
==
NULL
)
return
0
;
Aig_ManForEachObj
(
p
,
pObj
,
i
)
Counter
+=
(
p
->
pReprs
[
i
]
!=
NULL
);
return
Counter
;
}
/**Function*************************************************************
Synopsis [Returns 1 if pOld is in the TFI of pNew.]
Description []
...
...
src/aig/hop/hop.h
View file @
651a32cd
...
...
@@ -166,11 +166,11 @@ static inline int Hop_ObjIsMarkA( Hop_Obj_t * pObj ) { return pObj-
static
inline
void
Hop_ObjSetMarkA
(
Hop_Obj_t
*
pObj
)
{
pObj
->
fMarkA
=
1
;
}
static
inline
void
Hop_ObjClearMarkA
(
Hop_Obj_t
*
pObj
)
{
pObj
->
fMarkA
=
0
;
}
static
inline
void
Hop_ObjSetTravId
(
Hop_Obj_t
*
pObj
,
int
TravId
)
{
pObj
->
pData
=
(
void
*
)
TravId
;
}
static
inline
void
Hop_ObjSetTravIdCurrent
(
Hop_Man_t
*
p
,
Hop_Obj_t
*
pObj
)
{
pObj
->
pData
=
(
void
*
)
p
->
nTravIds
;
}
static
inline
void
Hop_ObjSetTravIdPrevious
(
Hop_Man_t
*
p
,
Hop_Obj_t
*
pObj
)
{
pObj
->
pData
=
(
void
*
)(
p
->
nTravIds
-
1
);
}
static
inline
int
Hop_ObjIsTravIdCurrent
(
Hop_Man_t
*
p
,
Hop_Obj_t
*
pObj
)
{
return
(
int
)((
int
)
pObj
->
pData
==
p
->
nTravIds
);
}
static
inline
int
Hop_ObjIsTravIdPrevious
(
Hop_Man_t
*
p
,
Hop_Obj_t
*
pObj
)
{
return
(
int
)((
int
)
pObj
->
pData
==
p
->
nTravIds
-
1
);
}
static
inline
void
Hop_ObjSetTravId
(
Hop_Obj_t
*
pObj
,
int
TravId
)
{
pObj
->
pData
=
(
void
*
)
(
long
)
TravId
;
}
static
inline
void
Hop_ObjSetTravIdCurrent
(
Hop_Man_t
*
p
,
Hop_Obj_t
*
pObj
)
{
pObj
->
pData
=
(
void
*
)
(
long
)
p
->
nTravIds
;
}
static
inline
void
Hop_ObjSetTravIdPrevious
(
Hop_Man_t
*
p
,
Hop_Obj_t
*
pObj
)
{
pObj
->
pData
=
(
void
*
)(
long
)(
p
->
nTravIds
-
1
);
}
static
inline
int
Hop_ObjIsTravIdCurrent
(
Hop_Man_t
*
p
,
Hop_Obj_t
*
pObj
)
{
return
(
int
)((
int
)(
long
)
pObj
->
pData
==
p
->
nTravIds
);
}
static
inline
int
Hop_ObjIsTravIdPrevious
(
Hop_Man_t
*
p
,
Hop_Obj_t
*
pObj
)
{
return
(
int
)((
int
)(
long
)
pObj
->
pData
==
p
->
nTravIds
-
1
);
}
static
inline
int
Hop_ObjTravId
(
Hop_Obj_t
*
pObj
)
{
return
(
int
)
pObj
->
pData
;
}
static
inline
int
Hop_ObjPhase
(
Hop_Obj_t
*
pObj
)
{
return
pObj
->
fPhase
;
}
...
...
src/aig/mfx/mfxCore.c
View file @
651a32cd
...
...
@@ -206,6 +206,7 @@ int Mfx_Perform( Nwk_Man_t * pNtk, Mfx_Par_t * pPars, If_Lib_t * pLutLib )
int
nTotalNodesBeg
=
Nwk_ManNodeNum
(
pNtk
);
int
nTotalEdgesBeg
=
Nwk_ManGetTotalFanins
(
pNtk
);
// assert( Nwk_ManCheck( pNtk ) );
// check limits on the number of fanins
nFaninMax
=
Nwk_ManGetFaninMax
(
pNtk
);
if
(
pPars
->
fResub
)
...
...
src/aig/ntl/ntlExtract.c
View file @
651a32cd
...
...
@@ -364,7 +364,7 @@ Aig_Obj_t * Ntl_GraphToNetworkAig( Aig_Man_t * pMan, Dec_Graph_t * pGraph )
Aig_Obj_t
*
Ntl_ManBuildNodeAig
(
Ntl_Obj_t
*
pNode
)
{
Aig_Man_t
*
pMan
=
pNode
->
pModel
->
pMan
->
pAig
;
int
fUseFactor
=
0
;
int
fUseFactor
=
1
;
// consider the constant node
if
(
Ntl_SopGetVarNum
(
pNode
->
pSop
)
==
0
)
return
Aig_NotCond
(
Aig_ManConst1
(
pMan
),
Ntl_SopIsConst0
(
pNode
->
pSop
)
);
...
...
@@ -957,8 +957,8 @@ Aig_Man_t * Ntl_ManCollapseForSec( Ntl_Man_t * p1, Ntl_Man_t * p2 )
***********************************************************************/
static
inline
void
Ntl_NetIncrementRefs
(
Ntl_Net_t
*
pNet
)
{
int
nRefs
=
(
int
)
pNet
->
pCopy
;
pNet
->
pCopy
=
(
void
*
)(
nRefs
+
1
);
int
nRefs
=
(
int
)
(
long
)
pNet
->
pCopy
;
pNet
->
pCopy
=
(
void
*
)(
long
)(
nRefs
+
1
);
}
/**Function*************************************************************
...
...
@@ -981,7 +981,7 @@ Nwk_Obj_t * Ntl_ManExtractNwk_rec( Ntl_Man_t * p, Ntl_Net_t * pNet, Nwk_Man_t *
if
(
pNet
->
fMark
)
return
pNet
->
pCopy
;
pNet
->
fMark
=
1
;
pNode
=
Nwk_ManCreateNode
(
pNtk
,
Ntl_ObjFaninNum
(
pNet
->
pDriver
),
(
int
)
pNet
->
pCopy
);
pNode
=
Nwk_ManCreateNode
(
pNtk
,
Ntl_ObjFaninNum
(
pNet
->
pDriver
),
(
int
)
(
long
)
pNet
->
pCopy
);
Ntl_ObjForEachFanin
(
pNet
->
pDriver
,
pFaninNet
,
i
)
{
Ntl_ManExtractNwk_rec
(
p
,
pFaninNet
,
pNtk
,
vCover
,
vMemory
);
...
...
@@ -1046,7 +1046,7 @@ Nwk_Man_t * Ntl_ManExtractNwk( Ntl_Man_t * p, Aig_Man_t * pAig )
pObj
=
Ntl_ModelPi
(
pRoot
,
Aig_ObjPioNum
(
pAnd
)
);
pNet
=
Ntl_ObjFanout0
(
pObj
);
pNet
->
fMark
=
1
;
pNet
->
pCopy
=
Nwk_ManCreateCi
(
pNtk
,
(
int
)
pNet
->
pCopy
);
pNet
->
pCopy
=
Nwk_ManCreateCi
(
pNtk
,
(
int
)
(
long
)
pNet
->
pCopy
);
}
else
if
(
Aig_ObjIsPo
(
pAnd
)
)
{
...
...
src/aig/ntl/ntlFraig.c
View file @
651a32cd
...
...
@@ -192,6 +192,8 @@ Aig_Man_t * Ntl_ManScl( Ntl_Man_t * p, Aig_Man_t * pAig, int fLatchConst, int fL
// derive the new AIG
pTemp
=
Aig_ManDupRepresDfs
(
pAig
);
printf
(
"Intermediate:
\n
"
);
Aig_ManPrintStats
(
pTemp
);
// duplicate the timing manager
if
(
pAig
->
pManTime
)
pTemp
->
pManTime
=
Tim_ManDup
(
pAig
->
pManTime
,
0
);
...
...
@@ -230,17 +232,21 @@ Aig_Man_t * Ntl_ManLcorr( Ntl_Man_t * p, Aig_Man_t * pAig, int nConfMax, int fVe
// perform fraiging for the given design
pAigCol
->
nRegs
=
Ntl_ModelLatchNum
(
Ntl_ManRootModel
(
p
));
pTemp
=
Fra_FraigLatchCorrespondence
(
pAigCol
,
0
,
nConfMax
,
0
,
fVerbose
,
NULL
);
//printf( "Reprs = %d.\n", Aig_ManCountReprs(pAigCol) );
Aig_ManStop
(
pTemp
);
// transfer equivalence classes to the original AIG
pAig
->
pReprs
=
Ntl_ManFraigDeriveClasses
(
pAig
,
pNew
,
pAigCol
);
pAig
->
nReprsAlloc
=
Aig_ManObjNumMax
(
pAig
);
//printf( "Reprs = %d.\n", Aig_ManCountReprs(pAig) );
// cleanup
Aig_ManStop
(
pAigCol
);
Ntl_ManFree
(
pNew
);
// derive the new AIG
pTemp
=
Aig_ManDupRepresDfs
(
pAig
);
//printf( "Intermediate LCORR:\n" );
//Aig_ManPrintStats( pTemp );
// duplicate the timing manager
if
(
pAig
->
pManTime
)
pTemp
->
pManTime
=
Tim_ManDup
(
pAig
->
pManTime
,
0
);
...
...
src/aig/ntl/ntlWriteBlif.c
View file @
651a32cd
...
...
@@ -45,7 +45,7 @@ void Ioa_WriteBlifModel( FILE * pFile, Ntl_Mod_t * pModel )
Ntl_Obj_t
*
pObj
;
Ntl_Net_t
*
pNet
;
float
Delay
;
int
i
,
k
;
int
i
,
k
,
fClockAdded
=
0
;
fprintf
(
pFile
,
".model %s
\n
"
,
pModel
->
pName
);
fprintf
(
pFile
,
".inputs"
);
Ntl_ModelForEachPi
(
pModel
,
pObj
,
i
)
...
...
@@ -117,8 +117,10 @@ void Ioa_WriteBlifModel( FILE * pFile, Ntl_Mod_t * pModel )
fprintf
(
pFile
,
" %s"
,
Ntl_ObjFanout0
(
pObj
)
->
pName
);
if
(
pObj
->
LatchId
>>
2
)
fprintf
(
pFile
,
" %d"
,
pObj
->
LatchId
>>
2
);
if
(
pObj
->
pFanio
[
1
]
!=
NULL
)
if
(
Ntl_ObjFanin
(
pObj
,
1
)
!=
NULL
)
fprintf
(
pFile
,
" %s"
,
Ntl_ObjFanin
(
pObj
,
1
)
->
pName
);
else
if
(
pObj
->
LatchId
>>
2
)
fprintf
(
pFile
,
" clock"
),
fClockAdded
=
1
;
fprintf
(
pFile
,
" %d"
,
pObj
->
LatchId
&
3
);
fprintf
(
pFile
,
"
\n
"
);
}
...
...
@@ -132,6 +134,8 @@ void Ioa_WriteBlifModel( FILE * pFile, Ntl_Mod_t * pModel )
fprintf
(
pFile
,
"
\n
"
);
}
}
if
(
fClockAdded
)
fprintf
(
pFile
,
".names clock
\n
0
\n
"
);
fprintf
(
pFile
,
".end
\n\n
"
);
}
...
...
src/aig/nwk/nwk.h
View file @
651a32cd
...
...
@@ -195,6 +195,8 @@ static inline int Nwk_ManTimeMore( float f1, float f2, float Eps ) { r
/*=== nwkBidec.c ==========================================================*/
extern
void
Nwk_ManBidecResyn
(
Nwk_Man_t
*
pNtk
,
int
fVerbose
);
extern
Hop_Obj_t
*
Nwk_NodeIfNodeResyn
(
Bdc_Man_t
*
p
,
Hop_Man_t
*
pHop
,
Hop_Obj_t
*
pRoot
,
int
nVars
,
Vec_Int_t
*
vTruth
,
unsigned
*
puCare
);
/*=== nwkCheck.c ==========================================================*/
extern
int
Nwk_ManCheck
(
Nwk_Man_t
*
p
);
/*=== nwkDfs.c ==========================================================*/
extern
int
Nwk_ManVerifyTopoOrder
(
Nwk_Man_t
*
pNtk
);
extern
int
Nwk_ManLevelBackup
(
Nwk_Man_t
*
pNtk
);
...
...
@@ -253,6 +255,7 @@ extern int Nwk_NodeCompareLevelsIncrease( Nwk_Obj_t ** pp1, Nwk_Obj_
extern
int
Nwk_NodeCompareLevelsDecrease
(
Nwk_Obj_t
**
pp1
,
Nwk_Obj_t
**
pp2
);
extern
void
Nwk_ObjPrint
(
Nwk_Obj_t
*
pObj
);
extern
void
Nwk_ManDumpBlif
(
Nwk_Man_t
*
pNtk
,
char
*
pFileName
,
Vec_Ptr_t
*
vCiNames
,
Vec_Ptr_t
*
vCoNames
);
extern
void
Nwk_ManPrintFanioNew
(
Nwk_Man_t
*
pNtk
);
#ifdef __cplusplus
}
...
...
src/aig/nwk/nwkCheck.c
View file @
651a32cd
...
...
@@ -30,7 +30,7 @@
/**Function*************************************************************
Synopsis []
Synopsis [
Checking the logic network for consistency.
]
Description []
...
...
@@ -39,6 +39,32 @@
SeeAlso []
***********************************************************************/
int
Nwk_ManCheck
(
Nwk_Man_t
*
p
)
{
Nwk_Obj_t
*
pObj
;
int
i
,
k
,
m
;
// check if the nodes have duplicated fanins
Nwk_ManForEachNode
(
p
,
pObj
,
i
)
{
for
(
k
=
0
;
k
<
pObj
->
nFanins
;
k
++
)
for
(
m
=
k
+
1
;
m
<
pObj
->
nFanins
;
m
++
)
if
(
pObj
->
pFanio
[
k
]
==
pObj
->
pFanio
[
m
]
)
printf
(
"Node %d has duplicated fanin %d.
\n
"
,
pObj
->
Id
,
pObj
->
pFanio
[
k
]
->
Id
);
}
/*
// check if all nodes are in the correct fanin/fanout relationship
Nwk_ManForEachObj( p, pObj, i )
{
Nwk_ObjForEachFanin( pObj, pNext, k )
if ( Nwk_ObjFindFanout( pNext, pObj ) == -1 )
printf( "Nwk_ManCheck(): Object %d has fanin %d which does not have a corresponding fanout.\n", pObj->Id, pNext->Id );
Nwk_ObjForEachFanout( pObj, pNext, k )
if ( Nwk_ObjFindFanin( pNext, pObj ) == -1 )
printf( "Nwk_ManCheck(): Object %d has fanout %d which does not have a corresponding fanin.\n", pObj->Id, pNext->Id );
}
*/
return
1
;
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
...
...
src/aig/nwk/nwkFanio.c
View file @
651a32cd
...
...
@@ -221,7 +221,7 @@ void Nwk_ObjAddFanin( Nwk_Obj_t * pObj, Nwk_Obj_t * pFanin )
Nwk_ManReallocNode
(
pObj
);
if
(
Nwk_ObjReallocIsNeeded
(
pFanin
)
)
Nwk_ManReallocNode
(
pFanin
);
for
(
i
=
pObj
->
nFanins
+
pObj
->
nFanouts
;
i
>
(
int
)
pObj
->
nFanins
;
i
--
)
for
(
i
=
pObj
->
nFanins
+
pObj
->
nFanouts
;
i
>
pObj
->
nFanins
;
i
--
)
pObj
->
pFanio
[
i
]
=
pObj
->
pFanio
[
i
-
1
];
pObj
->
pFanio
[
pObj
->
nFanins
++
]
=
pFanin
;
pFanin
->
pFanio
[
pFanin
->
nFanins
+
pFanin
->
nFanouts
++
]
=
pObj
;
...
...
@@ -247,15 +247,15 @@ void Nwk_ObjDeleteFanin( Nwk_Obj_t * pObj, Nwk_Obj_t * pFanin )
for
(
k
=
i
=
0
;
i
<
Limit
;
i
++
)
if
(
pObj
->
pFanio
[
i
]
!=
pFanin
)
pObj
->
pFanio
[
k
++
]
=
pObj
->
pFanio
[
i
];
assert
(
i
==
k
+
1
);
assert
(
i
==
k
+
1
);
// if it fails, likely because of duplicated fanin
pObj
->
nFanins
--
;
// remove pObj from the fanout list of pFanin
Limit
=
pFanin
->
nFanins
+
pFanin
->
nFanouts
;
for
(
k
=
i
=
pFanin
->
nFanins
;
i
<
Limit
;
i
++
)
if
(
pFanin
->
pFanio
[
i
]
!=
pObj
)
pFanin
->
pFanio
[
k
++
]
=
pFanin
->
pFanio
[
i
];
assert
(
i
==
k
+
1
);
pFanin
->
nFanouts
--
;
assert
(
i
==
k
+
1
);
// if it fails, likely because of duplicated fanout
pFanin
->
nFanouts
--
;
}
/**Function*************************************************************
...
...
src/aig/nwk/nwkMap.c
View file @
651a32cd
...
...
@@ -56,7 +56,7 @@ void Nwk_ManSetIfParsDefault( If_Par_t * pPars )
pPars
->
fPreprocess
=
1
;
pPars
->
fArea
=
0
;
pPars
->
fFancy
=
0
;
pPars
->
fExpRed
=
0
;
pPars
->
fExpRed
=
1
;
////
pPars
->
fLatchPaths
=
0
;
pPars
->
fEdge
=
1
;
pPars
->
fCutMin
=
0
;
...
...
@@ -244,16 +244,25 @@ Hop_Obj_t * Nwk_NodeIfToHop( Hop_Man_t * pHopMan, If_Man_t * pIfMan, If_Obj_t *
***********************************************************************/
Nwk_Man_t
*
Nwk_ManFromIf
(
If_Man_t
*
pIfMan
,
Aig_Man_t
*
p
,
Vec_Ptr_t
*
vAigToIf
)
{
Vec_Ptr_t
*
vIfToAig
;
Nwk_Man_t
*
pNtk
;
Nwk_Obj_t
*
pObjNew
;
Aig_Obj_t
*
pObj
;
Aig_Obj_t
*
pObj
,
*
pObjRepr
;
If_Obj_t
*
pIfObj
;
If_Cut_t
*
pCutBest
;
int
i
,
k
,
nLeaves
,
*
ppLeaves
;
assert
(
Aig_ManPiNum
(
p
)
==
If_ManCiNum
(
pIfMan
)
);
assert
(
Aig_ManPoNum
(
p
)
==
If_ManCoNum
(
pIfMan
)
);
assert
(
Aig_ManNodeNum
(
p
)
==
If_ManAndNum
(
pIfMan
)
);
Aig_ManCleanData
(
p
);
If_ManCleanCutData
(
pIfMan
);
// create mapping of IF to AIG
vIfToAig
=
Vec_PtrStart
(
If_ManObjNum
(
pIfMan
)
);
Aig_ManForEachObj
(
p
,
pObj
,
i
)
{
pIfObj
=
Vec_PtrEntry
(
vAigToIf
,
i
);
Vec_PtrWriteEntry
(
vIfToAig
,
pIfObj
->
Id
,
pObj
);
}
// construct the network
pNtk
=
Nwk_ManAlloc
();
pNtk
->
pName
=
Aig_UtilStrsav
(
p
->
pName
);
...
...
@@ -271,7 +280,10 @@ Nwk_Man_t * Nwk_ManFromIf( If_Man_t * pIfMan, Aig_Man_t * p, Vec_Ptr_t * vAigToI
// create node
pObjNew
=
Nwk_ManCreateNode
(
pNtk
,
nLeaves
,
pIfObj
->
nRefs
);
for
(
k
=
0
;
k
<
nLeaves
;
k
++
)
Nwk_ObjAddFanin
(
pObjNew
,
Aig_ManObj
(
p
,
ppLeaves
[
k
])
->
pData
);
{
pObjRepr
=
Vec_PtrEntry
(
vIfToAig
,
ppLeaves
[
k
]
);
Nwk_ObjAddFanin
(
pObjNew
,
pObjRepr
->
pData
);
}
// get the functionality
pObjNew
->
pFunc
=
Nwk_NodeIfToHop
(
pNtk
->
pManHop
,
pIfMan
,
pIfObj
);
}
...
...
@@ -292,7 +304,9 @@ Nwk_Man_t * Nwk_ManFromIf( If_Man_t * pIfMan, Aig_Man_t * p, Vec_Ptr_t * vAigToI
assert
(
0
);
pObj
->
pData
=
pObjNew
;
}
Vec_PtrFree
(
vIfToAig
);
pNtk
->
pManTime
=
Tim_ManDup
(
pIfMan
->
pManTim
,
0
);
assert
(
Nwk_ManCheck
(
pNtk
)
);
return
pNtk
;
}
...
...
@@ -328,6 +342,8 @@ Nwk_Man_t * Nwk_MappingIf( Aig_Man_t * p, Tim_Man_t * pManTime, If_Par_t * pPars
}
// transform the result of mapping into the new network
pNtk
=
Nwk_ManFromIf
(
pIfMan
,
p
,
vAigToIf
);
if
(
pPars
->
fBidec
&&
pPars
->
nLutSize
<=
8
)
Nwk_ManBidecResyn
(
pNtk
,
0
);
If_ManStop
(
pIfMan
);
Vec_PtrFree
(
vAigToIf
);
return
pNtk
;
...
...
src/aig/nwk/nwkObj.c
View file @
651a32cd
...
...
@@ -154,10 +154,8 @@ void Nwk_ManDeleteNode( Nwk_Obj_t * pObj )
Vec_Ptr_t
*
vNodes
=
pObj
->
pMan
->
vTemp
;
Nwk_Obj_t
*
pTemp
;
int
i
;
// delete fanins and fanouts
Nwk_ObjCollectFanouts
(
pObj
,
vNodes
);
Vec_PtrForEachEntry
(
vNodes
,
pTemp
,
i
)
Nwk_ObjDeleteFanin
(
pTemp
,
pObj
);
assert
(
Nwk_ObjFanoutNum
(
pObj
)
==
0
);
// delete fanins
Nwk_ObjCollectFanins
(
pObj
,
vNodes
);
Vec_PtrForEachEntry
(
vNodes
,
pTemp
,
i
)
Nwk_ObjDeleteFanin
(
pObj
,
pTemp
);
...
...
src/aig/nwk/nwkTiming.c
View file @
651a32cd
...
...
@@ -427,6 +427,8 @@ int Nwk_ManVerifyTiming( Nwk_Man_t * pNtk )
int
i
;
Nwk_ManForEachObj
(
pNtk
,
pObj
,
i
)
{
if
(
Nwk_ObjIsPi
(
pObj
)
&&
Nwk_ObjFanoutNum
(
pObj
)
==
0
)
continue
;
tArrival
=
Nwk_NodeComputeArrival
(
pObj
,
1
);
tRequired
=
Nwk_NodeComputeRequired
(
pObj
,
1
);
if
(
!
Nwk_ManTimeEqual
(
tArrival
,
Nwk_ObjArrival
(
pObj
),
(
float
)
0
.
01
)
)
...
...
src/aig/nwk/nwkUtil.c
View file @
651a32cd
...
...
@@ -19,6 +19,7 @@
***********************************************************************/
#include "nwk.h"
#include "math.h"
////////////////////////////////////////////////////////////////////////
/// DECLARATIONS ///
...
...
@@ -254,6 +255,114 @@ void Nwk_ManDumpBlif( Nwk_Man_t * pNtk, char * pFileName, Vec_Ptr_t * vCiNames,
printf
(
"Dumping logic network is currently not supported.
\n
"
);
}
/**Function*************************************************************
Synopsis [Prints the distribution of fanins/fanouts in the network.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
Nwk_ManPrintFanioNew
(
Nwk_Man_t
*
pNtk
)
{
char
Buffer
[
100
];
Nwk_Obj_t
*
pNode
;
Vec_Int_t
*
vFanins
,
*
vFanouts
;
int
nFanins
,
nFanouts
,
nFaninsMax
,
nFanoutsMax
,
nFaninsAll
,
nFanoutsAll
;
int
i
,
k
,
nSizeMax
;
// determine the largest fanin and fanout
nFaninsMax
=
nFanoutsMax
=
0
;
nFaninsAll
=
nFanoutsAll
=
0
;
Nwk_ManForEachNode
(
pNtk
,
pNode
,
i
)
{
nFanins
=
Nwk_ObjFaninNum
(
pNode
);
nFanouts
=
Nwk_ObjFanoutNum
(
pNode
);
nFaninsAll
+=
nFanins
;
nFanoutsAll
+=
nFanouts
;
nFaninsMax
=
AIG_MAX
(
nFaninsMax
,
nFanins
);
nFanoutsMax
=
AIG_MAX
(
nFanoutsMax
,
nFanouts
);
}
// allocate storage for fanin/fanout numbers
nSizeMax
=
AIG_MAX
(
10
*
(
Aig_Base10Log
(
nFaninsMax
)
+
1
),
10
*
(
Aig_Base10Log
(
nFanoutsMax
)
+
1
)
);
vFanins
=
Vec_IntStart
(
nSizeMax
);
vFanouts
=
Vec_IntStart
(
nSizeMax
);
// count the number of fanins and fanouts
Nwk_ManForEachNode
(
pNtk
,
pNode
,
i
)
{
nFanins
=
Nwk_ObjFaninNum
(
pNode
);
nFanouts
=
Nwk_ObjFanoutNum
(
pNode
);
// nFanouts = Nwk_NodeMffcSize(pNode);
if
(
nFanins
<
10
)
Vec_IntAddToEntry
(
vFanins
,
nFanins
,
1
);
else
if
(
nFanins
<
100
)
Vec_IntAddToEntry
(
vFanins
,
10
+
nFanins
/
10
,
1
);
else
if
(
nFanins
<
1000
)
Vec_IntAddToEntry
(
vFanins
,
20
+
nFanins
/
100
,
1
);
else
if
(
nFanins
<
10000
)
Vec_IntAddToEntry
(
vFanins
,
30
+
nFanins
/
1000
,
1
);
else
if
(
nFanins
<
100000
)
Vec_IntAddToEntry
(
vFanins
,
40
+
nFanins
/
10000
,
1
);
else
if
(
nFanins
<
1000000
)
Vec_IntAddToEntry
(
vFanins
,
50
+
nFanins
/
100000
,
1
);
else
if
(
nFanins
<
10000000
)
Vec_IntAddToEntry
(
vFanins
,
60
+
nFanins
/
1000000
,
1
);
if
(
nFanouts
<
10
)
Vec_IntAddToEntry
(
vFanouts
,
nFanouts
,
1
);
else
if
(
nFanouts
<
100
)
Vec_IntAddToEntry
(
vFanouts
,
10
+
nFanouts
/
10
,
1
);
else
if
(
nFanouts
<
1000
)
Vec_IntAddToEntry
(
vFanouts
,
20
+
nFanouts
/
100
,
1
);
else
if
(
nFanouts
<
10000
)
Vec_IntAddToEntry
(
vFanouts
,
30
+
nFanouts
/
1000
,
1
);
else
if
(
nFanouts
<
100000
)
Vec_IntAddToEntry
(
vFanouts
,
40
+
nFanouts
/
10000
,
1
);
else
if
(
nFanouts
<
1000000
)
Vec_IntAddToEntry
(
vFanouts
,
50
+
nFanouts
/
100000
,
1
);
else
if
(
nFanouts
<
10000000
)
Vec_IntAddToEntry
(
vFanouts
,
60
+
nFanouts
/
1000000
,
1
);
}
printf
(
"The distribution of fanins and fanouts in the network:
\n
"
);
printf
(
" Number Nodes with fanin Nodes with fanout
\n
"
);
for
(
k
=
0
;
k
<
nSizeMax
;
k
++
)
{
if
(
vFanins
->
pArray
[
k
]
==
0
&&
vFanouts
->
pArray
[
k
]
==
0
)
continue
;
if
(
k
<
10
)
printf
(
"%15d : "
,
k
);
else
{
sprintf
(
Buffer
,
"%d - %d"
,
(
int
)
pow
(
10
,
k
/
10
)
*
(
k
%
10
),
(
int
)
pow
(
10
,
k
/
10
)
*
(
k
%
10
+
1
)
-
1
);
printf
(
"%15s : "
,
Buffer
);
}
if
(
vFanins
->
pArray
[
k
]
==
0
)
printf
(
" "
);
else
printf
(
"%12d "
,
vFanins
->
pArray
[
k
]
);
printf
(
" "
);
if
(
vFanouts
->
pArray
[
k
]
==
0
)
printf
(
" "
);
else
printf
(
"%12d "
,
vFanouts
->
pArray
[
k
]
);
printf
(
"
\n
"
);
}
Vec_IntFree
(
vFanins
);
Vec_IntFree
(
vFanouts
);
printf
(
"Fanins: Max = %d. Ave = %.2f. Fanouts: Max = %d. Ave = %.2f.
\n
"
,
nFaninsMax
,
1
.
0
*
nFaninsAll
/
Nwk_ManNodeNum
(
pNtk
),
nFanoutsMax
,
1
.
0
*
nFanoutsAll
/
Nwk_ManNodeNum
(
pNtk
)
);
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////
...
...
src/base/abci/abc.c
View file @
651a32cd
This diff is collapsed.
Click to expand it.
src/base/abci/abcPrint.c
View file @
651a32cd
...
...
@@ -469,6 +469,7 @@ void Abc_NtkPrintFanio( FILE * pFile, Abc_Ntk_t * pNtk )
Vec_IntFree
(
vFanins
);
Vec_IntFree
(
vFanouts
);
}
/**Function*************************************************************
Synopsis [Prints the distribution of fanins/fanouts in the network.]
...
...
src/base/main/main.c
View file @
651a32cd
...
...
@@ -222,7 +222,7 @@ int main( int argc, char * argv[] )
if
(
fStatus
<
0
)
{
Abc_Stop
();
}
}
return
0
;
usage:
...
...
src/map/if/if.h
View file @
651a32cd
...
...
@@ -246,7 +246,6 @@ static inline int If_ObjIsConst1( If_Obj_t * pObj ) { r
static
inline
int
If_ObjIsCi
(
If_Obj_t
*
pObj
)
{
return
pObj
->
Type
==
IF_CI
;
}
static
inline
int
If_ObjIsCo
(
If_Obj_t
*
pObj
)
{
return
pObj
->
Type
==
IF_CO
;
}
static
inline
int
If_ObjIsTerm
(
If_Obj_t
*
pObj
)
{
return
pObj
->
Type
==
IF_CI
||
pObj
->
Type
==
IF_CO
;
}
//static inline int If_ObjIsPi( If_Obj_t * pObj ) { return If_ObjIsCi(pObj) && pObj->pFanin0 == NULL; }
static
inline
int
If_ObjIsLatch
(
If_Obj_t
*
pObj
)
{
return
If_ObjIsCi
(
pObj
)
&&
pObj
->
pFanin0
!=
NULL
;
}
static
inline
int
If_ObjIsAnd
(
If_Obj_t
*
pObj
)
{
return
pObj
->
Type
==
IF_AND
;
}
...
...
@@ -343,8 +342,10 @@ extern int If_ManPerformMappingComb( If_Man_t * p );
/*=== ifCut.c ============================================================*/
extern
int
If_CutFilter
(
If_Set_t
*
pCutSet
,
If_Cut_t
*
pCut
);
extern
void
If_CutSort
(
If_Man_t
*
p
,
If_Set_t
*
pCutSet
,
If_Cut_t
*
pCut
);
extern
void
If_CutOrder
(
If_Cut_t
*
pCut
);
extern
int
If_CutMerge
(
If_Cut_t
*
pCut0
,
If_Cut_t
*
pCut1
,
If_Cut_t
*
pCut
);
extern
void
If_CutPrint
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
);
extern
int
If_CutCheck
(
If_Cut_t
*
pCut
);
extern
void
If_CutPrint
(
If_Cut_t
*
pCut
);
extern
void
If_CutPrintTiming
(
If_Man_t
*
p
,
If_Cut_t
*
pCut
);
extern
void
If_CutLift
(
If_Cut_t
*
pCut
);
extern
void
If_CutCopy
(
If_Man_t
*
p
,
If_Cut_t
*
pCutDest
,
If_Cut_t
*
pCutSrc
);
...
...
@@ -365,6 +366,7 @@ extern If_Lib_t * If_LutLibDup( If_Lib_t * p );
extern
void
If_LutLibFree
(
If_Lib_t
*
pLutLib
);
extern
void
If_LutLibPrint
(
If_Lib_t
*
pLutLib
);
extern
int
If_LutLibDelaysAreDiscrete
(
If_Lib_t
*
pLutLib
);
extern
int
If_LutLibDelaysAreDifferent
(
If_Lib_t
*
pLutLib
);
extern
If_Lib_t
*
If_SetSimpleLutLib
(
int
nLutSize
);
extern
float
If_LutLibFastestPinDelay
(
If_Lib_t
*
p
);
extern
float
If_LutLibSlowestPinDelay
(
If_Lib_t
*
p
);
...
...
src/map/if/ifCut.c
View file @
651a32cd
...
...
@@ -297,6 +297,7 @@ int If_CutMerge( If_Cut_t * pCut0, If_Cut_t * pCut1, If_Cut_t * pCut )
return
0
;
}
pCut
->
uSign
=
pCut0
->
uSign
|
pCut1
->
uSign
;
assert
(
If_CutCheck
(
pCut
)
);
return
1
;
}
...
...
@@ -605,6 +606,63 @@ void If_CutSort( If_Man_t * p, If_Set_t * pCutSet, If_Cut_t * pCut )
/**Function*************************************************************
Synopsis [Orders the leaves of the cut.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
void
If_CutOrder
(
If_Cut_t
*
pCut
)
{
int
i
,
Temp
,
fChanges
;
do
{
fChanges
=
0
;
for
(
i
=
0
;
i
<
(
int
)
pCut
->
nLeaves
-
1
;
i
++
)
{
assert
(
pCut
->
pLeaves
[
i
]
!=
pCut
->
pLeaves
[
i
+
1
]
);
if
(
pCut
->
pLeaves
[
i
]
<=
pCut
->
pLeaves
[
i
+
1
]
)
continue
;
Temp
=
pCut
->
pLeaves
[
i
];
pCut
->
pLeaves
[
i
]
=
pCut
->
pLeaves
[
i
+
1
];
pCut
->
pLeaves
[
i
+
1
]
=
Temp
;
fChanges
=
1
;
}
}
while
(
fChanges
);
}
/**Function*************************************************************
Synopsis [Checks correctness of the cut.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
If_CutCheck
(
If_Cut_t
*
pCut
)
{
int
i
;
assert
(
pCut
->
nLeaves
<=
pCut
->
nLimit
);
for
(
i
=
1
;
i
<
(
int
)
pCut
->
nLeaves
;
i
++
)
{
if
(
pCut
->
pLeaves
[
i
-
1
]
>=
pCut
->
pLeaves
[
i
]
)
{
printf
(
"If_CutCheck(): Cut has wrong ordering of inputs.
\n
"
);
return
0
;
}
assert
(
pCut
->
pLeaves
[
i
-
1
]
<
pCut
->
pLeaves
[
i
]
);
}
return
1
;
}
/**Function*************************************************************
Synopsis [Prints one cut.]
Description []
...
...
@@ -614,7 +672,7 @@ void If_CutSort( If_Man_t * p, If_Set_t * pCutSet, If_Cut_t * pCut )
SeeAlso []
***********************************************************************/
void
If_CutPrint
(
If_
Man_t
*
p
,
If_
Cut_t
*
pCut
)
void
If_CutPrint
(
If_Cut_t
*
pCut
)
{
unsigned
i
;
printf
(
"{"
);
...
...
src/map/if/ifLib.c
View file @
651a32cd
...
...
@@ -228,6 +228,37 @@ int If_LutLibDelaysAreDiscrete( If_Lib_t * pLutLib )
/**Function*************************************************************
Synopsis [Returns 1 if the delays are discrete.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int
If_LutLibDelaysAreDifferent
(
If_Lib_t
*
pLutLib
)
{
int
i
,
k
;
float
Delay
=
pLutLib
->
pLutDelays
[
1
][
0
];
if
(
pLutLib
->
fVarPinDelays
)
{
for
(
i
=
2
;
i
<=
pLutLib
->
LutMax
;
i
++
)
for
(
k
=
0
;
k
<
i
;
k
++
)
if
(
pLutLib
->
pLutDelays
[
i
][
k
]
!=
Delay
)
return
1
;
}
else
{
for
(
i
=
2
;
i
<=
pLutLib
->
LutMax
;
i
++
)
if
(
pLutLib
->
pLutDelays
[
i
][
0
]
!=
Delay
)
return
1
;
}
return
0
;
}
/**Function*************************************************************
Synopsis [Sets simple LUT library.]
Description []
...
...
src/map/if/ifMap.c
View file @
651a32cd
...
...
@@ -88,7 +88,7 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep
{
// recompute the parameters of the best cut
pCut
->
Delay
=
If_CutDelay
(
p
,
pCut
);
//
assert( pCut->Delay <= pObj->Required + p->fEpsilon );
assert
(
pCut
->
Delay
<=
pObj
->
Required
+
p
->
fEpsilon
);
pCut
->
Area
=
(
Mode
==
2
)
?
If_CutAreaDerefed
(
p
,
pCut
)
:
If_CutAreaFlow
(
p
,
pCut
);
if
(
p
->
pPars
->
fEdge
)
pCut
->
Edge
=
(
Mode
==
2
)
?
If_CutEdgeDerefed
(
p
,
pCut
)
:
If_CutEdgeFlow
(
p
,
pCut
);
...
...
src/map/if/ifReduce.c
View file @
651a32cd
...
...
@@ -263,6 +263,7 @@ void If_ManImproveNodeUpdate( If_Man_t * p, If_Obj_t * pObj, Vec_Ptr_t * vFront
pCut
->
nLeaves
=
Vec_PtrSize
(
vFront
);
Vec_PtrForEachEntry
(
vFront
,
pFanin
,
i
)
pCut
->
pLeaves
[
i
]
=
pFanin
->
Id
;
If_CutOrder
(
pCut
);
// ref the new cut
If_CutAreaRef
(
p
,
pCut
);
}
...
...
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