ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
aigSplit.c
Go to the documentation of this file.
1
20
21#include "aig.h"
22#include "aig/saig/saig.h"
23
24#ifdef ABC_USE_CUDD
25#include "bdd/extrab/extraBdd.h"
26#endif
27
29
30
34
38
39#ifdef ABC_USE_CUDD
40
52Aig_Obj_t * Aig_NodeBddToMuxes_rec( DdManager * dd, DdNode * bFunc, Aig_Man_t * pNew, st__table * tBdd2Node )
53{
54 Aig_Obj_t * pNode, * pNode0, * pNode1, * pNodeC;
55 assert( !Cudd_IsComplement(bFunc) );
56 if ( st__lookup( tBdd2Node, (char *)bFunc, (char **)&pNode ) )
57 return pNode;
58 // solve for the children nodes
59 pNode0 = Aig_NodeBddToMuxes_rec( dd, Cudd_Regular(cuddE(bFunc)), pNew, tBdd2Node );
60 pNode0 = Aig_NotCond( pNode0, Cudd_IsComplement(cuddE(bFunc)) );
61 pNode1 = Aig_NodeBddToMuxes_rec( dd, cuddT(bFunc), pNew, tBdd2Node );
62 if ( ! st__lookup( tBdd2Node, (char *)Cudd_bddIthVar(dd, bFunc->index), (char **)&pNodeC ) )
63 assert( 0 );
64 // create the MUX node
65 pNode = Aig_Mux( pNew, pNodeC, pNode1, pNode0 );
66 st__insert( tBdd2Node, (char *)bFunc, (char *)pNode );
67 return pNode;
68}
69
81Aig_Man_t * Aig_ManConvertBddsToAigs( Aig_Man_t * p, DdManager * dd, Vec_Ptr_t * vCofs )
82{
83 DdNode * bFunc;
84 st__table * tBdd2Node;
85 Aig_Man_t * pNew;
86 Aig_Obj_t * pObj;
87 int i;
89 // generate AIG for BDD
90 pNew = Aig_ManStart( Aig_ManObjNum(p) );
91 pNew->pName = Abc_UtilStrsav( p->pName );
92 Aig_ManConst1(p)->pData = Aig_ManConst1(pNew);
93 Aig_ManForEachCi( p, pObj, i )
94 pObj->pData = Aig_ObjCreateCi( pNew );
95 // create the table mapping BDD nodes into the ABC nodes
97 // add the constant and the elementary vars
98 st__insert( tBdd2Node, (char *)Cudd_ReadOne(dd), (char *)Aig_ManConst1(pNew) );
99 Aig_ManForEachCi( p, pObj, i )
100 st__insert( tBdd2Node, (char *)Cudd_bddIthVar(dd, i), (char *)pObj->pData );
101 // build primary outputs for the cofactors
102 Vec_PtrForEachEntry( DdNode *, vCofs, bFunc, i )
103 {
104 if ( bFunc == Cudd_ReadLogicZero(dd) )
105 continue;
106 pObj = Aig_NodeBddToMuxes_rec( dd, Cudd_Regular(bFunc), pNew, tBdd2Node );
107 pObj = Aig_NotCond( pObj, Cudd_IsComplement(bFunc) );
108 Aig_ObjCreateCo( pNew, pObj );
109 }
110 st__free_table( tBdd2Node );
111
112 // duplicate the rest of the AIG
113 // add the POs
114 Aig_ManForEachCo( p, pObj, i )
115 {
116 if ( i == 0 )
117 continue;
118 Aig_ManDupSimpleDfs_rec( pNew, p, Aig_ObjFanin0(pObj) );
119 pObj->pData = Aig_ObjCreateCo( pNew, Aig_ObjChild0Copy(pObj) );
120 }
121 Aig_ManCleanup( pNew );
122 Aig_ManSetRegNum( pNew, Aig_ManRegNum(p) );
123 // check the resulting network
124 if ( !Aig_ManCheck(pNew) )
125 printf( "Aig_ManConvertBddsToAigs(): The check has failed.\n" );
126 return pNew;
127}
128
140DdNode * Aig_ManBuildPoBdd_rec( Aig_Man_t * p, Aig_Obj_t * pObj, DdManager * dd )
141{
142 DdNode * bBdd0, * bBdd1;
143 if ( pObj->pData != NULL )
144 return (DdNode *)pObj->pData;
145 assert( Aig_ObjIsNode(pObj) );
146 bBdd0 = Aig_ManBuildPoBdd_rec( p, Aig_ObjFanin0(pObj), dd );
147 bBdd1 = Aig_ManBuildPoBdd_rec( p, Aig_ObjFanin1(pObj), dd );
148 bBdd0 = Cudd_NotCond( bBdd0, Aig_ObjFaninC0(pObj) );
149 bBdd1 = Cudd_NotCond( bBdd1, Aig_ObjFaninC1(pObj) );
150 pObj->pData = Cudd_bddAnd( dd, bBdd0, bBdd1 ); Cudd_Ref( (DdNode *)pObj->pData );
151 return (DdNode *)pObj->pData;
152}
153
165Vec_Ptr_t * Aig_ManCofactorBdds( Aig_Man_t * p, Vec_Ptr_t * vSubset, DdManager * dd, DdNode * bFunc )
166{
167 Vec_Ptr_t * vCofs;
168 DdNode * bCube, * bTemp, * bCof, ** pbVars;
169 int i;
170 vCofs = Vec_PtrAlloc( 100 );
171 pbVars = (DdNode **)Vec_PtrArray(vSubset);
172 for ( i = 0; i < (1 << Vec_PtrSize(vSubset)); i++ )
173 {
174 bCube = Extra_bddBitsToCube( dd, i, Vec_PtrSize(vSubset), pbVars, 1 ); Cudd_Ref( bCube );
175 bCof = Cudd_Cofactor( dd, bFunc, bCube ); Cudd_Ref( bCof );
176 bCof = Cudd_bddAnd( dd, bTemp = bCof, bCube ); Cudd_Ref( bCof );
177 Cudd_RecursiveDeref( dd, bTemp );
178 Cudd_RecursiveDeref( dd, bCube );
179 Vec_PtrPush( vCofs, bCof );
180 }
181 return vCofs;
182}
183
195DdManager * Aig_ManBuildPoBdd( Aig_Man_t * p, DdNode ** pbFunc )
196{
197 DdManager * dd;
198 Aig_Obj_t * pObj;
199 int i;
200 assert( Saig_ManPoNum(p) == 1 );
202 dd = Cudd_Init( Aig_ManCiNum(p), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
203 Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT );
204 pObj = Aig_ManConst1(p);
205 pObj->pData = Cudd_ReadOne(dd); Cudd_Ref( (DdNode *)pObj->pData );
206 Aig_ManForEachCi( p, pObj, i )
207 {
208 pObj->pData = Cudd_bddIthVar(dd, i); Cudd_Ref( (DdNode *)pObj->pData );
209 }
210 pObj = Aig_ManCo( p, 0 );
211 *pbFunc = Aig_ManBuildPoBdd_rec( p, Aig_ObjFanin0(pObj), dd ); Cudd_Ref( *pbFunc );
212 *pbFunc = Cudd_NotCond( *pbFunc, Aig_ObjFaninC0(pObj) );
213 Aig_ManForEachObj( p, pObj, i )
214 {
215 if ( pObj->pData )
216 Cudd_RecursiveDeref( dd, (DdNode *)pObj->pData );
217 }
218 Cudd_ReduceHeap( dd, CUDD_REORDER_SYMM_SIFT, 1 );
219 return dd;
220}
221
233Vec_Ptr_t * Aig_ManVecRandSubset( Vec_Ptr_t * vVec, int nVars )
234{
235 Vec_Ptr_t * vRes;
236 void * pEntry;
237 unsigned Rand;
238 vRes = Vec_PtrDup(vVec);
239 while ( Vec_PtrSize(vRes) > nVars )
240 {
241 Rand = Aig_ManRandom( 0 );
242 pEntry = Vec_PtrEntry( vRes, Rand % Vec_PtrSize(vRes) );
243 Vec_PtrRemove( vRes, pEntry );
244 }
245 return vRes;
246}
247
259Aig_Man_t * Aig_ManSplit( Aig_Man_t * p, int nVars, int fVerbose )
260{
261 Aig_Man_t * pRes;
262 Aig_Obj_t * pNode;
263 DdNode * bFunc;
264 DdManager * dd;
265 Vec_Ptr_t * vSupp, * vSubs, * vCofs;
266 int i;
267 abctime clk = Abc_Clock();
268 if ( Saig_ManPoNum(p) != 1 )
269 {
270 printf( "Currently works only for one primary output.\n" );
271 return NULL;
272 }
273 if ( nVars < 1 )
274 {
275 printf( "The number of cofactoring variables should be a positive number.\n" );
276 return NULL;
277 }
278 if ( nVars > 16 )
279 {
280 printf( "The number of cofactoring variables should be less than 17.\n" );
281 return NULL;
282 }
283 vSupp = Aig_Support( p, Aig_ObjFanin0(Aig_ManCo(p,0)) );
284 if ( Vec_PtrSize(vSupp) == 0 )
285 {
286 printf( "Property output function is a constant.\n" );
287 Vec_PtrFree( vSupp );
288 return NULL;
289 }
290 dd = Aig_ManBuildPoBdd( p, &bFunc ); // bFunc is referenced
291 if ( fVerbose )
292 printf( "Support =%5d. BDD size =%6d. ", Vec_PtrSize(vSupp), Cudd_DagSize(bFunc) );
293 vSubs = Aig_ManVecRandSubset( vSupp, nVars );
294 // replace nodes by their BDD variables
295 Vec_PtrForEachEntry( Aig_Obj_t *, vSubs, pNode, i )
296 Vec_PtrWriteEntry( vSubs, i, pNode->pData );
297 // derive cofactors and functions
298 vCofs = Aig_ManCofactorBdds( p, vSubs, dd, bFunc );
299 pRes = Aig_ManConvertBddsToAigs( p, dd, vCofs );
300 Vec_PtrFree( vSupp );
301 Vec_PtrFree( vSubs );
302 if ( fVerbose )
303 printf( "Created %d cofactors (out of %d). ", Saig_ManPoNum(pRes), Vec_PtrSize(vCofs) );
304 if ( fVerbose )
305 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
306 // dereference
307 Cudd_RecursiveDeref( dd, bFunc );
308 Vec_PtrForEachEntry( DdNode *, vCofs, bFunc, i )
309 Cudd_RecursiveDeref( dd, bFunc );
310 Vec_PtrFree( vCofs );
311 Extra_StopManager( dd );
312 return pRes;
313}
314
315#else
316
317Aig_Man_t * Aig_ManSplit( Aig_Man_t * p, int nVars, int fVerbose )
318{
319 return NULL;
320}
321
322#endif
323
327
328
330
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_START Aig_Man_t * Aig_ManSplit(Aig_Man_t *p, int nVars, int fVerbose)
DECLARATIONS ///.
Definition aigSplit.c:317
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
Definition aigMan.c:438
#define Aig_ManForEachObj(p, pObj, i)
Definition aig.h:403
Aig_Obj_t * Aig_ManDupSimpleDfs_rec(Aig_Man_t *pNew, Aig_Man_t *p, Aig_Obj_t *pObj)
Definition aigDup.c:157
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Definition aig.h:393
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
Definition aigObj.c:66
Aig_Obj_t * Aig_Mux(Aig_Man_t *p, Aig_Obj_t *pC, Aig_Obj_t *p1, Aig_Obj_t *p0)
Definition aigOper.c:317
struct Aig_Obj_t_ Aig_Obj_t
Definition aig.h:51
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
Definition aigMan.c:47
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Definition aig.h:50
int Aig_ManCleanup(Aig_Man_t *p)
Definition aigMan.c:265
#define Aig_ManForEachCo(p, pObj, i)
Definition aig.h:398
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
Definition aigObj.c:45
Vec_Ptr_t * Aig_Support(Aig_Man_t *p, Aig_Obj_t *pObj)
Definition aigDfs.c:846
void Aig_ManCleanData(Aig_Man_t *p)
Definition aigUtil.c:205
ABC_DLL int Aig_ManCheck(Aig_Man_t *p)
FUNCTION DECLARATIONS ///.
Definition aigCheck.c:45
unsigned Aig_ManRandom(int fReset)
Definition aigUtil.c:1170
Cube * p
Definition exorList.c:222
DdNode * Extra_bddBitsToCube(DdManager *dd, int Code, int CodeWidth, DdNode **pbVars, int fMsbFirst)
void Extra_StopManager(DdManager *dd)
int st__ptrhash(const char *, int)
Definition st.c:467
int st__ptrcmp(const char *, const char *)
Definition st.c:479
int st__lookup(st__table *table, const char *key, char **value)
Definition st.c:114
st__table * st__init_table(st__compare_func_type compare, st__hash_func_type hash)
Definition st.c:72
int st__insert(st__table *table, const char *key, char *value)
Definition st.c:171
void st__free_table(st__table *table)
Definition st.c:81
void * pData
Definition aig.h:87
Definition st.h:52
#define assert(ex)
Definition util_old.h:213
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
Definition vecPtr.h:55