BaseCpuFxpConvert.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.CompilerServices;
  4. using System.Text;
  5. using FxpConvert.Common;
  6. namespace BaseCpuFxpConvert
  7. {
  8. public class BaseCpuFxpConvert:IFxpConvert
  9. {
  10. public bool IsSupport => true;
  11. public unsafe void DoubleConvertToDxp(ref double value, NiFpga_FxpTypeInfo dxpinfo, ref ulong fxp, uint count)
  12. {
  13. if (count == 0) return;
  14. ulong* ptr = (ulong*)Unsafe.AsPointer(ref fxp);
  15. double pow = (2 << (dxpinfo.wordLength - dxpinfo.integerWordLength - 1));
  16. double* valptr = (double*)Unsafe.AsPointer(ref value);
  17. for (int i = 0; i < count; i++)
  18. {
  19. ptr[i] = (ulong)(valptr[i] * pow);
  20. }
  21. }
  22. public unsafe void FloatConvertToDxp(ref float value, NiFpga_FxpTypeInfo dxpinfo, ref ulong fxp, uint count)
  23. {
  24. if (count == 0) return;
  25. ulong* ptr = (ulong*)Unsafe.AsPointer(ref fxp);
  26. float pow = (2 << (dxpinfo.wordLength - dxpinfo.integerWordLength - 1));
  27. float* valptr = (float*)Unsafe.AsPointer(ref value);
  28. for (int i = 0; i < count; i++)
  29. {
  30. ptr[i] = (ulong)(valptr[i] * pow);
  31. }
  32. }
  33. public unsafe void FxpConvertToDouble(ref ulong fxp, NiFpga_FxpTypeInfo dxpinfo, ref double value, uint count)
  34. {
  35. double* ptr = (double*)Unsafe.AsPointer(ref value);
  36. double pow = (2 << (dxpinfo.wordLength - dxpinfo.integerWordLength - 1));
  37. ulong* fxpptr = (ulong*)Unsafe.AsPointer(ref fxp);
  38. if (count > 0)
  39. {
  40. for (int i = 0; i < count; i++)
  41. {
  42. ptr[i] = (dxpinfo.isSigned ? ((long)(fxpptr[i])) : fxpptr[i]) / pow;
  43. }
  44. }
  45. }
  46. public unsafe void FxpConvertToFloat(ref ulong fxp, NiFpga_FxpTypeInfo dxpinfo, ref float value, uint count)
  47. {
  48. float* ptr = (float*)Unsafe.AsPointer(ref value);
  49. float pow = (2 << (dxpinfo.wordLength - dxpinfo.integerWordLength - 1));
  50. ulong* fxpptr = (ulong*)Unsafe.AsPointer(ref fxp);
  51. if (count > 0)
  52. {
  53. for (int i = 0; i < count; i++)
  54. {
  55. ptr[i] = (dxpinfo.isSigned ? ((long)(fxpptr[i])) : fxpptr[i]) / pow;
  56. }
  57. }
  58. }
  59. }
  60. }