split out normtopack to separate module
[ieee754fpu.git] / src / add / fpcommon / normtopack.py
1 # IEEE Floating Point Adder (Single Precision)
2 # Copyright (C) Jonathan P Dawson 2013
3 # 2013-12-12
4
5 from nmigen import Module, Signal, Cat, Mux, Array, Const
6 from nmigen.lib.coding import PriorityEncoder
7 from nmigen.cli import main, verilog
8 from math import log
9
10 from fpbase import FPNumIn, FPNumOut, FPOp, Overflow, FPBase, FPNumBase
11 from fpbase import MultiShiftRMerge, Trigger
12 from singlepipe import (ControlBase, StageChain, UnbufferedPipeline,
13 PassThroughStage)
14 from multipipe import CombMuxOutPipe
15 from multipipe import PriorityCombMuxInPipe
16
17 from fpbase import FPState, FPID
18 from fpcommon.postcalc import FPAddStage1Data
19 from fpcommon.postnormalise import FPNorm1ModSingle
20 from fpcommon.roundz import FPRoundMod
21 from fpcommon.corrections import FPCorrectionsMod
22 from fpcommon.pack import FPPackData, FPPackMod
23
24
25 class FPNormToPack(FPState, UnbufferedPipeline):
26
27 def __init__(self, width, id_wid):
28 FPState.__init__(self, "normalise_1")
29 self.id_wid = id_wid
30 self.width = width
31 UnbufferedPipeline.__init__(self, self) # pipeline is its own stage
32
33 def ispec(self):
34 return FPAddStage1Data(self.width, self.id_wid) # Norm1ModSingle ispec
35
36 def ospec(self):
37 return FPPackData(self.width, self.id_wid) # FPPackMod ospec
38
39 def setup(self, m, i):
40 """ links module to inputs and outputs
41 """
42
43 # Normalisation, Rounding Corrections, Pack - in a chain
44 nmod = FPNorm1ModSingle(self.width, self.id_wid)
45 rmod = FPRoundMod(self.width, self.id_wid)
46 cmod = FPCorrectionsMod(self.width, self.id_wid)
47 pmod = FPPackMod(self.width, self.id_wid)
48 chain = StageChain([nmod, rmod, cmod, pmod])
49 chain.setup(m, i)
50 self.out_z = pmod.ospec()
51
52 self.o = pmod.o
53
54 def process(self, i):
55 return self.o
56
57 def action(self, m):
58 m.d.sync += self.out_z.eq(self.process(None))
59 m.next = "pack_put_z"