parser_utils.adb 7.54 KB
Newer Older
1
--  *************************** taste aadl parser *************************  --
Maxime Perrotin's avatar
Maxime Perrotin committed
2
3
4
5
--  (c) 2008-2017 European Space Agency - maxime.perrotin@esa.int
--  LGPL license, see LICENSE file

with Ada.Text_IO,
6
     Parser_Version,
Maxime Perrotin's avatar
Maxime Perrotin committed
7
     Ocarina.AADL_Values,
8
9
     Ocarina.Configuration,
     Ocarina.FE_AADL.Parser,
Maxime Perrotin's avatar
Maxime Perrotin committed
10
     Ocarina.Instances.Queries,
11
12
13
     GNAT.OS_Lib,
     Ada.Characters.Latin_1,
     GNAT.Command_Line;
Maxime Perrotin's avatar
Maxime Perrotin committed
14

15
package body Parser_Utils is
Maxime Perrotin's avatar
Maxime Perrotin committed
16
17
18
19

   use Ada.Text_IO,
       Ocarina.Instances.Queries,
       Ada.Characters.Latin_1,
20
21
22
       GNAT.OS_Lib,
       Ocarina.ME_AADL,
       GNAT.Command_Line;
Maxime Perrotin's avatar
Maxime Perrotin committed
23
24
25
26
27
28
29

   ------------
   -- Banner --
   ------------

   procedure Banner is
      The_Banner : constant String :=
Maxime Perrotin's avatar
Maxime Perrotin committed
30
        Yellow_Bold & "TASTE AADL Parser" & No_Color & " (Version "
31
        & Parser_Version.Parser_Release & ") "
Maxime Perrotin's avatar
Maxime Perrotin committed
32
33
34
35
36
        & ASCII.LF & ASCII.CR & No_Color
        & "Contact: " & Underscore
        & "Maxime.Perrotin@esa.int" & No_Color & " or " & Underscore
        & "Thanassis.Tsiodras@esa.int"
        & ASCII.LF & ASCII.CR & No_Color
TASTE User's avatar
TASTE User committed
37
        & "Based on " & Parser_Version.Ocarina_Version;
Maxime Perrotin's avatar
Maxime Perrotin committed
38
39
40
41
42
43
44
45
46
47
   begin
      Put_Line (The_Banner);
   end Banner;

   -----------
   -- Usage --
   -----------

   procedure Usage is
   begin
48

Maxime Perrotin's avatar
Maxime Perrotin committed
49
50
      Put ("-l, --glue" & HT & HT & HT & HT);
      Put_Line ("Generate glue code");
51

Maxime Perrotin's avatar
Maxime Perrotin committed
52
53
      Put ("-w, --gw" & HT & HT & HT & HT);
      Put_Line ("Generate code skeletons");
54

Maxime Perrotin's avatar
Maxime Perrotin committed
55
56
      Put ("-o, --output <outputDir>" & HT & HT);
      Put_Line ("Root directory for the output files");
57

Maxime Perrotin's avatar
Maxime Perrotin committed
58
59
      Put ("-c, --deploymentview <d_view.aadl>" & HT);
      Put_Line ("The deployment view in AADL");
60

Maxime Perrotin's avatar
Maxime Perrotin committed
61
62
      Put ("-d, --dataview <dataview.aadl>" & HT & HT);
      Put_Line ("The data view in AADL");
63

Maxime Perrotin's avatar
Maxime Perrotin committed
64
65
      Put ("-t, --test" & HT & HT & HT & HT);
      Put_Line ("Dump model information");
66

Maxime Perrotin's avatar
Maxime Perrotin committed
67
68
      Put ("-g, --debug" & HT & HT & HT & HT);
      Put_Line ("Generate runtime debug output");
69

Maxime Perrotin's avatar
Maxime Perrotin committed
70
71
      Put ("-x, --timer <timer-resolution in ms>" & HT);
      Put_Line ("Set the timer resolution (default 100 ms)");
72

Maxime Perrotin's avatar
Maxime Perrotin committed
73
      Put ("-v, --version" & HT & HT & HT & HT);
74
      Put_Line ("Display taste-aadl-parser version number");
75

Maxime Perrotin's avatar
Maxime Perrotin committed
76
77
      Put ("-p, --polyorb-hi-c" & HT & HT & HT);
      Put_Line ("Interface glue code with PolyORB-HI-C");
78

Maxime Perrotin's avatar
Maxime Perrotin committed
79
80
      Put ("otherfiles" & HT & HT & HT & HT);
      Put_Line ("Any other aadl file you want to parse");
81

Maxime Perrotin's avatar
Maxime Perrotin committed
82
83
84
      Put_Line ("For example, this command will generate your application"
       & " skeletons:");
      New_Line;
85
      Put_Line ("taste-aadl-parser -i InterfaceView.aadl -d DataView.aadl"
Maxime Perrotin's avatar
Maxime Perrotin committed
86
87
88
89
90
       & " -o code --gw --keep-case");
      New_Line;

   end Usage;

