Commit b52871e4 authored by hugues.jerome's avatar hugues.jerome

* Add AADL-to-Cheddar backend


git-svn-id: https://tecsw.estec.esa.int/svn/taste/trunk/ocarina@866 129961e7-ef38-4bb5-a8f7-c9a525a55882
parent 2df81058
------------------------------------------------------------------------------
-- --
-- OCARINA COMPONENTS --
-- --
-- O C A R I N A . B A C K E N D S . C H E D D A R . M A I N --
-- --
-- B o d y --
-- --
-- Copyright (C) 2010, GET-Telecom Paris. --
-- --
-- Ocarina is free software; you can redistribute it and/or modify --
-- it under terms of the GNU General Public License as published by the --
-- Free Software Foundation; either version 2, or (at your option) any --
-- later version. Ocarina 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 distributed with Ocarina; see file COPYING. --
-- If not, write to the Free Software Foundation, 51 Franklin Street, Fifth --
-- Floor, Boston, MA 02111-1301, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
-- Ocarina is maintained by the Ocarina team --
-- (ocarina-users@listes.enst.fr) --
-- --
------------------------------------------------------------------------------
with Ocarina.ME_AADL;
with Ocarina.ME_AADL.AADL_Instances.Nodes;
with Ocarina.ME_AADL.AADL_Instances.Nutils;
with Ocarina.ME_AADL.AADL_Instances.Entities;
with Ocarina.Backends.XML_Tree.Nodes;
with Ocarina.Backends.XML_Tree.Nutils;
with Ocarina.Backends.Cheddar.Mapping;
package body Ocarina.Backends.Cheddar.Main is
use Ocarina.ME_AADL;
use Ocarina.ME_AADL.AADL_Instances.Nodes;
use Ocarina.ME_AADL.AADL_Instances.Entities;
use Ocarina.Backends.XML_Tree.Nutils;
use Ocarina.Backends.Cheddar.Mapping;
package AINU renames Ocarina.ME_AADL.AADL_Instances.Nutils;
package XTN renames Ocarina.Backends.XML_Tree.Nodes;
procedure Visit_Component (E : Node_Id);
procedure Visit_System (E : Node_Id);
procedure Visit_Processor (E : Node_Id);
procedure Visit_Thread (E : Node_Id);
procedure Visit_Process (E : Node_Id);
procedure Visit_Data (E : Node_Id);
----------------------------
-- Visit_Subcomponents_Of --
----------------------------
procedure Visit_Subcomponents_Of (E : Node_Id);
procedure Visit_Subcomponents_Of (E : Node_Id) is
S : Node_Id;
begin
if not AINU.Is_Empty (Subcomponents (E)) then
S := First_Node (Subcomponents (E));
while Present (S) loop
-- Visit the component instance corresponding to the
-- subcomponent S.
Visit (Corresponding_Instance (S));
S := Next_Node (S);
end loop;
end if;
end Visit_Subcomponents_Of;
Root_System_Node : Node_Id := No_Node;
Cheddar_Node : Node_Id := No_Node;
Tasks_Node : Node_Id := No_Node;
Processors_Node : Node_Id := No_Node;
Address_Node : Node_Id := No_Node;
Buffers_Node : Node_Id := No_Node;
Resources_Node : Node_Id := No_Node;
Dependencies_Node : Node_Id := No_Node;
-----------
-- Visit --
-----------
procedure Visit (E : Node_Id) is
begin
case Kind (E) is
when K_Architecture_Instance =>
Root_System_Node := Root_System (E);
Visit (Root_System_Node);
when K_Component_Instance =>
Visit_Component (E);
when others =>
null;
end case;
end Visit;
---------------------
-- Visit_Component --
---------------------
procedure Visit_Component (E : Node_Id) is
Category : constant Component_Category
:= Get_Category_Of_Component (E);
begin
case Category is
when CC_System =>
Visit_System (E);
when CC_Processor =>
Visit_Processor (E);
when CC_Process =>
Visit_Process (E);
when CC_Thread =>
Visit_Thread (E);
when CC_Data =>
Visit_Data (E);
when others =>
null;
end case;
end Visit_Component;
------------------
-- Visit_Thread --
------------------
procedure Visit_Thread (E : Node_Id) is
F : Node_Id;
begin
Append_Node_To_List
(Map_Thread (E), XTN.Subitems (Tasks_Node));
if Present (Features (E)) then
F := First_Node (Features (E));
while Present (F) loop
if Kind (F) = K_Port_Spec_Instance
and then Is_Event (F)
then
if Is_In (F) then
Append_Node_To_List
(Map_Buffer (E, F), XTN.Subitems (Buffers_Node));
end if;
Append_Node_To_List
(Map_Dependency (E, F), XTN.Subitems (Dependencies_Node));
end if;
F := Next_Node (F);
end loop;
end if;
Visit_Subcomponents_Of (E);
end Visit_Thread;
------------------
-- Visit_Data --
------------------
procedure Visit_Data (E : Node_Id) is
begin
Append_Node_To_List
(Map_Data (E), XTN.Subitems (Resources_Node));
Visit_Subcomponents_Of (E);
end Visit_Data;
----------------------------
-- Visit_Process_Instance --
----------------------------
procedure Visit_Process (E : Node_Id) is
begin
Append_Node_To_List
(Map_Process (E), XTN.Subitems (Address_Node));
Visit_Subcomponents_Of (E);
end Visit_Process;
---------------------
-- Visit_Processor --
---------------------
procedure Visit_Processor (E : Node_Id) is
begin
Append_Node_To_List
(Map_Processor (E), XTN.Subitems (Processors_Node));
Visit_Subcomponents_Of (E);
end Visit_Processor;
------------------
-- Visit_System --
------------------
procedure Visit_System (E : Node_Id) is
P : Node_Id;
U : Node_Id;
begin
P := Map_HI_Node (E);
Push_Entity (P);
U := Map_HI_Unit (E);
Push_Entity (U);
-- A cheddar XML file is made of one cheddar node, with several
-- children: tasks (AADL tasks), processors (AADL processors),
-- address_spaces (AADL processes), resources (AADL data
-- components).
-- <!ELEMENT cheddar (processors,
-- (address_spaces)?,
-- (tasks)?,
-- ((event_analyzers)?
-- |(networks)?
-- |(buffers)?
-- |(resources)?
-- |(messages)?),
-- (dependencies)?)
-- >
if Cheddar_Node = No_Node then
Cheddar_Node := Make_Xml_Node ("cheddar");
Append_Node_To_List
(Cheddar_Node, XTN.Subitems (XTN.Root_Node (XTN.XML_File (U))));
end if;
if Processors_Node = No_Node then
Processors_Node := Make_XML_Node ("processors");
Append_Node_To_List (Processors_Node, XTN.Subitems (Cheddar_Node));
end if;
if Address_Node = No_Node then
Address_Node := Make_XML_Node ("address_spaces");
Append_Node_To_List (Address_Node, XTN.Subitems (Cheddar_Node));
end if;
if Tasks_Node = No_Node then
Tasks_Node := Make_XML_Node ("tasks");
Append_Node_To_List (Tasks_Node, XTN.Subitems (Cheddar_Node));
end if;
if Buffers_Node = No_Node then
Buffers_Node := Make_XML_Node ("buffers");
Append_Node_To_List (Buffers_Node, XTN.Subitems (Cheddar_Node));
end if;
if Resources_Node = No_Node then
Resources_Node := Make_XML_Node ("resources");
Append_Node_To_List (Resources_Node, XTN.Subitems (Cheddar_Node));
end if;
if Dependencies_Node = No_Node then
Dependencies_Node := Make_XML_Node ("dependencies");
Append_Node_To_List (Dependencies_Node, XTN.Subitems (Cheddar_Node));
end if;
Visit_Subcomponents_Of (E);
Pop_Entity;
Pop_Entity; -- A
end Visit_System;
end Ocarina.Backends.Cheddar.Main;
------------------------------------------------------------------------------
-- --
-- OCARINA COMPONENTS --
-- --
-- O C A R I N A . B A C K E N D S . C H E D D A R . M A I N --
-- --
-- S p e c --
-- --
-- Copyright (C) 2010, GET-Telecom Paris. --
-- --
-- Ocarina is free software; you can redistribute it and/or modify --
-- it under terms of the GNU General Public License as published by the --
-- Free Software Foundation; either version 2, or (at your option) any --
-- later version. Ocarina 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 distributed with Ocarina; see file COPYING. --
-- If not, write to the Free Software Foundation, 51 Franklin Street, Fifth --
-- Floor, Boston, MA 02111-1301, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
-- Ocarina is maintained by the Ocarina team --
-- (ocarina-users@listes.enst.fr) --
-- --
------------------------------------------------------------------------------
package Ocarina.Backends.Cheddar.Main is
procedure Visit (E : Node_Id);
end Ocarina.Backends.Cheddar.Main;
This diff is collapsed.
------------------------------------------------------------------------------
-- --
-- OCARINA COMPONENTS --
-- --
-- O C A R I N A . B A C K E N D S . C H E D D A R . M A P P I N G --
-- --
-- S p e c --
-- --
-- Copyright (C) 2010, GET-Telecom Paris. --
-- --
-- Ocarina is free software; you can redistribute it and/or modify --
-- it under terms of the GNU General Public License as published by the --
-- Free Software Foundation; either version 2, or (at your option) any --
-- later version. Ocarina 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 distributed with Ocarina; see file COPYING. --
-- If not, write to the Free Software Foundation, 51 Franklin Street, Fifth --
-- Floor, Boston, MA 02111-1301, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
-- Ocarina is maintained by the Ocarina team --
-- (ocarina-users@listes.enst.fr) --
-- --
------------------------------------------------------------------------------
package Ocarina.Backends.Cheddar.Mapping is
function Map_HI_Node (E : Node_Id) return Node_Id;
function Map_HI_Unit (E : Node_Id) return Node_Id;
function Map_Processor (E : Node_Id) return Node_Id;
function Map_Process (E : Node_Id) return Node_Id;
function Map_Thread (E : Node_Id) return Node_Id;
function Map_Buffer (E : Node_Id; P : Node_Id) return Node_Id;
function Map_Dependency (E : Node_Id; P : Node_Id) return Node_Id;
function Map_Data (E : Node_Id) return Node_Id;
end Ocarina.Backends.Cheddar.Mapping;
------------------------------------------------------------------------------
-- --
-- OCARINA COMPONENTS --
-- --
-- O C A R I N A . B A C K E N D S . C H E D D A R --
-- --
-- B o d y --
-- --
-- Copyright (C) 2010, GET-Telecom Paris. --
-- --
-- Ocarina is free software; you can redistribute it and/or modify --
-- it under terms of the GNU General Public License as published by the --
-- Free Software Foundation; either version 2, or (at your option) any --
-- later version. Ocarina 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 distributed with Ocarina; see file COPYING. --
-- If not, write to the Free Software Foundation, 51 Franklin Street, Fifth --
-- Floor, Boston, MA 02111-1301, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
-- Ocarina is maintained by the Ocarina team --
-- (ocarina-users@listes.enst.fr) --
-- --
------------------------------------------------------------------------------
with Ocarina.Instances;
with Ocarina.Backends.Expander;
with Ocarina.Backends.Messages;
with Ocarina.Backends.Cheddar.Main;
with Ocarina.Backends.Utils;
with Ocarina.Backends.XML_Tree.Nodes;
with Ocarina.Backends.XML_Tree.Nutils;
with Ocarina.Backends.XML_Tree.Generator;
with GNAT.Command_Line; use GNAT.Command_Line;
with Namet; use Namet;
package body Ocarina.Backends.Cheddar is
use Ocarina.Instances;
use Ocarina.Backends.Messages;
use Ocarina.Backends.Utils;
use Ocarina.Backends.Expander;
package XTN renames Ocarina.Backends.XML_Tree.Nodes;
package XTU renames Ocarina.Backends.XML_Tree.Nutils;
Generated_Sources_Directory : Name_Id := No_Name;
procedure Visit_Architecture_Instance (E : Node_Id);
-- Most top level visitor routine. E is the root of the AADL
-- instance tree. The procedure does a traversal for each
-- compilation unit to be generated.
--------------
-- Generate --
--------------
procedure Generate (AADL_Root : Node_Id) is
Instance_Root : Node_Id;
begin
Instance_Root := Instantiate_Model (AADL_Root);
-- Expand the AADL instance
Expand (Instance_Root);
Visit_Architecture_Instance (Instance_Root);
-- Abort if the construction of the XML tree failed
if No (XML_Root) then
Display_Error ("XML generation failed", Fatal => True);
end if;
Enter_Directory (Generated_Sources_Directory);
-- Create the XML file
XML_Tree.Generator.Generate (XML_Root);
Leave_Directory;
end Generate;
----------
-- Init --
----------
procedure Init is
begin
Generated_Sources_Directory := Get_String_Name (".");
Initialize_Option_Scan;
loop
case Getopt ("* o:") is
when ASCII.NUL =>
exit;
when 'o' =>
declare
D : constant String := Parameter;
begin
if D'Length /= 0 then
Generated_Sources_Directory := Get_String_Name (D);
end if;
end;
when others =>
null;
end case;
end loop;
Register_Backend ("cheddar", Generate'Access, Cheddar_XML);
end Init;
-----------
-- Reset --
-----------
procedure Reset is
begin
null;
end Reset;
---------------------------------
-- Visit_Architecture_Instance --
---------------------------------
procedure Visit_Architecture_Instance (E : Node_Id) is
begin
XML_Root := XTU.New_Node (XTN.K_HI_Distributed_Application);
Set_Str_To_Name_Buffer ("generated-code");
-- Set_Str_To_Name_Buffer (".");
XTN.Set_Name (XML_Root, Name_Find);
XTN.Set_Units (XML_Root, XTU.New_List (XTN.K_List_Id));
XTN.Set_HI_Nodes (XML_Root, XTU.New_List (XTN.K_List_Id));
XTU.Push_Entity (XML_Root);
Cheddar.Main.Visit (E);
XTU.Pop_Entity;
end Visit_Architecture_Instance;
end Ocarina.Backends.Cheddar;
------------------------------------------------------------------------------
-- --
-- OCARINA COMPONENTS --
-- --
-- O C A R I N A . B A C K E N D S . C H E D D A R --
-- --
-- S p e c --
-- --
-- Copyright (C) 2010, GET-Telecom Paris. --
-- --
-- Ocarina is free software; you can redistribute it and/or modify --
-- it under terms of the GNU General Public License as published by the --
-- Free Software Foundation; either version 2, or (at your option) any --
-- later version. Ocarina 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 distributed with Ocarina; see file COPYING. --
-- If not, write to the Free Software Foundation, 51 Franklin Street, Fifth --
-- Floor, Boston, MA 02111-1301, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
-- Ocarina is maintained by the Ocarina team --
-- (ocarina-users@listes.enst.fr) --
-- --
------------------------------------------------------------------------------
package Ocarina.Backends.Cheddar is
-- This backend generates an XML file compatible with the Cheddar
-- tool, provided by UBO:
-- http://beru.univ-brest.fr/~singhoff/cheddar/
procedure Generate (AADL_Root : Node_Id);
-- The main entry point of the Cheddar
procedure Init;
-- Fills the corresponding location in the generator table by the
-- information on this generator and execute some initialization
-- routines necessary for its work.
procedure Reset;
private
XML_Root : Node_Id;
Current_XML_Node : Node_Id;
Distributed_Application : Node_Id;
HI_Node : Node_Id;
HI_Unit : Node_Id;
-- The root of the XML trees
end Ocarina.Backends.Cheddar;
......@@ -387,6 +387,9 @@ package Ocarina.Backends.Properties is
Thread_With_Port_Compute_Entrypoint,
Thread_Unknown);
type Supported_POSIX_Scheduling_Policy is
(SCHED_FIFO, SCHED_RR, SCHED_OTHERS, None);
function Get_Dispatch_Offset (T : Node_Id) return Time_Type;
-- Return the thread dispatch offset for periodic task.
......@@ -397,6 +400,12 @@ package Ocarina.Backends.Properties is
-- no protocol has been specified by the user, then return
-- Thread_None.
function Get_Thread_POSIX_Scheduling_Policy
(T : Node_Id)
return Supported_POSIX_Scheduling_Policy;
-- Return the POSIX scheduling policy of a given thread
-- component. If no policy has been specified, then return none.
function Get_Thread_Period (T : Node_Id) return Time_Type;
-- Return the period (for periodic threads) or the minumum
-- dispatch interval (for sporadic threads). The returned value is
......@@ -410,6 +419,12 @@ package Ocarina.Backends.Properties is
-- AADL. If the thread has no deadline property defined, return
-- the value of the thread period.
function Get_Thread_First_Dispatch_Time (T : Node_Id) return Time_Type;
-- Return the first dispact time of a thread. The returned value
-- is converted to the closest time unit depending on its unit in
-- AADL. If the thread has no deadline property defined, return
-- the value of the thread period.
function Get_Thread_Priority (T : Node_Id) return Unsigned_Long_Long;
-- Return the thread priority given by the user. Otherwise, return
-- 0.
......@@ -562,6 +577,8 @@ package Ocarina.Backends.Properties is
-- location and an error is raised if P is not mapped to any
-- processor.
function Get_Scheduler_Quantum (P : Node_Id) return Time_Type;
--------------------------------
-- AADL Connection Properties --
--------------------------------
......
......@@ -145,11 +145,13 @@ package body Ocarina.Backends.Utils is
end if;
if Is_Directory (Dir_Full_String) then
Display_Error
(Dir_Full_String
& " already exists",
Fatal => False,
Warning => True);
if Dir_Full_String /= "." then
Display_Error
(Dir_Full_String
& " already exists",
Fatal => False,
Warning => True);
end if;
return;
end if;
......
......@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
-- Copyright (C) 2009, GET-Telecom Paris. --
-- Copyright (C) 2009-2010, GET-Telecom Paris. --
-- --
-- Ocarina is free software; you can redistribute it and/or modify --
-- it under terms of the GNU General Public License as published by the --
......@@ -31,13 +31,18 @@
-- --
------------------------------------------------------------------------------
with Ocarina.ME_AADL.AADL_Instances.Nodes;
with Ocarina.Backends.XML_Values;
with Ocarina.Backends.XML_Tree.Nodes;
with Ocarina.Backends.XML_Tree.Nutils;
package body Ocarina.Backends.XML_Common.Mapping is
use Ocarina.ME_AADL.AADL_Instances.Nodes;
use Ocarina.Backends.XML_Tree.Nutils;
package XV renames Ocarina.Backends.XML_Values;
use Ocarina.Backends.XML_Tree.Nodes;
package XV renames Ocarina.Backends.XML_Values;
--------------
-- Map_Time --
......@@ -84,4 +89,47 @@ package body Ocarina.Backends.XML_Common.Mapping is
return Make_Literal (XV.New_Numeric_Value (Time, 1, 10));
end Map_Time;
---------------------
-- Map_To_XML_Node --
---------------------
function Map_To_XML_Node (Name : String; Value : Unsigned_Long_Long)
return Node_Id is
N, V : Node_Id;
begin
N := Make_XML_Node (Name);
V := Make_Literal (XV.New_Numeric_Value (Value, 1, 10));
Append_Node_To_List (V, Subitems (N));
return N;
end Map_To_XML_Node;
function Map_To_XML_Node (Name : String; Value : Name_Id)
return Node_Id is
N, V : Node_Id;
begin
N := Make_XML_Node (Name);
V := Make_Defining_Identifier (Value);
Append_Node_To_List (V, Subitems (N));
return N;
end Map_To_XML_Node;
-------------------------------------
-- Map_Node_Identifier_To_XML_Node --
-------------------------------------
function Map_Node_Identifier_To_XML_Node
(Name : String; The_Node : Node_Id) return Node_Id
is
N, V : Node_Id;
begin
N := Make_XML_Node (Name);