21 #pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
29static inline void MurmurHash3_x86_32 (
const void*
key,
35 const int nblocks = len / 4;
51 for(i = -nblocks; i; i++)
56 k1 = (k1 << 15) | (k1 >> (32 - 15));
60 h1 = (h1 << 13) | (h1 >> (32 - 13));
67 tail = (
const uint8_t*)(data + nblocks*4);
73 case 3: k1 ^= tail[2] << 16;
74 case 2: k1 ^= tail[1] << 8;
75 case 1: k1 ^= tail[0];
76 k1 *= c1; k1 = (k1 << 15) | (k1 >> (32 - 15)); k1 *= c2; h1 ^= k1;
97 int nBits = Abc_Base2Log( nEntries + 1 );
101 pSCHashTable->
SizeMask = (1 << nBits) - 1;
110 for ( i = 0; i <= pSCHashTable->
SizeMask; i++ )
112 Vec_IntErase( &pSCHashTable->
vSubCube0 );
113 Vec_IntErase( &pSCHashTable->
vSubCube1 );
119 unsigned int SubCubeID )
121 return pSCHashTable->
pBins + (SubCubeID & pSCHashTable->
SizeMask);
130 * vCube1 = Vec_WecEntry( vCubes, pSCData1->
iCube );
136 if ( !Vec_IntSize( vCube0 ) ||
137 !Vec_IntSize( vCube1 ) ||
138 Vec_IntEntry( vCube0, 0 ) != Vec_IntEntry( vCube1, 0 ) ||
139 pSCData0->
Id != pSCData1->
Id )
143 Result = ( pOutputID0[i] & pOutputID1[i] );
148 Vec_IntClear( &pSCHashTable->
vSubCube0 );
149 Vec_IntClear( &pSCHashTable->
vSubCube1 );
151 if ( pSCData0->
iLit1 > 0 && pSCData1->
iLit1 > 0 &&
152 ( Vec_IntEntry( vCube0, pSCData0->
iLit0 ) == Vec_IntEntry( vCube1, pSCData1->
iLit0 ) ||
153 Vec_IntEntry( vCube0, pSCData0->
iLit0 ) == Vec_IntEntry( vCube1, pSCData1->
iLit1 ) ||
154 Vec_IntEntry( vCube0, pSCData0->
iLit1 ) == Vec_IntEntry( vCube1, pSCData1->
iLit0 ) ||
155 Vec_IntEntry( vCube0, pSCData0->
iLit1 ) == Vec_IntEntry( vCube1, pSCData1->
iLit1 ) ) )
158 if ( pSCData0->
iLit0 > 0 )
159 Vec_IntAppendSkip( &pSCHashTable->
vSubCube0, vCube0, pSCData0->
iLit0 );
161 Vec_IntAppend( &pSCHashTable->
vSubCube0, vCube0 );
163 if ( pSCData1->
iLit0 > 0 )
164 Vec_IntAppendSkip( &pSCHashTable->
vSubCube1, vCube1, pSCData1->
iLit0 );
166 Vec_IntAppend( &pSCHashTable->
vSubCube1, vCube1 );
168 if ( pSCData0->
iLit1 > 0)
172 if ( pSCData1->
iLit1 > 0 )
194 MurmurHash3_x86_32( (
void* ) &SubCubeID,
sizeof(
int ), 0x9747b28c, &BinID);
195 pBin = Fxch_SCHashTableBin( pSCHashTable, BinID );
203 else if ( pBin->
Size == pBin->
Cap )
206 pBin->
Cap = ( pBin->
Cap >> 1 ) * 3;
210 iNewEntry = pBin->
Size++;
217 if ( pBin->
Size == 1 )
220 pNewEntry = &( pBin->
vSCData[iNewEntry] );
221 for ( iEntry = 0; iEntry < (int)pBin->
Size - 1; iEntry++ )
228 int iNewDiv = -1, i, z;
230 if ( (pEntry->
iLit1 != 0 && pNewEntry->
iLit1 == 0) || (pEntry->
iLit1 == 0 && pNewEntry->
iLit1 != 0) )
233 if ( !Fxch_SCHashTableEntryCompare( pSCHashTable, vCubes, pEntry, pNewEntry ) )
236 if ( ( pEntry->
iLit0 == 0 ) || ( pNewEntry->
iLit0 == 0 ) )
239 * vCube1 = Fxch_ManGetCube( pSCHashTable->
pFxchMan, pNewEntry->
iCube );
241 if ( Vec_IntSize( vCube0 ) > Vec_IntSize( vCube1 ) )
261 Result += Fxch_CountOnes( pOutputID0[i] & pOutputID1[i] );
263 for ( z = 0; z < Result; z++ )
290 MurmurHash3_x86_32( (
void* ) &SubCubeID,
sizeof(
int ), 0x9747b28c, &BinID);
292 pBin = Fxch_SCHashTableBin( pSCHashTable, BinID );
294 if ( pBin->
Size == 1 )
300 for ( iEntry = 0; iEntry < (int)pBin->
Size; iEntry++ )
306 pEntry = &( pBin->
vSCData[iEntry] );
307 for ( idx = 0; idx < (int)pBin->
Size; idx++ )
323 if ( (pEntry->
iLit1 != 0 && pNextEntry->
iLit1 == 0) || (pEntry->
iLit1 == 0 && pNextEntry->
iLit1 != 0) )
326 if ( !Fxch_SCHashTableEntryCompare( pSCHashTable, vCubes, pEntry, pNextEntry )
327 || pEntry->
iLit0 == 0
328 || pNextEntry->
iLit0 == 0 )
337 Result += Fxch_CountOnes( pOutputID0[i] & pOutputID1[i] );
339 for ( z = 0; z < Result; z++ )
344 if ( ( iCube0 == (
int)pNextEntry->
iCube && iCube1 == (
int)pEntry->
iCube ) ||
345 ( iCube0 == (
int)pEntry->
iCube && iCube1 == (
int)pNextEntry->
iCube ) )
347 Vec_IntDrop( vDivCubePairs, i+1 );
348 Vec_IntDrop( vDivCubePairs, i );
350 if ( Vec_IntSize( vDivCubePairs ) == 0 )
351 Vec_IntErase( vDivCubePairs );
374 printf(
"SubCube Hash Table at %p\n", (
void* )pHashTable );
375 printf(
"%20s %20s\n",
"nEntries",
376 "Memory Usage (MB)" );
379 printf(
"%20d %18.2f\n", pHashTable->
nEntries,
380 ( (
double ) Memory / 1048576 ) );
void Fxch_SCHashTablePrint(Fxch_SCHashTable_t *pHashTable)
Fxch_SCHashTable_t * Fxch_SCHashTableCreate(Fxch_Man_t *pFxchMan, int nEntries)
int Fxch_SCHashTableRemove(Fxch_SCHashTable_t *pSCHashTable, Vec_Wec_t *vCubes, uint32_t SubCubeID, uint32_t iCube, uint32_t iLit0, uint32_t iLit1, char fUpdate)
unsigned int Fxch_SCHashTableMemory(Fxch_SCHashTable_t *pHashTable)
void Fxch_SCHashTableDelete(Fxch_SCHashTable_t *pSCHashTable)
int Fxch_SCHashTableInsert(Fxch_SCHashTable_t *pSCHashTable, Vec_Wec_t *vCubes, uint32_t SubCubeID, uint32_t iCube, uint32_t iLit0, uint32_t iLit1, char fUpdate)
struct Fxch_SCHashTable_t_ Fxch_SCHashTable_t
int Fxch_DivAdd(Fxch_Man_t *pFxchMan, int fUpdate, int fSingleCube, int fBase)
struct Fxch_SubCube_t_ Fxch_SubCube_t
int Fxch_DivCreate(Fxch_Man_t *pFxchMan, Fxch_SubCube_t *pSubCube0, Fxch_SubCube_t *pSubCube1)
ABC_NAMESPACE_HEADER_START typedef unsigned char uint8_t
struct Fxch_SCHashTable_Entry_t_ Fxch_SCHashTable_Entry_t
int Fxch_DivRemove(Fxch_Man_t *pFxchMan, int fUpdate, int fSingleCube, int fBase)
#define ABC_REALLOC(type, obj, num)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Fxch_Man_t_ Fxch_Man_t
TYPEDEF DECLARATIONS ///.
Vec_Wec_t * vDivCubePairs
Fxch_SCHashTable_Entry_t * pBins
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.