From b3a4b0e8c858ad211f7fd83c7db9379c19ae4aae Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson <oscar.gustafsson@gmail.com> Date: Fri, 1 Jul 2022 11:21:50 +0200 Subject: [PATCH] Add second-order direct form IIR example --- b_asic/__init__.py | 2 +- b_asic/schedule.py | 9 +++--- examples/secondorderdirectformiir.py | 45 ++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 examples/secondorderdirectformiir.py diff --git a/b_asic/__init__.py b/b_asic/__init__.py index 7f4b9555..51bebc26 100644 --- a/b_asic/__init__.py +++ b/b_asic/__init__.py @@ -5,7 +5,7 @@ ASIC toolbox that simplifies circuit design and optimization. # NOTE: If this import gives an error, # make sure the C++ module has been compiled and installed properly. # See the included README.md for more information on how to build/install. -from _b_asic import * +# from _b_asic import * # Python modules. from b_asic.core_operations import * from b_asic.graph_component import * diff --git a/b_asic/schedule.py b/b_asic/schedule.py index 8d0dfafe..333e85f0 100644 --- a/b_asic/schedule.py +++ b/b_asic/schedule.py @@ -317,10 +317,11 @@ class Schedule: x = np.array(_x) y = np.array(_y) plt.fill(x + op_start_time, y + ypos) - _x, _y = zip(*execution_time_coords) - x = np.array(_x) - y = np.array(_y) - plt.plot(x + op_start_time, y + ypos, color='black', linewidth=3, alpha=0.5) + if execution_time_coords: + _x, _y = zip(*execution_time_coords) + x = np.array(_x) + y = np.array(_y) + plt.plot(x + op_start_time, y + ypos, color='black', linewidth=3, alpha=0.5) ytickpositions.append(ypos + 0.5) yticklabels.append(self._sfg.find_by_id(op_id).name) ypositions[op_id] = ypos diff --git a/examples/secondorderdirectformiir.py b/examples/secondorderdirectformiir.py new file mode 100644 index 00000000..6ff405a2 --- /dev/null +++ b/examples/secondorderdirectformiir.py @@ -0,0 +1,45 @@ +"""A sfg with delays and interesting layout for precednce list generation. + . . +IN1>--->C0>--->ADD1>----------+--->A0>--->ADD4>--->OUT1 + . ^ | ^ . + . | T1 | . + . | | | . + . ADD2<---<B1<---+--->A1>--->ADD3 . + . ^ | ^ . + . | T2 | . + . | | | . + . +-----<B2<---+--->A2>-----+ . +""" + +from b_asic.core_operations import Addition, ConstantMultiplication +from b_asic.special_operations import Delay, Input, Output +from b_asic.signal_flow_graph import SFG +from b_asic.schedule import Schedule + + +in1 = Input("IN1") +c0 = ConstantMultiplication(5, in1, "C0") +add1 = Addition(c0, None, "ADD1") +# Not sure what operation "Q" is supposed to be in the example +T1 = Delay(add1, 0, "T1") +T2 = Delay(T1, 0, "T2") +b2 = ConstantMultiplication(0.2, T2, "B2") +b1 = ConstantMultiplication(0.3, T1, "B1") +add2 = Addition(b1, b2, "ADD2") +add1.input(1).connect(add2) +a1 = ConstantMultiplication(0.4, T1, "A1") +a2 = ConstantMultiplication(0.6, T2, "A2") +add3 = Addition(a1, a2, "ADD3") +a0 = ConstantMultiplication(0.7, add1, "A0") +add4 = Addition(a0, add3, "ADD4") +out1 = Output(add4, "OUT1") + +sfg = SFG(inputs=[in1], outputs=[out1], name="Second-order direct form IIR filter") + +# Set latencies and exection times +sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) +sfg.set_latency_of_type(Addition.type_name(), 1) +sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) +sfg.set_execution_time_of_type(Addition.type_name(), 1) + +schedule = Schedule(sfg) -- GitLab