StringBuilder DefineUnpackedTypes(StringBuilder sbText) { List <string> alreadyDefined = new List <string> (); List <RecordTypeDeclaration> orderedList = Source.Portmap.UnpackedList; orderedList = orderDependencies(orderedList); foreach (RecordTypeDeclaration RecordType in orderedList) { var combined = RecordType.IdentifierList.Zip(RecordType.SubtypeList, (n, t) => new { Name = n, Type = t }); foreach (var element in combined) { if (!(Array.FindIndex(Source.Predefined, x => x.getIdentifier() == element.Type.getIdentifier()) > -1)) { //This prevents already defined types from being defined again. if ((alreadyDefined.Find(x => x == element.Type.getIdentifier())) == null) { //This ensures we use the packed version already created. if (!element.Type.isUnpacked()) { sbText.AppendLine("typedef" + element.Type.PortmapDefinition() + element.Type.getIdentifier() + "_def;"); //appending def to each typedef to prevent duplication between type package and vhdl package which leads to error. "mult_result_t cannot be resolved, as it is defined in package quantize_type_pkg and package quantization_test_p which are both wild card imported" } alreadyDefined.Add(element.Type.getIdentifier()); } } } sbText.AppendLine("typedef struct packed {"); //Need to make sure the packed version of unpacked types are declared before they are used in the packed version of another unpacked type. foreach (var element in combined) { if (Array.FindIndex(Source.Predefined, x => x.getIdentifier() == element.Type.getIdentifier()) > -1) { sbText.AppendLine(element.Type.PortmapDefinition() + " " + element.Name + ";"); } else if (element.Type.isUnpacked()) { sbText.AppendLine(" packed_" + element.Type.getIdentifier() + " " + element.Name + ";"); } else { sbText.AppendLine(" " + element.Type.getIdentifier() + "_def " + element.Name + ";"); } } sbText.AppendLine("} packed_" + RecordType.getIdentifier() + ";"); } foreach (PortInterfaceElement element in Source.Portmap.Expressions) { if (element.SignalType.getType() == "ArrayType" && element.SignalType.getSignalType().isUnpacked()) { sbText.AppendLine(" typedef packed_" + element.SignalType.getSignalType().getIdentifier() + " [" + element.SignalType.getLeft() + ":" + element.SignalType.getRight() + "] " + "packed_" + element.SignalType.getIdentifier() + ";"); } } return(sbText); }