diff --git a/src/libasr/runtime/lfortran_intrinsics.c b/src/libasr/runtime/lfortran_intrinsics.c index 114716d06d..1b0e81a4ce 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) +# include +#endif + #include #include @@ -1187,6 +1191,22 @@ LFORTRAN_API void _lfortran_i64sys_clock( #endif } +LFORTRAN_API double _lfortran_time() +{ +#if defined(_MSC_VER) + 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) { 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