54 Aig_Obj_t * pNode, * pNode0, * pNode1, * pNodeC;
55 assert( !Cudd_IsComplement(bFunc) );
56 if (
st__lookup( tBdd2Node, (
char *)bFunc, (
char **)&pNode ) )
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 ) )
65 pNode =
Aig_Mux( pNew, pNodeC, pNode1, pNode0 );
66 st__insert( tBdd2Node, (
char *)bFunc, (
char *)pNode );
91 pNew->pName = Abc_UtilStrsav(
p->pName );
92 Aig_ManConst1(
p)->pData = Aig_ManConst1(pNew);
98 st__insert( tBdd2Node, (
char *)Cudd_ReadOne(dd), (
char *)Aig_ManConst1(pNew) );
100 st__insert( tBdd2Node, (
char *)Cudd_bddIthVar(dd, i), (
char *)pObj->
pData );
104 if ( bFunc == Cudd_ReadLogicZero(dd) )
106 pObj = Aig_NodeBddToMuxes_rec( dd, Cudd_Regular(bFunc), pNew, tBdd2Node );
107 pObj = Aig_NotCond( pObj, Cudd_IsComplement(bFunc) );
125 printf(
"Aig_ManConvertBddsToAigs(): The check has failed.\n" );
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;
168 DdNode * bCube, * bTemp, * bCof, ** pbVars;
170 vCofs = Vec_PtrAlloc( 100 );
171 pbVars = (DdNode **)Vec_PtrArray(vSubset);
172 for ( i = 0; i < (1 << Vec_PtrSize(vSubset)); i++ )
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 );
195DdManager * Aig_ManBuildPoBdd(
Aig_Man_t *
p, DdNode ** pbFunc )
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 );
208 pObj->
pData = Cudd_bddIthVar(dd, i); Cudd_Ref( (DdNode *)pObj->
pData );
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) );
216 Cudd_RecursiveDeref( dd, (DdNode *)pObj->
pData );
218 Cudd_ReduceHeap( dd, CUDD_REORDER_SYMM_SIFT, 1 );
238 vRes = Vec_PtrDup(vVec);
239 while ( Vec_PtrSize(vRes) > nVars )
242 pEntry = Vec_PtrEntry( vRes, Rand % Vec_PtrSize(vRes) );
243 Vec_PtrRemove( vRes, pEntry );
268 if ( Saig_ManPoNum(
p) != 1 )
270 printf(
"Currently works only for one primary output.\n" );
275 printf(
"The number of cofactoring variables should be a positive number.\n" );
280 printf(
"The number of cofactoring variables should be less than 17.\n" );
284 if ( Vec_PtrSize(vSupp) == 0 )
286 printf(
"Property output function is a constant.\n" );
287 Vec_PtrFree( vSupp );
290 dd = Aig_ManBuildPoBdd(
p, &bFunc );
292 printf(
"Support =%5d. BDD size =%6d. ", Vec_PtrSize(vSupp), Cudd_DagSize(bFunc) );
293 vSubs = Aig_ManVecRandSubset( vSupp, nVars );
296 Vec_PtrWriteEntry( vSubs, i, pNode->
pData );
298 vCofs = Aig_ManCofactorBdds(
p, vSubs, dd, bFunc );
299 pRes = Aig_ManConvertBddsToAigs(
p, dd, vCofs );
300 Vec_PtrFree( vSupp );
301 Vec_PtrFree( vSubs );
303 printf(
"Created %d cofactors (out of %d). ", Saig_ManPoNum(pRes), Vec_PtrSize(vCofs) );
305 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
307 Cudd_RecursiveDeref( dd, bFunc );
309 Cudd_RecursiveDeref( dd, bFunc );
310 Vec_PtrFree( vCofs );
#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 ///.
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
#define Aig_ManForEachObj(p, pObj, i)
Aig_Obj_t * Aig_ManDupSimpleDfs_rec(Aig_Man_t *pNew, Aig_Man_t *p, Aig_Obj_t *pObj)
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
Aig_Obj_t * Aig_Mux(Aig_Man_t *p, Aig_Obj_t *pC, Aig_Obj_t *p1, Aig_Obj_t *p0)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
#define Aig_ManForEachCo(p, pObj, i)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
Vec_Ptr_t * Aig_Support(Aig_Man_t *p, Aig_Obj_t *pObj)
void Aig_ManCleanData(Aig_Man_t *p)
ABC_DLL int Aig_ManCheck(Aig_Man_t *p)
FUNCTION DECLARATIONS ///.
unsigned Aig_ManRandom(int fReset)
int st__ptrhash(const char *, int)
int st__ptrcmp(const char *, const char *)
int st__lookup(st__table *table, const char *key, char **value)
st__table * st__init_table(st__compare_func_type compare, st__hash_func_type hash)
int st__insert(st__table *table, const char *key, char *value)
void st__free_table(st__table *table)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.