FPAdder.Lola.txt 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. MODULE FPAdder( (*NW 28.9.2015*)
  2. IN clk, run, u, v: BIT; x, y: WORD;
  3. OUT stall: BIT; z: WORD);
  4. REG (clk) State: [2] BIT;
  5. x3, y3, t3: [25] BIT;
  6. Sum: [27] BIT;
  7. VAR xs, ys: BIT; (*signs*)
  8. xe, ye: [9] BIT; (*exponents*)
  9. xm, ym: [25] BIT; (*mantissas*)
  10. dx, dy, e0, e1: [9] BIT;
  11. sx, sy: [9] BIT; (*shift counts*)
  12. sx0, sx1, sy0, sy1: [2] BIT;
  13. sxh, syh: BIT;
  14. x0, x1,x2, y0, y1, y2: [25] BIT;
  15. s: [27] BIT;
  16. z24, z22, z20, z18, z16, z14, z12, z10, z8, z6, z4, z2: BIT;
  17. sc: [5] BIT; (*shift count*)
  18. sc0, sc1: [2] BIT;
  19. t1, t2: [25] BIT;
  20. BEGIN (*unpack*)
  21. xs := x.31;
  22. xe := u -> 150'9 : {0'1, x[30:23]};
  23. xm := {(~u | x.23), x[22:0], 0'1};
  24. ys := y.31;
  25. ye := {0'1, y[30:23]};
  26. ym := {(~u & ~v), y[22:0], 0'1};
  27. dx := xe - ye; dy := ye - xe;
  28. e0 := dx.8 -> ye : xe;
  29. sx := dy.8 -> 0 : dy; sy := dx.8 -> 0 : dx;
  30. sx0 := sx[1:0]; sx1 := sx[3:2];
  31. sy0 := sy[1:0]; sy1 := sy[3:2];
  32. sxh := sx.7 | sx.6 | sx.5; syh := sy.7 | sy.6 | sy.5;
  33. (*denormalize; right shift*)
  34. x0 := (xs & ~u) -> -xm : xm;
  35. x1 := (sx0 = 3) -> {xs!3, x0[24:3]} :
  36. (sx0 = 2) -> {xs!2, x0[24:2]} :
  37. (sx0 = 1) -> {xs, x0[24:1]} : x0;
  38. x2 := (sx1 = 3) -> {xs!12, x1[24:12]} :
  39. (sx1 = 2) -> {xs!8, x1[24:8]} :
  40. (sx1 = 1) -> {xs!4, x1[24:4]} : x1;
  41. x3 := sxh -> {xs!25} : sx.4 -> {xs!16, x2[24:16]} : x2;
  42. y0 := (ys & ~u) -> -ym : ym;
  43. y1 := (sy0 = 3) -> {ys!3, y0[24:3]} :
  44. (sy0 = 2) -> {ys!2, y0[24:2]} :
  45. (sy0 = 1) -> {ys, y0[24:1]} : y0;
  46. y2 := (sy1 = 3) -> {ys!12, y1[24:12]} :
  47. (sy1 = 2) -> {ys!8, y1[24:8]} :
  48. (sy1 = 1) -> {ys!4, y1[24:4]} : y1;
  49. y3 := syh -> {ys!25} : (sy.4 -> {ys!16, y2[24:16]} : y2);
  50. (*addition*)
  51. Sum := {xs, xs, x3} + {ys, ys, y3}; s := (Sum.26 -> -Sum : Sum) + 1; (*round*)
  52. (*post-normalize, shift left; sc = shift count*)
  53. z24 := ~s.25 & ~s.24;
  54. z22 := z24 & ~s.23 & ~s.22;
  55. z20 := z22 & ~s.21 & ~s.20;
  56. z18 := z20 & ~s.19 & ~s.18;
  57. z16 := z18 & ~s.17 & ~s.16;
  58. z14 := z16 & ~s.15 & ~s.14;
  59. z12 := z14 & ~s.13 & ~s.12;
  60. z10 := z12 & ~s.11 & ~s.10;
  61. z8 := z10 & ~s.9 & ~s.8;
  62. z6 := z8 & ~s.7 & ~s.6;
  63. z4 := z6 & ~s.5 & ~s.4;
  64. z2 := z4 & ~s.3 & ~s.2;
  65. sc := {z10,
  66. z18 & (s.17 | s.16 | s.15 | s.14 | s.13 | s.12 | s.11 | s.10) | z2,
  67. z22 & (s.21 | s.20 | s.19 | s.18) | z14 & (s.13 | s.12 | s.11 | s.10) | z6 & (s.5 | s.4 | s.3 | s.2),
  68. z24 & (s.23 | s.22) | z20 & (s.19 | s.18) | z16 & (s.15 | s.14) | z12 & (s.11 | s.10) | z8 & (s.7 | s.6) | z4 & (s.3 | s.2),
  69. ~s.25 & s.24 | z24 & ~s.23 & s.22 | z24 & ~s.23 & s.22 | z22 & ~s.21 & s.20 | z20 & ~s.19 & s.18 | z18 & ~s.17 & s.16 |
  70. z16 & ~s.15 & s.14 | z14 & ~s.13 & s.12 | z12 & ~s.11 & s.10 | z10 & ~s.9 & s.8 | z8 & ~s.7 & s.6 | z6 & ~s.5 & s.4 | z4 & ~s.3 & s.2};
  71. e1 := e0 - {0'4, sc} + 1;
  72. sc0 := sc[1:0]; sc1 := sc[3:2];
  73. t1 := (sc0 = 3) -> {s[22:1], 0'3} :
  74. (sc0 = 2) -> {s[23:1], 0'2} :
  75. (sc0 = 1) -> {s[24:1], 0'1} : s[25:1];
  76. t2 := (sc1 = 3) -> {t1[12:0], 0'12} :
  77. (sc1 = 2) -> {t1[16:0], 0'8} :
  78. (sc1 = 1) -> {t1[20:0], 0'4} : t1;
  79. t3 := sc.4 -> {t2[8:0], 0'16} : t2;
  80. stall := run & (State # 3);
  81. State := run -> State+1 : 0;
  82. z := v -> {Sum.26 ! 7, Sum[25:1]} : (*FLOOR*)
  83. x[30:0] = 0 -> (~u -> y : 0) :
  84. y[30:0] = 0 -> x :
  85. (t3 = 0) | e1.8 -> 0 : {Sum.26, e1[7:0], t3[23:1]}
  86. END FPAdder.