91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
   function Parse_Command_Line return Taste_Configuration is
      Config : Command_Line_Configuration;
      Result : Taste_Configuration;
   begin
      Define_Switch (Config, Output => Result.Interface_View'Access,
                     Switch   => "-i:", Long_Switch => "--interfaceview=",
                     Help     => "Mandatory interface view (AADL model)",
                     Argument => "InterfaceView.aadl");
      Define_Switch (Config, Output => Result.Deployment_View'Access,
                     Switch   => "-c:", Long_Switch => "--deploymentview=",
                     Help     => "Optional deployment view (AADL model)",
                     Argument => "DeploymentView.aadl");
      Define_Switch (Config, Output => Result.Data_View'Access,
                     Switch   => "-d:", Long_Switch => "--dataview=",
                     Help     => "Optional data view (AADL model)",
                     Argument => "DataView.aadl");
      Getopt (Config);
      loop
         declare
            S : constant String := Get_Argument;
         begin
            exit when S'Length = 0;
            Put_Line ("File argument : " & S);
         end;
      end loop;
      return Result;
   end Parse_Command_Line;

Maxime Perrotin's avatar
Maxime Perrotin committed
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
   -----------------------
   -- Get_APLC_Binding --
   -----------------------

   function Get_APLC_Binding (E : Node_Id) return List_Id is
      APLC_Binding : constant Name_Id :=
          Get_String_Name ("taste::aplc_binding");
   begin
      if Is_Defined_Property (E, APLC_Binding) then
         return Get_List_Property (E, APLC_Binding);
      else
         return No_List;
      end if;
   end Get_APLC_Binding;

134
135
136
137
138
139
140
141
142
143
144
   ------------------------
   -- Get_Interface_Name --
   ------------------------

   function Get_Interface_Name (D : Node_Id) return Name_Id is
      Interface_Name : constant Name_id :=
         Get_String_Name ("taste::interfacename");
   begin
      return Get_String_Property (D, Interface_Name);
   end Get_Interface_Name;

Maxime Perrotin's avatar
Maxime Perrotin committed
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
   --------------------------------------------
   -- Get all properties as a Map Key/String --
   -- Input parameter is an AADL instance    --
   --------------------------------------------
   function Get_Properties_Map (D : Node_Id) return Property_Maps.Map is
      properties : constant List_Id  := AIN.Properties (D);
      result     : Property_Maps.Map := Property_Maps.Empty_Map;
      property   : Node_Id           := AIN.First_Node (properties);
      prop_value : Node_Id;
      single_val : Node_Id;
   begin
      while Present (property) loop
         prop_value := AIN.Property_Association_Value (property);
         if Present (ATN.Single_Value (prop_value)) then
            --  Only support single-value properties for now
            single_val := ATN.Single_Value (prop_value);
            result.Insert (Key => AIN_Case (property),
162
163
164
                           New_Item => (Name  => US (AIN_Case (property)),
                                        Value =>
              US (case ATN.Kind (single_val) is
Maxime Perrotin's avatar
Maxime Perrotin committed
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
                 when ATN.K_Signed_AADLNumber =>
                   Ocarina.AADL_Values.Image
                      (ATN.Value (ATN.Number_Value (single_val))) &
                      (if Present (ATN.Unit_Identifier (single_val)) then " " &
                      Get_Name_String
                          (ATN.Display_Name (ATN.Unit_Identifier (single_val)))
                      else ""),
                 when ATN.K_Literal =>
                    Ocarina.AADL_Values.Image (ATN.Value (single_val),
                                               Quoted => False),
                 when ATN.K_Reference_Term =>
                    Get_Name_String
                       (ATN.Display_Name (ATN.First_Node --  XXX must iterate
                          (ATN.List_Items (ATN.Reference_Term (single_val))))),
                 when ATN.K_Enumeration_Term =>
                    Get_Name_String
                       (ATN.Display_Name (ATN.Identifier (single_val))),
                 when ATN.K_Number_Range_Term =>
                    "RANGE NOT SUPPORTED!",
                 when others => "ERROR! Unsupported kind: "
185
                                & ATN.Kind (single_val)'Img)));
Maxime Perrotin's avatar
Maxime Perrotin committed
186
187
188
189
190
191
         end if;
         property := AIN.Next_Node (property);
      end loop;
      return result;
   end Get_Properties_Map;

192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
   --  Initialization step: we look for ocarina on path to define
   --  OCARINA_PATH env. variable. This will indicate Ocarina librrary
   --  where to find AADL default property sets, and Ocarina specific
   --  packages and property sets.
   procedure Initialize_Ocarina is
      S : constant GNAT.OS_Lib.String_Access :=
        GNAT.OS_Lib.Locate_Exec_On_Path ("ocarina");
   begin
      if S = null then
         raise AADL_Parser_Error with "Ocarina is not in your PATH";
      end if;
      GNAT.OS_Lib.Setenv ("OCARINA_PATH", S.all (S'First .. S'Last - 12));
      Ocarina.Initialize;
      Ocarina.AADL_Version := Ocarina.AADL_V2;
      Ocarina.Configuration.Init_Modules;
      Ocarina.FE_AADL.Parser.Add_Pre_Prop_Sets := True;
   end Initialize_Ocarina;
209
end Parser_Utils;