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");
 }
Ejemplo n.º 2
0
        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);
        }