Sorta working FP renormalization in cordic
[ieee754fpu.git] / src / ieee754 / cordic / pipe_data.py
1 from nmigen import Signal, Const
2 from nmutil.dynamicpipe import SimpleHandshakeRedir
3 from ieee754.fpcommon.fpbase import Overflow, FPNumBaseRecord
4 from ieee754.fpcommon.getop import FPPipeContext
5 import math
6
7
8 class CordicInitialData:
9
10 def __init__(self, pspec):
11 ZMAX = pspec.ZMAX
12 self.z0 = Signal(range(-ZMAX, ZMAX), name="z") # denormed result
13
14 def __iter__(self):
15 yield self.z0
16
17 def eq(self, i):
18 return [self.z0.eq(i.z0)]
19
20
21 class CordicOutputData:
22
23 def __init__(self, pspec, e_extra=False):
24 width = pspec.width
25 self.x = FPNumBaseRecord(width, False, e_extra, name="x")
26 self.y = FPNumBaseRecord(width, False, e_extra, name="y")
27 self.ctx = FPPipeContext(pspec)
28 self.muxid = self.ctx.muxid
29
30 def __iter__(self):
31 yield from self.x
32 yield from self.y
33 yield from self.ctx
34
35 def eq(self, i):
36 return [self.x.eq(i.x), self.y.eq(i.y),
37 self.ctx.eq(i.ctx)]
38
39
40 class CordicData:
41
42 def __init__(self, pspec):
43
44 M = pspec.M
45 ZMAX = pspec.ZMAX
46 self.x = Signal(range(-M, M+1), name="x") # operand a
47 self.y = Signal(range(-M, M+1), name="y") # operand b
48 self.z = Signal(range(-ZMAX, ZMAX), name="z") # denormed result
49
50 def __iter__(self):
51 yield self.x
52 yield self.y
53 yield self.z
54
55 def eq(self, i):
56 ret = [self.z.eq(i.z), self.x.eq(i.x), self.y.eq(i.y)]
57 return ret
58
59
60 class CordicPipeSpec:
61 def __init__(self, fracbits, rounds_per_stage):
62 self.fracbits = fracbits
63 # Number of cordic operations per pipeline stage
64 self.rounds_per_stage = rounds_per_stage
65 self.M = (1 << fracbits)
66 self.ZMAX = int(round(self.M * math.pi/2))
67 zm = Const(-self.ZMAX)
68 self.iterations = zm.width - 1
69
70 self.pipekls = SimpleHandshakeRedir
71 self.stage = None