Ejemplo n.º 1
0
        void Initialize()
        {
            Inputs        = CreateAndInitializeRelatedObject <TInput>();
            InputProps    = RTLModuleHelper.SignalProperties(InputsType);
            OutputProps   = RTLModuleHelper.OutputProperties(GetType());
            InternalProps = RTLModuleHelper.InternalProperties(GetType());
            ModuleProps   = RTLModuleHelper.ModuleProperties(GetType());
            ModuleDetails = new List <RTLModuleDetails>();

            var fields = ModuleProps.Where(m => RTLModuleHelper.IsField(m));

            foreach (var m in fields)
            {
                var value = m.GetValue(this);

                if (value == null)
                {
                    throw new Exception($"Field {m.Name} returns null. Module should have an instance.");
                }

                var valueType = value.GetType();
                if (value is IRTLCombinationalModule module)
                {
                    ModuleDetails.Add(new RTLModuleDetails()
                    {
                        Module = module,
                        Member = m,
                        Name   = m.Name
                    });
                    continue;
                }

                if (valueType.IsArray)
                {
                    var elementType = valueType.GetElementType();
                    if (typeof(IRTLCombinationalModule).IsAssignableFrom(elementType))
                    {
                        ModuleDetails.AddRange(
                            (value as IEnumerable).OfType <IRTLCombinationalModule>()
                            .Select((iteration, idx) =>
                        {
                            return(new RTLModuleDetails()
                            {
                                Module = iteration,
                                Member = m,
                                Name = $"{m.Name}{idx}"
                            });
                        }));
                        continue;
                    }
                }

                throw new Exception($"Field {m.Name} is not a module. Actual type is {(value?.GetType()?.Name ?? "null")}");
            }
        }