split out putz to separate module
[ieee754fpu.git] / src / add / fpcommon / putz.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.getop import (FPGetOpMod, FPGetOp, FPNumBase2Ops, FPADDBaseData, FPGet2OpMod, FPGet2Op)
19 from fpcommon.denorm import (FPSCData, FPAddDeNormMod, FPAddDeNorm)
20 from fpcommon.postcalc import FPAddStage1Data
21 from fpcommon.postnormalise import (FPNorm1Data, FPNorm1ModSingle,
22 FPNorm1ModMulti, FPNorm1Single, FPNorm1Multi)
23 from fpcommon.roundz import (FPRoundData, FPRoundMod, FPRound)
24 from fpcommon.corrections import (FPCorrectionsMod, FPCorrections)
25 from fpcommon.pack import (FPPackData, FPPackMod, FPPack)
26 from fpcommon.normtopack import FPNormToPack
27
28
29 class FPPutZ(FPState):
30
31 def __init__(self, state, in_z, out_z, in_mid, out_mid, to_state=None):
32 FPState.__init__(self, state)
33 if to_state is None:
34 to_state = "get_ops"
35 self.to_state = to_state
36 self.in_z = in_z
37 self.out_z = out_z
38 self.in_mid = in_mid
39 self.out_mid = out_mid
40
41 def action(self, m):
42 if self.in_mid is not None:
43 m.d.sync += self.out_mid.eq(self.in_mid)
44 m.d.sync += [
45 self.out_z.z.v.eq(self.in_z)
46 ]
47 with m.If(self.out_z.z.stb & self.out_z.z.ack):
48 m.d.sync += self.out_z.z.stb.eq(0)
49 m.next = self.to_state
50 with m.Else():
51 m.d.sync += self.out_z.z.stb.eq(1)
52
53
54 class FPPutZIdx(FPState):
55
56 def __init__(self, state, in_z, out_zs, in_mid, to_state=None):
57 FPState.__init__(self, state)
58 if to_state is None:
59 to_state = "get_ops"
60 self.to_state = to_state
61 self.in_z = in_z
62 self.out_zs = out_zs
63 self.in_mid = in_mid
64
65 def action(self, m):
66 outz_stb = Signal(reset_less=True)
67 outz_ack = Signal(reset_less=True)
68 m.d.comb += [outz_stb.eq(self.out_zs[self.in_mid].stb),
69 outz_ack.eq(self.out_zs[self.in_mid].ack),
70 ]
71 m.d.sync += [
72 self.out_zs[self.in_mid].v.eq(self.in_z.v)
73 ]
74 with m.If(outz_stb & outz_ack):
75 m.d.sync += self.out_zs[self.in_mid].stb.eq(0)
76 m.next = self.to_state
77 with m.Else():
78 m.d.sync += self.out_zs[self.in_mid].stb.eq(1)
79