ocarina-backends-vxworks653_conf-connections.adb 6.97 KB
Newer Older
1
--  with Locations;
2
3
with Ocarina.Backends.Utils;
with Ocarina.Namet; use Ocarina.Namet;
4
5
6
7
8
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;

9
with Ocarina.Backends.C_Common.Mapping;
10
11
with Ocarina.Backends.XML_Tree.Nodes;
with Ocarina.Backends.XML_Tree.Nutils;
12
with Ocarina.Backends.Vxworks653_Conf.Mapping;
13
14
15
16
17

package body Ocarina.Backends.Vxworks653_Conf.Connections is

--   use Locations;
   use Ocarina.ME_AADL;
18
   use Ocarina.Backends.Utils;
19
20
21
22
23

   use Ocarina.ME_AADL.AADL_Instances.Nodes;
   use Ocarina.ME_AADL.AADL_Instances.Entities;
   use Ocarina.Backends.XML_Tree.Nutils;

24
   use Ocarina.Backends.Vxworks653_Conf.Mapping;
25
26
27
28
29

   package AINU renames Ocarina.ME_AADL.AADL_Instances.Nutils;
   package XTN renames Ocarina.Backends.XML_Tree.Nodes;

   Root_Node : Node_Id := No_Node;
30
   Connections_Node : Node_Id := No_Node;
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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
119
120
121
122
123
124
125
126
127

   procedure Visit_Architecture_Instance (E : Node_Id);
   procedure Visit_Component_Instance (E : Node_Id);
   procedure Visit_System_Instance (E : Node_Id);
   procedure Visit_Processor_Instance (E : Node_Id);
   procedure Visit_Bus_Instance (E : Node_Id);
   procedure Visit_Virtual_Processor_Instance (E : Node_Id);
   -----------
   -- Visit --
   -----------

   procedure Visit (E : Node_Id) is
   begin
      case Kind (E) is
         when K_Architecture_Instance =>
            Visit_Architecture_Instance (E);

         when K_Component_Instance =>
            Visit_Component_Instance (E);

         when others =>
            null;
      end case;
   end Visit;

   ---------------------------------
   -- Visit_Architecture_Instance --
   ---------------------------------

   procedure Visit_Architecture_Instance (E : Node_Id) is
   begin
      Root_Node := Root_System (E);
      Visit (Root_Node);
   end Visit_Architecture_Instance;

   ------------------------------
   -- Visit_Component_Instance --
   ------------------------------

   procedure Visit_Component_Instance (E : Node_Id) is
      Category : constant Component_Category := Get_Category_Of_Component (E);
   begin
      case Category is
         when CC_System =>
            Visit_System_Instance (E);

         when CC_Processor =>
            Visit_Processor_Instance (E);

         when CC_Bus =>
            Visit_Bus_Instance (E);

         when CC_Virtual_Processor =>
            Visit_Virtual_Processor_Instance (E);

         when others =>
            null;
      end case;
   end Visit_Component_Instance;

   ---------------------------
   -- Visit_System_Instance --
   ---------------------------

   procedure Visit_System_Instance (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.
            if AINU.Is_Processor (Corresponding_Instance (S)) then
               Visit (Corresponding_Instance (S));
            end if;
            S := Next_Node (S);
         end loop;
      end if;
   end Visit_System_Instance;

   ------------------------
   -- Visit_Bus_Instance --
   ------------------------

   procedure Visit_Bus_Instance (E : Node_Id) is
      pragma Unreferenced (E);
   begin
      null;
   end Visit_Bus_Instance;

   ------------------------------
   -- Visit_Processor_Instance --
   ------------------------------

   procedure Visit_Processor_Instance (E : Node_Id) is
      U                 : Node_Id;
      P                 : Node_Id;
128
      S                 : Node_Id;
129
130
131
132
133
134
135
136
137
   begin
      U := XTN.Unit (Backend_Node (Identifier (E)));
      P := XTN.Node (Backend_Node (Identifier (E)));

      Push_Entity (P);
      Push_Entity (U);

      Current_XML_Node := XTN.Root_Node (XTN.XML_File (U));

138
139
140
141
142
143
144
145
146
147
148
149
150
      Connections_Node := Make_XML_Node ("Connections");

      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.
            if AINU.Is_Virtual_Processor (Corresponding_Instance (S)) then
               Visit (Corresponding_Instance (S));
            end if;
            S := Next_Node (S);
         end loop;
      end if;
151
152

      Append_Node_To_List
153
        (Connections_Node,
154
155
156
157
158
159
160
161
162
163
164
         XTN.Subitems (Current_XML_Node));

      Pop_Entity;
      Pop_Entity;
   end Visit_Processor_Instance;

   --------------------------------------
   -- Visit_Virtual_Processor_Instance --
   --------------------------------------

   procedure Visit_Virtual_Processor_Instance (E : Node_Id) is
165
166
167
168
169
170
171
172
      Corresponding_Process : Node_Id;
      Connection_Node       : Node_Id;
      Source_Node           : Node_Id;
      Destination_Node      : Node_Id;
      Feature               : Node_Id;
      Port_Source           : Node_Id;
      Port_Destination      : Node_Id;
      Partition_Destination : Node_Id;
173
   begin
174
175
176
177
178
179
180
181
182
183
184
185
186
187
      Corresponding_Process := Find_Associated_Process (E);

      Feature := First_Node (Features (Corresponding_Process));

      while Present (Feature) loop
         if Is_Data (Feature) and then Is_Out (Feature)
         then
            Port_Source := Feature;
            Port_Destination := Item (First_Node (Destinations (Feature)));
            Partition_Destination := Parent_Component (Port_Destination);

            Connection_Node := Make_XML_Node ("Connection");
            Source_Node := Make_XML_Node ("Source");
            Add_Attribute ("PartitionNameRef",
188
189
                           Get_Name_String
                              (Map_Partition_Name (E)),
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
                           Source_Node);

            Add_Attribute ("PortNameRef",
                           Get_Name_String
                              (C_Common.Mapping.Map_Port_Name
                                 (Port_Source)),
                           Source_Node);

            Append_Node_To_List (Source_Node,
                                 XTN.Subitems (Connection_Node));

            Destination_Node := Make_XML_Node ("Destination");
            Add_Attribute ("PortNameRef",
                           Get_Name_String
                              (C_Common.Mapping.Map_Port_Name
                                 (Port_Destination)),
                           Destination_Node);

            Add_Attribute ("PartitionNameRef",
                           Get_Name_String
210
211
212
                              (Map_Partition_Name
                                 (Get_Partition_Runtime
                                          (Partition_Destination))),
213
214
215
216
217
218
219
220
221
222
                         Destination_Node);

            Append_Node_To_List (Destination_Node,
                                 XTN.Subitems (Connection_Node));
            Append_Node_To_List (Connection_Node,
                                 XTN.Subitems (Connections_Node));
         end if;
         Feature := Next_Node (Feature);
      end loop;

223
224
225
   end Visit_Virtual_Processor_Instance;

end Ocarina.Backends.Vxworks653_Conf.Connections;