Library prosa.analysis.facts.hyperperiod

In this file we prove some simple properties of hyperperiods of periodic tasks.
Section Hyperperiod.

Consider any type of periodic tasks, ...
  Context {Task : TaskType} `{PeriodicModel Task}.

... any task set ts, ...
  Variable ts : TaskSet Task.

... and any task tsk that belongs to this task set.
  Variable tsk : Task.
  Hypothesis H_tsk_in_ts : tsk \in ts.

A task set's hyperperiod is an integral multiple of each task's period in the task set.
In this section we show a property of hyperperiod in context of task sets with valid periods.
Consider any type of periodic tasks ...
  Context {Task : TaskType} `{PeriodicModel Task}.

... and any task set ts ...
  Variable ts : TaskSet Task.

... such that all tasks in ts have valid periods.
  Hypothesis H_valid_periods : valid_periods ts.

We show that the hyperperiod of task set ts is positive.
In this section we prove some lemmas about the hyperperiod in context of the periodic model.
Section PeriodicLemmas.

Consider any type of tasks, ...
  Context {Task : TaskType}.
  Context `{TaskOffset Task}.
  Context `{PeriodicModel Task}.

... any type of jobs, ...
  Context {Job : JobType}.
  Context `{JobTask Job Task}.
  Context `{JobArrival Job}.

... and a consistent arrival sequence with non-duplicate arrivals.
Consider a task set ts such that all tasks in ts have valid periods.
  Variable ts : TaskSet Task.
  Hypothesis H_valid_periods : valid_periods ts.

Let tsk be any periodic task in ts with a valid offset and period.
  Variable tsk : Task.
  Hypothesis H_task_in_ts : tsk \in ts.
  Hypothesis H_valid_offset : valid_offset arr_seq tsk.
  Hypothesis H_valid_period : valid_period tsk.
  Hypothesis H_periodic_task : respects_periodic_task_model arr_seq tsk.

Each task in ts continues releasing jobs indefinitely.
Let O_max denote the maximum task offset in ts and let HP denote the hyperperiod of all tasks in ts.
  Let O_max := max_task_offset ts.
  Let HP := hyperperiod ts.

We show that the job corresponding to any job j1 in any other hyperperiod is a job of the same task as j1.
We show that if a job j lies in the hyperperiod starting at instant t then j arrives in the interval [t, t + HP).
  Lemma all_jobs_arrive_within_hyperperiod :
    ∀ j t,
      j \in jobs_in_hyperperiod ts arr_seq t tsk →
      t ≤ job_arrival j < t + HP.

We show that the number of jobs in a hyperperiod starting at n1 × HP + O_max is the same as the number of jobs in a hyperperiod starting at n2 × HP + O_max given that n1 is less than or equal to n2.
  Lemma eq_size_hyp_lt :
    ∀ n1 n2,
      n1 ≤ n2 →
      size (jobs_in_hyperperiod ts arr_seq (n1 × HP + O_max) tsk)
      = size (jobs_in_hyperperiod ts arr_seq (n2 × HP + O_max) tsk).

We generalize the above lemma by lifting the condition on n1 and n2.
Consider any two jobs j1 and j2 that stem from the arrival sequence arr_seq such that j1 is of task tsk.
  Variable j1 : Job.
  Variable j2 : Job.
  Hypothesis H_j1_from_arr_seq : arrives_in arr_seq j1.
  Hypothesis H_j2_from_arr_seq : arrives_in arr_seq j2.
  Hypothesis H_j1_task : job_task j1 = tsk.

Assume that both j1 and j2 arrive after O_max.
We show that any job j that arrives in task arrivals in the same hyperperiod as j2 also arrives in task arrivals up to job_arrival j2 + HP.
We show that job j1 arrives in its own hyperperiod.
We show that the corresponding_job_in_hyperperiod of j1 in j2's hyperperiod arrives in task arrivals up to job_arrival j2 + HP.
Finally, we show that the corresponding_job_in_hyperperiod of j1 in j2's hyperperiod arrives in the arrival sequence arr_seq.

Jobs in Adjacent Hyperperiods

