diff --git a/examples/secondorderdirectformiir_architecture.py b/examples/secondorderdirectformiir_architecture.py index a6232651500dcbad2ff676cc9f436b01456da6be..72d23961bcc44c681af4688f545b690900f47945 100644 --- a/examples/secondorderdirectformiir_architecture.py +++ b/examples/secondorderdirectformiir_architecture.py @@ -30,19 +30,23 @@ out1 = Output(add4, "OUT1") sfg = SFG(inputs=[in1], outputs=[out1], name="Second-order direct form IIR filter") # %% -# Set latencies and execution times +# The SFG is +sfg + +# %% +# Set latencies and execution 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) # %% -# Create schedule +# Create schedule. schedule = Schedule(sfg, cyclic=True) schedule.show(title='Original schedule') # %% -# Reschedule to only require one adder and one multiplier +# Reschedule to only require one adder and one multiplier. schedule.move_operation('add4', 2) schedule.move_operation('cmul5', -4) schedule.move_operation('cmul4', -5) @@ -51,7 +55,7 @@ schedule.move_operation('cmul3', 1) schedule.show(title='Improved schedule') # %% -# Extract operations and create processing elements +# Extract operations and create processing elements. operations = schedule.get_operations() adders = operations.get_by_type_name('add') adders.show(title="Adder executions") @@ -62,13 +66,13 @@ inputs.show(title="Input executions") outputs = operations.get_by_type_name('out') outputs.show(title="Output executions") -p1 = ProcessingElement(adders, entity_name="adder") -p2 = ProcessingElement(mults, entity_name="cmul") -p_in = ProcessingElement(inputs, entity_name='input') -p_out = ProcessingElement(outputs, entity_name='output') +adder = ProcessingElement(adders, entity_name="adder") +multiplier = ProcessingElement(mults, entity_name="multiplier") +pe_in = ProcessingElement(inputs, entity_name='input') +pe_out = ProcessingElement(outputs, entity_name='output') # %% -# Extract and assign memory variables +# Extract and assign memory variables. mem_vars = schedule.get_memory_variables() mem_vars.show(title="All memory variables") direct, mem_vars = mem_vars.split_on_length() @@ -86,8 +90,10 @@ for i, mem in enumerate(mem_vars_set): direct.show(title="Direct interconnects") # %% -# Create architecture -arch = Architecture({p1, p2, p_in, p_out}, memories, direct_interconnects=direct) +# Create architecture. +arch = Architecture( + {adder, multiplier, pe_in, pe_out}, memories, direct_interconnects=direct +) # %% # The architecture can be rendered in enriched shells. @@ -107,7 +113,7 @@ memories[2].show_content("New assigned memory2") # %% # Looking at the architecture it is clear that there is now only one input to -# ``memory0``, so no input multiplexer required. +# ``memory0``, so no input multiplexer is required. arch # %% @@ -121,3 +127,14 @@ memories[2].show_content("New assigned memory2") # %% # However, this comes at the expense of an additional input to ``memory2``. arch + +# %% +# Finally, by noting that ``cmul1.0`` is the only variable from ``memory1`` going to +# ``in0`` of ``adder``, another multiplexer can be reduced by: +arch.move_process('cmul1.0', 'memory1', 'memory2', assign=True) +memories[1].show_content("New assigned memory1") +memories[2].show_content("New assigned memory2") + +# %% +# Leading to +arch