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

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. function Vector#(psz, a) shrinkVec (Vector#(sz, a) inVec,
  28.     Bit#(idx_sz) sel)
  29.   provisos (Bits#(a, asz),
  30.     Add#(pszM1,1,psz), 
  31.     Add#(pszM1,sz,nsz),
  32.     Div#(nsz,psz,noStages),
  33.     Log#(noStages,idx_sz),
  34.     Mul#(noStages,psz,total_sz),
  35.     Add#(sz,ext_sz,total_sz),
  36.     Bits#(Vector#(total_sz,a),xxA),
  37.     Bits#(Vector#(noStages,Vector#(psz,a)),xxA));
  38.       
  39.       Vector#(ext_sz, a) extVec = newVector;
  40.       Vector#(total_sz, a) appendVec = append(inVec, extVec);
  41.       Vector#(noStages, Vector#(psz, a)) outVecs = unpack(pack(appendVec));
  42.       return outVecs[sel];
  43.       
  44. endfunction
  45. function Vector#(sz, a) expandVec (Vector#(sz,a) inVec1,
  46.    Vector#(psz, a) inVec2,
  47.    Bit#(idx_sz) sel)
  48.   provisos (Bits#(a, asz),
  49.     Add#(pszM1,1,psz), 
  50.     Add#(pszM1,sz,nsz),
  51.     Div#(nsz,psz,noStages),
  52.     Log#(noStages,idx_sz),
  53.     Mul#(noStages,psz,total_sz),
  54.     Add#(sz,ext_sz,total_sz),
  55.     Bits#(Vector#(total_sz,a),xxA),
  56.     Bits#(Vector#(noStages,Vector#(psz,a)),xxA));
  57.       
  58.       Vector#(ext_sz, a) extVec = newVector;
  59.       Vector#(total_sz, a) appendVec = append(inVec1, extVec);
  60.       Vector#(noStages, Vector#(psz, a)) outVecs = unpack(pack(appendVec));
  61.       outVecs[sel] = inVec2;
  62.       appendVec = unpack(pack(outVecs));
  63.       return take(appendVec); // drop tails
  64.       
  65. endfunction
  66. // pack 2D vector into 1D vector in row major order
  67. function Vector#(o_sz,a) packVec(Vector#(r_sz,Vector#(c_sz,a)) inVec)
  68.    provisos (Mul#(r_sz,c_sz,o_sz));
  69.    Integer rSz = valueOf(r_sz);
  70.    Integer cSz = valueOf(c_sz);
  71.    Integer k = 0;
  72.    Vector#(o_sz,a) outVec = newVector;
  73.    for(Integer i = 0; i < rSz; i = i + 1)
  74.       for(Integer j = 0; j < cSz; j = j + 1)
  75.  begin
  76.     outVec[k] = inVec[i][j];
  77.     k = k + 1;
  78.  end
  79.    return outVec;
  80. endfunction
  81. // unpack 1D vector to 2D vector assuming 1D vector is row major
  82. function Vector#(r_sz,Vector#(c_sz,a)) unpackVec(Vector#(i_sz,a) inVec)
  83.    provisos (Mul#(r_sz,c_sz,i_sz));
  84.    Integer rSz = valueOf(r_sz);
  85.    Integer cSz = valueOf(c_sz);
  86.    Integer k = 0;
  87.    Vector#(r_sz,Vector#(c_sz,a)) outVec = newVector;
  88.    Vector#(c_sz,a) tempVec = newVector;
  89.    for(Integer i = 0; i < rSz; i = i + 1)
  90.       begin
  91.  for(Integer j = 0; j < cSz; j = j + 1)
  92.     begin
  93.        tempVec[j] = inVec[k];
  94.        k = k + 1;
  95.     end
  96.  outVec[i] = tempVec;
  97.       end
  98.    return outVec;
  99. endfunction
  100.