"""
==================================================
Automatic scheduling for different latency-offsets
==================================================

This example showcases how one can generate a schedule where the
operations have different latency offsets for the different inputs/outputs.
"""

from b_asic.list_schedulers import HybridScheduler
from b_asic.schedule import Schedule
from b_asic.scheduler import ALAPScheduler, ASAPScheduler
from b_asic.sfg_generators import ldlt_matrix_inverse

sfg = ldlt_matrix_inverse(N=3, name="matrix-inv", pe="mads")

sfg.set_latency_offsets_of_type_name("mads", {"in0": 3, "in1": 0, "in2": 0, "out0": 4})
sfg.set_execution_time_of_type_name("mads", 1)
sfg.set_latency_of_type_name("rec", 10)
sfg.set_execution_time_of_type_name("rec", 1)

# %%
# The SFG is
sfg

# %%
# Create an ASAP schedule for reference.
schedule1 = Schedule(sfg, scheduler=ASAPScheduler())
schedule1

# %%
# Create an ALAP schedule for reference.
schedule2 = Schedule(sfg, scheduler=ALAPScheduler())
schedule2

# %%
# Create a resource restricted schedule.
schedule3 = Schedule(sfg, scheduler=HybridScheduler())
schedule3

# %%
# Create another schedule with shorter scheduling time by enabling cyclic.
schedule4 = Schedule(
    sfg,
    scheduler=HybridScheduler(),
    schedule_time=49,
    cyclic=True,
)
schedule4

# %%
# Push the schedule time to the rate limit for one MADS operator.
schedule5 = Schedule(
    sfg,
    scheduler=HybridScheduler(),
    schedule_time=15,
    cyclic=True,
)
schedule5
