| /**CFile**************************************************************** |
| |
| FileName [gia.c] |
| |
| SystemName [ABC: Logic synthesis and verification system.] |
| |
| PackageName [Scalable AIG package.] |
| |
| Synopsis [] |
| |
| Author [Alan Mishchenko] |
| |
| Affiliation [UC Berkeley] |
| |
| Date [Ver. 1.0. Started - June 20, 2005.] |
| |
| Revision [$Id: gia.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] |
| |
| ***********************************************************************/ |
| |
| #include "gia.h" |
| |
| ABC_NAMESPACE_IMPL_START |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// DECLARATIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// FUNCTION DEFINITIONS /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| /**Function************************************************************* |
| |
| Synopsis [This is implementation of qsort in MiniSat.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| static int num_cmp1( int * x, int * y) { return ((*x) < (*y)) ? -1 : (((*x) > (*y)) ? 1 : 0); } |
| static int num_cmp2( int * x, int * y) { return (*x) < (*y); } |
| static inline void selectionsort(int* array, int size, int(*comp)(const void *, const void *)) |
| { |
| int i, j, best_i; |
| int tmp; |
| for (i = 0; i < size-1; i++){ |
| best_i = i; |
| for (j = i+1; j < size; j++){ |
| if (comp(array + j, array + best_i)) |
| best_i = j; |
| } |
| tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp; |
| } |
| } |
| static void sort_rec(int* array, int size, int(*comp)(const void *, const void *)) |
| { |
| if (size <= 15) |
| selectionsort(array, size, comp); |
| else{ |
| int pivot = array[size/2]; |
| int tmp; |
| int i = -1; |
| int j = size; |
| for(;;){ |
| do i++; while(comp(array + i, &pivot)); |
| do j--; while(comp(&pivot, array + j)); |
| if (i >= j) break; |
| tmp = array[i]; array[i] = array[j]; array[j] = tmp; |
| } |
| sort_rec(array , i , comp); |
| sort_rec(&array[i], size-i, comp); |
| } |
| } |
| void minisat_sort(int* array, int size, int(*comp)(const void *, const void *)) |
| { |
| sort_rec(array,size,comp); |
| } |
| |
| |
| /**Function************************************************************* |
| |
| Synopsis [This is implementation of qsort in MiniSat.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| static inline void selectionsort2(int* array, int size) |
| { |
| int i, j, best_i; |
| int tmp; |
| for (i = 0; i < size-1; i++){ |
| best_i = i; |
| for (j = i+1; j < size; j++){ |
| if (array[j] < array[best_i]) |
| best_i = j; |
| } |
| tmp = array[i]; array[i] = array[best_i]; array[best_i] = tmp; |
| } |
| } |
| static void sort_rec2(int* array, int size) |
| { |
| if (size <= 15) |
| selectionsort2(array, size); |
| else{ |
| int pivot = array[size/2]; |
| int tmp; |
| int i = -1; |
| int j = size; |
| for(;;){ |
| do i++; while(array[i] < pivot); |
| do j--; while(pivot < array[j]); |
| if (i >= j) break; |
| tmp = array[i]; array[i] = array[j]; array[j] = tmp; |
| } |
| sort_rec2(array , i ); |
| sort_rec2(&array[i], size-i); |
| } |
| } |
| void minisat_sort2(int* array, int size) |
| { |
| sort_rec2(array,size); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [This is implementation of qsort in MiniSat.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int * Gia_SortGetTest( int nSize ) |
| { |
| int i, * pArray; |
| srand( 0 ); |
| pArray = ABC_ALLOC( int, nSize ); |
| for ( i = 0; i < nSize; i++ ) |
| pArray[i] = rand(); |
| return pArray; |
| } |
| void Gia_SortVerifySorted( int * pArray, int nSize ) |
| { |
| int i; |
| for ( i = 1; i < nSize; i++ ) |
| assert( pArray[i-1] <= pArray[i] ); |
| } |
| void Gia_SortTest() |
| { |
| int nSize = 100000000; |
| int * pArray; |
| abctime clk = Abc_Clock(); |
| |
| printf( "Sorting %d integers\n", nSize ); |
| pArray = Gia_SortGetTest( nSize ); |
| clk = Abc_Clock(); |
| qsort( pArray, nSize, 4, (int (*)(const void *, const void *)) num_cmp1 ); |
| ABC_PRT( "qsort ", Abc_Clock() - clk ); |
| Gia_SortVerifySorted( pArray, nSize ); |
| ABC_FREE( pArray ); |
| |
| pArray = Gia_SortGetTest( nSize ); |
| clk = Abc_Clock(); |
| minisat_sort( pArray, nSize, (int (*)(const void *, const void *)) num_cmp2 ); |
| ABC_PRT( "minisat", Abc_Clock() - clk ); |
| Gia_SortVerifySorted( pArray, nSize ); |
| ABC_FREE( pArray ); |
| |
| pArray = Gia_SortGetTest( nSize ); |
| clk = Abc_Clock(); |
| minisat_sort2( pArray, nSize ); |
| ABC_PRT( "minisat with inlined comparison", Abc_Clock() - clk ); |
| Gia_SortVerifySorted( pArray, nSize ); |
| ABC_FREE( pArray ); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [This is implementation of qsort in MiniSat.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| static inline void selectionsort3(float* array, int* perm, int size) |
| { |
| float tmpf; |
| int tmpi; |
| int i, j, best_i; |
| for (i = 0; i < size-1; i++){ |
| best_i = i; |
| for (j = i+1; j < size; j++){ |
| if (array[j] < array[best_i]) |
| best_i = j; |
| } |
| tmpf = array[i]; array[i] = array[best_i]; array[best_i] = tmpf; |
| tmpi = perm[i]; perm[i] = perm[best_i]; perm[best_i] = tmpi; |
| } |
| } |
| static void sort_rec3(float* array, int* perm, int size) |
| { |
| if (size <= 15) |
| selectionsort3(array, perm, size); |
| else{ |
| float pivot = array[size/2]; |
| float tmpf; |
| int tmpi; |
| int i = -1; |
| int j = size; |
| for(;;){ |
| do i++; while(array[i] < pivot); |
| do j--; while(pivot < array[j]); |
| if (i >= j) break; |
| tmpf = array[i]; array[i] = array[j]; array[j] = tmpf; |
| tmpi = perm[i]; perm[i] = perm[j]; perm[j] = tmpi; |
| } |
| sort_rec3(array , perm, i ); |
| sort_rec3(&array[i], &perm[i], size-i); |
| } |
| } |
| void minisat_sort3(float* array, int* perm, int size) |
| { |
| sort_rec3(array, perm, size); |
| } |
| |
| /**Function************************************************************* |
| |
| Synopsis [Sorts the array of floating point numbers.] |
| |
| Description [] |
| |
| SideEffects [] |
| |
| SeeAlso [] |
| |
| ***********************************************************************/ |
| int * Gia_SortFloats( float * pArray, int * pPerm, int nSize ) |
| { |
| int i; |
| if ( pPerm == NULL ) |
| { |
| pPerm = ABC_ALLOC( int, nSize ); |
| for ( i = 0; i < nSize; i++ ) |
| pPerm[i] = i; |
| } |
| minisat_sort3( pArray, pPerm, nSize ); |
| // for ( i = 1; i < nSize; i++ ) |
| // assert( pArray[i-1] <= pArray[i] ); |
| return pPerm; |
| } |
| |
| |
| //////////////////////////////////////////////////////////////////////// |
| /// END OF FILE /// |
| //////////////////////////////////////////////////////////////////////// |
| |
| |
| ABC_NAMESPACE_IMPL_END |
| |