From 72a1d77694d51914c0dd6aa97dbfa58634b0a4a5 Mon Sep 17 00:00:00 2001 From: "bob.c.feng@intel.com" Date: Wed, 7 Nov 2018 17:18:34 +0800 Subject: BaseTools: Enable Pcd Array support. https://bugzilla.tianocore.org/show_bug.cgi?id=1292 This patch is going to enable Array data type for PCD. 1. Support Pcd ARRAY as Structure PCD type including basic datatype array and structure array. For example: gStructuredPcdPkgTokenSpaceGuid.PcdTest|{0x0}|TEST[10]|0x00010080 gStructuredPcdPkgTokenSpaceGuid.PcdTest2|{0x0}|UINT8[10]|0x00010081 2. Support C CODE style value initialization in DEC/DSC. For example: gStructuredPcdPkgTokenSpaceGuid.PcdTest|{CODE({ {0, {0, 0, 0, 0, 0, 0, 0}}, {0, {0, 0, 0, 0, 0, 0, 0}}, {0, {0, 0, 0, 0, 0, 0, 0}}, {0, {0, 0, 0, 0, 0, 0, 0}}, {0, {0, 0, 0, 0, 0, 0, 0}}, {0, {0, 0, 0, 0, 0, 0, 0}}, {0, {0, 0, 0, 0, 0, 0, 0}}, {0, {0, 0, 0, 0, 0, 0, 0}}, {0, {0, 0, 0, 0, 0, 0, 0}}, {0, {0, 0, 0, 0, 0, 0, 0}}, })} Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Bob Feng Cc: Liming Gao Reviewed-by: Liming Gao --- .../Source/Python/Workspace/BuildClassObject.py | 85 +++++++++++++++++++--- 1 file changed, 73 insertions(+), 12 deletions(-) (limited to 'BaseTools/Source/Python/Workspace/BuildClassObject.py') diff --git a/BaseTools/Source/Python/Workspace/BuildClassObject.py b/BaseTools/Source/Python/Workspace/BuildClassObject.py index 95edc376fe..15bb822910 100644 --- a/BaseTools/Source/Python/Workspace/BuildClassObject.py +++ b/BaseTools/Source/Python/Workspace/BuildClassObject.py @@ -50,7 +50,7 @@ class PcdClassObject(object): self.TokenSpaceGuidCName = Guid self.TokenSpaceGuidValue = GuidValue self.Type = Type - self.DatumType = DatumType + self._DatumType = DatumType self.DefaultValue = Value self.TokenValue = Token self.MaxDatumSize = MaxDatumSize @@ -72,6 +72,63 @@ class PcdClassObject(object): self.PcdValueFromFdf = "" self.CustomAttribute = {} self.UserDefinedDefaultStoresFlag = UserDefinedDefaultStoresFlag + self._Capacity = None + + @property + def Capacity(self): + self._Capacity = [] + dimension = ArrayIndex.findall(self._DatumType) + for item in dimension: + maxsize = item.lstrip("[").rstrip("]").strip() + if not maxsize: + maxsize = "-1" + self._Capacity.append(maxsize) + if hasattr(self, "SkuOverrideValues"): + for sku in self.SkuOverrideValues: + for defaultstore in self.SkuOverrideValues[sku]: + fields = self.SkuOverrideValues[sku][defaultstore] + for demesionattr in fields: + deme = ArrayIndex.findall(demesionattr) + for i in range(len(deme)-1): + if int(deme[i].lstrip("[").rstrip("]").strip()) > int(self._Capacity[i]): + print "error" + if hasattr(self,"DefaultValues"): + for demesionattr in self.DefaultValues: + deme = ArrayIndex.findall(demesionattr) + for i in range(len(deme)-1): + if int(deme[i].lstrip("[").rstrip("]").strip()) > int(self._Capacity[i]): + print "error" + self._Capacity = [str(int(d) + 1) for d in self._Capacity] + return self._Capacity + @property + def DatumType(self): + return self._DatumType + + @DatumType.setter + def DatumType(self,DataType): + self._DatumType = DataType + self._Capacity = None + + @property + def BaseDatumType(self): + if self.IsArray(): + return self._DatumType[:self._DatumType.index("[")] + else: + return self._DatumType + def IsArray(self): + return True if len(self.Capacity) else False + + def IsAggregateDatumType(self): + if self.DatumType in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, TAB_VOID, "BOOLEAN"]: + return False + if self.IsArray() or StructPattern.match(self.DatumType): + return True + return False + + def IsSimpleTypeArray(self): + if self.IsArray() and self.BaseDatumType in [TAB_UINT8, TAB_UINT16, TAB_UINT32, TAB_UINT64, "BOOLEAN"]: + return True + return False @staticmethod def GetPcdMaxSizeWorker(PcdString, MaxSize): @@ -183,23 +240,27 @@ class StructurePcd(PcdClassObject): def __repr__(self): return self.TypeName - def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0): - if FieldName in self.DefaultValues: - del self.DefaultValues[FieldName] - self.DefaultValues[FieldName] = [Value.strip(), FileName, LineNo] - return self.DefaultValues[FieldName] + def AddDefaultValue (self, FieldName, Value, FileName="", LineNo=0,DimensionAttr ="-1"): + if DimensionAttr not in self.DefaultValues: + self.DefaultValues[DimensionAttr] = collections.OrderedDict() + if FieldName in self.DefaultValues[DimensionAttr]: + del self.DefaultValues[DimensionAttr][FieldName] + self.DefaultValues[DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo] + return self.DefaultValues[DimensionAttr][FieldName] def SetDecDefaultValue(self, DefaultValue): self.DefaultValueFromDec = DefaultValue - def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreName, FileName="", LineNo=0): + def AddOverrideValue (self, FieldName, Value, SkuName, DefaultStoreName, FileName="", LineNo=0, DimensionAttr = '-1'): if SkuName not in self.SkuOverrideValues: self.SkuOverrideValues[SkuName] = OrderedDict() if DefaultStoreName not in self.SkuOverrideValues[SkuName]: self.SkuOverrideValues[SkuName][DefaultStoreName] = OrderedDict() - if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName]: - del self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] - self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] = [Value.strip(), FileName, LineNo] - return self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName] + if DimensionAttr not in self.SkuOverrideValues[SkuName][DefaultStoreName]: + self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr] = collections.OrderedDict() + if FieldName in self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr]: + del self.SkuOverrideValues[SkuName][DefaultStoreName][FieldName][DimensionAttr] + self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName] = [Value.strip(), FileName, LineNo] + return self.SkuOverrideValues[SkuName][DefaultStoreName][DimensionAttr][FieldName] def SetPcdMode (self, PcdMode): self.PcdMode = PcdMode @@ -209,7 +270,7 @@ class StructurePcd(PcdClassObject): self.TokenSpaceGuidCName = PcdObject.TokenSpaceGuidCName if PcdObject.TokenSpaceGuidCName else PcdObject.TokenSpaceGuidCName self.TokenSpaceGuidValue = PcdObject.TokenSpaceGuidValue if PcdObject.TokenSpaceGuidValue else self.TokenSpaceGuidValue self.Type = PcdObject.Type if PcdObject.Type else self.Type - self.DatumType = PcdObject.DatumType if PcdObject.DatumType else self.DatumType + self._DatumType = PcdObject.DatumType if PcdObject.DatumType else self.DatumType self.DefaultValue = PcdObject.DefaultValue if PcdObject.DefaultValue else self.DefaultValue self.TokenValue = PcdObject.TokenValue if PcdObject.TokenValue else self.TokenValue self.MaxDatumSize = PcdObject.MaxDatumSize if PcdObject.MaxDatumSize else self.MaxDatumSize -- cgit v1.2.3