1 from nmigen
import Module
, Signal
, Mux
, Elaboratable
, unsigned
2 from nmutil
.pipemodbase
import PipeModBase
3 from nmutil
.clz
import CLZ
4 from ieee754
.cordic
.pipe_data
import CordicData
, CordicOutputData
5 from ieee754
.fpcommon
.fpbase
import FPNumBaseRecord
8 class Norm(Elaboratable
):
9 def __init__(self
, pspec
):
10 self
.sig_in
= Signal(range(-pspec
.M
, pspec
.M
+1))
12 self
.sig_out
= Signal(pspec
.width
)
13 self
.width
= pspec
.width
15 def elaborate(self
, platform
):
19 numrec
= FPNumBaseRecord(self
.width
, False)
22 comb
+= sign
.eq(self
.sig_in
[-1])
24 absv
= Signal
.like(self
.sig_in
)
25 comb
+= absv
.eq(Mux(sign
, -self
.sig_in
, self
.sig_in
))
27 m
.submodules
.clzx
= clz
= CLZ(self
.sig_in
.width
)
29 count
= Signal
.like(clz
.lz
)
31 comb
+= clz
.sig_in
.eq(absv
)
32 comb
+= count
.eq(clz
.lz
)
34 normalized
= Signal(unsigned(self
.sig_in
.width
))
36 comb
+= normalized
.eq(absv
<< (count
-1))
38 comb
+= numrec
.m
.eq(normalized
[-(numrec
.m_width
+1):-1])
39 comb
+= numrec
.s
.eq(sign
)
40 comb
+= numrec
.e
.eq(-count
+1)
42 comb
+= self
.sig_out
.eq(numrec
.create2(numrec
.s
, numrec
.e
, numrec
.m
))
45 class CordicRenormalize(PipeModBase
):
46 def __init__(self
, pspec
):
47 super().__init
__(pspec
, "cordicrenorm")
50 return CordicData(self
.pspec
)
53 return CordicOutputData(self
.pspec
)
55 def elaborate(self
, platform
):
59 m
.submodules
.normx
= normx
= Norm(self
.pspec
)
60 m
.submodules
.normy
= normy
= Norm(self
.pspec
)
63 normx
.sig_in
.eq(self
.i
.x
),
64 normy
.sig_in
.eq(self
.i
.y
),
67 comb
+= self
.o
.x
.eq(normx
.sig_out
)
68 comb
+= self
.o
.y
.eq(normy
.sig_out
)
70 comb
+= self
.o
.ctx
.eq(self
.i
.ctx
)