Exemplo n.º 1
0
        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);
        }