------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- Cheddar is a GNU GPL real-time scheduling analysis tool. -- This program provides services to automatically check schedulability and -- other performance criteria of real-time architecture models. -- -- Copyright (C) 2002-2020, Frank Singhoff, Alain Plantec, Jerome Legrand, -- Hai Nam Tran, Stephane Rubini -- -- The Cheddar project was started in 2002 by -- Frank Singhoff, Lab-STICC UMR CNRS 6285, Universite de Bretagne Occidentale -- -- Cheddar has been published in the "Agence de Protection des Programmes/France" in 2008. -- Since 2008, Ellidiss technologies also contributes to the development of -- Cheddar and provides industrial support. -- -- The full list of contributors and sponsors can be found in AUTHORS.txt and SPONSORS.txt -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -- -- -- Contact : cheddar@listes.univ-brest.fr -- ------------------------------------------------------------------------------ -- Last update : -- $Rev$ -- $Date$ -- $Author: singhoff $ ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with Framework_Config; use Framework_Config; with Tasks; use Tasks; with Task_Set; use Task_Set; use Task_Set.Generic_Task_Set; with Buffers; use Buffers; use Buffers.Buffer_Roles_Package; with Buffer_Set; use Buffer_Set; use Buffer_Set.Generic_Buffer_Set; with Messages; use Messages; with Message_Set; use Message_Set; use Message_Set.Generic_Message_Set; with Dependencies; use Dependencies; with Resources; use Resources; with sets; package Task_Dependencies is -- Raised when a dependency accessor do not find the -- required dependency -- Dependency_Not_Found : exception; -------------------------------------------- -- A set of half dependencies -------------------------------------------- package Half_Dep_Set is new sets ( max_element => Framework_Config.Max_Tasks_Dependencies, element => Dependency_Ptr, free => Free, copy => Copy, put => Put, xml_string => XML_String, xml_ref_string => XML_Ref_String); use Half_Dep_Set; type Tasks_Dependencies is record Depends : Half_Dep_Set.set; Dependent_Tasks : Tasks_Set; end record; type Tasks_Dependencies_Ptr is access all Tasks_Dependencies; function XML_String (obj : in Tasks_Dependencies_Ptr; level : in Natural := 0) return Unbounded_String; function XML_root_String (obj : in Tasks_Dependencies_Ptr; level : in Natural := 0) return Unbounded_String; subtype Tasks_Dependencies_Range is Half_Dep_Set.element_range; subtype Tasks_Dependencies_Iterator is Half_Dep_Set.iterator; ---------------------------------------------------------- -- Basic services that are common to any dependency type ---------------------------------------------------------- procedure Free (My_Dependencies : in out Tasks_Dependencies_Ptr); function Export_Aadl_Properties (My_Dependencies : in Tasks_Dependencies_Ptr; Number_Of_Ht : in Natural) return Unbounded_String; procedure Reset (My_Dependencies : in out Tasks_Dependencies_Ptr; Free_Object : in Boolean := False); procedure Duplicate (Src : in Tasks_Dependencies_Ptr; Dest : in out Tasks_Dependencies_Ptr); procedure Put (My_Dependencies : in Tasks_Dependencies_Ptr); ----------------------------------------------------------------------- -- Services below allow us to test -- existing dependencies. ----------------------------------------------------------------------- -- Sub programs to test precedency constraints : dependency between two -- tasks (Precedence_Dependency dependencies only !) -- function Get_A_Successor (My_Dependencies : in Tasks_Dependencies_Ptr; My_Task : in Generic_Task_Ptr) return Generic_Task_Ptr; function Get_A_Predecessor (My_Dependencies : in Tasks_Dependencies_Ptr; My_Task : in Generic_Task_Ptr) return Generic_Task_Ptr; function Get_Successors_List (My_Dependencies : in Tasks_Dependencies_Ptr; My_Task : in Generic_Task_Ptr) return Tasks_Set; -------------------------------------------------------- function Get_Successors_List_Asynchronous (My_Dependencies : in Tasks_Dependencies_Ptr; My_Task : in Generic_Task_Ptr) return Tasks_Set; -------------------------------------------------------- function Get_Predecessors_List (My_Dependencies : in Tasks_Dependencies_Ptr; My_Task : in Generic_Task_Ptr) return Tasks_Set; -------------------------------------------------------- function Get_Predecessors_List_Asynchronous (My_Dependencies : in Tasks_Dependencies_Ptr; My_Task : in Generic_Task_Ptr) return Tasks_Set; -------------------------------------------------------- function Has_Predecessor (My_Dependencies : in Tasks_Dependencies_Ptr; My_Task : in Generic_Task_Ptr) return Boolean; -------------------------------------------------------- function Has_Predecessor_Asynchronous (My_Dependencies : in Tasks_Dependencies_Ptr; My_Task : in Generic_Task_Ptr) return Boolean; -------------------------------------------------------- function Has_Successor (My_Dependencies : in Tasks_Dependencies_Ptr; My_Task : in Generic_Task_Ptr) return Boolean; -- Get a task without predecessor -- function Get_A_Root_Task (My_Dependencies : in Tasks_Dependencies_Ptr) return Generic_Task_Ptr; -- Get a task without successor -- function Get_A_Leaf_Task (My_Dependencies : in Tasks_Dependencies_Ptr) return Generic_Task_Ptr; -- Get all tasks without predecessor -- function Get_Root_Tasks (My_Dependencies : in Tasks_Dependencies_Ptr) return Tasks_Set; -- Get all tasks without successor -- function Get_Leaf_Tasks (My_Dependencies : in Tasks_Dependencies_Ptr) return Tasks_Set; -- Check is a task dependencies is acyclic or not -- function Is_Acyclic (My_Dependencies : in Tasks_Dependencies_Ptr) return Boolean; function Is_Cyclic (My_Dependencies : in Tasks_Dependencies_Ptr) return Boolean; function Is_Unique_Precedence_Dependency (My_Dependencies : in Tasks_Dependencies_Ptr; Source_Task : Generic_Task_Ptr; Sink_Task : in Generic_Task_Ptr) return Boolean; function No_Precedence_Dependency_Deadlock (My_Dependencies : in Tasks_Dependencies_Ptr; Source_Task : Generic_Task_Ptr; Sink_Task : in Generic_Task_Ptr) return Boolean; ---------------------------------------------------------------------- -- Sub programs devoted to buffer constraints : -- those sub-program checks if a task has buffer to read or write ---------------------------------------------------------------------- function Has_Buffer_To_Read (My_Dependencies : in Tasks_Dependencies_Ptr; My_Task : in Generic_Task_Ptr) return Boolean; function Has_Buffer_To_Write (My_Dependencies : in Tasks_Dependencies_Ptr; My_Task : in Generic_Task_Ptr) return Boolean; ---------------------------------------------------------------------- -- Search for dependencies referencing entities to be deleted ---------------------------------------------------------------------- procedure Check_entity_referencing_task (My_Dependencies : in Tasks_Dependencies_Ptr; A_task : in Unbounded_String); procedure Check_entity_referencing_Processor (My_Dependencies : in Tasks_Dependencies_Ptr; A_Processor : in Unbounded_String); procedure Check_entity_referencing_resource (My_Dependencies : in Tasks_Dependencies_Ptr; A_resource : in Unbounded_String); procedure Check_entity_referencing_buffer (My_Dependencies : in Tasks_Dependencies_Ptr; A_buffer : in Unbounded_String); procedure Check_entity_referencing_message (My_Dependencies : in Tasks_Dependencies_Ptr; A_message : in Unbounded_String); ---------------------------------------------------------------------- -- Services below allow you to delete -- dependencies. ---------------------------------------------------------------------- -- Delete ALL dependencies related to the -- processor "A_Processor" -- procedure Delete_Processor_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Processor : in Unbounded_String); -- Delete ALL dependencies related to the -- address space "An_Address_Space" -- procedure Delete_Address_Space_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; An_Address_Space : in Unbounded_String); -- Delete ALL dependencies : -- 1) of a task (if My_Dep_Name is a Task_ptr) -- 2) of a message (if My_Dep_Name is a Message_ptr) -- 3) of a buffer (if My_Dep_Name is a Buffer_ptr) -- 4) of a resource (if My_Dep_Name is a Generic_Resource_ptr) -- procedure Delete_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Task : in Generic_Task_Ptr); procedure Delete_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Buffer : in Buffer_Ptr); procedure Delete_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Message : in Generic_Message_Ptr); procedure Delete_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Resource : in Generic_Resource_Ptr); -- Remove ONE precendency between two entities -- procedure Delete_One_Task_Dependency_remote_procedure_call (My_Dependencies : in out Tasks_Dependencies_Ptr; client : in Generic_Task_Ptr; server : in Generic_Task_Ptr); procedure Delete_One_Task_Dependency_precedence (My_Dependencies : in out Tasks_Dependencies_Ptr; Source : in Generic_Task_Ptr; Sink : in Generic_Task_Ptr); procedure Delete_One_Task_Dependency_Time_Triggered (My_Dependencies : in out Tasks_Dependencies_Ptr; Source : in Generic_Task_Ptr; Sink : in Generic_Task_Ptr; Timing_Type : in Time_Triggered_Communication_Timing_Property_Type); procedure Delete_One_Task_Dependency_queueing_buffer (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Task : in Generic_Task_Ptr; A_Buffer : in Buffer_Ptr; A_Type : in Orientation_Dependency_Type); procedure Delete_One_Task_Dependency_black_board_buffer (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Task : in Generic_Task_Ptr; A_Dep : in Buffer_Ptr; A_Type : in Orientation_Dependency_Type); procedure Delete_One_Task_Dependency_asynchronous_communication (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Task : in Generic_Task_Ptr; A_Message : in Generic_Message_Ptr; A_Type : in Orientation_Dependency_Type ); procedure Delete_One_Task_Dependency_resource (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Task : in Generic_Task_Ptr; A_Resource : in Generic_Resource_Ptr); --------------------------------------- -- Services below allow to update -- dependencies. --------------------------------------- -- Update ALL dependencies : -- 1) of a task (if My_Dep_Name is a Task_ptr) -- 2) of a message (if My_Dep_Name is a Message_ptr) -- 3) of a buffer (if My_Dep_Name is a Buffer_ptr) -- 4) of a resource (if My_Dep_Name is a Generic_Resource_ptr) -- procedure Update_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Task : in Generic_Task_Ptr); procedure Update_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Buffer : in Buffer_Ptr); procedure Update_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Message : in Generic_Message_Ptr); procedure Update_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Resource : in Generic_Resource_Ptr); --------------------------------------- -- Services below allow to add -- dependencies. --------------------------------------- -- Add ALL dependencies from the definition -- of a given buffer -- procedure Add_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; My_Tasks : in Tasks_Set; A_Buffer : in Buffer_Ptr); -- Add ALL dependencies from the definition -- of a given resource -- procedure Add_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; My_Tasks : in Tasks_Set; A_Resource : in Generic_Resource_Ptr); -- Add a dependency between two entities -- procedure Add_One_Task_Dependency_asynchronous_communication (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Task : in Generic_Task_Ptr; A_Dep : in Generic_Message_Ptr; A_Type : in Orientation_Dependency_Type ; protocol_property : in Asynchronous_Communication_Protocol_Property_Type := First_Message ); procedure Add_One_Task_Dependency_resource (My_Dependencies : in out Tasks_Dependencies_Ptr; Dependent_Task : in Generic_Task_Ptr; a_Resource : in Generic_Resource_Ptr); procedure Add_One_Task_Dependency_queueing_buffer (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Task : in Generic_Task_Ptr; A_Dep : in Buffer_Ptr; A_Type : in Orientation_Dependency_Type); procedure Add_One_Task_Dependency_black_board_buffer (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Task : in Generic_Task_Ptr; A_Dep : in Buffer_Ptr; A_Type : in Orientation_Dependency_Type); procedure Add_One_Task_Dependency_remote_procedure_call (My_Dependencies : in out Tasks_Dependencies_Ptr; client : in Generic_Task_Ptr; server : in Generic_Task_Ptr); procedure Add_One_Task_Dependency_precedence (My_Dependencies : in out Tasks_Dependencies_Ptr; Source : in Generic_Task_Ptr; Sink : in Generic_Task_Ptr); procedure Add_One_Task_Dependency_Time_Triggered (My_Dependencies : in out Tasks_Dependencies_Ptr; From_Task : in Generic_Task_Ptr; To_Task : in Generic_Task_Ptr; Timing_Type : in Time_Triggered_Communication_Timing_Property_Type); end Task_Dependencies;