22b1d7f35e9be56bd69465f7e2a51da3b909cd28
1 # IEEE Floating Point Adder (Single Precision)
2 # Copyright (C) Jonathan P Dawson 2013
5 from nmigen
import Module
, Signal
, Mux
7 from nmutil
.pipemodbase
import PipeModBase
8 from ieee754
.fpcommon
.fpbase
import FPNumBaseRecord
, FPRoundingMode
9 from ieee754
.fpcommon
.getop
import FPPipeContext
10 from ieee754
.fpcommon
.postnormalise
import FPNorm1Data
15 def __init__(self
, pspec
):
17 self
.z
= FPNumBaseRecord(width
, False, name
="z")
18 self
.ctx
= FPPipeContext(pspec
)
19 self
.muxid
= self
.ctx
.muxid
20 # pipeline bypass [data comes from specialcases]
21 self
.out_do_z
= Signal(reset_less
=True)
22 self
.oz
= Signal(width
, reset_less
=True)
24 self
.rm
= Signal(FPRoundingMode
, reset
=FPRoundingMode
.DEFAULT
)
28 ret
= [self
.z
.eq(i
.z
), self
.out_do_z
.eq(i
.out_do_z
), self
.oz
.eq(i
.oz
),
29 self
.ctx
.eq(i
.ctx
), self
.rm
.eq(i
.rm
)]
33 class FPRoundMod(PipeModBase
):
35 def __init__(self
, pspec
):
36 super().__init
__(pspec
, "roundz")
39 return FPNorm1Data(self
.pspec
)
42 return FPRoundData(self
.pspec
)
44 def elaborate(self
, platform
):
48 comb
+= self
.o
.eq(self
.i
) # copies muxid, z, out_do_z
51 msb1s
= Signal(reset_less
=True)
52 comb
+= msb1s
.eq(self
.i
.z
.m
.all()) # all 1s
53 comb
+= self
.o
.z
.m
.eq(Mux(self
.i
.roundz
, im
+1, im
)) # mantissa up
54 comb
+= self
.o
.z
.e
.eq(Mux(msb1s
& self
.i
.roundz
, ie
+ 1, ie
)) # exp up