Exemplo n.º 1
0
        /// <summary>
        /// Finds the length of an array type-signal
        /// </summary>
        /// <returns>The array length.</returns>
        /// <param name="element">The element to get the length for.</param>
        public AST.Constant GetArrayLength(AST.DataElement element)
        {
            if (element.CecilType.IsFixedArrayType())
            {
                if (element.Source is IMemberDefinition)
                {
                    return(new Constant
                    {
                        Source = element,
                        DefaultValue = ((IMemberDefinition)element.Source).GetFixedArrayLength(),
                        CecilType = element.CecilType.LoadType(typeof(uint))
                    });
                }
                else if (element.Source is System.Reflection.MemberInfo)
                {
                    return(new Constant
                    {
                        Source = element,
                        DefaultValue = ((System.Reflection.MemberInfo)element.Source).GetFixedArrayLength(),
                        CecilType = element.CecilType.LoadType(typeof(uint))
                    });
                }
            }

            if (element.DefaultValue is Array)
            {
                return(new Constant()
                {
                    Source = element,
                    DefaultValue = (element.DefaultValue as Array).Length,
                    CecilType = element.CecilType.LoadType(typeof(uint))
                });
            }

            throw new Exception($"Unable to guess length for signal: {element.Name}");
        }
Exemplo n.º 2
0
        /// <summary>
        /// Gets the initializer statement, if any.
        /// </summary>
        /// <returns>The initializer.</returns>
        /// <param name="element">The variable to get the initializer for.</param>
        public string GetInitializer(AST.DataElement element)
        {
            if (element.DefaultValue == null)
            {
                return(string.Empty);
            }

            if (element.DefaultValue is AST.ArrayCreateExpression)
            {
                var asexp = (AST.ArrayCreateExpression)element.DefaultValue;

                var nae = new ArrayCreateExpression()
                {
                    SourceExpression = asexp.SourceExpression,
                    SourceResultType = asexp.SourceResultType,
                };

                nae.ElementExpressions = asexp.ElementExpressions
                                         .Select(x => new PrimitiveExpression()
                {
                    SourceExpression = x.SourceExpression,
                    SourceResultType = x.SourceResultType,
                    Parent           = nae,
                    Value            = ((PrimitiveExpression)x).Value
                }).Cast <Expression>().ToArray();

                return(RenderExpression(nae));
            }
            else if (element.DefaultValue is Array)
            {
                var arr = (Array)element.DefaultValue;

                var nae = new ArrayCreateExpression()
                {
                    SourceExpression = null,
                    SourceResultType = element.CecilType.GetArrayElementType(),
                };

                nae.ElementExpressions = Enumerable.Range(0, arr.Length)
                                         .Select(x => new PrimitiveExpression()
                {
                    SourceExpression = null,
                    SourceResultType = element.CecilType.GetArrayElementType(),
                    Parent           = nae,
                    Value            = arr.GetValue(0)
                }).Cast <Expression>().ToArray();

                return(RenderExpression(nae));
            }
            else if (element.DefaultValue is ICSharpCode.Decompiler.CSharp.Syntax.AstNode)
            {
                var eltype       = Type.GetType(element.CecilType.FullName);
                var defaultvalue = eltype != null && element.CecilType.IsValueType ? Activator.CreateInstance(eltype) : null;

                return(RenderExpression(new AST.PrimitiveExpression()
                {
                    Value = defaultvalue,
                    SourceResultType = element.CecilType
                }));
            }
            else if (element.DefaultValue is AST.EmptyArrayCreateExpression)
            {
                var ese = element.DefaultValue as AST.EmptyArrayCreateExpression;
                return(RenderExpression(new AST.EmptyArrayCreateExpression()
                {
                    SizeExpression = ese.SizeExpression.Clone(),
                    SourceExpression = ese.SourceExpression,
                    SourceResultType = ese.SourceResultType
                }));
            }
            else if (element.CecilType.IsArrayType() && element.DefaultValue == null)
            {
                return(RenderExpression(new EmptyArrayCreateExpression()
                {
                    SourceExpression = null,
                    SourceResultType = element.CecilType,
                    SizeExpression = new MemberReferenceExpression()
                    {
                        Name = element.Name,
                        SourceExpression = null,
                        SourceResultType = element.CecilType,
                        Target = element
                    }
                }));
            }
            else
            {
                return(RenderExpression(new AST.PrimitiveExpression()
                {
                    Value = element.DefaultValue,
                    SourceResultType = element.CecilType
                }));
            }
        }
Exemplo n.º 3
0
 /// <summary>
 /// Gets the default value for an item, expressed as a VHDL expression
 /// </summary>
 /// <returns>The default value.</returns>
 /// <param name="element">The element to get the default value for.</param>
 public string DefaultValue(AST.DataElement element)
 {
     return(Parent.DefaultValue(element));
 }
Exemplo n.º 4
0
 /// <summary>
 /// Returns the VHDL type for a data element
 /// </summary>
 /// <returns>The VHDL type.</returns>
 /// <param name="element">The element to get the type for.</param>
 public VHDLType VHDLType(AST.DataElement element)
 {
     return(Parent.VHDLType(element));
 }
Exemplo n.º 5
0
 /// <summary>
 /// Gets the Cpp type for the signal
 /// </summary>
 /// <returns>The cpp type.</returns>
 /// <param name="element">The input signal.</param>
 public CppType GetType(AST.DataElement element)
 {
     return(GetType(element.CecilType));
 }
Exemplo n.º 6
0
 public string Type(AST.DataElement el)
 {
     return(RS.TypeScope.GetType(el).Name);
 }