public void EnumSizeTest()
 {
     Assert.AreEqual(1, RTLModuleHelper.SizeOfEnum(typeof(EmptyEnum)));
     Assert.AreEqual(1, RTLModuleHelper.SizeOfEnum(typeof(OneStateZero)));
     Assert.AreEqual(1, RTLModuleHelper.SizeOfEnum(typeof(OneStateOne)));
     Assert.AreEqual(2, RTLModuleHelper.SizeOfEnum(typeof(OneStateTwo)));
     Assert.AreEqual(2, RTLModuleHelper.SizeOfEnum(typeof(OneStateThree)));
     Assert.AreEqual(3, RTLModuleHelper.SizeOfEnum(typeof(OneStateFour)));
     Assert.AreEqual(8, RTLModuleHelper.SizeOfEnum(typeof(BitMask)));
 }
Ejemplo n.º 2
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")}");
            }
        }
Ejemplo n.º 3
0
        public void StageSchedule(Func <TInput> inputsFactory)
        {
            this.inputsFactory = inputsFactory;

            if (State == null && NextState == null)
            {
                var stageInputs     = inputsFactory();
                var nextStageInputs = inputsFactory();

                if (stageMap != null)
                {
                    State     = RTLPipelineStageTools.RecurviseResetToDefaults(stageMap(stageInputs));
                    NextState = RTLPipelineStageTools.RecurviseResetToDefaults(stageMap(nextStageInputs));
                }
                else if (stageMapWithState != null)
                {
                    var virtualState = RTLModuleHelper.Activate <TOutput>();
                    rtlModule.OnRelatedObjectCreating(virtualState);

                    State = RTLPipelineStageTools.RecurviseResetToDefaults(stageMapWithState(stageInputs, virtualState));

                    var virtualNextState = RTLModuleHelper.Activate <TOutput>();
                    rtlModule.OnRelatedObjectCreating(virtualNextState);

                    NextState = RTLPipelineStageTools.RecurviseResetToDefaults(stageMapWithState(nextStageInputs, virtualNextState));
                }
                else if (stageMapWithStateAndControl != null)
                {
                    var virtualState = RTLModuleHelper.Activate <TOutput>();
                    rtlModule.OnRelatedObjectCreating(virtualState);

                    State = RTLPipelineStageTools.RecurviseResetToDefaults(stageMapWithStateAndControl(stageInputs, virtualState, ManagedSignals));

                    var virtualNextState = RTLModuleHelper.Activate <TOutput>();
                    rtlModule.OnRelatedObjectCreating(virtualNextState);

                    NextState = RTLPipelineStageTools.RecurviseResetToDefaults(stageMapWithStateAndControl(nextStageInputs, virtualNextState, ManagedSignals));
                }
                else
                {
                    throw new Exception($"Pipeline stage is not initialized with scheduling method");
                }

                RTLPipelineStageTools.CarryOverAutoPropagateValues(stageInputs, State);
                rtlModule.OnRelatedObjectCreating(State);

                RTLPipelineStageTools.CarryOverAutoPropagateValues(nextStageInputs, NextState);
                rtlModule.OnRelatedObjectCreating(NextState);
            }

            nextStage?.StageSchedule(() => State);
        }
Ejemplo n.º 4
0
        public static T RecurviseResetToDefaults <T>(T value)
        {
            var type = value.GetType();

            foreach (var m in RTLReflectionTools.SynthesizableMembers(type))
            {
                var memberType   = m.GetMemberType();
                var memberValue  = m.GetValue(value);
                var backingField = getBackingField(value, m);

                if (memberValue is RTLBitArray bitArray)
                {
                    backingField.SetValue(value, new RTLBitArray().Resized(bitArray.Size).TypeChanged(bitArray.DataType));
                    continue;
                }

                if (RTLModuleHelper.IsSynthesizableSignalType(memberType))
                {
                    if (RTLReflectionTools.TryGetNullableType(memberType, out var actualType))
                    {
                        backingField.SetValue(value, Activator.CreateInstance(actualType));
                    }
                    else
                    {
                        backingField.SetValue(value, Activator.CreateInstance(memberType));
                    }
                    continue;
                }

                if (RTLModuleHelper.IsSynthesizableObject(memberType))
                {
                    RecurviseResetToDefaults(memberValue);
                    continue;
                }

                if (RTLModuleHelper.IsSynthesizableArrayType(memberType))
                {
                    var emptyArray = Array.CreateInstance(memberType.GetElementType(), (memberValue as Array).Length);
                    backingField.SetValue(value, emptyArray);
                    continue;
                }
            }

            return(value);
        }
