0c1820e8efb1d144665d1d1a4ef32156d1dabc22
1 """IEEE754 Floating Point Adder Pipeline
3 Copyright (C) 2019 Luke Kenneth Casson Leighton <lkcl@lkcl.net>
7 from nmigen
import Module
, Signal
, Cat
8 from nmigen
.cli
import main
, verilog
10 from ieee754
.fpcommon
.modbase
import FPModBase
12 from ieee754
.fpcommon
.fpbase
import FPNumBase
, FPNumBaseRecord
13 from ieee754
.fpcommon
.denorm
import FPSCData
14 from ieee754
.fpcommon
.getop
import FPPipeContext
17 class FPAddStage0Data
:
19 def __init__(self
, pspec
):
21 self
.z
= FPNumBaseRecord(width
, False)
22 self
.out_do_z
= Signal(reset_less
=True)
23 self
.oz
= Signal(width
, reset_less
=True)
24 self
.tot
= Signal(self
.z
.m_width
+ 4, reset_less
=True)
25 self
.ctx
= FPPipeContext(pspec
)
26 self
.muxid
= self
.ctx
.muxid
29 return [self
.z
.eq(i
.z
), self
.out_do_z
.eq(i
.out_do_z
), self
.oz
.eq(i
.oz
),
30 self
.tot
.eq(i
.tot
), self
.ctx
.eq(i
.ctx
)]
33 class FPAddStage0Mod(FPModBase
):
35 def __init__(self
, pspec
):
36 super().__init
__(pspec
, "add0")
39 return FPSCData(self
.pspec
, True)
42 return FPAddStage0Data(self
.pspec
)
44 def elaborate(self
, platform
):
48 # store intermediate tests (and zero-extended mantissas)
49 seq
= Signal(reset_less
=True)
50 mge
= Signal(reset_less
=True)
51 am0
= Signal(len(self
.i
.a
.m
)+1, reset_less
=True)
52 bm0
= Signal(len(self
.i
.b
.m
)+1, reset_less
=True)
53 comb
+= [seq
.eq(self
.i
.a
.s
== self
.i
.b
.s
),
54 mge
.eq(self
.i
.a
.m
>= self
.i
.b
.m
),
55 am0
.eq(Cat(self
.i
.a
.m
, 0)),
56 bm0
.eq(Cat(self
.i
.b
.m
, 0))
58 # same-sign (both negative or both positive) add mantissas
59 with m
.If(~self
.i
.out_do_z
):
60 comb
+= self
.o
.z
.e
.eq(self
.i
.a
.e
)
63 self
.o
.tot
.eq(am0
+ bm0
),
64 self
.o
.z
.s
.eq(self
.i
.a
.s
)
66 # a mantissa greater than b, use a
69 self
.o
.tot
.eq(am0
- bm0
),
70 self
.o
.z
.s
.eq(self
.i
.a
.s
)
72 # b mantissa greater than a, use b
75 self
.o
.tot
.eq(bm0
- am0
),
76 self
.o
.z
.s
.eq(self
.i
.b
.s
)
79 # pass-through context
80 comb
+= self
.o
.oz
.eq(self
.i
.oz
)
81 comb
+= self
.o
.out_do_z
.eq(self
.i
.out_do_z
)
82 comb
+= self
.o
.ctx
.eq(self
.i
.ctx
)