Consider periodic tasks, their jobs, ...
  Context {Task : TaskType} `{PeriodicModel Task}.
  Context {Job : JobType} `{JobTask Job Task} `{JobArrival Job}.

... and a valid arrival sequence of such jobs.
Consider a given task set ...
  Variable ts : TaskSet Task.

... and any valid periodic task in this set.
  Variable tsk : Task.
  Hypothesis H_task_in_ts : tsk \in ts.
  Hypothesis H_valid_period : valid_period tsk.
  Hypothesis H_periodic_task : respects_periodic_task_model arr_seq tsk.

Trivially, the hyperperiod can be expressed in terms of the task's period.
By definition, the task stays the same going forwards ...
  Lemma next_hyperperiod_job_task :
    ∀ j,
      job_task (next_hyperperiod_job ts arr_seq j) = job_task j.

... and also backwards.
  Lemma prev_hyperperiod_job_task :
    ∀ j,
      job_task (prev_hyperperiod_job ts arr_seq j) = job_task j.

The list of task-specific arrivals is a singleton list.
  Local Fact prev_next_hyperperiod_job_selection :
    ∀ j j' t,
      arrives_in arr_seq j' →
      job_task j = tsk →
      job_task j' = tsk →
      job_arrival j' = t →
      [seq j'' <- arr_seq t | same_task j'' j] = [::j'].

We can identify the next job based on its arrival time.
  Lemma next_hyperperiod_job_from_arrival :
    ∀ j j',
      arrives_in arr_seq j' →
      job_task j = tsk →
      job_task j' = tsk →
      job_arrival j' = job_arrival j + hyperperiod ts →
      next_hyperperiod_job ts arr_seq j = j'.

We can also identify the previous job based on its arrival time.
  Lemma prev_hyperperiod_job_from_arrival :
    ∀ j j',
      arrives_in arr_seq j' →
      job_task j = tsk →
      job_task j' = tsk →
      job_arrival j' = job_arrival j - hyperperiod ts →
      prev_hyperperiod_job ts arr_seq j = j'.

Forward Correspondence


  Section ForwardCorrespondence.

Suppose tsk releases jobs indefinitely.
    Hypothesis H_infinite_jobs : infinite_jobs arr_seq tsk.

Consider any job of the task under analysis.
    Variable j : Job.
    Hypothesis H_arrives : arrives_in arr_seq j.
    Hypothesis H_tsk : job_task j = tsk.

We establish some basic facts about the "matching" job in the next hyperperiod in one go, which we then expose as individual facts.
    Local Fact next_hyperperiod_job_properties :
      let
        j' := next_hyperperiod_job ts arr_seq j
      in
      [/\ arrives_in arr_seq j'
       , job_task j' = tsk
       , job_arrival j' = job_arrival j + hyperperiod ts
       & job_index arr_seq j' = job_index arr_seq j + jobs_per_hyperperiod ts tsk].

The successor belongs to the arrival sequence, ...
... has an arrival time exactly one hyperperiod apart, ...
... and the obvious job index.
The "prev" and "next" operations cancel out.

Backward Correspondence


  Section BackwardCorrespondence.

Consider a job of the task with at least one hyperperiod's worth of earlier releases.
    Variable j : Job.
    Hypothesis H_arrives : arrives_in arr_seq j.
    Hypothesis H_tsk : job_task j = tsk.
    Hypothesis H_index : jobs_per_hyperperiod ts tsk ≤ job_index arr_seq j.

We establish the properties of the matching job in the previous hyperperiod together, then expose them individually.
The predecessor belongs to the arrival sequence, ...
... arrives exactly one hyperperiod earlier, ...
... and has the preceding hyperperiod's job index.
The "next" and "prev" operations cancel out.

Workload in a Hyperperiod

The task parameters bound the work released in any hyperperiod.
Consider periodic tasks with worst-case execution costs ...
  Context {Task : TaskType} `{PeriodicModel Task} `{TaskCost Task}.

... and their jobs.
  Context {Job : JobType} `{JobTask Job Task} `{JobArrival Job} `{JobCost Job}.

Consider a given set of such periodic tasks ...
  Variable ts : TaskSet Task.
  Hypothesis H_valid_periods : valid_periods ts.

... and a corresponding valid arrival sequence.
If task WCETs bound the execution requirements of arriving jobs, ...
... then the total workload in any hyperperiod-sized interval is upper-bounded by the hyperperiod workload.