Ejemplo n.º 5
0
        protected override void OnSetup()
        {
            base.OnSetup();

            // do not create default state object if it was already assigned in ctor
            if (State == null)
            {
                State = CreateAndInitializeRelatedObject <TState>();
            }

            NextState = CreateAndInitializeRelatedObject <TState>();

            PipelineProps = RTLModuleHelper.PipelineProperties(GetType());

            foreach (var head in Pipelines.Select(pl => pl.Diag.Head))
            {
                head.Setup(this);
            }

            // store default state for reset logic
            DefaultState = CopyState();
        }
Ejemplo n.º 6
0
        public virtual void PopulateSnapshot(VCDSignalsSnapshot snapshot, RTLModuleSnapshotConfig config = null)
        {
            config = config ?? RTLModuleSnapshotConfig.Default;
            try
            {
                if (config.IsIncluded(RTLModuleSnapshotConfigInclude.Inputs))
                {
                    currentSnapshot = snapshot.Scope("Inputs");
                    foreach (var prop in InputProps)
                    {
                        currentMember = prop;
                        var value = currentMember.GetValue(Inputs);
                        currentSnapshot.SetVariables(ToVCDVariables(currentMember, value));
                    }
                }

                if (config.IsIncluded(RTLModuleSnapshotConfigInclude.Outputs))
                {
                    currentSnapshot = snapshot.Scope("Outputs");
                    foreach (var prop in OutputProps)
                    {
                        currentMember = prop;
                        var value = currentMember.GetValue(this);
                        currentSnapshot.SetVariables(ToVCDVariables(currentMember, value));
                    }
                }

                if (config.IsIncluded(RTLModuleSnapshotConfigInclude.Internals))
                {
                    currentSnapshot = snapshot.Scope("Internals");
                    foreach (var prop in InternalProps)
                    {
                        currentMember = prop;
                        var value = currentMember.GetValue(this);
                        currentSnapshot.SetVariables(ToVCDVariables(currentMember, value));
                    }
                }

                if (config.IsIncluded(RTLModuleSnapshotConfigInclude.Modules))
                {
                    currentSnapshot = null;
                    foreach (var m in ModuleProps.Where(m => RTLModuleHelper.IsField(m)))
                    {
                        var value = m.GetValue(this);
                        currentMember = m;

                        if (value is IRTLCombinationalModule module)
                        {
                            var moduleScope = snapshot.Scope(m.Name);

                            module.PopulateSnapshot(moduleScope);
                            continue;
                        }

                        // TODO: support for modules array
                    }
                }
            }
            catch (VCDSnapshotException)
            {
                throw;
            }
            catch (Exception ex)
            {
                ThrowVCDException(ex);
            }
        }
Ejemplo n.º 7
0
        protected virtual IEnumerable <VCDVariable> ToVCDVariables(string name, object value, bool includeToolkitTypes = false)
        {
            if (value == null)
            {
                return(Enumerable.Empty <VCDVariable>());
            }

            var recursivePrefix = string.IsNullOrEmpty(name) ? "" : $"{name}_";

            switch (value)
            {
            case Enum v:
                return(new[]
                {
                    new VCDVariable($"{name}ToString", value.ToString(), VCDSizeOfValue("")),
                    new VCDVariable($"{name}", value, VCDSizeOfValue(value))
                });

            case RTLBitArray b:
                return(new[]
                {
                    new VCDVariable($"{name}", value, VCDSizeOfValue(value))
                });

            default:
                var valueType = value.GetType();
                if (value.GetType().IsClass)
                {
                    var result = new List <VCDVariable>();

                    var props = RTLReflectionTools.SynthesizableMembers(valueType, includeToolkitTypes);
                    foreach (var m in props)
                    {
                        var memberValue = m.GetValue(value) ?? RTLModuleHelper.Activate(m.GetMemberType());

                        result.AddRange(ToVCDVariables(m, memberValue, recursivePrefix));
                    }

                    return(result);
                }

                if (valueType.IsConstructedGenericType)
                {
                    var genericType = valueType.GetGenericTypeDefinition();

                    // TODO: something smarter then this
                    if (genericType.Name.StartsWith("ValueTuple`"))
                    {
                        var result = new List <VCDVariable>();

                        var props = RTLReflectionTools.SynthesizableMembers(valueType, includeToolkitTypes).Where(m => m.Name.StartsWith("Item"));
                        foreach (var m in props)
                        {
                            var memberValue = m.GetValue(value) ?? RTLModuleHelper.Activate(m.GetMemberType());

                            result.AddRange(ToVCDVariables(m, memberValue, recursivePrefix));
                        }

                        return(result);
                    }
                }

                return(new[]
                {
                    new VCDVariable($"{name}", value, VCDSizeOfValue(value))
                });
            }
        }