diff --git a/analysis/facts/model/rbf.v b/analysis/facts/model/rbf.v index 94c44060a53cbc7dd1acb1b2081034e56f99390f..b328a868bd45ca7ab913404b08a2da2ed4cdb1b6 100644 --- a/analysis/facts/model/rbf.v +++ b/analysis/facts/model/rbf.v @@ -252,7 +252,7 @@ Section RequestBoundFunctions. [max_arrival tsk] is (1) an arrival bound of [tsk], and (2) it is a monotonic function that equals 0 for the empty interval delta = 0. *) Context `{MaxArrivals Task}. - Hypothesis H_valid_arrival_curve : valid_arrival_curve tsk (max_arrivals tsk). + Hypothesis H_valid_arrival_curve : valid_arrival_curve (max_arrivals tsk). Hypothesis H_is_arrival_curve : respects_max_arrivals arr_seq tsk (max_arrivals tsk). (** Let's define some local names for clarity. *) diff --git a/model/task/arrival/arrival_curve_to_rbf.v b/model/task/arrival/arrival_curve_to_rbf.v new file mode 100644 index 0000000000000000000000000000000000000000..c76073dfc02496ae701958a5834b76cf9208c31f --- /dev/null +++ b/model/task/arrival/arrival_curve_to_rbf.v @@ -0,0 +1,174 @@ +Require Export prosa.util.all. +Require Export prosa.model.task.arrival.request_bound_functions. +Require Export prosa.model.task.arrival.curves. + +(** * Converting an Arrival Curve + Worst-Case/Best-Case to a Request-Bound Function (RBF) *) + +(** Consider any type of tasks with a given cost ... *) +Context {Task : TaskType} `{TaskCost Task} `{TaskMinCost Task}. + +(** ... and any type of jobs associated with these tasks. *) +Context {Job : JobType} `{JobTask Job Task} `{JobCost Job}. + +(** In the following, we show a way to convert a given arrival curve, + paired with a worst-case/best-case execution time, to a request-bound function. + Definitions and proofs will handle both lower-bounding and upper-bounding arrival + curves. *) +Section ArrivalCurveToRBF. + + (** Let [MaxArr] and [MinArr] represent two arrivals curves. [MaxArr] upper-bounds + the possible number or arrivals for a given task, whereas [MinArr] lower-bounds it. *) + Context `{MaxArr : MaxArrivals Task} `{MinArr : MinArrivals Task}. + + (** We define the conversion to a request-bound function as the product of the task cost and the + number of arrivals during [Δ]. In the upper-bounding case, the cost of a task will represent + the WCET of its jobs. Symmetrically, in the lower-bounding case, the cost of a task will + represent the BCET of its jobs. *) + Definition task_max_rbf (arrivals : Task -> duration -> nat) task Δ := task_cost task * arrivals task Δ. + Definition task_min_rbf (arrivals : Task -> duration -> nat) task Δ := task_min_cost task * arrivals task Δ. + + (** Finally, we show that the newly defined functions are indeed request-bound functions. *) + Global Program Instance MaxArrivalsRBF : MaxRequestBound Task := task_max_rbf max_arrivals. + Global Program Instance MinArrivalsRBF : MinRequestBound Task := task_min_rbf min_arrivals. + + (** In the following section, we prove that the transformation yields a request-bound + function that conserves correctness properties in both the upper-bounding + and lower-bounding cases. *) + Section Facts. + + (** First, we establish the validity of the transformation for a single, given task. *) + Section SingleTask. + + (** Consider an arbitrary task [tsk] ... *) + Variable tsk : Task. + + (** ... and any job arrival sequence. *) + Variable arr_seq : arrival_sequence Job. + + (** First, note that any valid upper-bounding arrival curve, after being + converted, is a valid request-bound function. *) + Theorem valid_arrival_curve_to_max_rbf: + forall (arrivals : Task -> duration -> nat), + valid_arrival_curve (arrivals tsk) -> + valid_request_bound_function ((task_max_rbf arrivals) tsk). + Proof. + move => ARR [ZERO MONO]. + split. + - by rewrite /task_max_rbf ZERO muln0. + - move => x y LEQ. + rewrite /task_max_rbf. + destruct (task_cost tsk); first by rewrite mul0n. + by rewrite leq_pmul2l //; apply MONO. + Qed. + + (** The same idea can be applied in the lower-bounding case. *) + Theorem valid_arrival_curve_to_min_rbf: + forall (arrivals : Task -> duration -> nat), + valid_arrival_curve (arrivals tsk) -> + valid_request_bound_function ((task_min_rbf arrivals) tsk). + Proof. + move => ARR [ZERO MONO]. + split. + - by rewrite /task_min_rbf ZERO muln0. + - move => x y LEQ. + rewrite /task_min_rbf. + destruct (task_min_cost tsk); first by rewrite mul0n. + by rewrite leq_pmul2l //; apply MONO. + Qed. + + (** Next, we prove that the task respects the request-bound function in + the upper-bounding case. Note that, for this to work, we assume that the + cost of tasks upper-bounds the cost of the jobs belonging to them (i.e., + the task cost is the worst-case). *) + Theorem respects_arrival_curve_to_max_rbf: + jobs_have_valid_job_costs -> + respects_max_arrivals arr_seq tsk (MaxArr tsk) -> + respects_max_request_bound arr_seq tsk ((task_max_rbf MaxArr) tsk). + Proof. + move=> TASK_COST RESPECT t1 t2 LEQ. + specialize (RESPECT t1 t2 LEQ). + apply leq_trans with (n := task_cost tsk * number_of_task_arrivals arr_seq tsk t1 t2) => //. + - rewrite /max_arrivals /number_of_task_arrivals -sum1_size big_distrr //= muln1 leq_sum_seq // => j. + rewrite mem_filter => /andP [/eqP TSK _] _. + rewrite -TSK. + by apply TASK_COST. + - by destruct (task_cost tsk) eqn:C; rewrite /task_max_rbf C // leq_pmul2l. + Qed. + + (** Finally, we prove that the task respects the request-bound function also in + the lower-bounding case. This time, we assume that the cost of tasks lower-bounds + the cost of the jobs belonging to them. (i.e., the task cost is the best-case). *) + Theorem respects_arrival_curve_to_min_rbf: + jobs_have_valid_min_job_costs -> + respects_min_arrivals arr_seq tsk (MinArr tsk) -> + respects_min_request_bound arr_seq tsk ((task_min_rbf MinArr) tsk). + Proof. + move=> TASK_COST RESPECT t1 t2 LEQ. + specialize (RESPECT t1 t2 LEQ). + apply leq_trans with (n := task_min_cost tsk * number_of_task_arrivals arr_seq tsk t1 t2) => //. + - by destruct (task_min_cost tsk) eqn:C; rewrite /task_min_rbf C // leq_pmul2l. + - rewrite /min_arrivals /number_of_task_arrivals -sum1_size big_distrr //= muln1 leq_sum_seq // => j. + rewrite mem_filter => /andP [/eqP TSK _] _. + rewrite -TSK. + by apply TASK_COST. + Qed. + + End SingleTask. + + (** Next, we lift the results to the previous section to an arbitrary task set. *) + Section TaskSet. + + (** Let [ts] be an arbitrary task set... *) + Variable ts : TaskSet Task. + + (** ... and consider any job arrival sequence. *) + Variable arr_seq : arrival_sequence Job. + + (** First, we generalize the validity of the transformation to a task set both in + the upper-bounding case ... *) + Corollary valid_taskset_arrival_curve_to_max_rbf: + valid_taskset_arrival_curve ts MaxArr -> + valid_taskset_request_bound_function ts MaxArrivalsRBF. + Proof. + move=> VALID tsk IN. + specialize (VALID tsk IN). + by apply valid_arrival_curve_to_max_rbf. + Qed. + + (** ... and in the lower-bounding case. *) + Corollary valid_taskset_arrival_curve_to_min_rbf: + valid_taskset_arrival_curve ts MinArr -> + valid_taskset_request_bound_function ts MinArrivalsRBF. + Proof. + move=> VALID tsk IN. + specialize (VALID tsk IN). + by apply valid_arrival_curve_to_min_rbf. + Qed. + + (** Second, we show that a task set that respects a given arrival curve also respects + the produced request-bound function, lifting the result obtained in the single-task + case. The result is valid in the upper-bounding case... *) + Corollary taskset_respects_arrival_curve_to_max_rbf: + jobs_have_valid_job_costs -> + taskset_respects_max_arrivals arr_seq ts -> + taskset_respects_max_request_bound arr_seq ts. + Proof. + move=> TASK_COST SET_RESPECTS tsk IN. + by apply respects_arrival_curve_to_max_rbf, SET_RESPECTS. + Qed. + + (** ...as well as in the lower-bounding case. *) + Corollary taskset_respects_arrival_curve_to_min_rbf: + jobs_have_valid_min_job_costs -> + taskset_respects_min_arrivals arr_seq ts -> + taskset_respects_min_request_bound arr_seq ts. + Proof. + move=> TASK_COST SET_RESPECTS tsk IN. + by apply respects_arrival_curve_to_min_rbf, SET_RESPECTS. + Qed. + + End TaskSet. + + End Facts. + +End ArrivalCurveToRBF. diff --git a/model/task/arrival/curves.v b/model/task/arrival/curves.v index b8138bf2242bfbaa42f543f9291d98aaf2dfbd3f..4a49aa79e8be8f42ff6356c5310a5271e2e18051 100644 --- a/model/task/arrival/curves.v +++ b/model/task/arrival/curves.v @@ -60,7 +60,7 @@ Section ArrivalCurves. (** We say that a given curve [num_arrivals] is a valid arrival curve for task [tsk] iff [num_arrivals] is a monotonic function that equals 0 for the empty interval [delta = 0]. *) - Definition valid_arrival_curve (tsk : Task) (num_arrivals : duration -> nat) := + Definition valid_arrival_curve (num_arrivals : duration -> nat) := num_arrivals 0 = 0 /\ monotone num_arrivals leq. @@ -134,7 +134,7 @@ Section ArrivalCurvesModel. (** We say that [arrivals] is a valid arrival curve for a task set if it is valid for any task in the task set *) Definition valid_taskset_arrival_curve (arrivals : Task -> duration -> nat) := - forall (tsk : Task), tsk \in ts -> valid_arrival_curve tsk (arrivals tsk). + forall (tsk : Task), tsk \in ts -> valid_arrival_curve (arrivals tsk). (** Finally, we lift the per-task semantics of the respective arrival and separation curves to the entire task set. *) diff --git a/model/task/arrivals.v b/model/task/arrivals.v index 400721e5350762fb887a34ee7431b63e2c83060d..8c10fd472c2d552332cb1a96bf530abc51034328 100644 --- a/model/task/arrivals.v +++ b/model/task/arrivals.v @@ -43,7 +43,7 @@ Section TaskArrivals. (** ... and also count the cost of job arrivals. *) Definition cost_of_task_arrivals (t1 t2 : instant) := - \sum_(j <- task_arrivals_between t1 t2 | job_task j == tsk) job_cost j. + \sum_(j <- task_arrivals_between t1 t2) job_cost j. End TaskArrivals. diff --git a/model/task/concept.v b/model/task/concept.v index 2de3aec8290793ce107c928334a4a70d1ad3938e..c255a7bc18d1f0cc90f0648a869cb5312e03d8f7 100644 --- a/model/task/concept.v +++ b/model/task/concept.v @@ -26,6 +26,10 @@ Class TaskDeadline (Task : TaskType) := task_deadline : Task -> duration. execution cost (WCET). *) Class TaskCost (Task : TaskType) := task_cost : Task -> duration. +(** And finally, we define a task-model parameter to express each task's best-case + execution cost (BCET). *) +Class TaskMinCost (Task : TaskType) := task_min_cost : Task -> duration. + (** * Task Model Validity *) @@ -33,9 +37,10 @@ Class TaskCost (Task : TaskType) := task_cost : Task -> duration. model must satisfy. *) Section ModelValidity. - (** Consider any type of tasks with WCETs and relative deadlines. *) + (** Consider any type of tasks with WCETs/BCETs and relative deadlines. *) Context {Task : TaskType}. Context `{TaskCost Task}. + Context `{TaskMinCost Task}. Context `{TaskDeadline Task}. (** First, we constrain the possible WCET values of a valid task. *) @@ -67,7 +72,11 @@ Section ModelValidity. Definition valid_job_cost j := job_cost j <= task_cost (job_task j). - (** ... and any arrival sequence. *) + (** Every job have a valid job cost *) + Definition jobs_have_valid_job_costs := + forall j, valid_job_cost j. + + (** Next, consider any arrival sequence. *) Variable arr_seq : arrival_sequence Job. (** The cost of a job from the arrival sequence cannot @@ -78,6 +87,36 @@ Section ModelValidity. valid_job_cost j. End ValidJobCost. + + (** Third, we relate the cost of a task's jobs to its BCET. *) + Section ValidMinJobCost. + + (** Consider any type of jobs associated with the tasks ... *) + Context {Job : JobType}. + Context `{JobTask Job Task}. + (** ... and consider the cost of each job. *) + Context `{JobCost Job}. + + (** The cost of any job [j] cannot be less than the BCET of its respective + task. *) + Definition valid_min_job_cost j := + task_min_cost (job_task j) <= job_cost j. + + (** Every job have a valid job cost *) + Definition jobs_have_valid_min_job_costs := + forall j, valid_min_job_cost j. + + (** Next, consider any arrival sequence. *) + Variable arr_seq : arrival_sequence Job. + + (** The cost of a job from the arrival sequence cannot + be less than the task cost. *) + Definition arrivals_have_valid_min_job_costs := + forall j, + arrives_in arr_seq j -> + valid_min_job_cost j. + + End ValidMinJobCost. End ModelValidity. diff --git a/scripts/wordlist.pws b/scripts/wordlist.pws index 4e3df729c7a88eedbc616172f468b22cf377cea3..873a2fac99b0aa37cceb17573ba5bbd9dfb5953e 100644 --- a/scripts/wordlist.pws +++ b/scripts/wordlist.pws @@ -38,6 +38,8 @@ RBF RBFs WCET WCETs +BCET +BCETs Layland Liu sequentiality