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

3G开发

开发平台:

Others

  1. //----------------------------------------------------------------------//
  2. // The MIT License 
  3. // 
  4. // Copyright (c) 2007 Alfred Man Cheuk Ng, mcn02@mit.edu 
  5. // 
  6. // Permission is hereby granted, free of charge, to any person 
  7. // obtaining a copy of this software and associated documentation 
  8. // files (the "Software"), to deal in the Software without 
  9. // restriction, including without limitation the rights to use,
  10. // copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. // copies of the Software, and to permit persons to whom the
  12. // Software is furnished to do so, subject to the following conditions:
  13. // 
  14. // The above copyright notice and this permission notice shall be
  15. // included in all copies or substantial portions of the Software.
  16. // 
  17. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  19. // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  20. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  21. // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  22. // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  23. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  24. // OTHER DEALINGS IN THE SOFTWARE.
  25. //----------------------------------------------------------------------//
  26. import Vector::*;
  27. import FPComplex::*;
  28. import Complex::*;
  29. import FixedPoint::*;
  30. import GetPut::*;
  31. import Connectable::*;
  32. //Given a Bit#(n) returns it's parity
  33. function Bit#(1) getParity(Bit#(n) v) provisos(Add#(1, k, n));
  34.   function Bit#(1) _xor(Bit#(1) x, Bit#(1) y);
  35.     return (x ^ y);
  36.   endfunction
  37.   Vector#(n,Bit#(1)) vv = unpack(v);
  38.   Bit#(1) parity = Vector::fold(_xor, vv);
  39.   return(parity);
  40. endfunction
  41. // reverse the bits
  42. function Bit#(n) reverseBits(Bit#(n) x);
  43.   Vector#(n, Bit#(1)) vx  = unpack(x);
  44.   Vector#(n, Bit#(1)) rvx = Vector::reverse(vx);
  45.   Bit#(n)            prvx = pack(rvx);
  46.   return(prvx);
  47. endfunction
  48. // right shift no of bits (the amount of shifting is the first arg
  49. function Bit#(n) rightShiftBy(Nat shiftSz, Bit#(n) x);
  50.   return x >> shiftSz;
  51. endfunction // Bits
  52. // left shift no of bits (the amount of shifting is the first arg
  53. function Bit#(n) leftShiftBy(Nat shiftSz, Bit#(n) x);
  54.   return x << shiftSz;
  55. endfunction // Bits
  56. // return the top (i.e. sign) bit
  57. function Bit#(1) signBit(Bit#(n) x) provisos(Add#(1,k,n));
  58.   match {.signbit,.rest} = split(x);
  59.   return(signbit); 
  60. endfunction
  61. // performs zipwith with 4 vectors
  62. function Vector#(sz, any_e) zipWith4(function any_e f(any_a a, any_b b, any_c c, any_d d),
  63.                     Vector#(sz, any_a) va, Vector#(sz, any_b) vb,
  64. Vector#(sz, any_c) vc, Vector#(sz, any_d) vd);
  65.   Vector#(sz, any_e) ve = replicate(?);
  66.   for(Integer i = 0; i < valueOf(sz); i = i + 1)
  67.   ve[i] = f(va[i],vb[i],vc[i],vd[i]);
  68.   return(ve);
  69. endfunction
  70.   
  71.   
  72. //break up a value
  73. function Vector#(n, Bit#(m)) bitBreak(Bit#(nm) x) provisos(Mul#(n,m,nm));
  74.   return unpack(x);
  75. endfunction
  76.   
  77. //merge a value back together
  78. function Bit#(nm) bitMerge(Vector#(n, Bit#(m)) x) provisos(Mul#(n,m,nm));
  79.   return pack(x);
  80. endfunction
  81.   
  82. //drop values from the left  
  83. function Vector#(n, alpha) sv_truncate(Vector#(m, alpha) in) provisos(Add#(n,k,m));
  84.    Vector#(n, alpha) retval = newVector();
  85.    for(Integer i = valueOf(n) - 1, Integer j = valueOf(m) - 1;  i >= 0; i = i - 1, j = j - 1)
  86.       begin
  87.  retval[i] = in[j];
  88.       end
  89.        
  90.    return (retval);
  91. endfunction
  92.   
  93.   //drop values from the right
  94. function Vector#(n, alpha) sv_rtruncate(Vector#(m, alpha) in) provisos(Add#(k,n,m));
  95.    Vector#(n, alpha) retval = newVector();
  96.    for(Integer i = 0; i < valueOf(n); i = i + 1)
  97.       begin
  98.  retval[i] = in[i];
  99.       end
  100.    return (retval);
  101. endfunction
  102. function FPComplex#(b,sz) mapBPSK(Bool negateInput, Bit#(1) data) provisos(Literal#(FixedPoint#(b,sz)), Add#(1,x,b));
  103.    data = negateInput ? ~data : data;
  104.    return Complex{rel: (data[0] == 1)? 1 : -1,
  105.   img: 0};
  106. endfunction
  107. function FPComplex#(b,sz) mapQPSK(Bool negateInput, Bit#(2) data) provisos(Literal#(FixedPoint#(b,sz)), Add#(1,x,b));
  108.    data = negateInput ? ~data : data;
  109.    return Complex{
  110.            rel: (data[0] == 1)? fromRational(100000000000,141421356237) : fromRational(-100000000000,141421356237),
  111.            img: (data[1] == 1)? fromRational(100000000000,141421356237) : fromRational(-100000000000,141421356237)
  112.       };
  113. endfunction
  114. function FPComplex#(b,sz) mapQAM_16(Bool negateInput, Bit#(4) data) provisos(Literal#(FixedPoint#(b,sz)), Add#(1,x,b));
  115.     function f(x);
  116.         case (x) matches
  117.             2'b00: return fromRational(-300000000000,316227766017);
  118.             2'b01: return fromRational(-100000000000,316227766017);
  119.             2'b10: return fromRational(300000000000,316227766017);
  120.             2'b11: return fromRational(100000000000,316227766017);
  121.         endcase
  122.     endfunction
  123.     data = negateInput ? ~data : data;
  124.     return Complex{
  125.         rel: f({data[0],data[1]}),
  126.         img: f({data[2],data[3]})
  127.     };
  128. endfunction
  129.    
  130. function FPComplex#(b,sz) mapQAM_64(Bool negateInput, Bit#(6) data) provisos(Literal#(FixedPoint#(b,sz)), Add#(1,x,b));
  131.     function f(x);
  132.         case (x) matches
  133.             3'b000: return fromRational(-700000000000,648074069841);
  134.             3'b001: return fromRational(-500000000000,648074069841);
  135.             3'b011: return fromRational(-300000000000,648074069841);
  136.             3'b010: return fromRational(-100000000000,648074069841);
  137.             3'b110: return fromRational(100000000000,648074069841);
  138.             3'b111: return fromRational(300000000000,648074069841);
  139.             3'b101: return fromRational(500000000000,648074069841);
  140.             3'b100: return fromRational(700000000000,648074069841);
  141.         endcase
  142.     endfunction
  143.     data = negateInput ? ~data : data;
  144.     return Complex{
  145.         rel: f({data[0],data[1],data[2]}),
  146.         img: f({data[3],data[4],data[5]})
  147.     };
  148. endfunction
  149.    
  150.    
  151. // a function to add CP
  152. function Vector#(o_sz, t) addCP(Vector#(i_sz, t) inVec)
  153.    provisos (Add#(diff_sz,i_sz,o_sz),
  154.      Add#(xxA,diff_sz,i_sz));
  155.    Vector#(diff_sz,t) cp = takeTail(inVec);
  156.    return append(cp,inVec);
  157. endfunction
  158.    
  159. // a function that generates xors feedback according to mask
  160. function Bit#(1) genXORFeedback(Bit#(n) mask, Bit#(n) inData)
  161.    provisos (Add#(1,xxA,n));   
  162.    Bit#(1) res = 0;
  163.    for (Integer i = 0; i < valueOf(n); i = i + 1)
  164.       if (mask[i] == 1)
  165.  res = res ^ inData[i];
  166.    return res;
  167. endfunction   
  168.    
  169. // similar to map, but the function take 2 vec arguements
  170. function Vector#(sz,c) map2(function c f(a x, b y),
  171.     Vector#(sz,a) xs,
  172.     Vector#(sz,b) ys);
  173.    
  174.    function c fTup(Tuple2#(a,b) tup);
  175.       return f(tpl_1(tup),tpl_2(tup));
  176.    endfunction
  177.        
  178.    let tupVec = zip(xs,ys);
  179.    return map(fTup,tupVec);
  180. endfunction
  181.    
  182. // similar to map, but the function take 3 vec arguements
  183. function Vector#(sz,d) map3(function d f(a x, b y, c z),
  184.     Vector#(sz,a) xs,
  185.     Vector#(sz,b) ys,
  186.     Vector#(sz,c) zs);
  187.    
  188.    function d fTup(Tuple3#(a,b,c) tup);
  189.       return f(tpl_1(tup),tpl_2(tup),tpl_3(tup));
  190.    endfunction
  191.        
  192.    let tupVec = zip3(xs,ys,zs);
  193.    return map(fTup,tupVec);
  194. endfunction
  195. // similar to foldl, but the function take 2 vec arguements
  196.    function a foldl2(function a f(a x, b y, c z),
  197.      a x_fst,
  198.      Vector#(sz,b) ys,
  199.      Vector#(sz,c) zs);
  200.    
  201.    function a fTup(a x, Tuple2#(b,c) tup);
  202.       return f(x,tpl_1(tup),tpl_2(tup));
  203.    endfunction
  204.        
  205.    let tupVec = zip(ys,zs);
  206.    return foldl(fTup,x_fst,tupVec);
  207. endfunction
  208.    
  209. // print data of connection   
  210. module mkConnectionPrint#(String str, Get#(t) g, Put#(t) p) (Empty)
  211.    provisos (Bits#(t,t_sz));
  212.    rule connect(True);
  213.       let mesg <- g.get;
  214.       p.put(mesg);
  215.       $display("%s: %h",str,mesg);
  216.    endrule
  217. endmodule