36extern int Abc_ConvertZddToSop( DdManager * dd, DdNode * zCover,
char * pSop,
int nFanins,
Vec_Str_t * vCube,
int fPhase );
37extern int Abc_CountZddCubes( DdManager * dd, DdNode * zCover );
59 DdNode * bCover, * zCover, * zCover0, * zCover1;
60 int nFanins = Vec_IntSize(vFanins);
61 int fPhase, nCubes, nCubes0, nCubes1;
64 bCover = Cudd_zddIsop( dd, Cudd_Not(bLocal), Cudd_Not(bLocal), &zCover0 );
67 Cudd_RecursiveDeref( dd, bCover );
68 nCubes0 = Abc_CountZddCubes( dd, zCover0 );
71 bCover = Cudd_zddIsop( dd, bLocal, bLocal, &zCover1 );
74 Cudd_RecursiveDeref( dd, bCover );
75 nCubes1 = Abc_CountZddCubes( dd, zCover1 );
78 if ( nCubes1 <= nCubes0 )
82 Cudd_RecursiveDerefZdd( dd, zCover0 );
89 Cudd_RecursiveDerefZdd( dd, zCover1 );
94 Cudd_RecursiveDerefZdd( dd, zCover );
99 Vec_StrGrow( vSop, (nFanins + 3) * nCubes + 1 );
100 pSop = Vec_StrArray( vSop );
101 pSop[(nFanins + 3) * nCubes] = 0;
103 Vec_StrFill( vCube, nFanins,
'-' );
104 Vec_StrPush( vCube,
'\0' );
105 Abc_ConvertZddToSop( dd, zCover, pSop, nFanins, vCube, fPhase );
106 Cudd_RecursiveDerefZdd( dd, zCover );
115 DdNode * bLocal, * bTemp;
118 int i, nDecs, iLit = -1;
124 Vec_IntClear( vFanins );
125 for ( i = 0; i < nDecs; i++ )
131 Vec_IntPush( vFanins, iLit );
145 for ( i = 0; i < nDecs; i++ )
146 iLit =
Gia_ManHashOr( pNew, iLit, Vec_IntEntry(vFanins, i) );
152 for ( i = 0; i < nDecs; i++ )
160 Cudd_RecursiveDeref( ddDsd, bTemp );
162 iLit = Gia_ManRebuildIsop( ddNew, bLocal, pNew, vFanins, vSop, vCube );
163 Cudd_RecursiveDeref( ddNew, bLocal );
180 int i, nNodesDsd, iLit = -1;
184 vFanins = Vec_IntAlloc( 1000 );
185 vSop = Vec_StrAlloc( 10000 );
186 vCube = Vec_StrAlloc( 1000 );
189 pNew->
pName = Abc_UtilStrsav(
p->pName );
190 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
195 for ( i = 0; i < Gia_ManCiNum(
p); i++ )
203 for ( i = 0; i < nNodesDsd; i++ )
205 iLit = Gia_ManRebuildNode( pManDsd, ppNodesDsd[i], pNew, ddNew, vFanins, vSop, vCube );
210 Vec_IntFree( vFanins );
212 Vec_StrFree( vCube );
220 for ( i = 0; i < Gia_ManCoNum(
p); i++ )
225 Gia_ManAppendCo( pNew, iLit );
242void Gia_ManCollapseDeref( DdManager * dd,
Vec_Ptr_t * vFuncs )
244 DdNode * bFunc;
int i;
247 Cudd_RecursiveDeref( dd, bFunc );
248 Vec_PtrFree( vFuncs );
252 if ( Gia_ObjRefDecId(
p, Id) )
254 Cudd_RecursiveDeref( dd, (DdNode *)Vec_PtrEntry(vFuncs, Id) );
255 Vec_PtrWriteEntry( vFuncs, Id, NULL );
260 DdNode * bFunc0, * bFunc1, * bFunc;
265 vFuncs = Vec_PtrStart( Gia_ManObjNum(
p) );
266 if ( Gia_ObjRefNumId(
p, 0) > 0 )
267 Vec_PtrWriteEntry( vFuncs, 0, Cudd_ReadLogicZero(dd) ), Cudd_Ref(Cudd_ReadLogicZero(dd));
270 if ( Gia_ObjRefNumId(
p, Id) > 0 )
271 Vec_PtrWriteEntry( vFuncs, Id, Cudd_bddIthVar(dd,i) ), Cudd_Ref(Cudd_bddIthVar(dd,i));
275 bFunc0 = Cudd_NotCond( (DdNode *)Vec_PtrEntry(vFuncs, Gia_ObjFaninId0(pObj, i)), Gia_ObjFaninC0(pObj) );
276 bFunc1 = Cudd_NotCond( (DdNode *)Vec_PtrEntry(vFuncs, Gia_ObjFaninId1(pObj, i)), Gia_ObjFaninC1(pObj) );
277 bFunc = Cudd_bddAndLimit( dd, bFunc0, bFunc1, nBddLimit );
280 Gia_ManCollapseDeref( dd, vFuncs );
284 Vec_PtrWriteEntry( vFuncs, i, bFunc );
285 Gia_ObjCollapseDeref(
p, dd, vFuncs, Gia_ObjFaninId0(pObj, i) );
286 Gia_ObjCollapseDeref(
p, dd, vFuncs, Gia_ObjFaninId1(pObj, i) );
291 pObj = Gia_ManCo(
p, i );
292 bFunc0 = Cudd_NotCond( (DdNode *)Vec_PtrEntry(vFuncs, Gia_ObjFaninId0(pObj, Id)), Gia_ObjFaninC0(pObj) );
293 Vec_PtrWriteEntry( vFuncs, Id, bFunc0 ); Cudd_Ref( bFunc0 );
294 Gia_ObjCollapseDeref(
p, dd, vFuncs, Gia_ObjFaninId0(pObj, Id) );
296 assert( Vec_PtrSize(vFuncs) == Vec_PtrCountZero(vFuncs) + Gia_ManCoNum(
p) );
299 Vec_PtrWriteEntry( vFuncs, i, Vec_PtrEntry(vFuncs, Id) );
300 Vec_PtrShrink( vFuncs, Gia_ManCoNum(
p) );
318 DdManager * dd, * ddNew;
322 dd = Cudd_Init( Gia_ManCiNum(
p), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
323 Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT );
324 vFuncs = Gia_ManCollapse(
p, dd, 10000, 0 );
325 Cudd_AutodynDisable( dd );
326 if ( vFuncs == NULL )
332 ddNew = Cudd_Init( Gia_ManCiNum(
p), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
333 Cudd_zddVarsFromBddVars( ddNew, 2 );
336 printf(
"Ins = %d. Outs = %d. Shared BDD nodes = %d. Peak live nodes = %d. Peak nodes = %d.\n",
337 Gia_ManCiNum(
p), Gia_ManCoNum(
p),
338 Cudd_SharingSize( (DdNode **)Vec_PtrArray(vFuncs), Vec_PtrSize(vFuncs) ),
339 Cudd_ReadPeakLiveNodeCount(dd), (
int)Cudd_ReadNodeCount(dd) );
342 Dsd_Decompose( pManDsd, (DdNode **)Vec_PtrArray(vFuncs), Vec_PtrSize(vFuncs) );
347 char ** ppNamesCi = (
char **)Vec_PtrArray( vNamesCi );
348 char ** ppNamesCo = (
char **)Vec_PtrArray( vNamesCo );
349 Dsd_TreePrint( stdout, pManDsd, ppNamesCi, ppNamesCo, 0, -1, 0 );
350 Vec_PtrFreeFree( vNamesCi );
351 Vec_PtrFreeFree( vNamesCo );
354 pNew = Gia_ManRebuild(
p, pManDsd, ddNew );
357 Gia_ManCollapseDeref( dd, vFuncs );
382void Gia_ManPrintDsdOne(
Dsd_Manager_t * pManDsd,
int Output,
int OffSet )
386 for (
int i = 0; i < OffSet; i++ )
392void Gia_ManPrintDsd(
Dsd_Manager_t * pManDsd,
int Output,
int nOutputs,
int OffSet )
396 for (
int i = 0; i < nOutputs; i++ )
397 Gia_ManPrintDsdOne( pManDsd, i, OffSet );
401 assert( Output >= 0 && Output < nOutputs );
402 Gia_ManPrintDsdOne( pManDsd, Output, OffSet );
411 dd = Cudd_Init( Gia_ManCiNum(
p), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
412 Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT );
413 vFuncs = Gia_ManCollapse(
p, dd, 10000, 0 );
414 Cudd_AutodynDisable( dd );
415 if ( vFuncs == NULL )
421 if ( pManDsd == NULL )
423 Gia_ManCollapseDeref( dd, vFuncs );
427 Dsd_Decompose( pManDsd, (DdNode **)Vec_PtrArray(vFuncs), Vec_PtrSize(vFuncs) );
433 char ** ppNamesCi = (
char **)Vec_PtrArray( vNamesCi );
434 char ** ppNamesCo = (
char **)Vec_PtrArray( vNamesCo );
435 Dsd_TreePrint( stdout, pManDsd, ppNamesCi, ppNamesCo, 0, -1, OffSet );
436 Vec_PtrFreeFree( vNamesCi );
437 Vec_PtrFreeFree( vNamesCo );
440 Gia_ManPrintDsd( pManDsd, 0, Vec_PtrSize(vFuncs), 0 );
443 Gia_ManCollapseDeref( dd, vFuncs );
449 Vec_Ptr_t * vNew = Vec_PtrAlloc( 2 * Vec_PtrSize(vFuncs) ); DdNode * bFunc;
int i;
451 DdNode * bCof0 = Cudd_Cofactor( dd, bFunc, Cudd_Not(Cudd_bddIthVar(dd, iVar)) ); Cudd_Ref( bCof0 );
452 DdNode * bCof1 = Cudd_Cofactor( dd, bFunc, Cudd_bddIthVar(dd, iVar) ); Cudd_Ref( bCof1 );
453 Vec_PtrPush( vNew, bCof0 );
454 Vec_PtrPush( vNew, bCof1 );
463 dd = Cudd_Init( Gia_ManCiNum(
p), 0, CUDD_UNIQUE_SLOTS, CUDD_CACHE_SLOTS, 0 );
464 Cudd_AutodynEnable( dd, CUDD_REORDER_SYMM_SIFT );
465 vFuncs = Gia_ManCollapse(
p, dd, 10000, 0 );
466 Cudd_AutodynDisable( dd );
467 if ( vFuncs == NULL )
473 if ( pManDsd == NULL )
475 Gia_ManCollapseDeref( dd, vFuncs );
479 Dsd_Decompose( pManDsd, (DdNode **)Vec_PtrArray(vFuncs), Vec_PtrSize(vFuncs) );
481 printf(
"Function:\n" );
482 Gia_ManPrintDsd( pManDsd, 0, Vec_PtrSize(vFuncs), 0 );
487 for ( v = 0; v < Gia_ManCiNum(
p); v++ )
489 Vec_Ptr_t * vTemp = Gia_ManRecurDsdCof( dd, vFuncs, v );
490 Dsd_Decompose( pManDsd, (DdNode **)Vec_PtrArray(vTemp), Vec_PtrSize(vTemp) );
493 if ( DsdMin > DsdCur || (DsdMin == DsdCur && SuppMin > SuppCur) )
494 DsdMin = DsdCur, SuppMin = SuppCur, iBestV = v;
495 Gia_ManCollapseDeref( dd, vTemp );
498 vFuncs = Gia_ManRecurDsdCof( dd, vAux = vFuncs, iBestV );
499 Gia_ManCollapseDeref( dd, vAux );
500 printf(
"Cofactoring variable %c:\n", (
int)(iBestV >= 26 ?
'A' - 26 :
'a') + iBestV );
501 Dsd_Decompose( pManDsd, (DdNode **)Vec_PtrArray(vFuncs), Vec_PtrSize(vFuncs) );
502 Gia_ManPrintDsd( pManDsd, -1, Vec_PtrSize(vFuncs), (i+1)*2 );
506 Gia_ManCollapseDeref( dd, vFuncs );
int Abc_NtkDeriveFlatGiaSop(Gia_Man_t *pGia, int *gFanins, char *pSop)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
Dsd_Manager_t * Dsd_ManagerStart(DdManager *dd, int nSuppMax, int fVerbose)
FUNCTION DECLARATIONS ///.
void Dsd_NodeSetMark(Dsd_Node_t *p, word Mark)
void Dsd_TreePrint(FILE *pFile, Dsd_Manager_t *dMan, char *pInputNames[], char *pOutputNames[], int fShortNames, int Output, int OffSet)
Dsd_Node_t * Dsd_ManagerReadConst1(Dsd_Manager_t *pMan)
Dsd_Node_t * Dsd_NodeReadDec(Dsd_Node_t *p, int i)
enum Dsd_Type_t_ Dsd_Type_t
struct Dsd_Manager_t_ Dsd_Manager_t
TYPEDEF DEFINITIONS ///.
word Dsd_NodeReadMark(Dsd_Node_t *p)
Dsd_Node_t * Dsd_ManagerReadRoot(Dsd_Manager_t *pMan, int i)
int Dsd_TreeSuppSize(Dsd_Manager_t *pDsdMan, int Output)
void Dsd_ManagerStop(Dsd_Manager_t *dMan)
struct Dsd_Node_t_ Dsd_Node_t
DdNode * Dsd_TreeGetPrimeFunction(DdManager *dd, Dsd_Node_t *pNode)
FUNCTION DEFINITIONS ///.
DdManager * Dsd_ManagerReadDd(Dsd_Manager_t *pMan)
Dsd_Node_t * Dsd_ManagerReadInput(Dsd_Manager_t *pMan, int i)
void Dsd_TreePrint4(void *pStr, Dsd_Manager_t *pDsdMan, int Output)
int Dsd_NodeReadDecsNum(Dsd_Node_t *p)
Dsd_Node_t ** Dsd_TreeCollectNodesDfs(Dsd_Manager_t *dMan, int *pnNodes)
Dsd_Type_t Dsd_NodeReadType(Dsd_Node_t *p)
FUNCTION DEFINITIONS ///.
int Dsd_TreeNonDsdMax(Dsd_Manager_t *pDsdMan, int Output)
#define Dsd_IsComplement(p)
MACRO DEFINITIONS ///.
void Dsd_Decompose(Dsd_Manager_t *dMan, DdNode **pbFuncs, int nFuncs)
DECOMPOSITION FUNCTIONS ///.
void Gia_ManRecurDsd(Gia_Man_t *p, int fVerbose)
void Gia_ManCheckDsd(Gia_Man_t *p, int OffSet, int fVerbose)
ABC_NAMESPACE_IMPL_START Gia_Man_t * Gia_ManCollapseTest(Gia_Man_t *p, int fVerbose)
DECLARATIONS ///.
int Gia_ManFactorNode(Gia_Man_t *p, char *pSop, Vec_Int_t *vLeaves)
void Gia_ManStop(Gia_Man_t *p)
Gia_Man_t * Gia_ManDup(Gia_Man_t *p)
#define Gia_ManForEachAnd(p, pObj, i)
#define Gia_ManForEachCoId(p, Id, i)
void Gia_ManSetRegNum(Gia_Man_t *p, int nRegs)
void Gia_ManHashAlloc(Gia_Man_t *p)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
int Gia_ManHashOr(Gia_Man_t *p, int iLit0, int iLit1)
struct Gia_Obj_t_ Gia_Obj_t
int Gia_ManHashXor(Gia_Man_t *p, int iLit0, int iLit1)
struct Gia_Man_t_ Gia_Man_t
void Gia_ManCreateRefs(Gia_Man_t *p)
void Gia_ManPrintStats(Gia_Man_t *p, Gps_Par_t *pPars)
Vec_Ptr_t * Gia_GetFakeNames(int nNames, int fCaps)
#define Gia_ManForEachCiId(p, Id, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.