start implementing fp fused-mul-add pipeline
[ieee754fpu.git] / src / ieee754 / fpfma / norm.py
1 from nmutil.pipemodbase import PipeModBaseChain, PipeModBase
2 from ieee754.fpcommon.postnormalise import FPNorm1Data
3 from ieee754.fpcommon.roundz import FPRoundMod
4 from ieee754.fpcommon.corrections import FPCorrectionsMod
5 from ieee754.fpcommon.pack import FPPackMod
6 from ieee754.fpfma.main_stage import FPFMAPostCalcData
7 from nmigen.hdl.dsl import Module
8
9 from ieee754.fpfma.util import get_fpformat
10
11
12 class FPFMANorm(PipeModBase):
13 def __init__(self, pspec):
14 super().__init__(pspec, "norm")
15
16 def ispec(self):
17 return FPFMAPostCalcData(self.pspec)
18
19 def ospec(self):
20 return FPNorm1Data(self.pspec)
21
22 def elaborate(self, platform):
23 m = Module()
24 fpf = get_fpformat(self.pspec)
25 assert fpf.has_sign
26 inp = self.i
27 out = self.o
28 raise NotImplementedError # FIXME: finish
29 m.d.comb += [
30 out.roundz.eq(),
31 out.z.eq(),
32 out.out_do_z.eq(),
33 out.oz.eq(),
34 out.ctx.eq(),
35 out.rm.eq(),
36 ]
37 return m
38
39
40 class FPFMANormToPack(PipeModBaseChain):
41 def __init__(self, pspec):
42 super().__init__(pspec)
43
44 def get_chain(self):
45 """ gets chain of modules
46 """
47 nmod = FPFMANorm(self.pspec)
48 rmod = FPRoundMod(self.pspec)
49 cmod = FPCorrectionsMod(self.pspec)
50 pmod = FPPackMod(self.pspec)
51 return [nmod, rmod, cmod, pmod]