From ee05f255e29676ad79e07b5d6cc59dc66cd7fcb7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Brandenburg?= <bbb@mpi-sws.org>
Date: Sat, 21 Dec 2019 01:52:12 +0100
Subject: [PATCH] Add periodic task model

---
 model/task/arrival/periodic.v | 126 ++++++++++++++++++++++++++++++++++
 1 file changed, 126 insertions(+)
 create mode 100644 model/task/arrival/periodic.v

diff --git a/model/task/arrival/periodic.v b/model/task/arrival/periodic.v
new file mode 100644
index 000000000..8d582923a
--- /dev/null
+++ b/model/task/arrival/periodic.v
@@ -0,0 +1,126 @@
+Require Export prosa.model.task.arrival.sporadic.
+
+(** * The Periodic Task Model *)
+
+(** In the following, we define the classic Liu & Layland arrival process,
+    i.e., the arrival process commonly known as the _periodic task model_,
+    wherein the arrival times of consecutive jobs of a periodic task are
+    separated by the task's _period_. *)
+
+(** ** Task Model Parameter for Periods *)
+
+(** Under the periodic task model, each task is characterized by its period,
+    which we denote as [task_period]. *)
+
+Class PeriodicModel (Task : TaskType) := task_period : Task -> duration.
+
+(** ** Model Validity *)
+
+(** Next, we define the semantics of the periodic task model. *)
+Section ValidPeriodicTaskModel.
+  (** Consider any type of periodic tasks. *)
+  Context {Task : TaskType} `{PeriodicModel Task}.
+
+  (** A valid periodic task has a non-zero period. *)
+  Definition valid_period tsk := task_period tsk > 0.
+
+  (** Further, in the context of a set of periodic tasks, ... *)
+  Variable ts : TaskSet Task.
+
+  (** ... every task in the set must have a  valid period. *)
+  Definition valid_periods := forall tsk : Task, tsk \in ts -> valid_period tsk.
+
+  (** Next, consider any type of jobs stemming from these tasks ... *)
+  Context {Job : JobType} `{JobTask Job Task} `{JobArrival Job}.
+
+  (** ... and an arbitrary arrival sequence of such jobs. *)
+  Variable arr_seq : arrival_sequence Job.
+
+  (** We say that a task respects the periodic task model if the arrivals of
+      its jobs in the arrival sequence are separated by integer multiples of
+      the period. *)
+  Definition respects_periodic_task_model (tsk : Task) :=
+    forall (j j': Job),
+      (** Given two different jobs j and j' ... *)
+      j <> j' ->
+      (** ...that belong to the arrival sequence... *)
+      arrives_in arr_seq j ->
+      arrives_in arr_seq j' ->
+      (** ... and that stem from the given task, ... *)
+      job_task j = tsk ->
+      job_task j' = tsk ->
+      (** ... if [j] arrives no later than [j'] ...,  *)
+      job_arrival j <= job_arrival j' ->
+      (** ... then the arrivals of [j] and [j'] are separated by an integer
+          multiple of [task_period tsk]. *)
+      exists n, n > 0 /\ job_arrival j' =  (n * task_period tsk) + job_arrival j.
+
+  (** Every task in a set of periodic tasks must satisfy the above
+      criterion. *)
+  Definition taskset_respects_periodic_task_model :=
+    forall tsk, tsk \in ts -> respects_periodic_task_model tsk.
+
+End ValidPeriodicTaskModel.
+
+(** ** Treating Periodic Tasks as Sporadic Tasks *)
+
+(** Since the periodic-arrivals assumption is stricter than the
+    sporadic-arrivals assumption (i.e., any periodic arrival sequence is also a
+    valid sporadic arrivals sequence), it is sometimes convenient to apply
+    analyses for sporadic tasks to periodic tasks. We therefore provide an
+    automatic "conversion" of periodic tasks to sporadic tasks, i.e., we tell
+    Coq that it may use a periodic task's [task_period] parameter also as the
+    task's minimum inter-arrival time [task_min_inter_arrival_time]
+    parameter. *)
+
+Section PeriodicTasksAsSporadicTasks.
+  (** Any type of periodic tasks ... *)
+  Context {Task : TaskType} `{PeriodicModel Task}.
+
+  (** ... and their corresponding jobs ... *)
+  Context {Job : JobType} `{JobTask Job Task} `{JobArrival Job}.
+
+  (** ... may be interpreted as a type of sporadic tasks by using each task's
+      period as its minimum inter-arrival time ... *)
+  Global Instance periodic_as_sporadic : SporadicModel Task :=
+    {
+      task_min_inter_arrival_time := task_period
+    }.
+
+  (** ... such that the model interpretation is valid, both w.r.t. the minimum
+      inter-arrival time parameter ... *)
+  Remark valid_period_is_valid_inter_arrival_time:
+    forall tsk, valid_period tsk -> valid_task_min_inter_arrival_time tsk.
+  Proof. trivial. Qed.
+
+  (** ... and the separation of job arrivals. *)
+  Remark periodic_task_respects_sporadic_task_model:
+    forall arr_seq tsk,
+      respects_periodic_task_model arr_seq tsk -> respects_sporadic_task_model arr_seq tsk.
+  Proof.
+    move=> arr_seq tsk PERIODIC j j' NOT_EQ ARR_j ARR_j' TSK_j TSK_j' ORDER.
+    rewrite /task_min_inter_arrival_time /periodic_as_sporadic.
+    have PERIOD_MULTIPLE:  exists n, n > 0 /\ job_arrival j' =  (n * task_period tsk) + job_arrival j
+        by apply PERIODIC => //.
+    move: PERIOD_MULTIPLE => [n [GT0 ->]].
+    rewrite addnC leq_add2r.
+    by apply leq_pmull.
+  Qed.
+
+  (** For convenience, we state these obvious correspondences also at the level
+      of entire task sets. *)
+  Remark valid_periods_are_valid_inter_arrival_times:
+    forall ts, valid_periods ts -> valid_taskset_inter_arrival_times ts.
+  Proof. trivial. Qed.
+
+  Remark periodic_task_sets_respect_sporadic_task_model:
+    forall ts arr_seq,
+      taskset_respects_periodic_task_model ts arr_seq ->
+      taskset_respects_sporadic_task_model ts arr_seq.
+  Proof.
+    move=> ? ? PERIODIC ? ?.
+    apply periodic_task_respects_sporadic_task_model.
+    by apply PERIODIC.
+  Qed.
+
+End PeriodicTasksAsSporadicTasks.
-- 
GitLab