1 # IEEE Floating Point Adder (Single Precision)
2 # Copyright (C) Jonathan P Dawson 2013
5 from nmigen
import Module
, Signal
6 from nmigen
.cli
import main
, verilog
9 from nmutil
.pipemodbase
import PipeModBase
10 from ieee754
.fpcommon
.fpbase
import FPNumBaseRecord
11 from ieee754
.fpcommon
.fpbase
import FPNumBase
12 from ieee754
.fpcommon
.getop
import FPPipeContext
13 from ieee754
.fpcommon
.pscdata
import FPSCData
16 class FPAddDeNormMod(PipeModBase
):
18 def __init__(self
, pspec
, m_extra
):
19 self
.m_extra
= m_extra
20 super().__init
__(pspec
, "denormalise")
23 return FPSCData(self
.pspec
, self
.m_extra
)
26 return FPSCData(self
.pspec
, self
.m_extra
)
28 def elaborate(self
, platform
):
32 m
.submodules
.denorm_in_a
= in_a
= FPNumBase(self
.i
.a
)
33 m
.submodules
.denorm_in_b
= in_b
= FPNumBase(self
.i
.b
)
35 with m
.If(~self
.i
.out_do_z
):
36 # XXX hmmm, don't like repeating identical code
37 comb
+= self
.o
.a
.eq(self
.i
.a
)
38 with m
.If(in_a
.exp_n127
):
39 comb
+= self
.o
.a
.e
.eq(self
.i
.a
.N126
) # limit a exponent
41 comb
+= self
.o
.a
.m
[-1].eq(1) # set top mantissa bit
43 comb
+= self
.o
.b
.eq(self
.i
.b
)
44 with m
.If(in_b
.exp_n127
):
45 comb
+= self
.o
.b
.e
.eq(self
.i
.b
.N126
) # limit a exponent
47 comb
+= self
.o
.b
.m
[-1].eq(1) # set top mantissa bit
49 comb
+= self
.o
.ctx
.eq(self
.i
.ctx
)
50 comb
+= self
.o
.z
.eq(self
.i
.z
)
51 comb
+= self
.o
.out_do_z
.eq(self
.i
.out_do_z
)
52 comb
+= self
.o
.oz
.eq(self
.i
.oz
)