Library rt.implementation.basic.arrival_sequence

Require Import rt.util.all.
Require Import rt.model.basic.arrival_sequence rt.model.basic.job
               rt.model.basic.task rt.model.basic.task_arrival.
Require Import rt.implementation.basic.task rt.implementation.basic.job.

Module ConcreteArrivalSequence.

  Import Job ArrivalSequence ConcreteTask ConcreteJob SporadicTaskset SporadicTaskArrival.

  Section PeriodicArrivals.

    Variable ts: concrete_taskset.

    (* At any time t, we release Some job of tsk if t is a multiple of the period,
       otherwise we release None. *)

    Definition add_job (t: time) (tsk: concrete_task) :=
      if task_period tsk %| t then
        Some (Build_concrete_job (t %/ task_period tsk) (task_cost tsk) (task_deadline tsk) tsk)
      else
        None.

    (* The arrival sequence at any time t is simply the partial map of add_job. *)
    Definition periodic_arrival_sequence (t: time) := pmap (add_job t) ts.

  End PeriodicArrivals.

  Section Proofs.

    (* Let ts be any concrete task set with valid parameters. *)
    Variable ts: concrete_taskset.
    Hypothesis H_valid_task_parameters:
      valid_sporadic_taskset task_cost task_period task_deadline ts.

    (* Regarding the periodic arrival sequence built from ts, we prove that...*)
    Let arr_seq := periodic_arrival_sequence ts.

    (* ... every job comes from the task set, ... *)
    Theorem periodic_arrivals_all_jobs_from_taskset:
       (j: JobIn arr_seq),
        job_task (_job_in arr_seq j) \in ts. (* TODO: fix coercion. *)

    (* ..., jobs have valid parameters, ... *)
    Theorem periodic_arrivals_valid_job_parameters:
       (j: JobIn arr_seq),
        valid_sporadic_job task_cost task_deadline job_cost job_deadline job_task j.

    (* ... job arrivals satisfy the sporadic task model, ... *)
    Theorem periodic_arrivals_are_sporadic:
      sporadic_task_model task_period arr_seq job_task.

    (* ... and if the task set has no duplicates, the same applies to
       the arrival sequence. *)

    Theorem periodic_arrivals_is_a_set:
      uniq ts arrival_sequence_is_a_set arr_seq.

  End Proofs.

End ConcreteArrivalSequence.