]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Object/Parser/InfGuidObject.py
Add PCI PMC and PMCSR register definitions from PCI Power Management Interface Specif...
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Object / Parser / InfGuidObject.py
CommitLineData
4234283c
LG
1## @file\r
2# This file is used to define class objects of INF file [Guids] section. \r
3# It will consumed by InfParser. \r
4#\r
5# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
6#\r
7# This program and the accompanying materials are licensed and made available \r
8# under the terms and conditions of the BSD License which accompanies this \r
9# distribution. The full text of the license may be found at \r
10# http://opensource.org/licenses/bsd-license.php\r
11#\r
12# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15'''\r
16InfGuidObject\r
17'''\r
18\r
19from Library.ParserValidate import IsValidCVariableName\r
20from Library.CommentParsing import ParseComment\r
21from Library.ExpressionValidate import IsValidFeatureFlagExp \r
22 \r
23from Library.Misc import Sdict\r
24from Library import DataType as DT \r
25import Logger.Log as Logger\r
26from Logger import ToolError\r
27from Logger import StringTable as ST\r
28\r
29class InfGuidItemCommentContent():\r
30 def __init__(self):\r
31 #\r
32 # ## SOMETIMES_CONSUMES ## Variable:L"MemoryTypeInformation" \r
33 # TailString.\r
34 #\r
35 #\r
36 # SOMETIMES_CONSUMES\r
37 #\r
38 self.UsageItem = ''\r
39 #\r
40 # Variable\r
41 #\r
42 self.GuidTypeItem = ''\r
43 #\r
44 # MemoryTypeInformation\r
45 #\r
46 self.VariableNameItem = ''\r
47 #\r
48 # TailString\r
49 #\r
50 self.HelpStringItem = ''\r
51 \r
52 def SetUsageItem(self, UsageItem):\r
53 self.UsageItem = UsageItem\r
54 def GetUsageItem(self):\r
55 return self.UsageItem\r
56 \r
57 def SetGuidTypeItem(self, GuidTypeItem):\r
58 self.GuidTypeItem = GuidTypeItem\r
59 def GetGuidTypeItem(self):\r
60 return self.GuidTypeItem\r
61 \r
62 def SetVariableNameItem(self, VariableNameItem):\r
63 self.VariableNameItem = VariableNameItem\r
64 def GetVariableNameItem(self):\r
65 return self.VariableNameItem\r
66 \r
67 def SetHelpStringItem(self, HelpStringItem):\r
68 self.HelpStringItem = HelpStringItem\r
69 def GetHelpStringItem(self):\r
70 return self.HelpStringItem\r
71 \r
72class InfGuidItem():\r
73 def __init__(self):\r
74 self.Name = ''\r
75 self.FeatureFlagExp = ''\r
76 #\r
77 # A list contain instance of InfGuidItemCommentContent\r
78 #\r
79 self.CommentList = []\r
80 self.SupArchList = []\r
81 \r
82 def SetName(self, Name):\r
83 self.Name = Name\r
84 def GetName(self):\r
85 return self.Name\r
86 \r
87 def SetFeatureFlagExp(self, FeatureFlagExp):\r
88 self.FeatureFlagExp = FeatureFlagExp\r
89 def GetFeatureFlagExp(self):\r
90 return self.FeatureFlagExp\r
91 \r
92 def SetCommentList(self, CommentList):\r
93 self.CommentList = CommentList\r
94 def GetCommentList(self):\r
95 return self.CommentList\r
96 \r
97 def SetSupArchList(self, SupArchList):\r
98 self.SupArchList = SupArchList\r
99 def GetSupArchList(self):\r
100 return self.SupArchList\r
101\r
102## ParseComment\r
103#\r
104# ParseComment\r
105#\r
106def ParseGuidComment(CommentsList, InfGuidItemObj):\r
107 #\r
108 # Get/Set Usage and HelpString\r
109 #\r
110 if CommentsList != None and len(CommentsList) != 0 :\r
111 CommentInsList = []\r
112 PreUsage = None\r
113 PreGuidType = None\r
114 PreHelpText = ''\r
115 BlockFlag = -1\r
116 Count = 0\r
117 for CommentItem in CommentsList:\r
118 Count = Count + 1\r
119 CommentItemUsage, \\r
120 CommentItemGuidType, \\r
121 CommentItemVarString, \\r
122 CommentItemHelpText = \\r
123 ParseComment(CommentItem, \r
124 DT.ALL_USAGE_TOKENS, \r
125 DT.GUID_TYPE_TOKENS, \r
126 [], \r
127 True)\r
128 \r
129 if CommentItemHelpText == None:\r
130 CommentItemHelpText = ''\r
131 if Count == len(CommentsList) and CommentItemUsage == CommentItemGuidType == DT.ITEM_UNDEFINED:\r
132 CommentItemHelpText = DT.END_OF_LINE\r
133 \r
134 if Count == len(CommentsList):\r
135 if BlockFlag == 1 or BlockFlag == 2:\r
136 if CommentItemUsage == CommentItemGuidType == DT.ITEM_UNDEFINED:\r
137 BlockFlag = 4\r
138 else:\r
139 BlockFlag = 3\r
140 if BlockFlag == -1:\r
141 BlockFlag = 4 \r
142 if BlockFlag == -1 or BlockFlag == 1 or BlockFlag == 2:\r
143 if CommentItemUsage == CommentItemGuidType == DT.ITEM_UNDEFINED:\r
144 if BlockFlag == -1:\r
145 BlockFlag = 1\r
146 elif BlockFlag == 1:\r
147 BlockFlag = 2\r
148 else:\r
149 if BlockFlag == 1 or BlockFlag == 2:\r
150 BlockFlag = 3\r
151 elif BlockFlag == -1:\r
152 BlockFlag = 4\r
153 \r
154 #\r
155 # Combine two comment line if they are generic comment\r
156 # \r
157 if CommentItemUsage == CommentItemGuidType == PreUsage == PreGuidType == DT.ITEM_UNDEFINED:\r
158 CommentItemHelpText = PreHelpText + DT.END_OF_LINE + CommentItemHelpText\r
159 \r
160 PreHelpText = CommentItemHelpText\r
161 \r
162 if BlockFlag == 4: \r
163 CommentItemIns = InfGuidItemCommentContent()\r
164 CommentItemIns.SetUsageItem(CommentItemUsage)\r
165 CommentItemIns.SetGuidTypeItem(CommentItemGuidType)\r
166 CommentItemIns.SetVariableNameItem(CommentItemVarString)\r
167 CommentItemIns.SetHelpStringItem(CommentItemHelpText)\r
168 CommentInsList.append(CommentItemIns)\r
169 \r
170 BlockFlag = -1\r
171 PreUsage = None\r
172 PreGuidType = None\r
173 PreHelpText = ''\r
174 \r
175 elif BlockFlag == 3:\r
176 #\r
177 # Add previous help string\r
178 # \r
179 CommentItemIns = InfGuidItemCommentContent()\r
180 CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)\r
181 CommentItemIns.SetGuidTypeItem(DT.ITEM_UNDEFINED)\r
182 if PreHelpText == '' or PreHelpText.endswith(DT.END_OF_LINE):\r
183 PreHelpText += DT.END_OF_LINE\r
184 CommentItemIns.SetHelpStringItem(PreHelpText)\r
185 CommentInsList.append(CommentItemIns)\r
186 #\r
187 # Add Current help string\r
188 #\r
189 CommentItemIns = InfGuidItemCommentContent()\r
190 CommentItemIns.SetUsageItem(CommentItemUsage)\r
191 CommentItemIns.SetGuidTypeItem(CommentItemGuidType)\r
192 CommentItemIns.SetVariableNameItem(CommentItemVarString)\r
193 CommentItemIns.SetHelpStringItem(CommentItemHelpText)\r
194 CommentInsList.append(CommentItemIns)\r
195 \r
196 BlockFlag = -1\r
197 PreUsage = None\r
198 PreGuidType = None\r
199 PreHelpText = '' \r
200 \r
201 else:\r
202 PreUsage = CommentItemUsage\r
203 PreGuidType = CommentItemGuidType\r
204 PreHelpText = CommentItemHelpText\r
205 \r
206 InfGuidItemObj.SetCommentList(CommentInsList)\r
207 else:\r
208 #\r
209 # Still need to set the USAGE/GUIDTYPE to undefined.\r
210 #\r
211 CommentItemIns = InfGuidItemCommentContent()\r
212 CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)\r
213 CommentItemIns.SetGuidTypeItem(DT.ITEM_UNDEFINED)\r
214 InfGuidItemObj.SetCommentList([CommentItemIns])\r
215 \r
216 return InfGuidItemObj\r
217\r
218## InfGuidObject\r
219#\r
220# InfGuidObject\r
221#\r
222class InfGuidObject():\r
223 def __init__(self):\r
224 self.Guids = Sdict()\r
225 #\r
226 # Macro defined in this section should be only used in this section.\r
227 #\r
228 self.Macros = {}\r
229 \r
230 def SetGuid(self, GuidList, Arch = None):\r
231 __SupportArchList = []\r
232 for ArchItem in Arch:\r
233 #\r
234 # Validate Arch\r
235 # \r
236 if (ArchItem == '' or ArchItem == None):\r
237 ArchItem = 'COMMON' \r
238 \r
239 __SupportArchList.append(ArchItem)\r
240 \r
241 for Item in GuidList:\r
242 #\r
243 # Get Comment content of this protocol\r
244 #\r
245 CommentsList = None\r
246 if len(Item) == 3:\r
247 CommentsList = Item[1]\r
248 CurrentLineOfItem = Item[2]\r
249 Item = Item[0]\r
250 InfGuidItemObj = InfGuidItem() \r
251 if len(Item) >= 1 and len(Item) <= 2:\r
252 #\r
253 # Only GuildName contained\r
254 #\r
255 if not IsValidCVariableName(Item[0]):\r
256 Logger.Error("InfParser", \r
257 ToolError.FORMAT_INVALID, \r
258 ST.ERR_INF_PARSER_INVALID_CNAME%(Item[0]),\r
259 File=CurrentLineOfItem[2], \r
260 Line=CurrentLineOfItem[1], \r
261 ExtraData=CurrentLineOfItem[0])\r
262 if (Item[0] != ''):\r
263 InfGuidItemObj.SetName(Item[0])\r
264 else:\r
265 Logger.Error("InfParser", \r
266 ToolError.FORMAT_INVALID, \r
267 ST.ERR_INF_PARSER_CNAME_MISSING,\r
268 File=CurrentLineOfItem[2], \r
269 Line=CurrentLineOfItem[1], \r
270 ExtraData=CurrentLineOfItem[0])\r
271 if len(Item) == 2:\r
272 #\r
273 # Contained CName and Feature Flag Express\r
274 # <statements> ::= <CName> ["|" <FeatureFlagExpress>]\r
275 # For GUID entry. \r
276 #\r
277 if Item[1].strip() == '':\r
278 Logger.Error("InfParser", \r
279 ToolError.FORMAT_INVALID, \r
280 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r
281 File=CurrentLineOfItem[2], \r
282 Line=CurrentLineOfItem[1], \r
283 ExtraData=CurrentLineOfItem[0])\r
284 #\r
285 # Validate Feature Flag Express \r
286 #\r
287 FeatureFlagRtv = IsValidFeatureFlagExp(Item[1].strip())\r
288 if not FeatureFlagRtv[0]:\r
289 Logger.Error("InfParser", \r
290 ToolError.FORMAT_INVALID,\r
291 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r
292 File=CurrentLineOfItem[2], \r
293 Line=CurrentLineOfItem[1], \r
294 ExtraData=CurrentLineOfItem[0])\r
295 InfGuidItemObj.SetFeatureFlagExp(Item[1])\r
296 if len(Item) != 1 and len(Item) != 2:\r
297 #\r
298 # Invalid format of GUID statement \r
299 #\r
300 Logger.Error("InfParser", \r
301 ToolError.FORMAT_INVALID,\r
302 ST.ERR_INF_PARSER_GUID_PPI_PROTOCOL_SECTION_CONTENT_ERROR,\r
303 File=CurrentLineOfItem[2], \r
304 Line=CurrentLineOfItem[1], \r
305 ExtraData=CurrentLineOfItem[0])\r
306 \r
307 InfGuidItemObj = ParseGuidComment(CommentsList, InfGuidItemObj)\r
308 InfGuidItemObj.SetSupArchList(__SupportArchList)\r
309 \r
310 #\r
311 # Determine GUID name duplicate. Follow below rule:\r
312 #\r
313 # A GUID must not be duplicated within a [Guids] section. \r
314 # A GUID may appear in multiple architectural [Guids] \r
315 # sections. A GUID listed in an architectural [Guids] \r
316 # section must not be listed in the common architectural \r
317 # [Guids] section.\r
318 # \r
319 # NOTE: This check will not report error now.\r
320 # \r
321 for Item in self.Guids:\r
322 if Item.GetName() == InfGuidItemObj.GetName():\r
323 ItemSupArchList = Item.GetSupArchList()\r
324 for ItemArch in ItemSupArchList:\r
325 for GuidItemObjArch in __SupportArchList:\r
326 if ItemArch == GuidItemObjArch:\r
327 #\r
328 # ST.ERR_INF_PARSER_ITEM_DUPLICATE\r
329 #\r
330 pass\r
331\r
332 if ItemArch.upper() == 'COMMON' or GuidItemObjArch.upper() == 'COMMON':\r
333 #\r
334 # ST.ERR_INF_PARSER_ITEM_DUPLICATE_COMMON\r
335 #\r
336 pass\r
337 \r
338 if self.Guids.has_key((InfGuidItemObj)): \r
339 GuidList = self.Guids[InfGuidItemObj] \r
340 GuidList.append(InfGuidItemObj)\r
341 self.Guids[InfGuidItemObj] = GuidList\r
342 else:\r
343 GuidList = []\r
344 GuidList.append(InfGuidItemObj)\r
345 self.Guids[InfGuidItemObj] = GuidList\r
346 \r
347 return True\r
348 \r
349 def GetGuid(self):\r
350 return self.Guids