Claire Dross
8 years ago
3 changed files with 385 additions and 0 deletions
@ -0,0 +1,8 @@
@@ -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 @@
@@ -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 @@
@@ -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