private MemberPrecidence LoadScatterConditional(object owner, object conditional, List <MemoryMap> maps, ArrayList conditionalStack) { MemberPrecidence ret = MemberPrecidence.Unknown; foreach (object cond in (conditional as IList)) { //if (owner is MemoryMap && ret >= MemberPrecidence.LoadRegion) //{ // MemoryMap map = new MemoryMap(); // map.Name = GetConditionalName(cond); // map.Conditional = GetConditionalValue(cond); // owner = map; // maps.Add(map); //} conditionalStack.Add(cond); ret = LoadScatterElements(owner, cond, maps, conditionalStack); conditionalStack.Remove(cond); } return(ret); }
private MemberPrecidence LoadScatterElements(object owner, object conditional, List <MemoryMap> maps, ArrayList conditionalStack) { MemberPrecidence ret = MemberPrecidence.Unknown; List <If> ifs = GetCollectionFromObject(conditional, typeof(List <If>)) as List <If>; if (ifs != null && ifs.Count > 0) { LoadScatterConditional(owner, ifs, maps, conditionalStack); } List <IfDefined> ifdefs = GetCollectionFromObject(conditional, typeof(List <IfDefined>)) as List <IfDefined>; if (ifdefs != null) { LoadScatterConditional(owner, ifdefs, maps, conditionalStack); } List <IfNotDefined> ifndefs = GetCollectionFromObject(conditional, typeof(List <IfNotDefined>)) as List <IfNotDefined>; if (ifndefs != null) { LoadScatterConditional(owner, ifndefs, maps, conditionalStack); } List <LoadRegion> lrCollection = GetCollectionFromObject(conditional, typeof(List <LoadRegion>)) as List <LoadRegion>; if (lrCollection != null && lrCollection.Count > 0) { List <MemoryRegion> regionSet = GetCollectionFromObject(owner, typeof(List <MemoryRegion>)) as List <MemoryRegion>; ret = MemberPrecidence.LoadRegion; foreach (LoadRegion lr in lrCollection) { MemoryRegion region = new MemoryRegion(); region.Name = lr.Name; region.Address = lr.Base; region.Options = lr.Options; region.Size = lr.Size; // region.Order = regionSet.Count; region.Conditional = GetConditionalValue(conditional); regionSet.Add(region); ret = LoadScatterElements(region, lr, maps, conditionalStack); } } List <ExecRegion> erCollection = GetCollectionFromObject(conditional, typeof(List <ExecRegion>)) as List <ExecRegion>; if (erCollection != null && erCollection.Count > 0) { List <MemorySection> sectionSet = GetCollectionFromObject(owner, typeof(List <MemorySection>)) as List <MemorySection>; ret = MemberPrecidence.ExecRegion; foreach (ExecRegion er in erCollection) { MemorySection section = new MemorySection(); section.Name = er.Name; section.Address = er.Base; section.Options = er.Options; section.Size = er.Size; section.Order = (int)m_execRegionOrderMap[(owner as MemoryRegion).Name + ":" + er.Name]; section.Conditional = GetConditionalValue(conditional); sectionSet.Add(section); ret = LoadScatterElements(section, er, maps, conditionalStack); } } List <FileMapping> fileCollection = GetCollectionFromObject(conditional, typeof(List <FileMapping>)) as List <FileMapping>; if (fileCollection != null && fileCollection.Count > 0) { List <MemorySymbol> symSet = GetCollectionFromObject(owner, typeof(List <MemorySymbol>)) as List <MemorySymbol>; ret = MemberPrecidence.FileMapping; foreach (FileMapping fm in fileCollection) { MemorySymbol sym = new MemorySymbol(); sym.Name = fm.Name; sym.Options = fm.Options; sym.Conditional = GetConditionalValue(conditional); symSet.Add(sym); } } List <Set> setCollection = GetCollectionFromObject(conditional, typeof(List <Set>)) as List <Set>; if (setCollection != null && setCollection.Count > 0) { EnvVars envSets = GetObjectFromProperty(owner, typeof(EnvVars)) as EnvVars; if (ret < MemberPrecidence.SetMember) { ret = MemberPrecidence.SetMember; } EnvVars envSet = null; // conditional belongs to the map if we have a load region in this conditional if (conditionalStack.Count == 0) { envSet = FindMatchingSet(envSets, "Global"); if (envSet == null) { envSet = new EnvVars(); envSet.Name = "Global"; envSets.EnvVarsCollection.Add(envSet); } } else { for (int i = 0; i < conditionalStack.Count; i++) { object cond = conditionalStack[i]; if (i == (conditionalStack.Count - 1) && owner is MemoryMap && ret >= MemberPrecidence.LoadRegion) { ((MemoryMap)owner).Name = GetConditionalName(conditional); ((MemoryMap)owner).Conditional = GetConditionalValue(conditional); } else { string name = GetConditionalName(cond); string value = GetConditionalValue(cond); name += "_" + value.Replace(" ", "_").Replace("\"", ""); envSet = FindMatchingSet(envSets, name); if (envSet == null) { envSet = new EnvVars(); envSet.Name = name; envSet.Conditional = value; envSets.EnvVarsCollection.Add(envSet); } //envSets = envSet.EnvVarsCollection; } } } if ((int)ret < (int)MemberPrecidence.SetMember) { ret = MemberPrecidence.SetMember; } foreach (Set set in GetCollectionFromObject(conditional, typeof(List <Set>))) { EnvVar var = new EnvVar(); var.Name = set.Name; var.Value = set.Value; envSet.EnvVarCollection.Add(var); } } return(ret); }