+def CreatePcdDataBase(PcdDBData):\r
+ delta = {}\r
+ basedata = {}\r
+ if not PcdDBData:\r
+ return ""\r
+ for skuname,skuid in PcdDBData:\r
+ if len(PcdDBData[(skuname,skuid)][1]) != len(PcdDBData[("DEFAULT","0")][1]):\r
+ EdkLogger.ERROR("The size of each sku in one pcd are not same")\r
+ for skuname,skuid in PcdDBData:\r
+ if skuname == "DEFAULT":\r
+ continue\r
+ delta[(skuname,skuid)] = [(index,data,hex(data)) for index,data in enumerate(PcdDBData[(skuname,skuid)][1]) if PcdDBData[(skuname,skuid)][1][index] != PcdDBData[("DEFAULT","0")][1][index]]\r
+ basedata[(skuname,skuid)] = [(index,PcdDBData[("DEFAULT","0")][1][index],hex(PcdDBData[("DEFAULT","0")][1][index])) for index,data in enumerate(PcdDBData[(skuname,skuid)][1]) if PcdDBData[(skuname,skuid)][1][index] != PcdDBData[("DEFAULT","0")][1][index]]\r
+ databasebuff = PcdDBData[("DEFAULT","0")][0]\r
+\r
+ for skuname,skuid in delta:\r
+ databasebuff += pack('=H', int(skuid))\r
+ databasebuff += pack('=H', 0)\r
+ databasebuff += pack('=L', 8+4*len(delta[(skuname,skuid)]))\r
+ for item in delta[(skuname,skuid)]:\r
+ databasebuff += pack("=L",item[0])\r
+ databasebuff = databasebuff[:-1] + pack("=B",item[1])\r
+ totallen = len(databasebuff)\r
+ totallenbuff = pack("=L",totallen)\r
+ newbuffer = databasebuff[:32]\r
+ for i in range(4):\r
+ newbuffer += totallenbuff[i]\r
+ for i in range(36,totallen):\r
+ newbuffer += databasebuff[i]\r
+\r
+ return newbuffer\r
+def CreateVarCheckBin(VarCheckTab):\r
+ return VarCheckTab[('DEFAULT',"0")]\r
+def CreateAutoGen(PcdDriverAutoGenData):\r
+ autogenC = TemplateString()\r
+ for skuname,skuid in PcdDriverAutoGenData:\r
+ autogenC.Append("//SKUID: %s" % skuname)\r
+ autogenC.Append(PcdDriverAutoGenData[(skuname,skuid)][1].String)\r
+ return (PcdDriverAutoGenData[(skuname,skuid)][0],autogenC)\r
+def NewCreatePcdDatabasePhaseSpecificAutoGen(Platform,Phase):\r
+ def prune_sku(pcd,skuname):\r
+ new_pcd = copy.deepcopy(pcd)\r
+ new_pcd.SkuInfoList = {skuname:pcd.SkuInfoList[skuname]}\r
+ return new_pcd\r
+ DynamicPcds = Platform.DynamicPcdList\r
+ DynamicPcdSet_Sku = {(SkuName,skuobj.SkuId):[] for pcd in DynamicPcds for (SkuName,skuobj) in pcd.SkuInfoList.items() }\r
+ for skuname,skuid in DynamicPcdSet_Sku:\r
+ DynamicPcdSet_Sku[(skuname,skuid)] = [prune_sku(pcd,skuname) for pcd in DynamicPcds]\r
+ PcdDBData = {}\r
+ PcdDriverAutoGenData = {}\r
+ VarCheckTableData = {}\r
+ if DynamicPcdSet_Sku:\r
+ for skuname,skuid in DynamicPcdSet_Sku:\r
+ AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer,VarCheckTab = CreatePcdDatabasePhaseSpecificAutoGen (Platform,DynamicPcdSet_Sku[(skuname,skuid)], Phase)\r
+ final_data = ()\r
+ for item in PcdDbBuffer:\r
+ final_data += unpack("B",item)\r
+ PcdDBData[(skuname,skuid)] = (PcdDbBuffer, final_data)\r
+ PcdDriverAutoGenData[(skuname,skuid)] = (AdditionalAutoGenH, AdditionalAutoGenC)\r
+ VarCheckTableData[(skuname,skuid)] = VarCheckTab\r
+ if Platform.Platform.VarCheckFlag:\r
+ dest = os.path.join(Platform.BuildDir, 'FV')\r
+ VarCheckTable = CreateVarCheckBin(VarCheckTableData)\r
+ VarCheckTable.dump(dest, Phase)\r
+ AdditionalAutoGenH, AdditionalAutoGenC = CreateAutoGen(PcdDriverAutoGenData)\r
+ else:\r
+ AdditionalAutoGenH, AdditionalAutoGenC, PcdDbBuffer,VarCheckTab = CreatePcdDatabasePhaseSpecificAutoGen (Platform,{}, Phase)\r