6335244fbd098f5d68f8c6c74c08cb5b42706820
[ieee754fpu.git] / src / ieee754 / cordic / pipe_data.py
1 from nmigen import Signal, Const
2 import math
3
4 class CordicInitialData:
5
6 def __init__(self, pspec):
7 ZMAX = pspec.ZMAX
8 self.z0 = Signal(range(-ZMAX, ZMAX), name="z") # denormed result
9
10 def __iter__(self):
11 yield from self.z
12
13 def eq(self, i):
14 return [self.z.eq(i.z)]
15
16 class CordicData:
17
18 def __init__(self, pspec):
19
20 M = pspec.M
21 ZMAX = pspec.ZMAX
22 self.x = Signal(range(-M, M+1), name="x") # operand a
23 self.y = Signal(range(-M, M+1), name="y") # operand b
24 self.z = Signal(range(-ZMAX, ZMAX), name="z") # denormed result
25
26 def __iter__(self):
27 yield from self.x
28 yield from self.y
29 yield from self.z
30
31 def eq(self, i):
32 ret = [self.z.eq(i.z), self.x.eq(i.x), self.y.eq(i.y)]
33 return ret
34
35
36 class CordicPipeSpec:
37 def __init__(self, fracbits):
38 self.fracbits = fracbits
39 self.M = (1 << fracbits)
40 self.ZMAX = int(round(self.M * math.pi/2))
41 zm = Const(-self.ZMAX)
42 self.iterations = zm.width - 1