private static void AppendFeature(ref StringBuilder xmlFile, GBDFeatureDescriptor feature) { xmlFile.Append($"<feature name=\"{feature.Name}\">\n"); foreach (var type in feature.Types) { if (type.Fields.Any()) { var tagName = type.Type == "enum" ? "evalue" : "field"; AppendTag(ref xmlFile, type.Type, type.Attributes, false); foreach (var field in type.Fields) { AppendTag(ref xmlFile, tagName, field); } xmlFile.Append($"</{type.Type}>\n"); } else { AppendTag(ref xmlFile, type.Type, type.Attributes); } } foreach (var register in feature.Registers) { xmlFile.Append($"<reg name=\"{register.Name}\" bitsize=\"{register.Size}\" regnum=\"{register.Number}\" type=\"{register.Type}\" group=\"{register.Group}\"/>\n"); } xmlFile.Append("</feature>\n"); }
private static GBDFeatureDescriptor UnifyFeature(List <GBDFeatureDescriptor> featureVariations) { // This function unifies variations of a feature by taking the widest registers of matching name then adds taken register's type. var unifiedFeature = new GBDFeatureDescriptor(featureVariations.First().Name); var registers = new Dictionary <string, Tuple <GBDRegisterDescriptor, List <GDBCustomType> > >(); var types = new Dictionary <string, Tuple <GDBCustomType, uint> >(); foreach (var feature in featureVariations) { foreach (var register in feature.Registers) { if (!registers.ContainsKey(register.Name)) { registers.Add(register.Name, Tuple.Create(register, feature.Types)); } else if (register.Size > registers[register.Name].Item1.Size) { registers[register.Name] = Tuple.Create(register, feature.Types); } } } foreach (var pair in registers.Values.OrderByDescending(elem => elem.Item1.Size)) { unifiedFeature.Registers.Add(pair.Item1); AddFeatureTypes(ref types, pair.Item1.Type, pair.Item1.Size, pair.Item2); } foreach (var type in types.Values) { unifiedFeature.Types.Add(type.Item1); } return(unifiedFeature); }