30static inline int Gia_ObjDom(
Gia_Man_t *
p,
Gia_Obj_t * pObj ) {
return Vec_IntEntry(
p->vDoms, Gia_ObjId(
p, pObj)); }
31static inline void Gia_ObjSetDom(
Gia_Man_t *
p,
Gia_Obj_t * pObj,
int d ) { Vec_IntWriteEntry(
p->vDoms, Gia_ObjId(
p, pObj), d); }
52 if ( Gia_ObjDom(
p, pObj) == -1 )
54 Gia_ObjSetDom(
p, pObj, iDom0 );
57 iDom1 = Gia_ObjDom(
p, pObj );
62 iDomNext = Gia_ObjDom(
p, Gia_ManObj(
p, iDom1) );
63 if ( iDomNext == iDom1 )
70 iDomNext = Gia_ObjDom(
p, Gia_ManObj(
p, iDom0) );
71 if ( iDomNext == iDom0 )
77 Gia_ObjSetDom(
p, pObj, iDom0 );
80 Gia_ObjSetDom(
p, pObj, Gia_ObjId(
p, pObj) );
82static inline void Gia_ManComputeDoms(
Gia_Man_t *
p )
86 if (
p->vDoms == NULL )
87 p->vDoms = Vec_IntAlloc( 0 );
88 Vec_IntFill(
p->vDoms, Gia_ManObjNum(
p), -1 );
91 if ( i == 0 || Gia_ObjIsCi(pObj) )
93 if ( Gia_ObjIsCo(pObj) )
95 Gia_ObjSetDom(
p, pObj, i );
96 Gia_ManAddDom(
p, Gia_ObjFanin0(pObj), i );
99 assert( Gia_ObjIsAnd(pObj) );
100 Gia_ManAddDom(
p, Gia_ObjFanin0(pObj), i );
101 Gia_ManAddDom(
p, Gia_ObjFanin1(pObj), i );
121 if ( Gia_ObjIsCi(pNode) )
123 assert( Gia_ObjIsAnd(pNode) );
124 pFanin = Gia_ObjFanin0(pNode);
125 assert( Gia_ObjRefNum(
p, pFanin) > 0 );
126 if ( Gia_ObjRefDec(
p, pFanin) == 0 )
127 Counter += Gia_NodeDeref_rec(
p, pFanin );
128 pFanin = Gia_ObjFanin1(pNode);
129 assert( Gia_ObjRefNum(
p, pFanin) > 0 );
130 if ( Gia_ObjRefDec(
p, pFanin) == 0 )
131 Counter += Gia_NodeDeref_rec(
p, pFanin );
138 if ( Gia_ObjIsCi(pNode) )
140 assert( Gia_ObjIsAnd(pNode) );
141 pFanin = Gia_ObjFanin0(pNode);
142 if ( Gia_ObjRefInc(
p, pFanin) == 0 )
143 Counter += Gia_NodeRef_rec(
p, pFanin );
144 pFanin = Gia_ObjFanin1(pNode);
145 if ( Gia_ObjRefInc(
p, pFanin) == 0 )
146 Counter += Gia_NodeRef_rec(
p, pFanin );
151 if ( Gia_ObjIsTravIdCurrent(
p, pNode) )
153 Gia_ObjSetTravIdCurrent(
p, pNode);
154 if ( Gia_ObjRefNum(
p, pNode) || Gia_ObjIsCi(pNode) )
156 Vec_IntPush( vSupp, Gia_ObjId(
p, pNode) );
157 Vec_IntPush( vSuppRefs, Gia_ObjRefNum(
p, pNode) );
160 assert( Gia_ObjIsAnd(pNode) );
161 Gia_NodeCollect_rec(
p, Gia_ObjFanin0(pNode), vSupp, vSuppRefs );
162 Gia_NodeCollect_rec(
p, Gia_ObjFanin1(pNode), vSupp, vSuppRefs );
166 int ConeSize1, ConeSize2, i, iObj;
167 assert( !Gia_IsComplement(pNode) );
168 assert( Gia_ObjIsAnd(pNode) );
169 Vec_IntClear( vSupp );
170 Vec_IntClear( vSuppRefs );
172 ConeSize1 = Gia_NodeDeref_rec(
p, pNode );
173 Gia_NodeCollect_rec(
p, Gia_ObjFanin0(pNode), vSupp, vSuppRefs );
174 Gia_NodeCollect_rec(
p, Gia_ObjFanin1(pNode), vSupp, vSuppRefs );
175 ConeSize2 = Gia_NodeRef_rec(
p, pNode );
176 assert( ConeSize1 == ConeSize2 );
180 Vec_IntAddToEntry( vSuppRefs, i, -Gia_ObjRefNumId(
p, iObj) );
197 if ( Gia_ObjIsTravIdCurrent(
p, pNode) )
199 Gia_ObjSetTravIdCurrent(
p, pNode);
200 assert( Gia_ObjIsAnd(pNode) );
203 return pNode->
Value =
Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pNode), Gia_ObjFanin1Copy(pNode) );
208 int nMints = 1 << nVars;
210 assert( nVars >= 0 && nVars <= 5 );
212 pNew->
pName = Abc_UtilStrsav(
p->pName );
213 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
214 Gia_ManConst0(
p)->Value = 0;
216 for ( i = 0; i < Vec_IntSize(vSupp); i++ )
217 Gia_ManAppendCi(pNew);
218 for ( m = 0; m < nMints; m++ )
225 pObj->
Value = (m >> i) & 1;
227 pObj->
Value = Gia_ObjToLit(pNew, Gia_ManCi(pNew, i));
228 Gia_ObjSetTravIdCurrent(
p, pObj );
231 Gia_ManAppendCo( pNew, iResLit );
252 extern void Gia_ManCollapseTestTest(
Gia_Man_t *
p );
257 int i, nSize, Entry, k;
262 Gia_ManComputeDoms(
p );
263 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
264 vSupp = Vec_IntAlloc( 1000 );
265 vSuppRefs = Vec_IntAlloc( 1000 );
268 if ( !Gia_ObjIsAnd(pObj) && !Gia_ObjIsCo(pObj) )
270 if ( Gia_ObjDom(
p, pObj) != i )
272 if ( Gia_ObjIsCo(pObj) )
273 pObj = Gia_ObjFanin0(pObj);
274 if ( !Gia_ObjIsAnd(pObj) )
280 Vec_IntSelectSortCost2( Vec_IntArray(vSupp), Vec_IntSize(vSupp), Vec_IntArray(vSuppRefs) );
282 printf(
"Obj %6d : ", i );
283 printf(
"Cone = %4d ", nSize );
284 printf(
"Supp = %4d ", Vec_IntSize(vSupp) );
290 for ( k = 0; k < Vec_IntSize(vSupp); k++ )
291 if ( Vec_IntEntry(vSuppRefs, k) == 1 )
293 k = Abc_MinInt( k, 3 );
299 Gia_ManCollapseTestTest( pNew );
303 Vec_IntFree( vSuppRefs );
304 Vec_IntFree( vSupp );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Gia_Man_t * Gia_ManDomDerive(Gia_Man_t *p, Gia_Obj_t *pRoot, Vec_Int_t *vSupp, int nVars)
void Gia_ManComputeDomsTry(Gia_Man_t *p)
int Gia_ManDomDerive_rec(Gia_Man_t *pNew, Gia_Man_t *p, Gia_Obj_t *pNode)
void Gia_ManStop(Gia_Man_t *p)
int Gia_NodeMffcSizeSupp(Gia_Man_t *p, Gia_Obj_t *pNode, Vec_Int_t *vSupp)
void Gia_ManHashAlloc(Gia_Man_t *p)
#define Gia_ManForEachObjReverse(p, pObj, i)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
void Gia_DumpAiger(Gia_Man_t *p, char *pFilePrefix, int iFileNum, int nFileNumDigits)
void Gia_ManCreateRefs(Gia_Man_t *p)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
void Gia_ManIncrementTravId(Gia_Man_t *p)
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
void Gia_ManHashStop(Gia_Man_t *p)
int Gia_ManLevelNum(Gia_Man_t *p)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.