/// <summary> /// 1. Interrupt is not resolved, time evolution is synchronized /// 2. P1 terminate, or P2 interrupt, not need synchronization /// </summary> /// <param name="P1"></param> /// <param name="P2"></param> /// <param name="model"></param> /// <param name="result"></param> private static void InterruptEncodeTick(AutomataBDD P1, AutomataBDD P2, Model model, AutomataBDD result) { //1. (isInterrupted = 0 ∧ P1.Tick ∧ P2.Tick ∧ isInterrupted' = 0) Expression guard = Expression.EQ(new Variable(result.newLocalVarName), new IntConstant(0)); Expression update = new Assignment(result.newLocalVarName, new IntConstant(0)); List<CUDDNode> transition = model.EncodeTransition(guard, update, new List<int>()); CUDD.Ref(P2.Ticks); transition = CUDD.Function.And(CUDD.Function.And(transition, P1.Ticks), P2.Ticks); result.Ticks.AddRange(CUDD.Function.And(transition, P1.Ticks)); //2. (isInterrupted = 1 and P1.tick ∧ isInterrupted' = 1) guard = Expression.EQ(new Variable(result.newLocalVarName), new IntConstant(1)); update = new Assignment(result.newLocalVarName, new IntConstant(1)); transition = model.EncodeTransition(guard, update, new List<int>()); result.Ticks.AddRange(CUDD.Function.And(transition, P1.Ticks)); //3. (isInterrupted = 2 and P2.tick ∧ isInterrupted' = 2) guard = Expression.EQ(new Variable(result.newLocalVarName), new IntConstant(2)); update = new Assignment(result.newLocalVarName, new IntConstant(2)); transition = model.EncodeTransition(guard, update, new List<int>()); result.Ticks.AddRange(CUDD.Function.And(transition, P2.Ticks)); }
/// <summary> /// (!temp ∧ guard∧ ∧ update ∧ temp ' ∧ P1.init) /// </summary> private static void EventPrefixTransitition(Expression guardOfTrans, Expression updateOfTrans, AutomataBDD P1, Model model, AutomataBDD result) { Expression guard = new PrimitiveApplication(PrimitiveApplication.AND, new PrimitiveApplication(PrimitiveApplication.EQUAL, new Variable(result.newLocalVarName), new IntConstant(0)), guardOfTrans); Expression update = new Sequence(updateOfTrans, new Assignment(result.newLocalVarName, new IntConstant(1))); List <CUDDNode> transition = model.EncodeTransition(guard, update, new List <int>()); transition = CUDD.Function.And(transition, P1.GetInitInColumn(model)); transition = model.AddVarUnchangedConstraint(transition, model.GlobalVarIndex); result.transitionBDD.AddRange(transition); }
/// <summary> /// /// </summary> /// <param name="channelEventIndex"></param> /// <param name="exps">List of expressions of channel in</param> /// <param name="P1">Process after channel in</param> /// <param name="model">Process after channel in</param> /// <param name="result"></param> private static void SyncChannelOutputEncodeTransition(int channelEventIndex, List<Expression> exps, AutomataBDD P1, Model model, AutomataBDD result) { Expression guard = Expression.EQ(new Variable(result.newLocalVarName), new IntConstant(0)); Expression update = new Assignment(Model.EVENT_NAME, new IntConstant(channelEventIndex)); for (int i = 0; i < exps.Count; i++) { //Update eventParameterVariables[i] = exps[i] //Don't need to update exps because later after synchronization, not updated variable keeps the same value update = new Sequence(update, new Assignment(model.eventParameterVariables[i], exps[i])); } update = new Sequence(update, new Assignment(result.newLocalVarName, new IntConstant(1))); List<CUDDNode> transition = model.EncodeTransition(guard, update, new List<int>()); transition = CUDD.Function.And(transition, P1.GetInitInColumn(model)); transition = model.AddVarUnchangedConstraint(transition, model.GlobalVarIndex); result.channelOutTransitionBDD.AddRange(transition); // CopyTransitionAfterEventChannel(P1, model, result); }
/// <summary> /// /// </summary> /// <param name="channelEventIndex"></param> /// <param name="exps">List of expressions of channel in</param> /// <param name="P1">Process after channel in</param> /// <param name="model">Process after channel in</param> /// <param name="result"></param> private static void SyncChannelOutputEncodeTransition(int channelEventIndex, List <Expression> exps, AutomataBDD P1, Model model, AutomataBDD result) { Expression guard = Expression.EQ(new Variable(result.newLocalVarName), new IntConstant(0)); Expression update = new Assignment(Model.EVENT_NAME, new IntConstant(channelEventIndex)); for (int i = 0; i < exps.Count; i++) { //Update eventParameterVariables[i] = exps[i] //Don't need to update exps because later after synchronization, not updated variable keeps the same value update = new Sequence(update, new Assignment(model.eventParameterVariables[i], exps[i])); } update = new Sequence(update, new Assignment(result.newLocalVarName, new IntConstant(1))); List <CUDDNode> transition = model.EncodeTransition(guard, update, new List <int>()); transition = CUDD.Function.And(transition, P1.GetInitInColumn(model)); transition = model.AddVarUnchangedConstraint(transition, model.GlobalVarIndex); result.channelOutTransitionBDD.AddRange(transition); // CopyTransitionAfterEventChannel(P1, model, result); }
/// <summary> /// (!temp ∧ guard∧ ∧ update ∧ temp ' ∧ P1.init) /// </summary> private static void EventPrefixTransitition(Expression guardOfTrans, Expression updateOfTrans, AutomataBDD P1, Model model, AutomataBDD result) { Expression guard = Expression.AND(Expression.EQ(new Variable(result.newLocalVarName), new IntConstant(0)), guardOfTrans); Expression update = new Sequence(updateOfTrans, new Assignment(result.newLocalVarName, new IntConstant(1))); List<CUDDNode> transition = model.EncodeTransition(guard, update, new List<int>()); transition = CUDD.Function.And(transition, P1.GetInitInColumn(model)); transition = model.AddVarUnchangedConstraint(transition, model.GlobalVarIndex); result.transitionBDD.AddRange(transition); }