2013-05-22 11:11:09 -04:00
|
|
|
from migen.fhdl.std import *
|
2013-01-05 08:18:36 -05:00
|
|
|
|
|
|
|
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)
|