mirror of
https://github.com/enjoy-digital/litex.git
synced 2025-01-04 09:52:26 -05:00
corelogic: complex arithmetic support
This commit is contained in:
parent
badba89686
commit
314a6c7743
2 changed files with 68 additions and 0 deletions
16
examples/basic/complex.py
Normal file
16
examples/basic/complex.py
Normal file
|
@ -0,0 +1,16 @@
|
|||
from migen.corelogic.complex import *
|
||||
from migen.fhdl import verilog
|
||||
|
||||
w = Complex(32, 42)
|
||||
A = SignalC(16)
|
||||
B = SignalC(16)
|
||||
Bw = SignalC(16, variable=True)
|
||||
C = SignalC(16)
|
||||
D = SignalC(16)
|
||||
sync = [
|
||||
Bw.eq(B*w),
|
||||
C.eq(A + Bw),
|
||||
D.eq(A - Bw)
|
||||
]
|
||||
|
||||
print(verilog.convert(Fragment(sync=sync)))
|
52
migen/corelogic/complex.py
Normal file
52
migen/corelogic/complex.py
Normal file
|
@ -0,0 +1,52 @@
|
|||
from migen.fhdl.structure import *
|
||||
|
||||
class Complex:
|
||||
def __init__(self, real, imag):
|
||||
self.real = real
|
||||
self.imag = imag
|
||||
|
||||
def __neg__(self):
|
||||
return Complex(-self.real, -self.imag)
|
||||
|
||||
def __add__(self, other):
|
||||
if isinstance(other, Complex):
|
||||
return Complex(self.real + other.real, self.imag + other.imag)
|
||||
else:
|
||||
return Complex(self.real + other, self.imag)
|
||||
__radd__ = __add__
|
||||
def __sub__(self, other):
|
||||
if isinstance(other, Complex):
|
||||
return Complex(self.real - other.real, self.imag - other.imag)
|
||||
else:
|
||||
return Complex(self.real - other, self.imag)
|
||||
def __rsub__(self, other):
|
||||
if isinstance(other, Complex):
|
||||
return Complex(other.real - self.real, other.imag - self.imag)
|
||||
else:
|
||||
return Complex(other - self.real, -self.imag)
|
||||
def __mul__(self, other):
|
||||
if isinstance(other, Complex):
|
||||
return Complex(self.real*other.real - self.imag*other.imag,
|
||||
self.real*other.imag + self.imag*other.real)
|
||||
else:
|
||||
return Complex(self.real*other, self.imag*other)
|
||||
__rmul__ = __mul__
|
||||
|
||||
def __lshift__(self, other):
|
||||
return Complex(self.real << other, self.imag << other)
|
||||
def __rshift__(self, other):
|
||||
return Complex(self.real >> other, self.imag >> other)
|
||||
|
||||
def __repr__(self):
|
||||
return repr(self.real) + " + " + repr(self.imag) + "j"
|
||||
|
||||
def eq(self, r):
|
||||
if isinstance(r, Complex):
|
||||
return self.real.eq(r.real), self.imag.eq(r.imag)
|
||||
else:
|
||||
return self.real.eq(r), self.imag.eq(0)
|
||||
|
||||
def SignalC(*args, **kwargs):
|
||||
real = Signal(*args, **kwargs)
|
||||
imag = Signal(*args, **kwargs)
|
||||
return Complex(real, imag)
|
Loading…
Reference in a new issue