------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- Cheddar is a GNU GPL real time scheduling analysis tool. -- This program provides services to automatically check performances -- of real time architectures. -- -- Copyright (C) 2002-2010, by Frank Singhoff, Alain Plantec, Jerome Legrand -- -- The Cheddar project was started in 2002 by -- the LISyC Team, University of Western Britanny. -- -- Since 2008, Ellidiss technologies also contributes to the development of -- Cheddar and provides industrial support. -- -- 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: 559 $ -- $Date: 2012-10-13 13:58:21 +0200 (Sat, 13 Oct 2012) $ -- $Author: gaudel $ ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ 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_Predecessors_List (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_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; ---------------------------------------------------------------------- -- Services below allow you to delete -- dependencies. ---------------------------------------------------------------------- -- Delete ALL dependencies of a -- processor (parameter "A_Processor") -- procedure Delete_Processor_All_Task_Dependencies (My_Dependencies : in out Tasks_Dependencies_Ptr; A_Processor : in Unbounded_String); -- Delete ALL dependencies of an -- address space (parameter "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 tasks -- Do not change other dependencies types ! -- procedure Delete_One_Task_Dependency (My_Dependencies : in out Tasks_Dependencies_Ptr; Source : in Generic_Task_Ptr; Sink : in Generic_Task_Ptr); -- Remove ONE dependency between a task and -- a message or a buffer or a resource -- procedure Delete_One_Task_Dependency (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 (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 (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 a task and -- a message or a buffer or a resource -- procedure Add_One_Task_Dependency (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); procedure Add_One_Task_Dependency (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 (My_Dependencies : in out Tasks_Dependencies_Ptr; Dependent_Task : in Generic_Task_Ptr; a_Resource : in Generic_Resource_Ptr); -- Add a precedency constraint between two tasks -- (only related to precedency constraint) -- procedure Add_One_Task_Dependency (My_Dependencies : in out Tasks_Dependencies_Ptr; Source : in Generic_Task_Ptr; Sink : in Generic_Task_Ptr); -- Add a Time_Triggered_Communication constraint between two tasks -- (a dependency with a Time_Triggered_Communication_Timing_Property_Type) -- procedure Add_One_Task_Dependency (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;