add operand down pipeline chain
[ieee754fpu.git] / src / ieee754 / fpmul / mulstages.py
1 # IEEE Floating Point Multiplier
2
3 from nmigen import Module
4 from nmigen.cli import main, verilog
5
6 from nmutil.singlepipe import (StageChain, SimpleHandshake)
7
8 from ieee754.fpcommon.fpbase import FPState
9 from ieee754.fpcommon.denorm import FPSCData
10 from ieee754.fpcommon.postcalc import FPAddStage1Data
11 from .mul0 import FPMulStage0Mod
12 from .mul1 import FPMulStage1Mod
13
14
15 class FPMulStages(FPState, SimpleHandshake):
16
17 def __init__(self, width, id_wid, op_wid=None):
18 FPState.__init__(self, "align")
19 self.width = width
20 self.id_wid = id_wid
21 self.op_wid = op_wid
22 SimpleHandshake.__init__(self, self) # pipeline is its own stage
23 self.m1o = self.ospec()
24
25 def ispec(self):
26 return FPSCData(self.width, self.id_wid, False, self.op_wid)
27
28 def ospec(self):
29 return FPAddStage1Data(self.width, self.id_wid, self.op_wid)
30
31 def setup(self, m, i):
32 """ links module to inputs and outputs
33 """
34
35 # chain MulStage0 and MulStage1
36 m0mod = FPMulStage0Mod(self.width, self.id_wid, self.op_wid)
37 m1mod = FPMulStage1Mod(self.width, self.id_wid, self.op_wid)
38
39 chain = StageChain([m0mod, m1mod])
40 chain.setup(m, i)
41
42 self.o = m1mod.o
43
44 def process(self, i):
45 return self.o
46
47 def action(self, m):
48 m.d.sync += self.m1o.eq(self.process(None))
49 m.next = "normalise_1"
50
51