ffa_ch9_exodus.kv 1
ffa_ch9_exodus.kv 2
ffa_ch9_exodus.kv 3
ffa_ch9_exodus.kv 4
ffa_ch9_exodus.kv 5
ffa_ch9_exodus.kv 6
ffa_ch9_exodus.kv 7
ffa_ch9_exodus.kv 8
ffa_ch9_exodus.kv 9
ffa_ch9_exodus.kv 10
ffa_ch9_exodus.kv 11
ffa_ch9_exodus.kv 12
ffa_ch9_exodus.kv 13
ffa_ch9_exodus.kv 14
ffa_ch9_exodus.kv 15
ffa_ch9_exodus.kv 16
ffa_ch9_exodus.kv 17
ffa_ch9_exodus.kv 18
ffa_ch9_exodus.kv 19
ffa_ch9_exodus.kv 20 with W_Shifts; use W_Shifts;
ffa_ch9_exodus.kv 21
ffa_ch9_exodus.kv 22
ffa_ch9_exodus.kv 23 package body W_Mul is
ffa_ch9_exodus.kv 24
ffa_ch10_karatsub... 25 function Mul_HalfWord_Iron(X : in HalfWord;
ffa_ch10_karatsub... 26 Y : in HalfWord) return Word is
ffa_ch10_karatsub... 27 begin
ffa_ch10_karatsub... 28 return X * Y;
ffa_ch10_karatsub... 29 end Mul_HalfWord_Iron;
ffa_ch10_karatsub... 30 pragma Inline_Always(Mul_HalfWord_Iron);
ffa_ch10_karatsub... 31
ffa_ch10_karatsub... 32
ffa_ch9_exodus.kv 33
ffa_ch10_karatsub... 34 function Mul_HalfWord_Soft(X : in HalfWord; Y : in HalfWord) return Word is
ffa_ch9_exodus.kv 35
ffa_ch9_exodus.kv 36
ffa_ch9_exodus.kv 37 XS : Word := X;
ffa_ch9_exodus.kv 38
ffa_ch9_exodus.kv 39
ffa_ch9_exodus.kv 40 YS : Word := Y;
ffa_ch9_exodus.kv 41
ffa_ch9_exodus.kv 42
ffa_ch9_exodus.kv 43 GM : Word;
ffa_ch9_exodus.kv 44
ffa_ch9_exodus.kv 45
ffa_ch9_exodus.kv 46 XY : Word := 0;
ffa_ch9_exodus.kv 47
ffa_ch9_exodus.kv 48
ffa_ch9_exodus.kv 49 procedure Bit is
ffa_ch9_exodus.kv 50 begin
ffa_ch9_exodus.kv 51
ffa_ch9_exodus.kv 52
ffa_ch9_exodus.kv 53 GM := 0 - (YS and 1);
ffa_ch9_exodus.kv 54
ffa_ch9_exodus.kv 55
ffa_ch9_exodus.kv 56 XY := XY + (XS and GM);
ffa_ch9_exodus.kv 57
ffa_ch9_exodus.kv 58
ffa_ch9_exodus.kv 59 YS := Shift_Right(YS, 1);
ffa_ch9_exodus.kv 60
ffa_ch9_exodus.kv 61
ffa_ch9_exodus.kv 62 XS := Shift_Left(XS, 1);
ffa_ch9_exodus.kv 63
ffa_ch9_exodus.kv 64 end Bit;
ffa_ch9_exodus.kv 65 pragma Inline_Always(Bit);
ffa_ch9_exodus.kv 66
ffa_ch9_exodus.kv 67 begin
ffa_ch9_exodus.kv 68
ffa_ch9_exodus.kv 69
ffa_ch9_exodus.kv 70 for b in 1 .. HalfByteness loop
ffa_ch9_exodus.kv 71
ffa_ch9_exodus.kv 72 Bit; Bit; Bit; Bit; Bit; Bit; Bit; Bit;
ffa_ch9_exodus.kv 73
ffa_ch9_exodus.kv 74 end loop;
ffa_ch9_exodus.kv 75
ffa_ch9_exodus.kv 76
ffa_ch9_exodus.kv 77 return XY;
ffa_ch9_exodus.kv 78
ffa_ch10_karatsub... 79 end Mul_HalfWord_Soft;
ffa_ch10_karatsub... 80 pragma Inline_Always(Mul_HalfWord_Soft);
ffa_ch9_exodus.kv 81
ffa_ch9_exodus.kv 82
ffa_ch9_exodus.kv 83
ffa_ch9_exodus.kv 84 function BottomHW(W : in Word) return HalfWord is
ffa_ch9_exodus.kv 85 begin
ffa_ch9_exodus.kv 86 return W and (2**HalfBitness - 1);
ffa_ch9_exodus.kv 87 end BottomHW;
ffa_ch9_exodus.kv 88 pragma Inline_Always(BottomHW);
ffa_ch9_exodus.kv 89
ffa_ch9_exodus.kv 90
ffa_ch9_exodus.kv 91
ffa_ch9_exodus.kv 92 function TopHW(W : in Word) return HalfWord is
ffa_ch9_exodus.kv 93 begin
ffa_ch9_exodus.kv 94 return Shift_Right(W, HalfBitness);
ffa_ch9_exodus.kv 95 end TopHW;
ffa_ch9_exodus.kv 96 pragma Inline_Always(TopHW);
ffa_ch9_exodus.kv 97
ffa_ch9_exodus.kv 98
ffa_ch9_exodus.kv 99
ffa_ch9_exodus.kv 100 procedure Mul_Word(X : in Word;
ffa_ch9_exodus.kv 101 Y : in Word;
ffa_ch9_exodus.kv 102 XY_LW : out Word;
ffa_ch9_exodus.kv 103 XY_HW : out Word) is
ffa_ch9_exodus.kv 104
ffa_ch9_exodus.kv 105
ffa_ch9_exodus.kv 106 XL : constant HalfWord := BottomHW(X);
ffa_ch9_exodus.kv 107
ffa_ch9_exodus.kv 108
ffa_ch9_exodus.kv 109 XH : constant HalfWord := TopHW(X);
ffa_ch9_exodus.kv 110
ffa_ch9_exodus.kv 111
ffa_ch9_exodus.kv 112 YL : constant HalfWord := BottomHW(Y);
ffa_ch9_exodus.kv 113
ffa_ch9_exodus.kv 114
ffa_ch9_exodus.kv 115 YH : constant HalfWord := TopHW(Y);
ffa_ch9_exodus.kv 116
ffa_ch9_exodus.kv 117
ffa_ch10_karatsub... 118 LL : constant Word := Mul_HalfWord_Iron(XL, YL);
ffa_ch9_exodus.kv 119
ffa_ch9_exodus.kv 120
ffa_ch10_karatsub... 121 LH : constant Word := Mul_HalfWord_Iron(XL, YH);
ffa_ch9_exodus.kv 122
ffa_ch9_exodus.kv 123
ffa_ch10_karatsub... 124 HL : constant Word := Mul_HalfWord_Iron(XH, YL);
ffa_ch9_exodus.kv 125
ffa_ch9_exodus.kv 126
ffa_ch10_karatsub... 127 HH : constant Word := Mul_HalfWord_Iron(XH, YH);
ffa_ch9_exodus.kv 128
ffa_ch9_exodus.kv 129
ffa_ch9_exodus.kv 130 CL : constant Word := TopHW(TopHW(LL) + BottomHW(LH) + BottomHW(HL));
ffa_ch9_exodus.kv 131
ffa_ch9_exodus.kv 132 begin
ffa_ch9_exodus.kv 133
ffa_ch9_exodus.kv 134
ffa_ch9_exodus.kv 135 XY_LW := LL + Shift_Left(LH + HL, HalfBitness);
ffa_ch9_exodus.kv 136
ffa_ch9_exodus.kv 137
ffa_ch9_exodus.kv 138 XY_HW := HH + TopHW(HL) + TopHW(LH) + CL;
ffa_ch9_exodus.kv 139
ffa_ch9_exodus.kv 140 end Mul_Word;
ffa_ch9_exodus.kv 141 pragma Inline_Always(Mul_Word);
ffa_ch9_exodus.kv 142
ffa_ch9_exodus.kv 143 end W_Mul;