rename FPADDBaseData to FPBaseData and move to separate module
[ieee754fpu.git] / src / ieee754 / fclass / pipeline.py
1 # IEEE754 FCLASS Module
2 # Copyright (C) 2019 Luke Kenneth Casson Leighon <lkcl@lkcl.net>
3
4
5 from nmigen import Module, Signal, Elaboratable
6 from nmigen.cli import main, verilog
7
8 from nmutil.singlepipe import ControlBase
9 from nmutil.concurrentunit import ReservationStations, num_bits
10
11 from ieee754.fpcommon.basedata import FPBaseData
12 from ieee754.fpcommon.pack import FPPackData
13
14
15 from ieee754.fpcommon.fpbase import FPState, FPNumBase
16 from ieee754.fpcommon.getop import FPPipeContext
17
18 from ieee754.fpcommon.fpbase import FPState
19 from ieee754.fclass.fclass import FPClassMod
20 from ieee754.pipeline import PipelineSpec, DynamicPipe
21
22
23 class FPFClassPipe(DynamicPipe):
24 """ FPConversion: turns its argument (modkls) from a stage into a pipe
25 """
26
27 def __init__(self, in_pspec, out_pspec, modkls):
28 in_pspec.stage = modkls(in_pspec, out_pspec)
29 super().__init__(in_pspec)
30
31
32 # XXX not used because there isn't anything to "join" (no pipe chain)
33 # keeping this code around just in case FPClass has to be split into
34 # two [unlikely but hey]
35 class FPClassBasePipe(ControlBase):
36 def __init__(self, modkls, in_pspec, out_pspec):
37 ControlBase.__init__(self)
38 # redundant because there's only one "thing" here.
39 self.pipe1 = FPFClassPipe(in_pspec, out_pspec, modkls)
40 self._eqs = self.connect([self.pipe1, ])
41
42 def elaborate(self, platform):
43 m = ControlBase.elaborate(self, platform)
44 m.submodules.fclass = self.pipe1
45 m.d.comb += self._eqs
46 return m
47
48
49 class FPClassMuxInOutBase(ReservationStations):
50 """ Reservation-Station version of FPClass pipeline.
51
52 * fan-in on inputs (an array of FPBaseData: a,b,mid)
53 * 2-stage multiplier pipeline
54 * fan-out on outputs (an array of FPPackData: z,mid)
55
56 Fan-in and Fan-out are combinatorial.
57 """
58
59 def __init__(self, modkls, in_width, out_width,
60 num_rows, op_wid=0, pkls=FPClassBasePipe):
61 self.op_wid = op_wid
62 self.id_wid = num_bits(num_rows)
63
64 self.in_pspec = PipelineSpec(in_width, self.id_wid, op_wid)
65 self.out_pspec = PipelineSpec(out_width, self.id_wid, op_wid)
66
67 self.alu = pkls(self.in_pspec, self.out_pspec, modkls)
68 ReservationStations.__init__(self, num_rows)
69
70 def i_specfn(self):
71 return FPBaseData(self.in_pspec)
72
73 def o_specfn(self):
74 return FPPackData(self.out_pspec)
75
76
77 class FPClassMuxInOut(FPClassMuxInOutBase):
78 """ Reservation-Station version of FPClass pipeline.
79
80 * fan-in on inputs (an array of FPBaseData: a,b,mid)
81 * 2-stage multiplier pipeline
82 * fan-out on outputs (an array of FPPackData: z,mid)
83
84 Fan-in and Fan-out are combinatorial.
85 """
86
87 def __init__(self, in_width, out_width, num_rows, op_wid=0):
88 FPClassMuxInOutBase.__init__(self, FPClassMod,
89 in_width, out_width,
90 num_rows, op_wid,
91 pkls=FPFClassPipe)
92 #pkls=FPClassBasePipe)
93