------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- 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: 431 $ -- $Date: 2011-04-24 13:35:23 +0200 (dim., 24 avr. 2011) $ -- $Author: singhoff $ ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ with Ada.Text_IO; use Ada.Text_IO; with Sax.Readers; use Sax.Readers; with Sax.Exceptions; use Sax.Exceptions; with Sax.Locators; use Sax.Locators; with Sax.Attributes; use Sax.Attributes; with Unicode.CES; use Unicode.CES; with Unicode; use Unicode; with Offsets; use Offsets; use Offsets.Offsets_Table_Package; with Parameters; use Parameters; use Parameters.User_Defined_Parameters_Table_Package; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with strings; use strings; with unbounded_strings; use unbounded_strings; with Dependencies; use Dependencies; with Resources; use Resources; use Resources.resource_accesses; with Resource_Set; use Resource_Set; use Resource_Set.Generic_Resource_Set; with Messages; use Messages; with Message_Set; use Message_Set; use Message_Set.Generic_Message_Set; with Event_Analyzer_Set; use Event_Analyzer_Set; use Event_Analyzer_Set.Generic_Event_Analyzer_Set; with Ada.Numerics.Aux; use Ada.Numerics.Aux; with Tasks; use Tasks; with Task_Set; use Task_Set; use Task_Set.Generic_Task_Set; with CacheS; use CacheS; with Cache_Set; use Cache_Set; with Address_SpaceS; use Address_SpaceS; with Address_Space_set; use Address_Space_set; use Address_Space_Set.Generic_Address_Space_Set; with Buffers; use Buffers; use Buffers.Buffer_Roles_package; with Buffer_Set; use Buffer_Set; use Buffer_Set.Generic_Buffer_Set; with Processors; use Processors; with Queueing_Systems; use Queueing_Systems; with Time_Unit_Events; use Time_Unit_Events; use Time_Unit_Events.Time_Unit_Package; with Scheduling_Analysis; use Scheduling_Analysis; with Scheduler_Interface; use Scheduler_Interface; with Task_Dependencies; use Task_Dependencies; with Network_Set; use Network_Set; with Ada.Strings.Maps; use Ada.Strings.Maps; with Networks; use Networks; with xml_architecture_io; use xml_architecture_io; with multiprocessor_services; use multiprocessor_services; with framework_config; use framework_config; package body Xml_generic_Parsers.event_table is tue1 : Time_Unit_Event_io; sched1 : Scheduling_Result_io; -- Variable to store indexes of indexed_table entities -- Index_value : natural; New_Table : Scheduling_Result_Ptr; New_Event : Time_Unit_Event_Ptr; A_Buffer : Buffer_Ptr; A_Message : Generic_Message_Ptr; A_Task : Generic_Task_Ptr; A_Cache : Generic_Cache_Ptr; A_Resource : Generic_Resource_Ptr; A_processor : Generic_processor_Ptr; function Get_Parsed_Event_Table (Handler : in Xml_Event_Table_Parser) return Scheduling_Table_Ptr is begin return Handler.Parsed_Event_Table; end Get_Parsed_Event_Table; procedure Set_Scheduled_System (Handler : in out Xml_Event_Table_Parser; Scheduled_System : in System) is begin Handler.Scheduled_System := Scheduled_System; end Set_Scheduled_System; procedure Initialize_Event_Table_Parser (Handler : in out Xml_Event_Table_Parser) is begin initialize(tue1); initialize(sched1); Handler.Current_Parameter := 1; end Initialize_Event_Table_Parser; procedure Start_Document (Handler : in out Xml_Event_Table_Parser) is begin Initialize_Event_Table_Parser (Handler); Handler.Parsed_Event_Table := new Scheduling_Table; end Start_Document; procedure Start_Element (Handler : in out Xml_Event_Table_Parser; Namespace_Uri : Unicode.CES.Byte_Sequence := ""; Local_Name : Unicode.CES.Byte_Sequence := ""; Qname : Unicode.CES.Byte_Sequence := ""; Atts : Sax.Attributes.Attributes'Class) is begin Handler.Current_Parameter := 1; Start_Element(xml_generic_parser(handler), tue1, namespace_uri, local_name, qname, atts); Start_Element(xml_generic_parser(handler), sched1, namespace_uri, local_name, qname, atts); if Qname = "scheduling_result" then New_table:= new Scheduling_Result; New_table.has_error := False; New_table.scheduling_msg := empty_string; New_table.error_msg := empty_string; New_table.result := new Scheduling_Sequence; -- Today, we do not set the processor name of the corresponding -- scheduling table a_processor:=null; add (Handler.Parsed_Event_Table.all, a_processor, New_table.all); end if; end Start_Element; procedure End_Element (Handler : in out Xml_Event_Table_Parser; Namespace_Uri : Unicode.CES.Byte_Sequence := ""; Local_Name : Unicode.CES.Byte_Sequence := ""; Qname : Unicode.CES.Byte_Sequence := "") is begin end_element(xml_generic_parser(handler), index_value, namespace_uri,local_name,qname); end_Element(xml_generic_parser(handler), tue1, namespace_uri, local_name, qname); end_Element(xml_generic_parser(handler), sched1, namespace_uri, local_name, qname); if Qname = "scheduling_result" then Initialize_Event_Table_Parser (Handler); end if; if Qname = "time_unit_event" then case tue1.type_of_event is when start_of_task_capacity => A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.start_Task); New_Event := new Time_Unit_Event (Start_Of_Task_Capacity); New_Event.start_task := a_task; add (New_Table.result.all, index_Value, new_event); when end_of_task_capacity => A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.end_Task); New_Event := new Time_Unit_Event (End_Of_Task_Capacity); New_Event.end_task := A_Task; add (New_Table.result.all, index_Value, new_event); when write_to_buffer => A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.write_task); A_Buffer := Search_Buffer_by_id (Handler.Scheduled_System.Buffers, tue1.write_Buffer); New_Event := new Time_Unit_Event (write_to_buffer); New_Event.write_buffer := A_Buffer; New_Event.write_task := a_task; New_Event.write_size := tue1.write_size; add (New_Table.result.all, index_Value, new_event); when read_from_buffer => A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.read_Task); A_Buffer := Search_Buffer_by_id (Handler.Scheduled_System.Buffers, tue1.read_Buffer); New_Event := new Time_Unit_Event (Read_From_Buffer); New_Event.read_buffer := A_Buffer; New_Event.read_task := A_Task; New_Event.read_size := tue1.read_size; add (New_Table.result.all, index_Value, new_event); when context_switch_overhead => A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.switched_Task); New_Event := new Time_Unit_Event (context_switch_overhead); New_Event.switched_task := A_Task; add (New_Table.result.all, index_Value, new_event); when running_task => A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.running_task); New_Event := new Time_Unit_Event (Running_Task); New_Event.running_task := A_Task; New_Event.current_priority:= priority_range(tue1.current_priority); add (New_Table.result.all, index_Value, new_event); when task_activation => A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.activation_task); New_Event := new Time_Unit_Event (Task_activation); New_Event.activation_task := A_Task; add (New_Table.result.all, index_Value, new_event); when allocate_resource => A_Resource := Search_Resource_by_id (Handler.Scheduled_System.Resources, tue1.allocate_resource); A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.allocate_Task); New_Event := new Time_Unit_Event (Allocate_Resource); New_Event.allocate_task := A_Task; New_Event.allocate_resource := A_Resource; add (New_Table.result.all, index_Value, new_event); when release_resource => A_Resource := Search_Resource_by_id (Handler.Scheduled_System.Resources, tue1.release_Resource); A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.release_Task); New_Event := new Time_Unit_Event (Release_Resource); New_Event.release_task := A_Task; New_Event.release_resource := A_Resource; add (New_Table.result.all, index_Value, new_event); when wait_for_resource => A_Resource := Search_Resource_by_id (Handler.Scheduled_System.Resources, tue1.wait_for_Resource); A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.wait_for_resource_Task); New_Event := new Time_Unit_Event (Wait_For_Resource); New_Event.wait_for_resource_task := A_Task; New_Event.wait_for_resource := A_Resource; add (New_Table.result.all, index_Value, new_event); when send_message => A_Message := Search_Message_by_id (Handler.Scheduled_System.Messages, tue1.send_Message); A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.send_Task); New_Event := new Time_Unit_Event (Send_Message); New_Event.send_task := A_Task; New_Event.send_message := A_Message; add (New_Table.result.all, index_Value, new_event); when receive_message => A_Message := Search_Message_by_id (Handler.Scheduled_System.Messages, tue1.receive_Message); A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.receive_Task); New_Event := new Time_Unit_Event (Receive_Message); New_Event.receive_task := A_Task; New_Event.receive_message := A_Message; add (New_Table.result.all, index_Value, new_event); when wait_for_memory => A_Cache := Search_Cache_by_id (Handler.Scheduled_System.Caches, tue1.wait_for_cache); A_Task := Search_Task_by_id (Handler.Scheduled_System.Tasks, tue1.wait_for_memory_task); New_Event := new Time_Unit_Event (wait_for_memory); New_Event.wait_for_memory_task := A_Task; New_Event.wait_for_cache := A_cache; add (New_Table.result.all, index_Value, new_event); when address_space_activation => New_Event := new Time_Unit_Event (address_space_activation); New_Event.activation_address_space := tue1.activation_address_space; New_Event.duration := tue1.duration; add (New_Table.result.all, index_Value, new_event); end case; Initialize_Event_Table_Parser (Handler); end if; end End_Element; end Xml_generic_Parsers.event_table;