]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/commitdiff
RoCoN: approximated functions test code extended.
authorPavel Pisa <ppisa@pikron.com>
Sat, 6 Dec 2014 11:59:13 +0000 (12:59 +0100)
committerPavel Pisa <ppisa@pikron.com>
Sat, 6 Dec 2014 11:59:13 +0000 (12:59 +0100)
Signed-off-by: Pavel Pisa <ppisa@pikron.com>
sw/app/rocon/appl_tests.c

index ae19cf4b9905579d1cb8b3b957927a0828d8fdc6..bfdc25c1e745b6f698c66fa642929e9d603924a7 100644 (file)
@@ -293,9 +293,12 @@ int cmd_do_testlxpwrstat(cmd_io_t *cmd_io, const struct cmd_des *des, char *para
   return 0;
 }
 
+#include <math.h>
+
 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;
 }