update comments
[ieee754fpu.git] / src / add / fpcommon / pack.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, Elaboratable
6 from nmigen.cli import main, verilog
7
8 from fpbase import FPNumOut
9 from fpbase import FPState
10 from fpcommon.roundz import FPRoundData
11 from singlepipe import Object
12
13
14 class FPPackData(Object):
15
16 def __init__(self, width, id_wid):
17 Object.__init__(self)
18 self.z = Signal(width, reset_less=True)
19 self.mid = Signal(id_wid, reset_less=True)
20
21
22 class FPPackMod(Elaboratable):
23
24 def __init__(self, width, id_wid):
25 self.width = width
26 self.id_wid = id_wid
27 self.i = self.ispec()
28 self.o = self.ospec()
29
30 def ispec(self):
31 return FPRoundData(self.width, self.id_wid)
32
33 def ospec(self):
34 return FPPackData(self.width, self.id_wid)
35
36 def process(self, i):
37 return self.o
38
39 def setup(self, m, in_z):
40 """ links module to inputs and outputs
41 """
42 m.submodules.pack = self
43 m.d.comb += self.i.eq(in_z)
44
45 def elaborate(self, platform):
46 m = Module()
47 z = FPNumOut(self.width, False)
48 m.submodules.pack_in_z = self.i.z
49 m.submodules.pack_out_z = z
50 m.d.comb += self.o.mid.eq(self.i.mid)
51 with m.If(~self.i.out_do_z):
52 with m.If(self.i.z.is_overflowed):
53 m.d.comb += z.inf(self.i.z.s)
54 with m.Else():
55 m.d.comb += z.create(self.i.z.s, self.i.z.e, self.i.z.m)
56 with m.Else():
57 m.d.comb += z.v.eq(self.i.oz)
58 m.d.comb += self.o.z.eq(z.v)
59 return m
60
61
62 class FPPack(FPState):
63
64 def __init__(self, width, id_wid):
65 FPState.__init__(self, "pack")
66 self.mod = FPPackMod(width)
67 self.out_z = self.ospec()
68
69 def ispec(self):
70 return self.mod.ispec()
71
72 def ospec(self):
73 return self.mod.ospec()
74
75 def setup(self, m, in_z):
76 """ links module to inputs and outputs
77 """
78 self.mod.setup(m, in_z)
79
80 m.d.sync += self.out_z.v.eq(self.mod.out_z.v)
81 m.d.sync += self.out_z.mid.eq(self.mod.o.mid)
82
83 def action(self, m):
84 m.next = "pack_put_z"