From 419d6410db0b35c869679c176315a5d12abb327a Mon Sep 17 00:00:00 2001 From: gptsarthak Date: Fri, 7 Apr 2023 18:15:47 +0530 Subject: [PATCH 1/4] Implement time.time() method --- src/libasr/runtime/lfortran_intrinsics.c | 11 +++++++++++ src/libasr/runtime/lfortran_intrinsics.h | 1 + src/runtime/time.py | 8 ++++++++ 3 files changed, 20 insertions(+) create mode 100644 src/runtime/time.py diff --git a/src/libasr/runtime/lfortran_intrinsics.c b/src/libasr/runtime/lfortran_intrinsics.c index 114716d06d..6fda3ffbe1 100644 --- a/src/libasr/runtime/lfortran_intrinsics.c +++ b/src/libasr/runtime/lfortran_intrinsics.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -1187,6 +1188,16 @@ LFORTRAN_API void _lfortran_i64sys_clock( #endif } +LFORTRAN_API double _lfortran_time() +{ + struct timeval tv; + if (gettimeofday(&tv, NULL) != 0) { + /* Error occurred, return -1 */ + return -1.0; + } + return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0; +} + LFORTRAN_API void _lfortran_sp_rand_num(float *x) { srand(time(0)); *x = rand() / (float) RAND_MAX; diff --git a/src/libasr/runtime/lfortran_intrinsics.h b/src/libasr/runtime/lfortran_intrinsics.h index ae01305df2..9245eab939 100644 --- a/src/libasr/runtime/lfortran_intrinsics.h +++ b/src/libasr/runtime/lfortran_intrinsics.h @@ -208,6 +208,7 @@ LFORTRAN_API void _lfortran_i32sys_clock( int32_t *count, int32_t *rate, int32_t *max); LFORTRAN_API void _lfortran_i64sys_clock( uint64_t *count, int64_t *rate, int64_t *max); +LFORTRAN_API double _lfortran_time(); LFORTRAN_API void _lfortran_sp_rand_num(float *x); LFORTRAN_API void _lfortran_dp_rand_num(double *x); LFORTRAN_API int64_t _lpython_open(char *path, char *flags); diff --git a/src/runtime/time.py b/src/runtime/time.py new file mode 100644 index 0000000000..87c37190cf --- /dev/null +++ b/src/runtime/time.py @@ -0,0 +1,8 @@ +from lpython import f64, ccall + +def time() -> f64: + return _lfortran_time() + +@ccall +def _lfortran_time() -> f64: + pass From 71e24a67ba0ba50c6ecc6d122da866390d76d085 Mon Sep 17 00:00:00 2001 From: gptsarthak Date: Sat, 8 Apr 2023 17:08:04 +0530 Subject: [PATCH 2/4] Implement time.time() using --- src/libasr/runtime/lfortran_intrinsics.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/libasr/runtime/lfortran_intrinsics.c b/src/libasr/runtime/lfortran_intrinsics.c index 6fda3ffbe1..6e6d56ab6c 100644 --- a/src/libasr/runtime/lfortran_intrinsics.c +++ b/src/libasr/runtime/lfortran_intrinsics.c @@ -9,7 +9,6 @@ #include #include #include -#include #include #include @@ -1190,12 +1189,9 @@ LFORTRAN_API void _lfortran_i64sys_clock( LFORTRAN_API double _lfortran_time() { - struct timeval tv; - if (gettimeofday(&tv, NULL) != 0) { - /* Error occurred, return -1 */ - return -1.0; - } - return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0; + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + return (double)ts.tv_sec + (double)ts.tv_nsec / 1000000000.0; } LFORTRAN_API void _lfortran_sp_rand_num(float *x) { From 71c3ea8920fd5885e97c1b6d32f708d67bf37153 Mon Sep 17 00:00:00 2001 From: gptsarthak Date: Sat, 8 Apr 2023 20:02:25 +0530 Subject: [PATCH 3/4] Add Windows implementation for time.time() --- src/libasr/runtime/lfortran_intrinsics.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/libasr/runtime/lfortran_intrinsics.c b/src/libasr/runtime/lfortran_intrinsics.c index 6e6d56ab6c..e587fe68a0 100644 --- a/src/libasr/runtime/lfortran_intrinsics.c +++ b/src/libasr/runtime/lfortran_intrinsics.c @@ -10,6 +10,10 @@ #include #include +#if defined(MSC_VER) || defined(MACH_) +# include +#endif + #include #include @@ -1189,9 +1193,18 @@ LFORTRAN_API void _lfortran_i64sys_clock( LFORTRAN_API double _lfortran_time() { +#if defined(MSC_VER) || defined(MACH_) + FILETIME ft; + ULARGE_INTEGER uli; + GetSystemTimeAsFileTime(&ft); + uli.LowPart = ft.dwLowDateTime; + uli.HighPart = ft.dwHighDateTime; + return (double)uli.QuadPart / 10000000.0 - 11644473600.0; +#else struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); return (double)ts.tv_sec + (double)ts.tv_nsec / 1000000000.0; +#endif } LFORTRAN_API void _lfortran_sp_rand_num(float *x) { From 4e92737e3763f73357d3750294f20d0509d5e53f Mon Sep 17 00:00:00 2001 From: gptsarthak Date: Sat, 8 Apr 2023 21:18:35 +0530 Subject: [PATCH 4/4] fix : typing mistake in #ifdef --- src/libasr/runtime/lfortran_intrinsics.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libasr/runtime/lfortran_intrinsics.c b/src/libasr/runtime/lfortran_intrinsics.c index e587fe68a0..1b0e81a4ce 100644 --- a/src/libasr/runtime/lfortran_intrinsics.c +++ b/src/libasr/runtime/lfortran_intrinsics.c @@ -10,7 +10,7 @@ #include #include -#if defined(MSC_VER) || defined(MACH_) +#if defined(_MSC_VER) # include #endif @@ -1193,7 +1193,7 @@ LFORTRAN_API void _lfortran_i64sys_clock( LFORTRAN_API double _lfortran_time() { -#if defined(MSC_VER) || defined(MACH_) +#if defined(_MSC_VER) FILETIME ft; ULARGE_INTEGER uli; GetSystemTimeAsFileTime(&ft);