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