31static unsigned long Aig_Hash(
Aig_Obj_t * pObj,
int TableSize )
33 unsigned long Key = Aig_ObjIsExor(pObj) * 1699;
34 Key ^= Aig_ObjFanin0(pObj)->Id * 7937;
35 Key ^= Aig_ObjFanin1(pObj)->Id * 2971;
36 Key ^= Aig_ObjFaninC0(pObj) * 911;
37 Key ^= Aig_ObjFaninC1(pObj) * 353;
38 return Key % TableSize;
45 assert( Aig_ObjChild0(pObj) && Aig_ObjChild1(pObj) );
46 assert( Aig_ObjFanin0(pObj)->Id < Aig_ObjFanin1(pObj)->Id );
47 for ( ppEntry =
p->pTable + Aig_Hash(pObj,
p->nTableSize); *ppEntry; ppEntry = &(*ppEntry)->pNext )
48 if ( *ppEntry == pObj )
50 assert( *ppEntry == NULL );
73 int nTableSizeOld, Counter, i;
78 pTableOld =
p->pTable;
79 nTableSizeOld =
p->nTableSize;
81 p->nTableSize = Abc_PrimeCudd( 2 * Aig_ManNodeNum(
p) );
86 for ( i = 0; i < nTableSizeOld; i++ )
87 for ( pEntry = pTableOld[i], pNext = pEntry? pEntry->
pNext : NULL;
88 pEntry; pEntry = pNext, pNext = pEntry? pEntry->
pNext : NULL )
91 ppPlace = Aig_TableFind(
p, pEntry );
92 assert( *ppPlace == NULL );
98 assert( Counter == Aig_ManNodeNum(
p) );
119 assert( !Aig_IsComplement(pGhost) );
120 assert( Aig_ObjIsNode(pGhost) );
121 assert( Aig_ObjChild0(pGhost) && Aig_ObjChild1(pGhost) );
122 assert( Aig_ObjFanin0(pGhost)->Id < Aig_ObjFanin1(pGhost)->Id );
123 if (
p->pTable == NULL || !Aig_ObjRefs(Aig_ObjFanin0(pGhost)) || !Aig_ObjRefs(Aig_ObjFanin1(pGhost)) )
125 for ( pEntry =
p->pTable[Aig_Hash(pGhost,
p->nTableSize)]; pEntry; pEntry = pEntry->
pNext )
127 if ( Aig_ObjChild0(pEntry) == Aig_ObjChild0(pGhost) &&
128 Aig_ObjChild1(pEntry) == Aig_ObjChild1(pGhost) &&
129 Aig_ObjType(pEntry) == Aig_ObjType(pGhost) )
150 if ( pFanin0 == pFanin1 )
152 if ( pFanin0 == Aig_Not(pFanin1) )
153 return Aig_ManConst0(
p);
154 if ( Aig_Regular(pFanin0) == Aig_ManConst1(
p) )
155 return pFanin0 == Aig_ManConst1(
p) ? pFanin1 : Aig_ManConst0(
p);
156 if ( Aig_Regular(pFanin1) == Aig_ManConst1(
p) )
157 return pFanin1 == Aig_ManConst1(
p) ? pFanin0 : Aig_ManConst0(
p);
158 pGhost = Aig_ObjCreateGhost(
p, pFanin0, pFanin1,
AIG_OBJ_AND );
176 assert( !Aig_IsComplement(pObj) );
178 if ( (pObj->
Id & 0xFF) == 0 && 2 *
p->nTableSize < Aig_ManNodeNum(
p) )
180 ppPlace = Aig_TableFind(
p, pObj );
181 assert( *ppPlace == NULL );
199 assert( !Aig_IsComplement(pObj) );
200 ppPlace = Aig_TableFind(
p, pObj );
201 assert( *ppPlace == pObj );
203 *ppPlace = pObj->
pNext;
222 for ( i = 0; i <
p->nTableSize; i++ )
223 for ( pEntry =
p->pTable[i]; pEntry; pEntry = pEntry->
pNext )
243 printf(
"Table size = %d. Entries = %d.\n",
p->nTableSize, Aig_ManNodeNum(
p) );
244 for ( i = 0; i <
p->nTableSize; i++ )
247 for ( pEntry =
p->pTable[i]; pEntry; pEntry = pEntry->
pNext )
250 printf(
"%d ", Counter );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_TableClear(Aig_Man_t *p)
void Aig_TableResize(Aig_Man_t *p)
FUNCTION DEFINITIONS ///.
void Aig_TableInsert(Aig_Man_t *p, Aig_Obj_t *pObj)
Aig_Obj_t * Aig_TableLookup(Aig_Man_t *p, Aig_Obj_t *pGhost)
int Aig_TableCountEntries(Aig_Man_t *p)
Aig_Obj_t * Aig_TableLookupTwo(Aig_Man_t *p, Aig_Obj_t *pFanin0, Aig_Obj_t *pFanin1)
void Aig_TableProfile(Aig_Man_t *p)
void Aig_TableDelete(Aig_Man_t *p, Aig_Obj_t *pObj)
struct Aig_Obj_t_ Aig_Obj_t
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.