/// <summary> /// Adds a new event to the state machine. /// </summary> /// <param name="eventname"></param> /// <returns></returns> public Event AddEvent(string eventname) { Event e; if (!_events.TryGetValue(eventname, out e)) { _events[eventname] = e = new Event(eventname); } return e; }
/// <summary> /// Emits code for a single event handler. /// </summary> /// <param name="e"></param> private void EmitEventHandler(Event e) { BeginHandler(e); PrepareTransitionSet(e); // use gate converter to schedule condition evaluation ConvertConditions(e); // stage 0: preconditions and LEAVE handlers _guards.AddLeaveEffects(_effectsbefore); _guards.AddEnterEffects(_effectsafter); AddTriggerEffects(e.Triggers); foreach(var t in e.Triggers) { var c = _gc.ConvertToGate(0, t.PreCondition); _gc.Schedule(c); } _effectsbefore.Schedule(_gc); _effectsafter.Schedule(_gc); // code output: precondition labels EmitCodeLabels(0); // pre-effects if (!_effectsbefore.IsEmpty) { Writer.AppendComment(); Writer.AppendComment("state exit handler effects"); EmitEffects(_effectsbefore.GetEffectConditions()); } // emit state transition code EmitTriggerStateChange(_writer, e.Triggers); // stage 1: postconditions and other handlers. _gc.SetNextStage(); // code output: postcondition labels EmitCodeLabels(1); // post-effects if (!_effectsafter.IsEmpty) { Writer.AppendComment(); Writer.AppendComment("state entry handler effects"); EmitEffects(_effectsafter.GetEffectConditions()); } EndHandler(); }
private void PrepareTransitionSet(Event e) { // next state inference ... _tset = new TransitionSet(); _tset.AddRange(e.Triggers .SelectMany(t => t.Transitions) ); // set of modified variable indexes _modified = e.Triggers .SelectMany(t => t.ModifiedVariables) .Distinct() .Select(z => z.Index).ToList(); }
private void BeginHandler(Event e) { // code generation start here EmitHandlerHeader(e.Name); EmitEnterBlock(); _gc = new GateConverter(); // process labels before they are added ... _gc.OnBeforeAddLabel = EvaluateCodeLabelBefore; _guards = new GuardCollection(); _effectsbefore = new EffectsCollection(); _effectsafter = new EffectsCollection(); }
private void ConvertConditions(Event e) { var c = new TriggerTermCollection<bool>(true); foreach (var t in e.Triggers) { c.Add(t); } foreach (var t in e.Triggers) { foreach (var g in t.Guards) { _guards.AddGuard(t, g); } } }
protected abstract void EmitSwitchCaseLabel(Event e);
protected abstract void EmitHandlerInvocation(Event e);
protected override void EmitSwitchCaseLabel(Event e) { var caselabel = Parameters.EventTypeName + "." + e.Name; Writer.AppendLine("case " + caselabel + ":"); }
protected override void EmitHandlerInvocation(Event e) { Writer.AppendLine(e.Name + "_Handler();"); Writer.AppendLine("break;"); Writer.AppendLine(); }
public Trigger(Event e, ICondition c) : base(e.Name, c) { Event = e; }