diff --git a/b_asic/signal_generator.py b/b_asic/signal_generator.py index 8270736ffe96ce2d0fa11ae0ec5ca2451d963be1..cf79873794d11435542d94ea0ac38ec198c4a4c4 100644 --- a/b_asic/signal_generator.py +++ b/b_asic/signal_generator.py @@ -76,6 +76,9 @@ class Impulse(SignalGenerator): def __call__(self, time: int) -> complex: return 1 if time == self._delay else 0 + def __repr__(self): + return f"Impulse({self._delay})" if self._delay else "Impulse()" + class Step(SignalGenerator): """ @@ -93,6 +96,9 @@ class Step(SignalGenerator): def __call__(self, time: int) -> complex: return 1 if time >= self._delay else 0 + def __repr__(self): + return f"Step({self._delay})" if self._delay else "Step()" + class Constant(SignalGenerator): """ @@ -110,6 +116,9 @@ class Constant(SignalGenerator): def __call__(self, time: int) -> complex: return self._constant + def __str__(self): + return f"{self._constant}" + class ZeroPad(SignalGenerator): """ @@ -130,6 +139,9 @@ class ZeroPad(SignalGenerator): return self._data[time] return 0.0 + def __repr__(self): + return f"ZeroPad({self._data})" + class Sinusoid(SignalGenerator): """ @@ -153,6 +165,13 @@ class Sinusoid(SignalGenerator): def __call__(self, time: int) -> complex: return sin(pi * (self._frequency * time + self._phase)) + def __repr__(self): + return ( + f"Sinusoid({self._frequency}, {self._phase})" + if self._phase + else f"Sinusoid({self._frequency})" + ) + class AddGenerator: """ @@ -168,6 +187,9 @@ class AddGenerator: def __call__(self, time: int) -> complex: return self._a(time) + self._b(time) + def __str__(self): + return f"{self._a} + {self._b}" + class SubGenerator: """ @@ -183,6 +205,9 @@ class SubGenerator: def __call__(self, time: int) -> complex: return self._a(time) - self._b(time) + def __str__(self): + return f"{self._a} - {self._b}" + class MultGenerator: """ @@ -198,6 +223,19 @@ class MultGenerator: def __call__(self, time: int) -> complex: return self._a(time) * self._b(time) + def __str__(self): + a = ( + f"({self._a})" + if isinstance(self._a, (AddGenerator, SubGenerator)) + else f"{self._a}" + ) + b = ( + f"({self._b})" + if isinstance(self._b, (AddGenerator, SubGenerator)) + else f"{self._b}" + ) + return f"{a} * {b}" + class DivGenerator: """ @@ -212,3 +250,19 @@ class DivGenerator: def __call__(self, time: int) -> complex: return self._a(time) / self._b(time) + + def __str__(self): + a = ( + f"({self._a})" + if isinstance(self._a, (AddGenerator, SubGenerator)) + else f"{self._a}" + ) + b = ( + f"({self._b})" + if isinstance( + self._b, + (AddGenerator, SubGenerator, MultGenerator, DivGenerator), + ) + else f"{self._b}" + ) + return f"{a} / {b}" diff --git a/test/test_signal_generator.py b/test/test_signal_generator.py index 9492de379e6dfc62ce8862da2a6fc195a2b0f24a..085b555a597c0f5233d3d700b962f82080bfbda9 100644 --- a/test/test_signal_generator.py +++ b/test/test_signal_generator.py @@ -12,12 +12,16 @@ def test_impulse(): assert g(1) == 0 assert g(2) == 0 + assert str(g) == "Impulse()" + g = Impulse(1) assert g(-1) == 0 assert g(0) == 0 assert g(1) == 1 assert g(2) == 0 + assert str(g) == "Impulse(1)" + def test_step(): g = Step() @@ -26,12 +30,16 @@ def test_step(): assert g(1) == 1 assert g(2) == 1 + assert str(g) == "Step()" + g = Step(1) assert g(-1) == 0 assert g(0) == 0 assert g(1) == 1 assert g(2) == 1 + assert str(g) == "Step(1)" + def test_constant(): g = Constant() @@ -40,12 +48,16 @@ def test_constant(): assert g(1) == 1 assert g(2) == 1 + assert str(g) == "1.0" + g = Constant(0.5) assert g(-1) == 0.5 assert g(0) == 0.5 assert g(1) == 0.5 assert g(2) == 0.5 + assert str(g) == "0.5" + def test_zeropad(): g = ZeroPad([0.4, 0.6]) @@ -54,6 +66,8 @@ def test_zeropad(): assert g(1) == 0.6 assert g(2) == 0 + assert str(g) == "ZeroPad([0.4, 0.6])" + def test_sinusoid(): g = Sinusoid(0.5) @@ -62,12 +76,16 @@ def test_sinusoid(): assert g(2) == pytest.approx(0) assert g(3) == -1 + assert str(g) == "Sinusoid(0.5)" + g = Sinusoid(0.5, 0.25) assert g(0) == pytest.approx(sqrt(2) / 2) assert g(1) == pytest.approx(sqrt(2) / 2) assert g(2) == pytest.approx(-sqrt(2) / 2) assert g(3) == pytest.approx(-sqrt(2) / 2) + assert str(g) == "Sinusoid(0.5, 0.25)" + def test_addition(): g = Impulse() + Impulse(2) @@ -77,20 +95,26 @@ def test_addition(): assert g(2) == 1 assert g(3) == 0 - g = 1 + Impulse(2) + assert str(g) == "Impulse() + Impulse(2)" + + g = 1.0 + Impulse(2) assert g(-1) == 1 assert g(0) == 1 assert g(1) == 1 assert g(2) == 2 assert g(3) == 1 - g = Impulse(1) + 1 + assert str(g) == "Impulse(2) + 1.0" + + g = Impulse(1) + 1.0 assert g(-1) == 1 assert g(0) == 1 assert g(1) == 2 assert g(2) == 1 assert g(3) == 1 + assert str(g) == "Impulse(1) + 1.0" + def test_subtraction(): g = Impulse() - Impulse(2) @@ -100,20 +124,26 @@ def test_subtraction(): assert g(2) == -1 assert g(3) == 0 - g = 1 - Impulse(2) + assert str(g) == "Impulse() - Impulse(2)" + + g = 1.0 - Impulse(2) assert g(-1) == 1 assert g(0) == 1 assert g(1) == 1 assert g(2) == 0 assert g(3) == 1 - g = Impulse(2) - 1 + assert str(g) == "1.0 - Impulse(2)" + + g = Impulse(2) - 1.0 assert g(-1) == -1 assert g(0) == -1 assert g(1) == -1 assert g(2) == 0 assert g(3) == -1 + assert str(g) == "Impulse(2) - 1.0" + def test_multiplication(): g = Impulse() * 0.5 @@ -122,17 +152,23 @@ def test_multiplication(): assert g(1) == 0 assert g(2) == 0 + assert str(g) == "Impulse() * 0.5" + g = 2 * Sinusoid(0.5, 0.25) assert g(0) == pytest.approx(sqrt(2)) assert g(1) == pytest.approx(sqrt(2)) assert g(2) == pytest.approx(-sqrt(2)) assert g(3) == pytest.approx(-sqrt(2)) - g = Step(1) * Sinusoid(0.5, 0.25) + assert str(g) == "Sinusoid(0.5, 0.25) * 2" + + g = Step(1) * (Sinusoid(0.5, 0.25) + 1.0) assert g(0) == 0 - assert g(1) == pytest.approx(sqrt(2) / 2) - assert g(2) == pytest.approx(-sqrt(2) / 2) - assert g(3) == pytest.approx(-sqrt(2) / 2) + assert g(1) == pytest.approx(sqrt(2) / 2 + 1) + assert g(2) == pytest.approx(-sqrt(2) / 2 + 1) + assert g(3) == pytest.approx(-sqrt(2) / 2 + 1) + + assert str(g) == "Step(1) * (Sinusoid(0.5, 0.25) + 1.0)" def test_division(): @@ -142,13 +178,19 @@ def test_division(): assert g(1) == 0.5 assert g(2) == 0.5 + assert str(g) == "Step() / 2" + g = 0.5 / Step() assert g(0) == 0.5 assert g(1) == 0.5 assert g(2) == 0.5 + assert str(g) == "0.5 / Step()" + g = Sinusoid(0.5, 0.25) / (0.5 * Step()) assert g(0) == pytest.approx(sqrt(2)) assert g(1) == pytest.approx(sqrt(2)) assert g(2) == pytest.approx(-sqrt(2)) assert g(3) == pytest.approx(-sqrt(2)) + + assert str(g) == "Sinusoid(0.5, 0.25) / (Step() * 0.5)"