ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
abcBidec.c
Go to the documentation of this file.
1
20
21#include "base/abc/abc.h"
22#include "bool/bdc/bdc.h"
23#include "bool/kit/kit.h"
24
26
27
31
32static inline Hop_Obj_t * Bdc_FunCopyHop( Bdc_Fun_t * pObj ) { return Hop_NotCond( (Hop_Obj_t *)Bdc_FuncCopy(Bdc_Regular(pObj)), Bdc_IsComplement(pObj) ); }
33
37
49Hop_Obj_t * Abc_NodeIfNodeResyn( Bdc_Man_t * p, Hop_Man_t * pHop, Hop_Obj_t * pRoot, int nVars, Vec_Int_t * vTruth, unsigned * puCare, float dProb )
50{
51 unsigned * pTruth;
52 Bdc_Fun_t * pFunc;
53 int nNodes, i;
54 assert( nVars <= 16 );
55 // derive truth table
56 pTruth = Hop_ManConvertAigToTruth( pHop, Hop_Regular(pRoot), nVars, vTruth, 0 );
57 if ( Hop_IsComplement(pRoot) )
58 Extra_TruthNot( pTruth, pTruth, nVars );
59 // perform power-aware decomposition
60 if ( dProb >= 0.0 )
61 {
62 float Prob = (float)2.0 * dProb * (1.0 - dProb);
63 assert( Prob >= 0.0 && Prob <= 0.5 );
64 if ( Prob >= 0.4 )
65 {
66 Extra_TruthNot( puCare, puCare, nVars );
67 if ( dProb > 0.5 ) // more 1s than 0s
68 Extra_TruthOr( pTruth, pTruth, puCare, nVars );
69 else
70 Extra_TruthSharp( pTruth, pTruth, puCare, nVars );
71 Extra_TruthNot( puCare, puCare, nVars );
72 // decompose truth table
73 Bdc_ManDecompose( p, pTruth, NULL, nVars, NULL, 1000 );
74 }
75 else
76 {
77 // decompose truth table
78 Bdc_ManDecompose( p, pTruth, puCare, nVars, NULL, 1000 );
79 }
80 }
81 else
82 {
83 // decompose truth table
84 Bdc_ManDecompose( p, pTruth, puCare, nVars, NULL, 1000 );
85 }
86 // convert back into HOP
87 Bdc_FuncSetCopy( Bdc_ManFunc( p, 0 ), Hop_ManConst1( pHop ) );
88 for ( i = 0; i < nVars; i++ )
89 Bdc_FuncSetCopy( Bdc_ManFunc( p, i+1 ), Hop_ManPi( pHop, i ) );
90 nNodes = Bdc_ManNodeNum(p);
91 for ( i = nVars + 1; i < nNodes; i++ )
92 {
93 pFunc = Bdc_ManFunc( p, i );
94 Bdc_FuncSetCopy( pFunc, Hop_And( pHop, Bdc_FunCopyHop(Bdc_FuncFanin0(pFunc)), Bdc_FunCopyHop(Bdc_FuncFanin1(pFunc)) ) );
95 }
96 return Bdc_FunCopyHop( Bdc_ManRoot(p) );
97}
98
110void Abc_NtkBidecResyn( Abc_Ntk_t * pNtk, int fVerbose )
111{
112 Bdc_Par_t Pars = {0}, * pPars = &Pars;
113 Bdc_Man_t * p;
114 Abc_Obj_t * pObj;
115 Vec_Int_t * vTruth;
116 int i, nGainTotal = 0, nNodes1, nNodes2;
117 abctime clk = Abc_Clock();
118 assert( Abc_NtkIsLogic(pNtk) );
119 if ( !Abc_NtkToAig(pNtk) )
120 return;
121 pPars->nVarsMax = Abc_NtkGetFaninMax( pNtk );
122 pPars->fVerbose = fVerbose;
123 if ( pPars->nVarsMax > 15 )
124 {
125 if ( fVerbose )
126 printf( "Resynthesis is not performed for nodes with more than 15 inputs.\n" );
127 pPars->nVarsMax = 15;
128 }
129 vTruth = Vec_IntAlloc( 0 );
130 p = Bdc_ManAlloc( pPars );
131 Abc_NtkForEachNode( pNtk, pObj, i )
132 {
133 if ( Abc_ObjFaninNum(pObj) > 15 )
134 continue;
135 nNodes1 = Hop_DagSize((Hop_Obj_t *)pObj->pData);
136 pObj->pData = Abc_NodeIfNodeResyn( p, (Hop_Man_t *)pNtk->pManFunc, (Hop_Obj_t *)pObj->pData, Abc_ObjFaninNum(pObj), vTruth, NULL, -1.0 );
137 nNodes2 = Hop_DagSize((Hop_Obj_t *)pObj->pData);
138 nGainTotal += nNodes1 - nNodes2;
139 }
140 Bdc_ManFree( p );
141 Vec_IntFree( vTruth );
142 if ( fVerbose )
143 {
144 printf( "Total gain in AIG nodes = %d. ", nGainTotal );
145 ABC_PRT( "Total runtime", Abc_Clock() - clk );
146 }
147}
148
149
153
154
156
void Abc_NtkBidecResyn(Abc_Ntk_t *pNtk, int fVerbose)
Definition abcBidec.c:110
Hop_Obj_t * Abc_NodeIfNodeResyn(Bdc_Man_t *p, Hop_Man_t *pHop, Hop_Obj_t *pRoot, int nVars, Vec_Int_t *vTruth, unsigned *puCare, float dProb)
FUNCTION DEFINITIONS ///.
Definition abcBidec.c:49
struct Abc_Obj_t_ Abc_Obj_t
Definition abc.h:116
ABC_DLL int Abc_NtkGetFaninMax(Abc_Ntk_t *pNtk)
Definition abcUtil.c:486
struct Abc_Ntk_t_ Abc_Ntk_t
Definition abc.h:115
ABC_DLL int Abc_NtkToAig(Abc_Ntk_t *pNtk)
Definition abcFunc.c:1333
#define Abc_NtkForEachNode(pNtk, pNode, i)
Definition abc.h:464
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_PRT(a, t)
Definition abc_global.h:255
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
int Bdc_ManNodeNum(Bdc_Man_t *p)
Definition bdcCore.c:48
Bdc_Fun_t * Bdc_FuncFanin0(Bdc_Fun_t *p)
Definition bdcCore.c:50
Bdc_Fun_t * Bdc_ManRoot(Bdc_Man_t *p)
Definition bdcCore.c:47
typedefABC_NAMESPACE_HEADER_START struct Bdc_Fun_t_ Bdc_Fun_t
INCLUDES ///.
Definition bdc.h:42
struct Bdc_Par_t_ Bdc_Par_t
Definition bdc.h:44
void Bdc_FuncSetCopy(Bdc_Fun_t *p, void *pCopy)
Definition bdcCore.c:54
struct Bdc_Man_t_ Bdc_Man_t
Definition bdc.h:43
Bdc_Fun_t * Bdc_FuncFanin1(Bdc_Fun_t *p)
Definition bdcCore.c:51
void * Bdc_FuncCopy(Bdc_Fun_t *p)
Definition bdcCore.c:52
void Bdc_ManFree(Bdc_Man_t *p)
Definition bdcCore.c:113
int Bdc_ManDecompose(Bdc_Man_t *p, unsigned *puFunc, unsigned *puCare, int nVars, Vec_Ptr_t *vDivs, int nNodesMax)
Definition bdcCore.c:291
Bdc_Fun_t * Bdc_ManFunc(Bdc_Man_t *p, int i)
DECLARATIONS ///.
Definition bdcCore.c:46
Bdc_Man_t * Bdc_ManAlloc(Bdc_Par_t *pPars)
MACRO DEFINITIONS ///.
Definition bdcCore.c:68
Cube * p
Definition exorList.c:222
typedefABC_NAMESPACE_HEADER_START struct Hop_Man_t_ Hop_Man_t
INCLUDES ///.
Definition hop.h:49
int Hop_DagSize(Hop_Obj_t *pObj)
Definition hopDfs.c:279
Hop_Obj_t * Hop_And(Hop_Man_t *p, Hop_Obj_t *p0, Hop_Obj_t *p1)
Definition hopOper.c:104
unsigned * Hop_ManConvertAigToTruth(Hop_Man_t *p, Hop_Obj_t *pRoot, int nVars, Vec_Int_t *vTruth, int fMsbFirst)
Definition hopTruth.c:143
struct Hop_Obj_t_ Hop_Obj_t
Definition hop.h:50
void * pManFunc
Definition abc.h:191
void * pData
Definition abc.h:145
#define assert(ex)
Definition util_old.h:213