Claire Dross
8 years ago
3 changed files with 385 additions and 0 deletions
@ -0,0 +1,8 @@ |
|||||||
|
package body MMS.F_PT.F_MM.Behavior.Guarantees with SPARK_Mode is |
||||||
|
|
||||||
|
procedure Run is |
||||||
|
begin |
||||||
|
MMS.F_PT.F_MM.Behavior.Run; |
||||||
|
end Run; |
||||||
|
|
||||||
|
end MMS.F_PT.F_MM.Behavior.Guarantees; |
@ -0,0 +1,58 @@ |
|||||||
|
-- This package provides a wrapper above MMS.F_PT.F_MM.Behavior.Run which |
||||||
|
-- is used to verify in SPARK that high level guarantees on F_MM are implied |
||||||
|
-- by its behavioural specification. |
||||||
|
|
||||||
|
package MMS.F_PT.F_MM.Behavior.Guarantees with SPARK_Mode is |
||||||
|
pragma Unevaluated_Use_Of_Old (Allow); |
||||||
|
|
||||||
|
----------------------------------- |
||||||
|
-- High-Level Properties on F_MM -- |
||||||
|
----------------------------------- |
||||||
|
|
||||||
|
function In_Take_Off_State return Boolean is |
||||||
|
(Power_State = On |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = TAKE_OFF); |
||||||
|
|
||||||
|
function Energy_Check_Succeed return Boolean is |
||||||
|
(Power_State = ON |
||||||
|
and then On_State = INIT |
||||||
|
and then Energy_Compatible_With_Mission); |
||||||
|
|
||||||
|
function Energy_Check_Fail return Boolean is |
||||||
|
(Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = CRUISE |
||||||
|
and then not Energy_Compatible_With_Mission); |
||||||
|
|
||||||
|
function Mission_Cancelled return Boolean is |
||||||
|
(Power_State = On |
||||||
|
and then On_State = CANCELLED); |
||||||
|
|
||||||
|
----------------------------------- |
||||||
|
-- High-Level Garantees for F_MM -- |
||||||
|
----------------------------------- |
||||||
|
|
||||||
|
procedure Run with |
||||||
|
Post => |
||||||
|
|
||||||
|
-- 6.6.3.A Viability guarantee: no take-off if energy aboard is |
||||||
|
-- incompatible with mission completion. |
||||||
|
|
||||||
|
(if In_Take_Off_State and then not In_Take_Off_State'Old then |
||||||
|
Energy_Check_Succeed'Old) |
||||||
|
|
||||||
|
-- 6.6.3.B Any mission cancellation is signaled to CP and GS. |
||||||
|
|
||||||
|
and then |
||||||
|
(if Mission_Cancelled and then not Mission_Cancelled'Old then |
||||||
|
Mission_Cancellation_Signaled) |
||||||
|
|
||||||
|
-- 6.6.3.2.A Missions cancelled for energy reasons can be proven |
||||||
|
-- infeasible. |
||||||
|
|
||||||
|
and then |
||||||
|
(if Mission_Cancelled and then not Mission_Cancelled'Old then |
||||||
|
Energy_Check_Fail'Old); |
||||||
|
|
||||||
|
end MMS.F_PT.F_MM.Behavior.Guarantees; |
@ -0,0 +1,319 @@ |
|||||||
|
-- This package provides the behavioural specification of F_MM. It is |
||||||
|
-- expressed as a contract on a Run procedure which reprents the modifications |
||||||
|
-- performed on the state State of F_MM at each cycle of the functionality. |
||||||
|
-- We write the contract using a Contract_Cases and we use SPARK to ensure |
||||||
|
-- that: |
||||||
|
-- - Information about the current State of the module are only accessed |
||||||
|
-- when it makes sense (represented as preconditions over accessors). |
||||||
|
-- - A single behaviour is specified for each case in the specification. |
||||||
|
-- - There is a behaviour is specified for every case in the specification. |
||||||
|
|
||||||
|
package MMS.F_PT.F_MM.Behavior with |
||||||
|
SPARK_Mode, |
||||||
|
Abstract_State => State |
||||||
|
is |
||||||
|
pragma Unevaluated_Use_Of_Old (Allow); |
||||||
|
|
||||||
|
----------------------------------------- |
||||||
|
-- States of the automaton in Figure 3 -- |
||||||
|
----------------------------------------- |
||||||
|
|
||||||
|
type Power_State_Type is (ON, OFF); |
||||||
|
|
||||||
|
function Power_State return Power_State_Type with |
||||||
|
Global => State; |
||||||
|
|
||||||
|
type On_State_Type is (INIT, RUNNING, CANCELLED, COMPLETE, ABORTED); |
||||||
|
|
||||||
|
function On_State return On_State_Type with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON; |
||||||
|
|
||||||
|
type Running_State_Type is (TAKE_OFF, CLIMB, CRUISE, DESCENT, LANDING); |
||||||
|
|
||||||
|
function Running_State return Running_State_Type with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = RUNNING; |
||||||
|
|
||||||
|
function Navigation_Mode return Navigation_Mode_Type with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = RUNNING; |
||||||
|
|
||||||
|
function Operating_Mode return Navigation_Option_Type with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Navigation_Mode = RP; |
||||||
|
|
||||||
|
----------------------------------------- |
||||||
|
-- Guards of the automaton in Figure 3 -- |
||||||
|
----------------------------------------- |
||||||
|
|
||||||
|
function Boarding_Completed return Boolean with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = INIT, |
||||||
|
Post => |
||||||
|
(if Boarding_Completed'Result then |
||||||
|
Payload_Bay_Closed |
||||||
|
and then Mission_Parameters_Defined |
||||||
|
and then Energy_Compatible_With_Mission); |
||||||
|
|
||||||
|
function Power_On return Boolean with |
||||||
|
Global => State; |
||||||
|
|
||||||
|
function Power_Off return Boolean with |
||||||
|
Global => State, |
||||||
|
Post => Power_Off'Result = not Power_On; |
||||||
|
|
||||||
|
function Mission_Abort_Received return Boolean with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON; |
||||||
|
|
||||||
|
function Start_Or_Go_Received return Boolean with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = INIT; |
||||||
|
|
||||||
|
function Take_Off_Over return Boolean with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = TAKE_OFF; |
||||||
|
|
||||||
|
function Descent_Over return Boolean with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = DESCENT; |
||||||
|
|
||||||
|
function Landed return Boolean with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = LANDING; |
||||||
|
|
||||||
|
function Operating_Mode_Changed return Boolean with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then (Running_State in CLIMB | CRUISE | DESCENT) |
||||||
|
and then Navigation_Mode = RP; |
||||||
|
|
||||||
|
function Cruise_Altitude_Reached return Boolean with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then (Running_State in CLIMB | DESCENT); |
||||||
|
|
||||||
|
---------------- |
||||||
|
-- Properties -- |
||||||
|
---------------- |
||||||
|
|
||||||
|
function Energy_Compatible_With_Mission return Boolean with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State in INIT | RUNNING |
||||||
|
and then (if On_State = RUNNING then Running_State = CRUISE); |
||||||
|
|
||||||
|
function Mission_Parameters_Defined return Boolean with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = INIT; |
||||||
|
|
||||||
|
function Payload_Bay_Closed return Boolean with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = INIT; |
||||||
|
|
||||||
|
function Emergency_Landing return Boolean with |
||||||
|
Global => State, |
||||||
|
Pre => Power_State = ON |
||||||
|
and then On_State = CANCELLED; |
||||||
|
|
||||||
|
function Mission_Cancellation_Signaled return Boolean with |
||||||
|
Global => State; |
||||||
|
|
||||||
|
--------------------------------------- |
||||||
|
-- Behavioural Specification of F_MM -- |
||||||
|
--------------------------------------- |
||||||
|
|
||||||
|
procedure Run with |
||||||
|
Global => (In_Out => State), |
||||||
|
Contract_Cases => |
||||||
|
(Power_State = OFF |
||||||
|
and then Power_Off |
||||||
|
=> |
||||||
|
Power_State = OFF, |
||||||
|
|
||||||
|
Power_State = OFF |
||||||
|
and then Power_On |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = INIT, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then Power_Off |
||||||
|
=> |
||||||
|
Power_State = OFF, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then Power_On |
||||||
|
and then (On_State in INIT | RUNNING) |
||||||
|
and then Mission_Abort_Received |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = ABORTED, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then Power_On |
||||||
|
and then On_State = INIT |
||||||
|
and then not Mission_Abort_Received |
||||||
|
and then not Boarding_Completed |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = INIT, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then Power_On |
||||||
|
and then On_State = INIT |
||||||
|
and then not Mission_Abort_Received |
||||||
|
and then Boarding_Completed |
||||||
|
and then not Start_Or_Go_Received |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = INIT, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then Power_On |
||||||
|
and then On_State = INIT |
||||||
|
and then not Mission_Abort_Received |
||||||
|
and then Boarding_Completed |
||||||
|
and then Start_Or_Go_Received |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = TAKE_OFF, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = TAKE_OFF |
||||||
|
and then Power_On |
||||||
|
and then not Mission_Abort_Received |
||||||
|
and then Take_Off_Over |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = CLIMB, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = TAKE_OFF |
||||||
|
and then Power_On |
||||||
|
and then not Mission_Abort_Received |
||||||
|
and then not Take_Off_Over |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = TAKE_OFF, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = CRUISE |
||||||
|
and then Power_On |
||||||
|
and then not Mission_Abort_Received |
||||||
|
and then not Energy_Compatible_With_Mission |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = CANCELLED |
||||||
|
and then Mission_Cancellation_Signaled |
||||||
|
and then Emergency_Landing, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = DESCENT |
||||||
|
and then Power_On |
||||||
|
and then not Mission_Abort_Received |
||||||
|
and then Descent_Over |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = LANDING, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then (Running_State in CLIMB | CRUISE | DESCENT) |
||||||
|
and then Power_On |
||||||
|
and then not Mission_Abort_Received |
||||||
|
and then Navigation_Mode = RP |
||||||
|
and then |
||||||
|
(if Running_State = CRUISE then Energy_Compatible_With_Mission) |
||||||
|
and then |
||||||
|
(if Running_State = DESCENT then not Descent_Over) |
||||||
|
and then Operating_Mode_Changed |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then (Running_State in CLIMB | DESCENT), |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then (Running_State in CLIMB | DESCENT) |
||||||
|
and then Power_On |
||||||
|
and then not Mission_Abort_Received |
||||||
|
and then (if Navigation_Mode = RP then not Operating_Mode_Changed) |
||||||
|
and then (if Running_State = DESCENT then not Descent_Over) |
||||||
|
and then Cruise_Altitude_Reached |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = CRUISE, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then (Running_State in CLIMB | DESCENT | CRUISE) |
||||||
|
and then Power_On |
||||||
|
and then not Mission_Abort_Received |
||||||
|
and then |
||||||
|
(if Running_State = CRUISE then Energy_Compatible_With_Mission) |
||||||
|
and then (if Navigation_Mode = RP then not Operating_Mode_Changed) |
||||||
|
and then |
||||||
|
(if Running_State in CLIMB | DESCENT then |
||||||
|
not Cruise_Altitude_Reached) |
||||||
|
and then (if Running_State = DESCENT then not Descent_Over) |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = Running_State'Old, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = LANDING |
||||||
|
and then Power_On |
||||||
|
and then not Mission_Abort_Received |
||||||
|
and then Landed |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = COMPLETE, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = LANDING |
||||||
|
and then Power_On |
||||||
|
and then not Mission_Abort_Received |
||||||
|
and then not Landed |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = RUNNING |
||||||
|
and then Running_State = LANDING, |
||||||
|
|
||||||
|
Power_State = ON |
||||||
|
and then Power_On |
||||||
|
and then (On_State in CANCELLED .. ABORTED) |
||||||
|
=> |
||||||
|
Power_State = ON |
||||||
|
and then On_State = On_State'Old); |
||||||
|
|
||||||
|
end MMS.F_PT.F_MM.Behavior; |
Loading…
Reference in new issue