216b01934c60a125df1d0522a6865d4c1b7d37b3
[ieee754fpu.git] / src / ieee754 / cordic / sin_cos_pipe_stage.py
1 from nmigen import Module, Signal, Cat, Mux
2 from nmutil.pipemodbase import PipeModBase
3 from ieee754.cordic.pipe_data import CordicData
4 import math
5
6
7 class CordicStage(PipeModBase):
8 def __init__(self, pspec, stagenum):
9 super().__init__(pspec, "cordicstage%d" % stagenum)
10 self.stagenum = stagenum
11
12 def ispec(self):
13 return CordicData(self.pspec, False)
14
15 def ospec(self):
16 return CordicData(self.pspec, False)
17
18 def elaborate(self, platform):
19 m = Module()
20 comb = m.d.comb
21
22 dx = Signal(self.i.x.shape())
23 dy = Signal(self.i.y.shape())
24 dz = Signal(self.i.z.shape())
25 angle = int(round(self.pspec.M *
26 math.atan(2**(-self.stagenum))))
27
28 comb += dx.eq(self.i.y >> self.stagenum)
29 comb += dy.eq(self.i.x >> self.stagenum)
30 comb += dz.eq(angle)
31
32 with m.If(self.i.z >= 0):
33 comb += self.o.x.eq(self.i.x - dx)
34 comb += self.o.y.eq(self.i.y + dy)
35 comb += self.o.z.eq(self.i.z - dz)
36 with m.Else():
37 comb += self.o.x.eq(self.i.x + dx)
38 comb += self.o.y.eq(self.i.y - dy)
39 comb += self.o.z.eq(self.i.z + dz)
40
41 return m