예제 #1
0
        /// <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));
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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);
        }
예제 #5
0
        /// <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);
        }