------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- 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 Time_Unit_Events; use Time_Unit_Events; with Time_Unit_Events.extended; use Time_Unit_Events.extended; with Call_Framework_Interface; use Call_Framework_Interface; use Call_Framework_Interface.Framework_Request_Package; use Call_Framework_Interface.Framework_Response_Package; with Text_IO; use Text_IO; with Xml_Tag; use Xml_Tag; with unbounded_strings; use unbounded_strings; with Task_Set; use Task_Set; use Task_Set.Generic_Task_Set; with Buffer_Set; use Buffer_Set; use Buffer_Set.Generic_Buffer_Set; with Ada.Exceptions; use Ada.Exceptions; with Processors; use Processors; with Processor_Set; use Processor_Set; use Processor_Set.Generic_Processor_Set; with framework; use framework; with Call_Scheduling_Framework; use Call_Scheduling_Framework; with Call_Memory_Framework; use Call_Memory_Framework; use Call_Memory_Framework.Buffer_Result_Package; with Call_Resource_Framework; use Call_Resource_Framework; with Call_Dependency_Framework; use Call_Dependency_Framework; with Call_cache_Framework; use Call_cache_Framework; with Call_network_Framework; use Call_network_Framework; with Call_security_Framework; use Call_security_Framework; with Call_Random_Framework; use Call_Random_Framework; with Call_Design_Pattern_Framework; use Call_Design_Pattern_Framework; with Scheduler_Interface; use Scheduler_Interface; with Multiprocessor_Services_Interface; use Multiprocessor_Services_Interface; use Multiprocessor_Services_Interface.Scheduling_Result_Per_Processor_Package; with Translate; use Translate; with Translate.English_Labels; with Translate.Francais_Labels; with Translate.AADL_Labels; with Text_IO; use Text_IO; with initialize_framework; use initialize_framework; with GNAT.OS_Lib; use GNAT.OS_Lib; with Ada.IO_Exceptions; use Ada.IO_Exceptions; with GNAT.Current_Exception; use GNAT.Current_Exception; package body Call_Framework is type Sub_Framework_Request is record Statement : Framework_Statement_Type; Param : Framework_Parameters_Table; Target : Generic_Processor_Ptr; end record; procedure initialize (Aadl_Labels : in Boolean) is s : GNAT.OS_Lib.String_Access; begin -- Initialize an object id generator -- initialize (framework_id); -- Initialize all labels of the framework -- Translate.Initialize; if Current_Language = English then Translate.English_Labels.Initialize; else Translate.Francais_Labels.Initialize; end if; if (Aadl_Labels = True) then Translate.AADL_Labels.Initialize; end if; -- Read install path -- s := Getenv ("CHEDDAR_INSTALL_PATH"); install_path := To_Unbounded_String (s.all); if install_path = empty_string then Put_Line( "Warning : CHEDDAR_INSTALL_PATH is not defined : CHEDDAR_INSTALL_PATH is set with default value '.' " ); install_path := To_Unbounded_String ("./"); end if; -- Save that we have initialized the framework -- Now we can check that the framework is readu to use -- Set_Initialize; end initialize; procedure Sequential_Framework_Request (Sys : in out System; Request : in Framework_Request_Table; Response : in out Framework_Response_Table) is begin Check_Initialize; Sequential_Framework_Request (Sys, Request, Response, Total_Order, String_Output); end Sequential_Framework_Request; procedure Initialize (F : in out Framework_Request) is begin F.target := empty_string; Initialize (F.param); end Initialize; -- Do various checks on the parameters of a request -- procedure Check_Framework_Parameters (Request : in Sub_Framework_Request) is ok : boolean := false; begin for I in 0 .. Request.Param.Nb_Entries - 1 loop ok := False; for k in Integer_framework_parameter_name'Range loop if (Request.Param.Entries (I).parameter_name = Integer_framework_parameter_name (k)) then ok := True; end if; end loop; for k in Boolean_framework_parameter_name'Range loop if (Request.Param.Entries (I).parameter_name = Boolean_framework_parameter_name (k)) then ok := True; end if; end loop; for k in String_framework_parameter_name'Range loop if (Request.Param.Entries (I).parameter_name = String_framework_parameter_name (k)) then ok := True; end if; end loop; if not ok then Raise_Exception (Unexpected_Parameter'Identity, To_String (Request.Param.Entries (I).parameter_name & " for " & Request.Statement'img)); end if; for k in Integer_framework_parameter_name'Range loop if (Request.Param.Entries (I).type_of_parameter /= Integer_Parameter) and (Request.Param.Entries (I).parameter_name = Integer_framework_parameter_name (k)) then Raise_Exception (Parameter_Type_Error'Identity, To_String (Request.Param.Entries (I).parameter_name & " for " & Request.Statement'img)); end if; end loop; for k in Boolean_framework_parameter_name'Range loop if (Request.Param.Entries (I).type_of_parameter /= Boolean_Parameter) and (Request.Param.Entries (I).parameter_name = Boolean_framework_parameter_name (k)) then Raise_Exception (Parameter_Type_Error'Identity, To_String (Request.Param.Entries (I).parameter_name & " for " & Request.Statement'img)); end if; end loop; end loop; end Check_Framework_Parameters; procedure Call_A_Request (Sys : in out System; Request : in Sub_Framework_Request; A_Response : in out Unbounded_String; Output : in Output_Format := String_Output) is -- Parameters to be used for calling the "computing time line" service -- Event_To_Generate : Time_Unit_Event_Type_Boolean_Table; Period : Natural := 0; Schedule_With_Offsets : Boolean := True; Schedule_With_Precedencies : Boolean := True; Schedule_With_Resources : Boolean := True; Schedule_With_CRPD : Boolean := False; Schedule_With_jitters : Boolean := false; WCRT_With_CRPD : CRPD_Computation_Approach_Type := No_CRPD; WCRT_With_Memory_Interferences : Memory_Interference_Computation_Approach_Type := No_Memory_Interference; minimize_preemption : boolean := false; With_Task_Specific_Seed : Boolean := True; Global_Seed_Value : Integer := 0; Predictable_Global_Seed : Boolean := True; Schedule_With_Task_Groups : Boolean := False; worst_case : Boolean := true; best_case : Boolean := true; average_case : Boolean := true; Feasibility_Name : Unbounded_String; ok : Boolean := False; begin case Request.Statement is ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Time_Line => Initialize (Event_To_Generate, True); -- Check parameters -- Check_Framework_Parameters(request); for I in 0 .. Request.Param.Nb_Entries - 1 loop if ( (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("preemption")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("wait_for_memory")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("buffer_overflow")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("buffer_underflow")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("period")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("seed_value")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("schedule_with_offsets")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("schedule_with_precedencies")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("schedule_with_resources")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("minimize_preemption")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("schedule_with_jitters")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("predictable")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("start_of_task_capacity")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("end_of_task_capacity")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("write_to_buffer")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("read_from_buffer")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("running_task")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("task_activation")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("send_message")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("receive_message")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("allocate_resource")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("release_resource")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("wait_for_resource")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("address_space_activation")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("context_switch_overhead")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("schedule_with_task_groups")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("schedule_with_crpd")) ) then Raise_Exception (Unexpected_Parameter'Identity, " " & to_string(Request.Param.Entries (I).parameter_name) & " unknown " & " for Scheduling_Simulation_Time_Line"); end if; end loop; -- Fetch parameters from the request -- for I in 0 .. Request.Param.Nb_Entries - 1 loop if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("period")) then Period := Request.Param.Entries (I).integer_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("seed_value")) then Global_Seed_Value := Request.Param.Entries (I).integer_value; With_Task_Specific_Seed := False; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("schedule_with_offsets")) then Schedule_With_Offsets := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("schedule_with_precedencies")) then Schedule_With_Precedencies := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("schedule_with_resources")) then Schedule_With_Resources := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("minimize_preemption")) then minimize_preemption := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("schedule_with_jitters")) then Schedule_With_jitters := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("predictable")) then Predictable_Global_Seed := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("start_of_task_capacity")) then Event_To_Generate (Start_Of_Task_Capacity) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("end_of_task_capacity")) then Event_To_Generate (End_Of_Task_Capacity) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("write_to_buffer")) then Event_To_Generate (Write_To_Buffer) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("read_from_buffer")) then Event_To_Generate (Read_From_Buffer) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("running_task")) then Event_To_Generate (Running_Task) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("task_activation")) then Event_To_Generate (Task_activation) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("send_message")) then Event_To_Generate (Send_Message) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("receive_message")) then Event_To_Generate (Receive_Message) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("allocate_resource")) then Event_To_Generate (Receive_Message) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("release_resource")) then Event_To_Generate (Release_Resource) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("wait_for_resource")) then Event_To_Generate (Wait_For_Resource) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("address_space_activation")) then Event_To_Generate (Address_Space_Activation) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("context_switch_overhead")) then Event_To_Generate (Context_Switch_Overhead) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("schedule_with_task_groups")) then Schedule_With_Task_Groups := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("schedule_with_crpd")) then Schedule_With_CRPD := Request.Param.Entries (I).boolean_value; end if; end loop; -- Call framework -- Compute_Simulation_Time_Line (Sys, A_Response, -- With period -- Period, -- With offsets -- Schedule_With_Offsets, -- With Task precedencies -- Schedule_With_Precedencies, -- With Shared resources -- Schedule_With_Resources, -- With Shared jitters, -- Schedule_With_jitters, -- Reduce preeemption as much as we can -- minimize_preemption, -- With task specific seed -- With_Task_Specific_Seed, -- With a global seed value -- Global_Seed_Value, -- Predictable seed of not ? -- Predictable_Global_Seed, -- Which event we should generate -- Event_To_Generate, Output, -- With CRPD added to capacity of tasks -- Schedule_With_CRPD); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Basics => Compute_Simulation_Basics (Sys, A_Response, Request.Target, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Run_Event_Handler => Run_User_Defined_Event_Handlers (Sys, A_Response, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Priority_Inversion => Priority_Inversion_Detection (Sys, A_Response, Request.Target, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_General_Task => Partionning_Tasks (Sys, A_Response, General_Task, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_First_Fit => Partionning_Tasks (Sys, A_Response, First_Fit, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Next_Fit => Partionning_Tasks (Sys, A_Response, Next_Fit, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Best_Fit => Partionning_Tasks (Sys, A_Response, Best_Fit, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Small_Task => Partionning_Tasks (Sys, A_Response, Small_Task, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Deadlock => Deadlock_Detection (Sys, A_Response, Request.Target, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Context_Switch_Number => Compute_Simulation_Number_Of_Context_Switch (Sys, A_Response, Request.Target, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Preemption_Number => Compute_Simulation_Number_Of_Preemption (Sys, A_Response, Request.Target, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_periodic_task_worst_case_Response_Time => -- Check parameters -- Check_Framework_Parameters(request); for I in 0 .. Request.Param.Nb_Entries - 1 loop if ( (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("wcrt_without_crpd")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("wcrt_with_crpd_ECB_only")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("wcrt_with_crpd_ECB_union_multiset")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("wcrt_with_crpd_UCB_union_multiset")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("wcrt_with_crpd_combined_multiset")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("wcrt_without_memory_interferences")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("wcrt_with_DRAM_single_arbiter")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("wcrt_with_kalray_multi_arbiter")) ) then Raise_Exception (Unexpected_Parameter'Identity, " " & to_string(Request.Param.Entries (I).parameter_name) & " unknown " & " for " & Request.statement'img); end if; end loop; for I in 0 .. Request.Param.Nb_Entries - 1 loop if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("wcrt_without_crpd")) then WCRT_With_CRPD := No_CRPD; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("wcrt_with_crpd_ECB_only")) then WCRT_With_CRPD := ECB_Only; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("wcrt_with_crpd_ECB_union_multiset")) then WCRT_With_CRPD := ECB_Union_Multiset; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("wcrt_with_crpd_UCB_union_multiset")) then WCRT_With_CRPD := UCB_Union_Multiset; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("wcrt_with_crpd_combined_multiset")) then WCRT_With_CRPD := Combined_Multiset; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("wcrt_without_memory_interferences")) then WCRT_With_Memory_Interferences := No_Memory_Interference; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("wcrt_with_DRAM_single_arbiter")) then WCRT_With_Memory_Interferences := DRAM_Single_Arbiter; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("wcrt_with_kalray_multi_arbiter")) then WCRT_With_Memory_Interferences := Kalray_Multi_Arbiter; end if; end loop; if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_Response_Time (Sys, A_Response, Periodic, WCRT_With_Memory_Interferences, WCRT_With_CRPD, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Cpu_Utilization => if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_Processor_Utilization_Factor (Sys, A_Response, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Demand_Bound_Function => if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_By_Demand_Bound_Function (Sys, A_Response, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Interval=> if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_interval (Sys, A_Response, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Select_Feasibility_Test_By_Name => -- Check parameters -- Check_Framework_Parameters(request); for I in 0 .. Request.Param.Nb_Entries - 1 loop if ( (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("feasibility_test_name")) ) then Raise_Exception (Unexpected_Parameter'Identity, " " & to_string(Request.Param.Entries (I).parameter_name) & " unknown " & " for " & Request.statement'img); end if; end loop; for I in 0 .. Request.Param.Nb_Entries - 1 loop if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("feasibility_name")) then feasibility_name := Request.Param.Entries (I).string_value; end if; end loop; Compute_feasibility_test_by_name (Sys, A_Response, Request.Target, feasibility_name, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Response_Time => -- Check parameters -- Check_Framework_Parameters(request); for I in 0 .. Request.Param.Nb_Entries - 1 loop if ( (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("worst_case")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("best_case")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("average_case")) ) then Raise_Exception (Unexpected_Parameter'Identity, " " & to_string(Request.Param.Entries (I).parameter_name) & " unknown " & " for " & Request.statement'img); end if; end loop; for I in 0 .. Request.Param.Nb_Entries - 1 loop if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("worst_case")) then worst_case := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("best_case")) then best_case := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("average_case")) then average_case := Request.Param.Entries (I).boolean_value; end if; end loop; Compute_Simulation_Response_Time (Sys, A_Response, Request.Target, worst_case, best_case, average_case, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Blocking_Time => -- Check parameters -- Check_Framework_Parameters(request); for I in 0 .. Request.Param.Nb_Entries - 1 loop if ( (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("worst_case")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("best_case")) and (Request.Param.Entries (I).parameter_name /= To_Unbounded_String ("average_case")) ) then Raise_Exception (Unexpected_Parameter'Identity, " " & to_string(Request.Param.Entries (I).parameter_name) & " unknown " & " for " & Request.statement'img); end if; end loop; for I in 0 .. Request.Param.Nb_Entries - 1 loop if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("worst_case")) then worst_case := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("best_case")) then best_case := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.Entries (I).parameter_name = To_Unbounded_String ("average_case")) then average_case := Request.Param.Entries (I).boolean_value; end if; end loop; Compute_Simulation_Blocking_Time (Sys, A_Response, Request.Target, worst_case, best_case, average_case, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_All_Response_Times => -- This service exits, i.e. has been implemented ... but we need to decide how to return -- the results to the caller null; ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Compute_And_Set_Worst_Case_Blocking_Time => Compute_Worst_Case_Blocking_Time (Sys, A_Response, Request.Target, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Compute_Worst_Case_Blocking_Time => Compute_Worst_Case_Blocking_Time (Sys, A_Response, Request.Target, False, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Basics => if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_Basics (Sys, A_Response, Request.Target, Output); end if; when Scheduling_Feasibility_Compute_Resource_Ceiling_Priority => Compute_resource_ceiling_priority (Sys, A_Response, Request.Target, False, Output); when Scheduling_Feasibility_Compute_And_Set_Resource_Ceiling_Priority => Compute_resource_ceiling_priority (Sys, A_Response, Request.Target, true, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Set_Priorities_According_To_Deadline_Monotonic => Set_Priorities (Sys, A_Response, Request.Target, Scheduling_Set_Priorities_According_To_Deadline_Monotonic, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Set_Priorities_According_To_Rate_Monotonic => Set_Priorities (Sys, A_Response, Request.Target, Scheduling_Set_Priorities_According_To_Rate_Monotonic, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Set_Priorities_According_To_Audsley_OPA=> Set_Priorities (Sys, A_Response, Request.Target, Scheduling_Set_Priorities_According_To_Audsley_OPA, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Set_Priorities_According_To_OPA_CRPD_PT_Simplified=> Set_Priorities (Sys, A_Response, Request.Target, Scheduling_Set_Priorities_According_To_OPA_CRPD_PT_Simplified, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Set_Priorities_According_To_OPA_CRPD_PT => Set_Priorities (Sys, A_Response, Request.Target, Scheduling_Set_Priorities_According_To_OPA_CRPD_PT, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Set_Priorities_According_To_OPA_CRPD_Tree=> Set_Priorities (Sys, A_Response, Request.Target, Scheduling_Set_Priorities_According_To_OPA_CRPD_Tree, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Buffer_Feasibility_Tests => if (Get_Number_Of_Buffer_From_Processor (Sys.Buffers, Request.Target.name) /= 0) then Compute_Buffer_Feasibility_Tests (Sys, A_Response, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Memory_Compute_Footprint_Analysis => Compute_Memory_Requirement_Analysis (Sys, A_Response, False, Output); when Memory_Set_Footprint_Analysis => Compute_Memory_Requirement_Analysis (Sys, A_Response, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Buffer_Scheduling_Simulation => if (Get_Number_Of_Buffer_From_Processor (Sys.Buffers, Request.Target.name) /= 0) then Compute_Buffer_Scheduling_Simulation (Sys, A_Response, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Random_Response_Time_Density => Compute_Response_Time_Density (Sys, A_Response, Request.Target, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Compute_Chetto_Blazewicz_Priority => Chetto_Parameter_Modifications (Sys, A_Response, Request.Target, False, True, False, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Compute_Chetto_Blazewicz_Deadline => Chetto_Parameter_Modifications (Sys, A_Response, Request.Target, True, False, False, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Set_Chetto_Blazewicz_Deadline => Chetto_Parameter_Modifications (Sys, A_Response, Request.Target, True, False, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Set_Chetto_Blazewicz_Priority => Chetto_Parameter_Modifications (Sys, A_Response, Request.Target, False, True, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Compute_End_To_End_Response_Time_One_Step => Compute_End_To_End_Response_Time (Sys, A_Response, False, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Set_End_To_End_Response_Time_One_Step => Compute_End_To_End_Response_Time (Sys, A_Response, True, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Compute_End_To_End_Response_Time_All_Steps => Compute_End_To_End_Response_Time (Sys, A_Response, False, False, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Set_End_To_End_Response_Time_All_Steps => Compute_End_To_End_Response_Time (Sys, A_Response, True, False, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Select_Feasibility_Tests_Simple => Select_Feasibility_Tests_Simple_System (Sys, A_Response, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Tests_Compositional => Select_Feasibility_Tests_Compositional_System (Sys, A_Response, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Transaction_Worst_Case_Response_Time_Audsley=> if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_Response_Time (Sys, A_Response, Audsley, No_Memory_Interference, No_CRPD, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Transaction_Worst_Case_Response_Time_Tindell=> if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_Response_Time (Sys, A_Response, Tindell, No_Memory_Interference, No_CRPD, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Transaction_Worst_Case_Response_Time_Palencia=> if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_Response_Time (Sys, A_Response, Palencia, No_Memory_Interference, No_CRPD, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Transaction_Worst_Case_Response_Time_WCDOPS_Plus=> if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_Response_Time (Sys, A_Response, Wcdops_plus, No_Memory_Interference, No_CRPD, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Transaction_Worst_Case_Response_Time_WCDOPS_Plus_NIM=> null; if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_Response_Time (Sys, A_Response, Wcdops_plus_nim, No_Memory_Interference, No_CRPD, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Cache_Analysis_Compute_Cache_Access_Profile => Compute_Tasks_Cache_Access_Profile(Sys => Sys, A_Processor => Request.Target, Result => A_Response, Output => Output); when Cache_Analysis_Import_CFG => Call_Cache_Framework.Import_CFG(Sys => Sys, A_Processor => Request.Target, Result => A_Response, Output => Output); when Cache_Analysis_Import_CFG_And_Compute_Cache_Access_Profile => Call_Cache_Framework.Import_CFG(Sys => Sys, A_Processor => Request.Target, Result => A_Response, Output => Output); Compute_Tasks_Cache_Access_Profile(Sys => Sys, A_Processor => Request.Target, Result => A_Response, Output => Output); ----------------------------------------------------------- ----------------------------------------------------------- when Memory_Analysis_Interferences_Delays => Compute_Memory_Interferences_Delays(Sys => Sys, A_Processor => Request.Target, Result => A_Response, Output => Output); ----------------------------------------------------------- ----------------------------------------------------------- when Network_NoC_Compute_Communication_Delay => Compute_NoC_communication_Delay(Sys => Sys, Result => A_Response, Output => Output); when Network_NoC_Compute_Path_Delay => Compute_NoC_Path_Delay(Sys => Sys, Result => A_Response, Output => Output); when Network_NoC_Compute_Direct_Interference_Delay => Compute_NoC_direct_interference_Delay(Sys => Sys, Result => A_Response, Output => Output); when Network_Noc_Compute_Indirect_Interference_Delay => Compute_NoC_indirect_interference_Delay(Sys => Sys, Result => A_Response, Output => Output); when Network_Compute_NoC_Transformation_ECTM_SAF => Compute_ectm_saf_transformation(sys, A_Response, False, Output); when Network_Set_NoC_Transformation_ECTM_SAF => Compute_ectm_saf_transformation(sys, A_Response, True, Output); when Network_Compute_NoC_Transformation_ECTM_Wormhole => Compute_ectm_wormhole_transformation(Sys, A_Response, False, Output); when Network_Set_NoC_Transformation_ECTM_Wormhole => Compute_ectm_wormhole_transformation(Sys, A_Response, True, Output); when Network_Compute_NoC_Transformation_WCCTM_SAF => Compute_wcctm_saf_transformation(Sys, A_Response, False, Output); when Network_Set_NoC_Transformation_WCCTM_SAF => Compute_wcctm_saf_transformation(Sys, A_Response, True, Output); when Network_Compute_NoC_Transformation_WCCTM_Wormhole => Compute_wcctm_wormhole_transformation(Sys, A_Response, False, Output); when Network_Set_NoC_Transformation_WCCTM_Wormhole => Compute_wcctm_wormhole_transformation(Sys, A_Response, True, Output); when Network_Compute_Spacewire_Transformation_SCM => Compute_Spacewire_SCM_transformation(Sys, A_Response, False, Output); when Network_Set_Spacewire_Transformation_SCM => Compute_Spacewire_SCM_transformation(Sys, A_Response, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when MILS_compute_security_chinese_wall => Compute_MILS_security_chinese_wall(Sys => Sys, Result => A_Response, Output => Output); when MILS_compute_security_Warshall => Compute_MILS_security_warshall(Sys => Sys, Result => A_Response, Output => Output); when MILS_compute_security_bell_lapadula => Compute_MILS_security_bell_lapadula(Sys => Sys, Result => A_Response, Output => Output); when MILS_compute_security_biba => Compute_MILS_security_biba(Sys => Sys, Result => A_Response, Output => Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Compute_Scheduling_Anomalies => Check_Scheduling_Anomalies(Sys => Sys, Result => A_Response, Output => Output); end case; exception when others => A_Response := To_Unbounded_String (Exception_Name) & " " & To_Unbounded_String (Exception_Message); end Call_A_Request; procedure Initialize_Before_Request (Request : in Framework_Request) is begin case Request.statement is when Scheduling_Simulation_Time_Line => initialize (Sched.all); when Buffer_Scheduling_Simulation => initialize (Buff); when others => null; end case; end Initialize_Before_Request; function Build_A_Title (Request : in Framework_Request) return Unbounded_String is begin case Request.statement is when Scheduling_Simulation_Basics => return Start_Sched_Sim & unbounded_lf & Start_Title & Lb_Scheduling_Simulation (Current_Language); when Scheduling_Feasibility_Basics => return Start_Sched_Feas & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language); when Scheduling_Simulation_Time_Line => return empty_string; when Scheduling_Simulation_Preemption_Number| Scheduling_Simulation_Context_Switch_Number | Scheduling_Simulation_All_Response_Times | Scheduling_Simulation_Priority_Inversion | Scheduling_Simulation_Deadlock | Scheduling_Simulation_Response_Time | Scheduling_Compute_Scheduling_Anomalies | Scheduling_Simulation_Blocking_Time => return Start_Sched_Sim & unbounded_lf & Start_Title & Lb_Scheduling_Simulation (Current_Language); when Scheduling_Simulation_Run_Event_Handler => return Start_Sched_Sim & unbounded_lf & Start_Title & Lb_Scheduling_Simulation (Current_Language) & Lb_Comma & Lb_Event_Analyzer (Current_Language); when Buffer_Scheduling_Simulation => return unbounded_lf & Lb_Draw_Buffer (Current_Language); when Random_Response_Time_Density => return Start_Response_Time_Density & Start_Title & unbounded_lf & Lb_Response_Time_Density (Current_Language); when Scheduling_Feasibility_First_Fit => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language) & Lb_Comma & Lb_Partition (Current_Language) & Lb_Partition_First_Fit (Current_Language); when Scheduling_Feasibility_General_Task => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language) & Lb_Comma & Lb_Partition (Current_Language) & Lb_Partition_General_Task (Current_Language); when Scheduling_Feasibility_Best_Fit => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language) & Lb_Comma & Lb_Partition (Current_Language) & Lb_Partition_Best_Fit (Current_Language); when Scheduling_Feasibility_Next_Fit => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language) & Lb_Comma & Lb_Partition (Current_Language) & Lb_Partition_Next_Fit (Current_Language); when Scheduling_Feasibility_Small_Task => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language) & Lb_Comma & Lb_Partition (Current_Language) & Lb_Partition_Small_Task (Current_Language); when Scheduling_Feasibility_Compute_And_Set_worst_case_Blocking_Time| Scheduling_Feasibility_Compute_worst_case_Blocking_Time => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language); when Scheduling_Feasibility_periodic_task_worst_case_Response_Time| Scheduling_Feasibility_Transaction_Worst_Case_Response_Time_Audsley| Scheduling_Feasibility_Transaction_Worst_Case_Response_Time_Tindell| Scheduling_Feasibility_Transaction_Worst_Case_Response_Time_Palencia| Scheduling_Feasibility_Transaction_Worst_Case_Response_Time_WCDOPS_Plus| Scheduling_Feasibility_Transaction_Worst_Case_Response_Time_WCDOPS_Plus_NIM| Scheduling_Feasibility_Compute_Resource_Ceiling_Priority| Scheduling_Feasibility_Compute_And_Set_Resource_Ceiling_Priority| Scheduling_Feasibility_Demand_Bound_Function| Scheduling_Feasibility_interval| Scheduling_Feasibility_Cpu_Utilization| Memory_Analysis_Interferences_Delays => return Start_Sched_Feas & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language); when Memory_Set_Footprint_Analysis | Memory_Compute_Footprint_Analysis => return Start_Buf_Bound & unbounded_lf & Start_Title & Lb_Memory_Requirement_Analysis (Current_Language); when Buffer_Feasibility_Tests => return Start_Buf_Bound & unbounded_lf & Start_Title & Lb_Compute_Buffer (Current_Language); when Select_Feasibility_Tests_Simple => return Lb_Select_Simple (Current_Language); when Scheduling_Feasibility_Tests_Compositional => return Lb_Select_Compositional (Current_Language); when Select_Feasibility_Test_By_Name => return Lb_feasibility_test_by_name (Current_Language); when Scheduling_Set_Priorities_According_To_Deadline_Monotonic| Scheduling_Set_Priorities_According_To_Audsley_OPA| Scheduling_Set_Priorities_According_To_OPA_CRPD_PT_Simplified| Scheduling_Set_Priorities_According_To_OPA_CRPD_PT| Scheduling_Set_Priorities_According_To_OPA_CRPD_Tree| Scheduling_Set_Priorities_According_To_Rate_Monotonic => return Start_Set_Prio & unbounded_lf & Start_Title & unbounded_lf & Lb_Set_Priorities (Current_Language); when Dependency_Compute_End_To_End_Response_Time_One_Step | Dependency_Set_End_To_End_Response_Time_One_Step | Dependency_Compute_End_To_End_Response_Time_All_Steps | Dependency_Set_End_To_End_Response_Time_All_Steps => return Start_End_To_End & unbounded_lf & Start_Title & Lb_Jitter_From_Response_Time (Current_Language); when Dependency_Compute_Chetto_Blazewicz_Priority | Dependency_Compute_Chetto_Blazewicz_Deadline | Dependency_Set_Chetto_Blazewicz_Priority | Dependency_Set_Chetto_Blazewicz_Deadline => return Lb_Chetto (Current_Language); when Cache_Analysis_Compute_Cache_Access_Profile => return Lb_Compute_Cache_Access_Profile (Current_Language); when Cache_Analysis_Import_CFG => return Lb_Import_CFG (Current_Language); when Cache_Analysis_Import_CFG_And_Compute_Cache_Access_Profile => return Lb_Import_CFG_And_Compute_Cache_Access_Profile (Current_Language); when Network_NoC_Compute_Communication_Delay | Network_NoC_Compute_Path_Delay | Network_NoC_Compute_Direct_Interference_Delay | Network_Noc_Compute_Indirect_Interference_Delay | Network_Set_NoC_Transformation_ECTM_SAF | Network_Set_NoC_Transformation_ECTM_Wormhole | Network_Set_NoC_Transformation_WCCTM_SAF | Network_Set_NoC_Transformation_WCCTM_Wormhole | Network_Compute_NoC_Transformation_ECTM_SAF | Network_Compute_NoC_Transformation_ECTM_Wormhole | Network_Compute_NoC_Transformation_WCCTM_SAF | Network_Compute_NoC_Transformation_WCCTM_Wormhole => return Lb_NoC_Analysis (Current_Language); when Network_compute_Spacewire_Transformation_SCM | Network_Set_Spacewire_Transformation_SCM => return Lb_SpaceWire_Analysis (Current_Language); when MILS_compute_security_Warshall | MILS_compute_security_bell_lapadula | MILS_compute_security_biba | MILS_compute_security_chinese_wall => return Lb_Mils_Analysis(Current_Language); end case; end Build_A_Title; procedure Sequential_Framework_Request (Sys : in out System_Ptr; Request : in Framework_Request_Table; Response : in out Framework_Response_Table; Order : in Perform_Order; Output : in Output_Format) is begin Check_Initialize; Sequential_Framework_Request (Sys.all, Request, Response, Order, Output); end Sequential_Framework_Request; procedure Sequential_Framework_Request (Sys : in out System; Request : in Framework_Request_Table; Response : in out Framework_Response_Table; Order : in Perform_Order; Output : in Output_Format) is A_Response : Framework_Response; A_Processor : Generic_Processor_Ptr; My_Iterator : Processors_Iterator; A_Request : Sub_Framework_Request; begin Check_Initialize; for I in 0 .. Request.Nb_Entries - 1 loop Initialize_Before_Request (Request.Entries (I)); -- Here, we should take care of two cases : -- case 1 : the called service should be run for -- each processor (that's the most of services) -- case 2 : the called service is global to all processor and -- should be called one time only -- -- if (Request.Entries (I).statement = Scheduling_Simulation_Run_Event_Handler) or (Request.Entries (I).statement = Memory_Set_Footprint_Analysis) or (Request.Entries (I).statement = Memory_Compute_Footprint_Analysis) or (Request.Entries (I).statement = Scheduling_Simulation_Time_Line) or (Request.Entries (I).statement = Scheduling_Feasibility_Small_Task) or (Request.Entries (I).statement = Scheduling_Feasibility_Best_Fit) or (Request.Entries (I).statement = Scheduling_Feasibility_Next_Fit) or (Request.Entries (I).statement = Scheduling_Feasibility_First_Fit) or (Request.Entries (I).statement = Scheduling_Feasibility_General_Task) or (Request.Entries (I).statement = Dependency_Compute_End_To_End_Response_Time_One_Step) or (Request.Entries (I).statement = Dependency_Set_End_To_End_Response_Time_One_Step) or (Request.Entries (I).statement = Dependency_Compute_End_To_End_Response_Time_All_Steps) or (Request.Entries (I).statement = Dependency_Set_End_To_End_Response_Time_All_Steps) or (Request.Entries (I).statement = Dependency_Set_Chetto_Blazewicz_Deadline) or (Request.Entries (I).statement = Dependency_Compute_Chetto_Blazewicz_Priority) or (Request.Entries (I).statement = Dependency_Compute_Chetto_Blazewicz_Deadline) or (Request.Entries (I).statement = Dependency_Set_Chetto_Blazewicz_Priority) or (Request.Entries (I).statement = MILS_compute_security_chinese_wall) or (Request.Entries (I).statement = MILS_compute_security_Warshall) or (Request.Entries (I).statement = MILS_compute_security_bell_lapadula) or (Request.Entries (I).statement = MILS_compute_security_biba) or (Request.Entries (I).statement = Network_compute_Spacewire_Transformation_SCM) or (Request.Entries (I).statement = Network_set_Spacewire_Transformation_SCM) or (Request.Entries (I).statement = Network_NoC_Compute_Communication_Delay) or (Request.Entries (I).statement = Network_NoC_Compute_Path_Delay) or (Request.Entries (I).statement = Network_NoC_Compute_Direct_Interference_Delay) or (Request.Entries (I).statement = Network_NoC_Compute_Indirect_Interference_Delay) or (Request.Entries (I).statement = Network_Compute_NoC_Transformation_ECTM_SAF) or (Request.Entries (I).statement = Network_Set_NoC_Transformation_ECTM_SAF) or (Request.Entries (I).statement = Network_Compute_NoC_Transformation_ECTM_Wormhole) or (Request.Entries (I).statement = Network_Set_NoC_Transformation_ECTM_Wormhole) or (Request.Entries (I).statement = Network_Compute_NoC_Transformation_WCCTM_SAF) or (Request.Entries (I).statement = Network_Set_NoC_Transformation_WCCTM_SAF) or (Request.Entries (I).statement = Network_Compute_NoC_Transformation_WCCTM_Wormhole) or (Request.Entries (I).statement = Network_Set_NoC_Transformation_WCCTM_Wormhole) then -- Only one call for all processors -- Initialize (A_Response); A_Request.Param := Request.Entries (I).param; A_Request.Statement := Request.Entries (I).statement; Call_A_Request (Sys, A_Request, A_Response.text, Output); if A_Response.text /= empty_string then A_Response.title := Build_A_Title (Request.Entries (I)); if A_Response.title /= empty_string then A_Response.title := unbounded_lf & unbounded_lf & A_Response.title & Lb_Colon & unbounded_lf & End_Title; end if; Add (Response, A_Response); end if; else -- A call for each processor -- reset_iterator (Sys.Processors, My_Iterator); loop current_element (Sys.Processors, A_Processor, My_Iterator); -- Do a request -- if (A_Processor.name = Request.Entries (I).target) or (Request.Entries (I).target = empty_string) then Initialize (A_Response); A_Request.Target := A_Processor; A_Request.Param := Request.Entries (I).param; A_Request.Statement := Request.Entries (I).statement; Call_A_Request (Sys, A_Request, A_Response.text, Output); if A_Response.text /= empty_string then A_Response.title := Build_A_Title (Request.Entries (I)); if A_Response.title /= empty_string then A_Response.title := unbounded_lf & A_Response.title & Lb_Comma & Lb_Processor (Current_Language) & Start_Proc & A_Processor.name & End_Proc & Lb_Colon & unbounded_lf & End_Title; end if; Add (Response, A_Response); end if; end if; exit when is_last_element (Sys.Processors, My_Iterator); next_element (Sys.Processors, My_Iterator); end loop; end if; end loop; end Sequential_Framework_Request; procedure Parallel_Framework_Request (Sys : in out System; Request : in Framework_Request_Table; Response : in out Framework_Response_Table; Order : in Perform_Order := Total_Order; Output : in Output_Format := String_Output) is begin Check_Initialize; end Parallel_Framework_Request; procedure Distributed_Framework_Request (Sys : in out System; Request : in Framework_Request_Table; Response : in out Framework_Response_Table; Order : in Perform_Order := Total_Order; Output : in Output_Format := String_Output) is begin Check_Initialize; end Distributed_Framework_Request; end Call_Framework;