diff --git a/src/misc/misc_time.c b/src/misc/misc_time.c index 945de732f..cc986f432 100644 --- a/src/misc/misc_time.c +++ b/src/misc/misc_time.c @@ -1,159 +1,159 @@ -/********** -Copyright 1990 Regents of the University of California. All rights reserved. -**********/ - -/* - * Date and time utility functions - */ - -#include "ngspice/ngspice.h" -#include - -#if defined(HAS_WINGUI) || defined(__MINGW32__) || defined(_MSC_VER) -#define WIN32_LEAN_AND_MEAN - -#include -#ifndef HAVE_GETTIMEOFDAY -#include -#include // portable: uint64_t MSVC: __int64 - -/*/ MSVC defines this in winsock2.h!? -typedef struct timeval { - long tv_sec; - long tv_usec; -} timeval; -*/ -int gettimeofday(struct timeval * tp, void * unused) -{ - NG_IGNORE(unused); - // Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's - // This magic number is the number of 100 nanosecond intervals since January 1, 1601 (UTC) - // until 00:00:00 January 1, 1970 - static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL); - - SYSTEMTIME system_time; - FILETIME file_time; - uint64_t time; - - GetSystemTime( &system_time ); - SystemTimeToFileTime( &system_time, &file_time ); - time = ((uint64_t)file_time.dwLowDateTime ) ; - time += ((uint64_t)file_time.dwHighDateTime) << 32; - - tp->tv_sec = (long) ((time - EPOCH) / 10000000L); - tp->tv_usec = (long) (system_time.wMilliseconds * 1000); - return 0; -} -#endif -#endif - -#include "misc_time.h" - -#ifdef USE_OMP -#include -#endif - -/* Return the date. Return value is static data. */ - -char * -datestring(void) -{ - -#ifdef HAVE_LOCALTIME - static char tbuf[45]; - struct tm *tp; - char *ap; - size_t i; - - time_t tloc; - time(&tloc); - tp = localtime(&tloc); - ap = asctime(tp); - (void) sprintf(tbuf, "%.20s", ap); - (void) strcat(tbuf, ap + 19); - i = strlen(tbuf); - tbuf[i - 1] = '\0'; - return (tbuf); - -#else - - return ("today"); - -#endif -} - -/* return time interval in seconds and milliseconds */ - -PerfTime timebegin; - -void timediff(PerfTime *now, PerfTime *begin, int *sec, int *msec) -{ - - *msec = (int) now->milliseconds - (int) begin->milliseconds; - *sec = (int) now->seconds - (int) begin->seconds; - if (*msec < 0) { - *msec += 1000; - (*sec)--; - } - return; - -} - -/* - * How many seconds have elapsed in running time. - * This is the routine called in IFseconds - */ - -double -seconds(void) -{ -#ifdef USE_OMP - // Usage of OpenMP time function - return(omp_get_wtime() - timebegin.secs); -#elif defined(HAVE_QUERYPERFORMANCECOUNTER) - // Windows (MSC and mingw) specific implementation - LARGE_INTEGER frequency, counter; - QueryPerformanceFrequency(&frequency); - QueryPerformanceCounter(&counter); - return ((double)counter.QuadPart / frequency.QuadPart - timebegin.secs); -#elif defined(HAVE_CLOCK_GETTIME) - struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); - return (ts.tv_sec + ts.tv_nsec / 1e9 - timebegin.secs); -#elif defined(HAVE_GETTIMEOFDAY) - // Usage of gettimeofday - struct timeval tv; - gettimeofday(&tv, NULL); - return (tv.tv_sec + tv.tv_usec / 1e6 - timebegin.secs); -#elif defined(HAVE_FTIME) - // Usage of ftime - struct timeb tb; - PerfTime timenow; - int sec, msec; - ftime(&tb); - timenow.seconds = tb.time; - timenow.milliseconds = tb.millitm; - timediff(&timenow, &timebegin, &sec, &msec); - return(sec + (double) msec / 1000.0); -#elif defined(HAVE_TIMES) - // Usage of times - struct tms tmsbuf; - clock_t ticks = times(&tmsbuf); - return((double) tmsbuf.tms_utime / HZ); -#elif defined(HAVE_GETRUSAGE) - // Usage of getrusage - struct rusage ruse; - getrusage(RUSAGE_SELF, &ruse); - return ((double)ruse.ru_utime.tv_sec + (double) ruse.ru_utime.tv_usec / 1000000.0); -#else - #error "No timer function available." -#endif -} - -void perf_timer_get_time(PerfTime *time) -{ - time->secs = seconds(); - time->seconds = (int)time->secs; - time->milliseconds = (int)((time->secs - time->seconds) * 1000.0); - -} +/********** +Copyright 1990 Regents of the University of California. All rights reserved. +**********/ + +/* + * Date and time utility functions + */ + +#include "ngspice/ngspice.h" +#include + +#if defined(HAS_WINGUI) || defined(__MINGW32__) || defined(_MSC_VER) +#define WIN32_LEAN_AND_MEAN + +#include +#ifndef HAVE_GETTIMEOFDAY +#include +#include // portable: uint64_t MSVC: __int64 + +/*/ MSVC defines this in winsock2.h!? +typedef struct timeval { + long tv_sec; + long tv_usec; +} timeval; +*/ +int gettimeofday(struct timeval * tp, void * unused) +{ + NG_IGNORE(unused); + // Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's + // This magic number is the number of 100 nanosecond intervals since January 1, 1601 (UTC) + // until 00:00:00 January 1, 1970 + static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL); + + SYSTEMTIME system_time; + FILETIME file_time; + uint64_t time; + + GetSystemTime( &system_time ); + SystemTimeToFileTime( &system_time, &file_time ); + time = ((uint64_t)file_time.dwLowDateTime ) ; + time += ((uint64_t)file_time.dwHighDateTime) << 32; + + tp->tv_sec = (long) ((time - EPOCH) / 10000000L); + tp->tv_usec = (long) (system_time.wMilliseconds * 1000); + return 0; +} +#endif +#endif + +#include "misc_time.h" + +#ifdef USE_OMP +#include +#endif + +/* Return the date. Return value is static data. */ + +char * +datestring(void) +{ + +#ifdef HAVE_LOCALTIME + static char tbuf[45]; + struct tm *tp; + char *ap; + size_t i; + + time_t tloc; + time(&tloc); + tp = localtime(&tloc); + ap = asctime(tp); + (void) sprintf(tbuf, "%.20s", ap); + (void) strcat(tbuf, ap + 19); + i = strlen(tbuf); + tbuf[i - 1] = '\0'; + return (tbuf); + +#else + + return ("today"); + +#endif +} + +/* return time interval in seconds and milliseconds */ + +PerfTime timebegin; + +void timediff(PerfTime *now, PerfTime *begin, int *sec, int *msec) +{ + + *msec = (int) now->milliseconds - (int) begin->milliseconds; + *sec = (int) now->seconds - (int) begin->seconds; + if (*msec < 0) { + *msec += 1000; + (*sec)--; + } + return; + +} + +/* + * How many seconds have elapsed in running time. + * This is the routine called in IFseconds + */ + +double +seconds(void) +{ +#ifdef USE_OMP + // Usage of OpenMP time function + return(omp_get_wtime() - timebegin.secs); +#elif defined(HAVE_QUERYPERFORMANCECOUNTER) + // Windows (MSC and mingw) specific implementation + LARGE_INTEGER frequency, counter; + QueryPerformanceFrequency(&frequency); + QueryPerformanceCounter(&counter); + return ((double)counter.QuadPart / frequency.QuadPart - timebegin.secs); +#elif defined(HAVE_CLOCK_GETTIME) + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (ts.tv_sec + ts.tv_nsec / 1e9 - timebegin.secs); +#elif defined(HAVE_GETTIMEOFDAY) + // Usage of gettimeofday + struct timeval tv; + gettimeofday(&tv, NULL); + return (tv.tv_sec + tv.tv_usec / 1e6 - timebegin.secs); +#elif defined(HAVE_FTIME) + // Usage of ftime + struct timeb tb; + PerfTime timenow; + int sec, msec; + ftime(&tb); + timenow.seconds = tb.time; + timenow.milliseconds = tb.millitm; + timediff(&timenow, &timebegin, &sec, &msec); + return(sec + (double) msec / 1000.0); +#elif defined(HAVE_TIMES) + // Usage of times + struct tms tmsbuf; + clock_t ticks = times(&tmsbuf); + return((double) tmsbuf.tms_utime / HZ); +#elif defined(HAVE_GETRUSAGE) + // Usage of getrusage + struct rusage ruse; + getrusage(RUSAGE_SELF, &ruse); + return ((double)ruse.ru_utime.tv_sec + (double) ruse.ru_utime.tv_usec / 1000000.0); +#else + #error "No timer function available." +#endif +} + +void perf_timer_get_time(PerfTime *time) +{ + time->secs = seconds(); + time->seconds = (int)time->secs; + time->milliseconds = (int)((time->secs - time->seconds) * 1000.0); + +}