ComplexF.bsv
上传用户:aoptech
上传日期:2014-09-22
资源大小:784k
文件大小:5k
源码类别:

3G开发

开发平台:

Others

  1. // The MIT License
  2. //
  3. // Copyright (c) 2006 Nirav Dave (ndave@csail.mit.edu)
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. typedef struct{
  23.   Bit#(n) i;
  24.   Bit#(n) q;
  25. }
  26.  ComplexF#(numeric type n) deriving(Eq, Bits);
  27. function Int#(n)  toInt(Bit#(n) x)= unpack(x);
  28. function Bit#(n) toBit(Int#(n) x)= pack(x);
  29. instance Literal#(ComplexF#(n));
  30.   function ComplexF#(n) fromInteger(Integer x);
  31.     return error("Can't use Literal");
  32.   endfunction
  33. endinstance
  34. instance Bounded#(ComplexF#(n));
  35.   function ComplexF#(n) minBound();
  36.     Int#(n) mb = minBound;
  37.     return ComplexF{i: pack(mb),q: pack(mb)};
  38.   endfunction
  39.   function ComplexF#(n) maxBound();
  40.     Int#(n) mb = maxBound;
  41.     return ComplexF{i: pack(mb),q: pack(mb)};
  42.   endfunction
  43. endinstance
  44. instance BitExtend#(n,m, ComplexF) provisos(Add#(k,n,m));
  45.      function ComplexF#(m) zeroExtend(ComplexF#(n) x);
  46.        return ComplexF{
  47.                 i: zeroExtend(x.i),
  48.                 q: zeroExtend(x.q)                 
  49.               };
  50.      endfunction
  51.      function ComplexF#(m) signExtend(ComplexF#(n) x);
  52.        return ComplexF{
  53.                 i: signExtend(x.i),
  54.                 q: signExtend(x.q)                 
  55.               };
  56.      endfunction
  57.      function ComplexF#(n) truncate(ComplexF#(m) x);
  58.        Nat rmax = fromInteger(valueOf(m) -1);
  59.        Nat rmin = fromInteger(valueOf(m) - valueOf(n));
  60.        return ComplexF{
  61.                 i: x.i[rmax:rmin],
  62.                 q: x.q[rmax:rmin]                 
  63.               };
  64.      endfunction
  65. endinstance
  66.    
  67. function Bit#(n) complex_add(Bit#(n) x, Bit#(n) y) provisos(Add#(1,k,n), Add#(1,n, TAdd#(1,n)));
  68.   Nat              si = fromInteger(valueOf(n) - 1);
  69.   Nat          si_p_1 = fromInteger(valueOf(n));
  70.   Bit#(1)          sx = pack(x)[si];
  71.   Bit#(1)          sy = pack(y)[si];
  72.   Int#(TAdd#(1,n)) ix = unpack({sx,x});
  73.   Int#(TAdd#(1,n)) iy = unpack({sy,y});
  74.   Int#(TAdd#(1,n)) ir = ix + iy + 1;
  75.   Bit#(n)         res = (pack(ir))[si_p_1:1];
  76. return  res;
  77. endfunction
  78. function Bit#(n) complex_sub(Bit#(n) x, Bit#(n) y) provisos(Add#(1,k,n), Add#(1,n, TAdd#(1,n)));
  79.   Nat              si = fromInteger(valueOf(n) - 1);
  80.   Nat          si_p_1 = fromInteger(valueOf(n));
  81.   Bit#(1)          sx = pack(x)[si];
  82.   Bit#(1)          sy = pack(y)[si];
  83.   Int#(TAdd#(1,n)) ix = unpack({sx,x});
  84.   Int#(TAdd#(1,n)) iy = unpack({sy,y});
  85.   Int#(TAdd#(1,n)) ir = ix - iy + 1;
  86.   Bit#(n)         res = (pack(ir))[si_p_1:1];
  87.   return  res;
  88. endfunction
  89.    
  90.    
  91. function Bit#(n) complex_mult(Bit#(n) x, Bit#(n) y) provisos(Add#(k,n,TAdd#(n,n)));
  92.   Nat                si = fromInteger(valueOf(n) - 1) ; 
  93.   Nat               si2 = fromInteger(2*(valueOf(n) - 1));
  94.   Nat              si_1 = fromInteger(valueOf(n) - 2); // 14 for 16
  95.   Bit#(TAdd#(n,n)) half = 1 << (si_1);
  96.   Int#(TAdd#(n,n)) ix = unpack(signExtend(x));
  97.   Int#(TAdd#(n,n)) iy = unpack(signExtend(y));
  98.   Bit#(TAdd#(n,n)) t1 = pack(ix*iy);
  99.   Bit#(TAdd#(n,n)) t2 = t1 + half;
  100.   Bit#(n)          t3 = t2[si2:si];
  101.   Int#(n)         it3 = unpack(t3);
  102.   Bit#(n)         res = pack((it3 == minBound) ? maxBound : it3);
  103.   return  res;
  104. endfunction
  105. instance Arith#(ComplexF#(n)) provisos(Add#(1,k,n), Add#(k2,n,TAdd#(n,n)), Add#(1,n,TAdd#(1,n)));
  106.   function ComplexF#(n) + (ComplexF#(n) x, ComplexF#(n) y);
  107.      return ComplexF{
  108.               i: complex_add(x.i, y.i),
  109.               q: complex_add(x.q, y.q)
  110.              };
  111.   endfunction     
  112.   function ComplexF#(n) - (ComplexF#(n) x, ComplexF#(n) y);
  113.      return ComplexF{
  114.               i: complex_sub(x.i, y.i),
  115.               q: complex_sub(x.q, y.q)
  116.              };
  117.   endfunction
  118.   function ComplexF#(n) * (ComplexF#(n) x, ComplexF#(n) y) provisos(Add#(k2,n,TAdd#(n,n)));
  119.     Bit#(n) ii = complex_mult(x.i, y.i);
  120.     Bit#(n) qq = complex_mult(x.q, y.q);
  121.     Bit#(n) iq = complex_mult(x.i, y.q);
  122.     Bit#(n) qi = complex_mult(x.q, y.i);
  123.     return ComplexF{
  124.              i: complex_add(ii, qq),
  125.              q: complex_sub(qi, iq)
  126.             };
  127.   endfunction
  128.   
  129.   function ComplexF#(n) negate (ComplexF#(n) x);
  130.     return ComplexF{
  131.               i: negate(x.i),
  132.               q: negate(x.q)
  133.             };
  134.   endfunction
  135. endinstance