Built with Alectryon, running Coq+SerAPI v8.20.0+0.20.0. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file ssrmatching_plugin.cmxs (using legacy method) ... done]
[Loading ML file ssreflect_plugin.cmxs (using legacy method) ... done]
[Loading ML file ring_plugin.cmxs (using legacy method) ... done]
Serlib plugin: coq-elpi.elpi is not available: serlib support is missing.
Incremental checking for commands in this plugin will be impacted.
[Loading ML file coq-elpi.elpi ... done]
[Loading ML file zify_plugin.cmxs (using legacy method) ... done]
[Loading ML file micromega_core_plugin.cmxs (using legacy method) ... done]
[Loading ML file micromega_plugin.cmxs (using legacy method) ... done]
[Loading ML file btauto_plugin.cmxs (using legacy method) ... done]
Notation"_ + _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Notation"_ - _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Notation"_ <= _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Notation"_ < _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Notation"_ >= _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Notation"_ > _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Notation"_ <= _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing,default]
Notation"_ < _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing,default]
Notation"_ <= _ < _" was already used in scope
nat_scope. [notation-overridden,parsing,default]
Notation"_ < _ < _" was already used in scope
nat_scope. [notation-overridden,parsing,default]
Notation"_ * _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Require Import prosa.model.task.absolute_deadline.(** * Schedulability *)(** In the following section we define the notion of schedulable task. *)SectionTask.(** Consider any type of tasks, ... *)Context {Task : TaskType}.(** ... any type of jobs associated with these tasks, ... *)Context {Job: JobType}.Context `{JobArrival Job}.Context `{JobCost Job}.Context `{JobDeadline Job}.Context `{JobTask Job Task}.(** ... and any kind of processor state. *)Context {PState : ProcessorState Job}.(** Consider any job arrival sequence... *)Variablearr_seq: arrival_sequence Job.(** ...and any schedule of these jobs. *)Variablesched: schedule PState.(** Let [tsk] be any task that is to be analyzed. *)Variabletsk: Task.(** Then, we say that R is a response-time bound of [tsk] in this schedule ... *)VariableR: duration.(** ... iff any job [j] of [tsk] in this arrival sequence has completed by [job_arrival j + R]. *)Definitiontask_response_time_bound :=
forallj,
arrives_in arr_seq j ->
job_of_task tsk j ->
job_response_time_bound sched j R.(** We say that a task is schedulable if all its jobs meet their deadline *)Definitionschedulable_task :=
forallj,
arrives_in arr_seq j ->
job_of_task tsk j ->
job_meets_deadline sched j.EndTask.(** In this section we infer schedulability from a response-time bound of a task. *)SectionSchedulability.(** Consider any type of tasks, ... *)Context {Task : TaskType}.Context `{TaskDeadline Task}.(** ... any type of jobs associated with these tasks, ... *)Context {Job: JobType}.Context `{JobArrival Job}.Context `{JobCost Job}.Context `{JobTask Job Task}.(** ... and any kind of processor state. *)Context {PState : ProcessorState Job}.(** Consider any job arrival sequence... *)Variablearr_seq: arrival_sequence Job.(** ...and any schedule of these jobs. *)Variablesched: schedule PState.(** Assume that jobs don't execute after completion. *)HypothesisH_completed_jobs_dont_execute: completed_jobs_dont_execute sched.(** Let [tsk] be any task that is to be analyzed. *)Variabletsk: Task.(** Given a response-time bound of [tsk] in this schedule no larger than its deadline, ... *)VariableR: duration.HypothesisH_R_le_deadline: R <= task_deadline tsk.HypothesisH_response_time_bounded: task_response_time_bound arr_seq sched tsk R.(** ...then [tsk] is schedulable. *)
byerewrite leq_trans; eauto.Qed.EndSchedulability.(** We further define two notions of "all deadlines met" that do not depend on a task abstraction: one w.r.t. all scheduled jobs in a given schedule and one w.r.t. all jobs that arrive in a given arrival sequence. *)SectionAllDeadlinesMet.(** Consider any given type of jobs... *)Context {Job : JobType}.Context `{JobArrival Job}.Context `{JobCost Job}.Context `{JobDeadline Job}.(** ... any given type of processor states. *)Context {PState: ProcessorState Job}.(** We say that all deadlines are met if every job scheduled at some point in the schedule meets its deadline. Note that this is a relatively weak definition since an "empty" schedule that is idle at all times trivially satisfies it (since the definition does not require any kind of work conservation). *)Definitionall_deadlines_met (sched: schedule PState) :=
foralljt,
scheduled_at sched j t ->
job_meets_deadline sched j.(** To augment the preceding definition, we also define an alternate notion of "all deadlines met" based on all jobs included in a given arrival sequence. *)SectionDeadlinesOfArrivals.(** Given an arbitrary job arrival sequence ... *)Variablearr_seq: arrival_sequence Job.(** ... we say that all arrivals meet their deadline if every job that arrives at some point in time meets its deadline. Note that this definition does not preclude the existence of jobs in a schedule that miss their deadline (e.g., if they stem from another arrival sequence). *)Definitionall_deadlines_of_arrivals_met (sched: schedule PState) :=
forallj,
arrives_in arr_seq j ->
job_meets_deadline sched j.EndDeadlinesOfArrivals.(** We observe that the latter definition, assuming a schedule in which all jobs come from the arrival sequence, implies the former definition. *)