示例#1
0
        private void CreateStateValues()
        {
            string cname  = _code.Name;
            string ename  = "E_" + cname + "_State";
            Type   tState = CreateEnum(ename, _stateLookup.Count);

            _stateType = tState;
            TypeDescriptor tdState = (TypeDescriptor)tState;
            // do not add type - it will be assigned during post-processing
            //_code.Owner.AddChild(tdState, ename);
            Array enumValues = tState.GetEnumValues();

            foreach (StateInfo si in _stateLookup.Values)
            {
                int i = si.StateIndex;
                si.StateValue            = enumValues.GetValue(i);
                si.StateExpr.PlaceHolder = LiteralReference.CreateConstant(si.StateValue);
            }
            ComponentDescriptor owner = (ComponentDescriptor)_code.Owner;
            string fname   = "m_" + cname + "_State";
            var    initVal = Activator.CreateInstance(tState);
            ISignalOrPortDescriptor sdState = owner.CreateSignalInstance(fname, initVal);
            Type tStateSignal = typeof(Signal <>).MakeGenericType(tState);

            _tComponent = _modBuilder.DefineType(owner.Instance.GetType().FullName, TypeAttributes.Public);
            FieldBuilder fbStateSignal = _tComponent.DefineField(fname, tStateSignal, FieldAttributes.Private);

            _stateSignal = new SignalRef(sdState, SignalRef.EReferencedProperty.Instance);
            _nextStateSignal.PlaceHolder = new SignalRef(sdState, SignalRef.EReferencedProperty.Next);
        }
示例#2
0
        private void CreateCoStateValues()
        {
            foreach (var kvp in _coFSMs)
            {
                ITransactionSite target = kvp.Key;
                CoFSMInfo        cfi    = kvp.Value;

                string ename, fname;
                if (target.Name == null)
                {
                    ename = "E_" + target.Host.Descriptor.Name + "_CoState";
                    fname = "m_" + target.Host.Descriptor.Name + "_CoState";
                }
                else
                {
                    ename = "E_" + target.Host.Descriptor.Name + "_" + target.Name + "_CoState";
                    fname = "m_" + target.Host.Descriptor.Name + "_" + target.Name + "_CoState";
                }

                Type                tState  = CreateEnum(ename, cfi.TotalStates);
                TypeDescriptor      tdState = (TypeDescriptor)tState;
                ComponentDescriptor owner   = (ComponentDescriptor)_code.Owner;
                owner.AddChild(tdState, tdState.Name);

                Type         tStateSignal  = typeof(Signal <>).MakeGenericType(tState);
                FieldBuilder fbStateSignal = _tComponent.DefineField(fname, tStateSignal, FieldAttributes.Private);
                Array        enumValues    = tState.GetEnumValues();
                object       initVal;
                if (cfi.HasNeutralTA)
                {
                    initVal = cfi.FirstNeutral.StateValue;
                }
                else
                {
                    initVal = enumValues.GetValue(0);
                }
                var sdState = owner.CreateSignalInstance(fname, initVal);
                cfi.CoStateSignal           = new SignalRef(sdState, SignalRef.EReferencedProperty.Instance);
                cfi.CoStateType             = tStateSignal;
                cfi.NextCoState.PlaceHolder = new SignalRef(sdState, SignalRef.EReferencedProperty.Next);

                foreach (CoStateInfo csi in cfi.StateInfos)
                {
                    csi.StateValue            = enumValues.GetValue(csi.StateIndex);
                    csi.StateExpr.PlaceHolder = LiteralReference.CreateConstant(csi.StateValue);
                }
            }
        }