From fa41e214df44f76c40c5a287671956fa7b048973 Mon Sep 17 00:00:00 2001
From: kimaya <f20171026@goa.bits-pilani.ac.in>
Date: Thu, 14 Apr 2022 11:28:13 +0200
Subject: [PATCH] add alternate interpretation of numeric priorities

To complement the existing interpretation, add one more instance of
numeric fixed priority that assigns higher priority to lower numeric
values.
---
 model/priority/numeric_fixed_priority.v | 83 ++++++++++++++++++++-----
 1 file changed, 67 insertions(+), 16 deletions(-)

diff --git a/model/priority/numeric_fixed_priority.v b/model/priority/numeric_fixed_priority.v
index 7f5c73e10..217c11a72 100644
--- a/model/priority/numeric_fixed_priority.v
+++ b/model/priority/numeric_fixed_priority.v
@@ -11,14 +11,62 @@ Require Export prosa.model.priority.classes.
     to a numeric priority value. *)
 Class TaskPriority (Task : TaskType) := task_priority : Task -> nat.
 
-(** Based on this parameter, we define the corresponding FP policy. *)
-Instance NumericFP (Task : TaskType) `{TaskPriority Task} : FP_policy Task :=
-{
-  hep_task (tsk1 tsk2 : Task) := task_priority tsk1 >= task_priority tsk2
-}.
+(** Based on this parameter, we define two corresponding FP policies. In one
+    instance, a lower numeric value indicates lower priority, while in the other
+    instance, a lower numeric value indicates higher priority. Both these
+    interpretations can be found in practice and in the literature. For example,
+    Linux uses "higher numeric value <-> higher priority", whereas many papers
+    assume "lower numeric value <-> higher priority". *)
 
-(** In this section, we prove a few basic properties of numeric fixed priorities. *)
-Section Properties.
+(** In this section, we define ascending numeric fixed priorities, where a
+    larger numeric value indicates higher priority, and note some trivial facts
+    about this interpretation of priority values. *)
+Section PropertiesNFPA.
+
+  (** The instance [NumericFPAscending] assigns higher priority to tasks with
+      higher numeric [task_priority] value. *)
+  #[local] Instance NumericFPAscending (Task : TaskType) `{TaskPriority Task} : FP_policy Task :=
+    {
+      hep_task (tsk1 tsk2 : Task) := task_priority tsk1 >= task_priority tsk2
+    }.
+
+  (**  Consider any kind of tasks with specified priorities... *)
+  Context {Task : TaskType}.
+  Context `{TaskPriority Task}.
+
+  (** ...and jobs stemming from these tasks. *)
+  Context {Job : JobType}.
+  Context `{JobTask Job Task}.
+
+  (** The resulting priority policy is reflexive. *)
+  Lemma NFPA_is_reflexive : reflexive_priorities.
+  Proof.  by move=> ?; rewrite /hep_job_at /JLFP_to_JLDP /hep_job /FP_to_JLFP /hep_task /NumericFPAscending. Qed.
+
+  (** The resulting priority policy is transitive. *)
+  Lemma NFPA_is_transitive : transitive_priorities.
+  Proof.
+    move=> t y x z.
+    rewrite /hep_job_at /JLFP_to_JLDP /hep_job /FP_to_JLFP /hep_task /NumericFPAscending.
+    by move=> PRIO_yx PRIO_zy; apply leq_trans with (n := task_priority (job_task y)).
+  Qed.
+
+  (** The resulting priority policy is total. *)
+  Lemma NFPA_is_total : total_priorities.
+  Proof. by move=> t j1 j2; apply leq_total. Qed.
+
+End PropertiesNFPA.
+
+(** Next, we define descending numeric fixed priorities, where a larger numeric
+    value indicates lower priority, and again note some trivial facts about this
+    alternate interpretation of priority values. *)
+Section PropertiesNFPD.
+
+  (** The instance [NumericFPDescending] assigns lower priority to tasks with
+      higher numeric [task_priority] value. *)
+  #[local] Instance NumericFPDescending (Task : TaskType) `{TaskPriority Task} : FP_policy Task :=
+    {
+      hep_task (tsk1 tsk2 : Task) := task_priority tsk1 <= task_priority tsk2
+    }.
 
   (**  Consider any kind of tasks with specified priorities... *)
   Context {Task : TaskType}.
@@ -29,28 +77,31 @@ Section Properties.
   Context `{JobTask Job Task}.
 
   (** The resulting priority policy is reflexive. *)
-  Lemma NFP_is_reflexive : reflexive_priorities.
-  Proof. by move=> ?; rewrite /hep_job_at /JLFP_to_JLDP /hep_job /FP_to_JLFP /hep_task /NumericFP. Qed.
+  Lemma NFPD_is_reflexive : reflexive_priorities.
+  Proof.  by  move=> ?; rewrite /hep_job_at /JLFP_to_JLDP /hep_job /FP_to_JLFP /hep_task /NumericFPDescending. Qed.
 
   (** The resulting priority policy is transitive. *)
-  Lemma NFP_is_transitive : transitive_priorities.
+  Lemma NFPD_is_transitive : transitive_priorities.
   Proof.
     move=> t y x z.
-    rewrite /hep_job_at /JLFP_to_JLDP /hep_job /FP_to_JLFP /hep_task /NumericFP.
+    rewrite /hep_job_at /JLFP_to_JLDP /hep_job /FP_to_JLFP /hep_task /NumericFPDescending.
     by move=> PRIO_yx PRIO_zy; apply leq_trans with (n := task_priority (job_task y)).
   Qed.
 
   (** The resulting priority policy is total. *)
-  Lemma NFP_is_total : total_priorities.
+  Lemma NFPD_is_total : total_priorities.
   Proof. by move=> t j1 j2; apply leq_total. Qed.
 
-End Properties.
+End PropertiesNFPD.
 
 (** We add the above lemmas into a "Hint Database" basic_rt_facts, so Coq
     will be able to apply them automatically. *)
 Global Hint Resolve
-     NFP_is_reflexive
-     NFP_is_transitive
-     NFP_is_total
+     NFPA_is_reflexive
+     NFPA_is_transitive
+     NFPA_is_total
+     NFPD_is_reflexive
+     NFPD_is_transitive
+     NFPD_is_total
   : basic_rt_facts.
 
-- 
GitLab