diff --git a/b_asic/architecture.py b/b_asic/architecture.py index c60b2382d26c63fffa152f91957d7786e140c359..5cc2cfa791aef4882fdeab9ccec18fcdef2d9b75 100644 --- a/b_asic/architecture.py +++ b/b_asic/architecture.py @@ -293,10 +293,15 @@ class ProcessingElement(Resource): Process collection containing operations to map to processing element. entity_name : str, optional Name of processing element entity. + assign : bool, default True + Perform assignment when creating the ProcessingElement. """ def __init__( - self, process_collection: ProcessCollection, entity_name: Optional[str] = None + self, + process_collection: ProcessCollection, + entity_name: Optional[str] = None, + assign: bool = True, ): super().__init__(process_collection=process_collection, entity_name=entity_name) if not all( @@ -318,7 +323,8 @@ class ProcessingElement(Resource): self._type_name = op_type.type_name() self._input_count = ops[0].input_count self._output_count = ops[0].output_count - self.assign() + if assign: + self.assign() @property def processes(self) -> List[OperatorProcess]: @@ -364,6 +370,9 @@ class Memory(Resource): Number of read ports for memory. write_ports : int, optional Number of write ports for memory. + assign : bool, default False + Perform assignment when creating the Memory (using the default properties). + """ def __init__( @@ -373,6 +382,7 @@ class Memory(Resource): entity_name: Optional[str] = None, read_ports: Optional[int] = None, write_ports: Optional[int] = None, + assign: bool = False, ): super().__init__(process_collection=process_collection, entity_name=entity_name) if not all( @@ -401,6 +411,8 @@ class Memory(Resource): raise ValueError(f"At least {write_ports_bound} write ports required") self._input_count = write_ports self._memory_type = memory_type + if assign: + self.assign() memory_processes = [ cast(MemoryProcess, process) for process in process_collection diff --git a/examples/thirdorderblwdf.py b/examples/thirdorderblwdf.py index 117041fcecaf2d9e49df26c46363b15c26266119..df19a1ed59b09c45845223924c0cc691226d289d 100644 --- a/examples/thirdorderblwdf.py +++ b/examples/thirdorderblwdf.py @@ -5,9 +5,13 @@ Third-order Bireciprocal LWDF Small bireciprocal lattice wave digital filter. """ +import numpy as np +from mplsignal.freq_plots import freqz_fir + from b_asic.core_operations import Addition, SymmetricTwoportAdaptor from b_asic.schedule import Schedule from b_asic.signal_flow_graph import SFG +from b_asic.signal_generator import Impulse from b_asic.simulation import Simulation from b_asic.special_operations import Delay, Input, Output @@ -21,19 +25,28 @@ a = s.output(0) + D0 out0 = Output(a, "y") sfg = SFG(inputs=[in0], outputs=[out0], name="Third-order BLWDF") +# %% +# The SFG looks like +sfg -# Set latencies and exection times +# %% +# Set latencies and execution times sfg.set_latency_of_type(SymmetricTwoportAdaptor.type_name(), 4) sfg.set_latency_of_type(Addition.type_name(), 1) sfg.set_execution_time_of_type(SymmetricTwoportAdaptor.type_name(), 1) sfg.set_execution_time_of_type(Addition.type_name(), 1) -sim = Simulation(sfg, [lambda n: 0 if n else 1]) +# %% +# Simulate +sim = Simulation(sfg, [Impulse()]) sim.run_for(1000) -import numpy as np -from mplsignal.freq_plots import freqz_fir +# %% +# Display output freqz_fir(np.array(sim.results['0']) / 2) +# %% +# Create and display schedule schedule = Schedule(sfg, cyclic=True) +schedule.show()