From: Pavel Pisa Date: Sat, 6 Dec 2014 11:59:13 +0000 (+0100) Subject: RoCoN: approximated functions test code extended. X-Git-Url: https://rtime.felk.cvut.cz/gitweb/fpga/lx-cpu1/lx-rocon.git/commitdiff_plain/6a2aea5beb85e8904dd1ba06955f416ab83f237c RoCoN: approximated functions test code extended. Signed-off-by: Pavel Pisa --- diff --git a/sw/app/rocon/appl_tests.c b/sw/app/rocon/appl_tests.c index ae19cf4..bfdc25c 100644 --- a/sw/app/rocon/appl_tests.c +++ b/sw/app/rocon/appl_tests.c @@ -293,9 +293,12 @@ int cmd_do_testlxpwrstat(cmd_io_t *cmd_io, const struct cmd_des *des, char *para return 0; } +#include + int cmd_do_testfncapprox(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[]) { char *ps = param[1]; + unsigned long fnc; unsigned long val; unsigned long res; long diff; @@ -305,23 +308,45 @@ int cmd_do_testfncapprox(cmd_io_t *cmd_io, const struct cmd_des *des, char *para uint64_t yl; si_skspace(&ps); - if (si_ulong(&ps, &val, 0) < 0) + if (si_ulong(&ps, &fnc, 0) < 0) return -CMDERR_BADPAR; - x = val; - xb = __builtin_clz(x); - xl = x << xb; - - *fpga_fncapprox_base = xl; + si_skspace(&ps); + if (si_ulong(&ps, &val, 0) < 0) + return -CMDERR_BADPAR; - res = *fpga_fncapprox_base; + if (fnc == 1) { + x = val; + xb = __builtin_clz(x); + xl = x << xb; + } else { + xl = val; + } - yl = (1LL << 62) / xl; + fpga_fncapprox_base[fnc] = xl; + + res = fpga_fncapprox_base[fnc]; + + switch (fnc) { + case 0: + yl = xl; + case 1: + yl = (1LL << 62) / xl; + break; + case 2: + yl = sin(xl * M_PI / 2.0 / (1UL << 30)) * (1UL << 30); + break; + case 3: + yl = cos(xl * M_PI / 2.0 / (1UL << 30)) * (1UL << 30); + break; + default: + yl = 0; + } diff = yl - res; - printf("val=0x%08lx res=0x%08lx ref=0x%08lx diff=%ld\n", - val, res, (unsigned long)yl, diff); + printf("fnc=%ld val=0x%08lx res=0x%08lx ref=0x%08lx diff=%ld\n", + fnc, val, res, (unsigned long)yl, diff); return 0; }