9fbbc9765d00520a93ffa6ce83f0cbf5bfbc6b75
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 fpbase
import FPNumIn
, FPNumOut
, FPNumBase
10 from fpbase
import FPState
15 def __init__(self
, width
, id_wid
):
16 self
.a
= FPNumBase(width
, True)
17 self
.b
= FPNumBase(width
, True)
18 self
.z
= FPNumOut(width
, False)
19 self
.oz
= Signal(width
, reset_less
=True)
20 self
.out_do_z
= Signal(reset_less
=True)
21 self
.mid
= Signal(id_wid
, reset_less
=True)
32 return [self
.z
.eq(i
.z
), self
.out_do_z
.eq(i
.out_do_z
), self
.oz
.eq(i
.oz
),
33 self
.a
.eq(i
.a
), self
.b
.eq(i
.b
), self
.mid
.eq(i
.mid
)]
36 class FPAddDeNormMod(FPState
):
38 def __init__(self
, width
, id_wid
):
45 return FPSCData(self
.width
, self
.id_wid
)
48 return FPSCData(self
.width
, self
.id_wid
)
53 def setup(self
, m
, i
):
54 """ links module to inputs and outputs
56 m
.submodules
.denormalise
= self
57 m
.d
.comb
+= self
.i
.eq(i
)
59 def elaborate(self
, platform
):
61 m
.submodules
.denorm_in_a
= self
.i
.a
62 m
.submodules
.denorm_in_b
= self
.i
.b
63 m
.submodules
.denorm_out_a
= self
.o
.a
64 m
.submodules
.denorm_out_b
= self
.o
.b
66 with m
.If(~self
.i
.out_do_z
):
67 # XXX hmmm, don't like repeating identical code
68 m
.d
.comb
+= self
.o
.a
.eq(self
.i
.a
)
69 with m
.If(self
.i
.a
.exp_n127
):
70 m
.d
.comb
+= self
.o
.a
.e
.eq(self
.i
.a
.N126
) # limit a exponent
72 m
.d
.comb
+= self
.o
.a
.m
[-1].eq(1) # set top mantissa bit
74 m
.d
.comb
+= self
.o
.b
.eq(self
.i
.b
)
75 with m
.If(self
.i
.b
.exp_n127
):
76 m
.d
.comb
+= self
.o
.b
.e
.eq(self
.i
.b
.N126
) # limit a exponent
78 m
.d
.comb
+= self
.o
.b
.m
[-1].eq(1) # set top mantissa bit
80 m
.d
.comb
+= self
.o
.mid
.eq(self
.i
.mid
)
81 m
.d
.comb
+= self
.o
.z
.eq(self
.i
.z
)
82 m
.d
.comb
+= self
.o
.out_do_z
.eq(self
.i
.out_do_z
)
83 m
.d
.comb
+= self
.o
.oz
.eq(self
.i
.oz
)
88 class FPAddDeNorm(FPState
):
90 def __init__(self
, width
, id_wid
):
91 FPState
.__init
__(self
, "denormalise")
92 self
.mod
= FPAddDeNormMod(width
)
93 self
.out_a
= FPNumBase(width
)
94 self
.out_b
= FPNumBase(width
)
96 def setup(self
, m
, i
):
97 """ links module to inputs and outputs
101 m
.d
.sync
+= self
.out_a
.eq(self
.mod
.out_a
)
102 m
.d
.sync
+= self
.out_b
.eq(self
.mod
.out_b
)
105 # Denormalised Number checks