1 # IEEE Floating Point Adder (Single Precision)
2 # Copyright (C) Jonathan P Dawson 2013
5 from nmigen
import Module
, Signal
, Cat
, Mux
, Array
, Const
6 from nmigen
.lib
.coding
import PriorityEncoder
7 from nmigen
.cli
import main
, verilog
10 from fpbase
import FPNumIn
, FPNumOut
, FPOp
, Overflow
, FPBase
, FPNumBase
11 from fpbase
import MultiShiftRMerge
, Trigger
12 from singlepipe
import (ControlBase
, StageChain
, UnbufferedPipeline
,
14 from multipipe
import CombMuxOutPipe
15 from multipipe
import PriorityCombMuxInPipe
17 from fpbase
import FPState
, FPID
18 from fpcommon
.roundz
import FPRoundData
21 class FPCorrectionsMod
:
23 def __init__(self
, width
, id_wid
):
27 self
.out_z
= self
.ospec()
30 return FPRoundData(self
.width
, self
.id_wid
)
33 return FPRoundData(self
.width
, self
.id_wid
)
38 def setup(self
, m
, i
):
39 """ links module to inputs and outputs
41 m
.submodules
.corrections
= self
42 m
.d
.comb
+= self
.i
.eq(i
)
44 def elaborate(self
, platform
):
46 m
.submodules
.corr_in_z
= self
.i
.z
47 m
.submodules
.corr_out_z
= self
.out_z
.z
48 m
.d
.comb
+= self
.out_z
.eq(self
.i
) # copies mid, z, out_do_z
49 with m
.If(~self
.i
.out_do_z
):
50 with m
.If(self
.i
.z
.is_denormalised
):
51 m
.d
.comb
+= self
.out_z
.z
.e
.eq(self
.i
.z
.N127
)
55 class FPCorrections(FPState
):
57 def __init__(self
, width
, id_wid
):
58 FPState
.__init
__(self
, "corrections")
59 self
.mod
= FPCorrectionsMod(width
)
60 self
.out_z
= self
.ospec()
63 return self
.mod
.ispec()
66 return self
.mod
.ospec()
68 def setup(self
, m
, in_z
):
69 """ links module to inputs and outputs
71 self
.mod
.setup(m
, in_z
)
73 m
.d
.sync
+= self
.out_z
.eq(self
.mod
.out_z
)
74 m
.d
.sync
+= self
.out_z
.mid
.eq(self
.mod
.o
.mid
)