Register each pipeline stage
[ieee754fpu.git] / src / ieee754 / cordic / sin_cos_pipeline.py
1 from nmutil.singlepipe import ControlBase
2 from nmutil.concurrentunit import ReservationStations, num_bits
3 from nmutil.pipemodbase import PipeModBaseChain
4
5 from ieee754.cordic.sin_cos_pipe_stage import (
6 CordicStage, CordicInitialStage)
7 from ieee754.cordic.pipe_data import (CordicPipeSpec, CordicData,
8 CordicInitialData)
9
10 class CordicPipeChain(PipeModBaseChain):
11 def __init__(self, pspec, stages):
12 self.stages = stages
13 super().__init__(pspec)
14
15 def get_chain(self):
16 return self.stages
17
18
19 class CordicBasePipe(ControlBase):
20 def __init__(self, pspec):
21 ControlBase.__init__(self)
22 self.initstage = CordicPipeChain(pspec,
23 [CordicInitialStage(pspec)])
24 self.cordicstages = []
25 for i in range(pspec.iterations):
26 stage = CordicPipeChain(pspec,
27 [CordicStage(pspec, i)])
28 self.cordicstages.append(stage)
29
30 self._eqs = self.connect([self.initstage] + self.cordicstages)
31
32 def elaborate(self, platform):
33 m = ControlBase.elaborate(self, platform)
34 m.submodules.init = self.initstage
35 for i, stage in enumerate(self.cordicstages):
36 setattr(m.submodules, "cordic%d" % i,
37 stage)
38 m.d.comb += self._eqs
39 return m