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 Export prosa.model.processor.platform_properties.(** * Supply *)(** In this file, we establish properties of the notion of supply. *)(** We start with a few basic facts about supply. *)SectionBasicFacts.(** Consider any type of jobs, ... *)Context {Job : JobType}.(** ... any kind of processor state model, ... *)Context `{PState : ProcessorState Job}.(** ... and any schedule. *)Variablesched : schedule PState.(** First, we leverage the property [service_on_le_supply_on] to show that [service_at j t] is always bounded by [supply_at t]. *)
forall (j : Job) (t : instant),
service_at sched j t <= supply_at sched t
bymove=> j t; apply: leq_sum => c _; apply service_on_le_supply_on.Qed.(** As a corollary, it is easy to show that if a job receives service at a time instant [t], then the supply at this time instant is positive. *)
forall (j : Job) (t : instant),
0 < service_at sched j t -> 0 < supply_at sched t
bymove=> j t; rewrite (leqRW (service_at_le_supply_at _ _)).Qed.(** Next, we show that, at any time instant [t], either there is some supply available or it is a blackout time. *)
forallt : instant,
is_blackout sched t \/ has_supply sched t
byrewrite /is_blackout; move=> t; case: (has_supply).Qed.EndBasicFacts.(** As a common special case, we establish facts about schedules in which supply is either 0 or 1 at all times. *)SectionUnitService.(** Consider any type of jobs, ... *)Context {Job : JobType}.(** ... any kind of unit-supply processor state model, ... *)Context `{PState : ProcessorState Job}.HypothesisH_unit_supply_proc_model : unit_supply_proc_model PState.(** ... and any schedule. *)Variablesched : schedule PState.(** We show that, under the unit-supply assumption, [supply_at t] is equal to [1 - is_blackout t] for any time instant [t]. *)
supply_during sched t (t + d) <=
\sum_(t <= i < t + d) 1
byapply: leq_sum => t0 _; apply supply_at_le_1.Qed.(** We observe that the supply during an interval can be decomposed into the last instant and the rest of the interval. *)
bymove => t1 t2 LEQ; rewrite /supply_during big_nat_recr //=.Qed.(** Finally, we show that the blackout during a time interval <<[t, t + δ)>> is equal to the difference between [δ] and the supply during <<[t, t + δ)>>. *)
byrewrite -addn1 subnACA ?supply_during_bound; lia.Qed.EndUnitService.(** Lastly, we prove one lemma about supply in the case of the fully supply-consuming processor model. *)SectionConsumedSupply.(** Consider any type of jobs, ... *)Context {Job : JobType}.(** ... any kind of fully supply-consuming processor state model, ... *)Context `{PState : ProcessorState Job}.HypothesisH_supply_is_fully_consumed : fully_consuming_proc_model PState.(** ... and any schedule. *)Variablesched : schedule PState.(** The fact that a job [j] is scheduled at a time instant [t] and there is a supply at [t] implies that the job receives service at time [t]. *)
forall (j : Job) (t : instant),
has_supply sched t ->
scheduled_at sched j t -> 0 < service_at sched j t
bymove => j t SUP SCHED; rewrite H_supply_is_fully_consumed.Qed.EndConsumedSupply.(** We add some of the above lemmas to the "Hint Database" [basic_rt_facts], so the [auto] tactic will be able to use them. *)GlobalHint Resolve
supply_at_le_1
: basic_rt_facts.