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); }
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); } } }