예제 #1
0
        private static void TimeInterruptEncodeTransitionChannel(string clk, AutomataBDD m0, AutomataBDD m1, int t, Model model, AutomataBDD result)
        {
            Expression guard;
            List<CUDDNode> guardDD, transTemp;

            //1. clk <= t and m0.Trans/In/Out and [(event' = termination & clk' = -1) or (event' != termination & clk' = clk)]
            guard = Expression.AND(Expression.LE(new Variable(clk), new IntConstant(t)),
                                                Expression.OR(Expression.AND(
                                                    AutomataBDD.GetTerminateTransExpression(),
                                                    new Assignment(clk, new IntConstant(-1))), Expression.AND(
                                                    AutomataBDD.GetNotTerminateTransExpression(),
                                                    new Assignment(clk, new Variable(clk)))));
            guardDD = guard.TranslateBoolExpToBDD(model).GuardDDs;

            CUDD.Ref(guardDD);
            transTemp = CUDD.Function.And(m0.transitionBDD, guardDD);
            result.transitionBDD.AddRange(transTemp);

            //
            CUDD.Ref(guardDD);
            transTemp = CUDD.Function.And(m0.channelInTransitionBDD, guardDD);
            result.channelInTransitionBDD.AddRange(transTemp);

            //
            //CUDD.Ref(guardDD);
            transTemp = CUDD.Function.And(m0.channelOutTransitionBDD, guardDD);
            result.channelOutTransitionBDD.AddRange(transTemp);

            //2. clk = t and event' = tau and clk' = t + 1 and m1.Init
            guard = Expression.AND(Expression.EQ(new Variable(clk), new IntConstant(t)),
                        Expression.AND(AutomataBDD.GetTauTransExpression(),
                                            new Assignment(clk, new IntConstant(t + 1))));
            guardDD = guard.TranslateBoolExpToBDD(model).GuardDDs;
            guardDD = CUDD.Function.And(m1.GetInitInColumn(model), CUDD.Function.Or(guardDD));
            guardDD = model.AddVarUnchangedConstraint(guardDD, model.GlobalVarIndex);
            result.transitionBDD.AddRange(guardDD);

            //3. clk = t + 1 and m1.Trans and clk' = t + 1
            guard = Expression.AND(Expression.EQ(new Variable(clk), new IntConstant(t + 1)),
                                            new Assignment(clk, new IntConstant(t + 1)));
            guardDD = guard.TranslateBoolExpToBDD(model).GuardDDs;

            //
            CUDD.Ref(guardDD);
            transTemp = CUDD.Function.And(m1.transitionBDD, guardDD);
            result.transitionBDD.AddRange(guardDD);

            //
            CUDD.Ref(guardDD);
            transTemp = CUDD.Function.And(m1.channelInTransitionBDD, guardDD);
            result.channelInTransitionBDD.AddRange(guardDD);

            //
            //CUDD.Ref(guardDD);
            transTemp = CUDD.Function.And(m1.channelOutTransitionBDD, guardDD);
            result.channelOutTransitionBDD.AddRange(guardDD);
        }
예제 #2
0
        /// <summary>
        /// [ REFS: '', DEREFS: 'P1, P2']
        /// </summary>
        /// <param name="isP1Terminate"></param>
        /// <param name="P1"></param>
        /// <param name="P2"></param>
        /// <param name="model"></param>
        /// <param name="result"></param>
        public static void SequenceEncodeTransition(string isP1Terminate, AutomataBDD P1, AutomataBDD P2, Model model, AutomataBDD result)
        {
            CUDDNode tauEvent       = GetTauTransEncoding(model);
            CUDDNode terminateEvent = GetTerminationTransEncoding(model);

            CUDD.Ref(terminateEvent);
            CUDD.Ref(P1.transitionBDD);
            List <CUDDNode> notTerminateTransition = CUDD.Function.And(P1.transitionBDD, CUDD.Function.Not(terminateEvent));

            //CUDD.Ref(terminateEvent);
            //CUDD.Ref(P1.transitionBDD);
            List <CUDDNode> terminateTransition = CUDD.Function.And(P1.transitionBDD, terminateEvent);

            //Convert terminate transition to tau transition
            terminateTransition = CUDD.Abstract.ThereExists(terminateTransition, model.GetAllEventVars());
            terminateTransition = CUDD.Function.And(terminateTransition, tauEvent);

            //1. !isP1Terminate and not terminate transition, channel and !isP1Terminate
            Expression guard = Expression.AND(Expression.EQ(new Variable(isP1Terminate), new IntConstant(0)),
                                              new Assignment(isP1Terminate, new IntConstant(0)));

            List <CUDDNode> guardDD = guard.TranslateBoolExpToBDD(model).GuardDDs;

            //
            CUDD.Ref(guardDD);
            result.transitionBDD.AddRange(CUDD.Function.And(guardDD, notTerminateTransition));

            CUDD.Ref(guardDD);
            result.channelInTransitionBDD.AddRange(CUDD.Function.And(guardDD, P1.channelInTransitionBDD));

            // CUDD.Ref(guardDD);
            result.channelOutTransitionBDD.AddRange(CUDD.Function.And(guardDD, P1.channelOutTransitionBDD));

            //2. (!isP1Terminate ∧ terminate P1.transition ∧ isP1Terminate' and P2.Init')
            guard = Expression.AND(Expression.EQ(new Variable(isP1Terminate), new IntConstant(0)),
                                   new Assignment(isP1Terminate, new IntConstant(1)));
            guardDD = guard.TranslateBoolExpToBDD(model).GuardDDs;
            guardDD = CUDD.Function.And(guardDD, P2.GetInitInColumn(model));
            result.transitionBDD.AddRange(CUDD.Function.And(guardDD, terminateTransition));

            //3. (isP1Terminate ∧ P2.Trans/In/Out ∧ isP1Terminate')
            guard = Expression.AND(Expression.EQ(new Variable(isP1Terminate), new IntConstant(1)),
                                   new Assignment(isP1Terminate, new IntConstant(1)));
            guardDD = guard.TranslateBoolExpToBDD(model).GuardDDs;

            //
            CUDD.Ref(guardDD);
            result.transitionBDD.AddRange(CUDD.Function.And(guardDD, P2.transitionBDD));

            CUDD.Ref(guardDD);
            result.channelInTransitionBDD.AddRange(CUDD.Function.And(guardDD, P2.channelInTransitionBDD));

            //CUDD.Ref(guardDD);
            result.channelOutTransitionBDD.AddRange(CUDD.Function.And(guardDD, P2.channelOutTransitionBDD));
        }
예제 #3
0
        /// <summary>
        /// [ REFS: '', DEREFS: 'P1, P2']
        /// </summary>
        /// <param name="isP1Terminate"></param>
        /// <param name="P1"></param>
        /// <param name="P2"></param>
        /// <param name="model"></param>
        /// <param name="result"></param>
        public static void SequenceEncodeTransition(string isP1Terminate, AutomataBDD P1, AutomataBDD P2, Model model, AutomataBDD result)
        {
            CUDDNode tauEvent = GetTauTransEncoding(model);
            CUDDNode terminateEvent = GetTerminationTransEncoding(model);

            CUDD.Ref(terminateEvent);
            CUDD.Ref(P1.transitionBDD);
            List<CUDDNode> notTerminateTransition = CUDD.Function.And(P1.transitionBDD, CUDD.Function.Not(terminateEvent));

            //CUDD.Ref(terminateEvent);
            //CUDD.Ref(P1.transitionBDD);
            List<CUDDNode> terminateTransition = CUDD.Function.And(P1.transitionBDD, terminateEvent);
            //Convert terminate transition to tau transition
            terminateTransition = CUDD.Abstract.ThereExists(terminateTransition, model.GetAllEventVars());
            terminateTransition = CUDD.Function.And(terminateTransition, tauEvent);

            //1. !isP1Terminate and not terminate transition, channel and !isP1Terminate
            Expression guard = Expression.AND(Expression.EQ(new Variable(isP1Terminate), new IntConstant(0)),
                        new Assignment(isP1Terminate, new IntConstant(0)));

            List<CUDDNode> guardDD = guard.TranslateBoolExpToBDD(model).GuardDDs;

            //
            CUDD.Ref(guardDD);
            result.transitionBDD.AddRange(CUDD.Function.And(guardDD, notTerminateTransition));

            CUDD.Ref(guardDD);
            result.channelInTransitionBDD.AddRange(CUDD.Function.And(guardDD, P1.channelInTransitionBDD));

            // CUDD.Ref(guardDD);
            result.channelOutTransitionBDD.AddRange(CUDD.Function.And(guardDD, P1.channelOutTransitionBDD));

            //2. (!isP1Terminate ∧ terminate P1.transition ∧ isP1Terminate' and P2.Init')
            guard = Expression.AND(Expression.EQ(new Variable(isP1Terminate), new IntConstant(0)),
                        new Assignment(isP1Terminate, new IntConstant(1)));
            guardDD = guard.TranslateBoolExpToBDD(model).GuardDDs;
            guardDD = CUDD.Function.And(guardDD, P2.GetInitInColumn(model));
            result.transitionBDD.AddRange(CUDD.Function.And(guardDD, terminateTransition));

            //3. (isP1Terminate ∧ P2.Trans/In/Out ∧ isP1Terminate')
            guard = Expression.AND(Expression.EQ(new Variable(isP1Terminate), new IntConstant(1)),
                        new Assignment(isP1Terminate, new IntConstant(1)));
            guardDD = guard.TranslateBoolExpToBDD(model).GuardDDs;

            //
            CUDD.Ref(guardDD);
            result.transitionBDD.AddRange(CUDD.Function.And(guardDD, P2.transitionBDD));

            CUDD.Ref(guardDD);
            result.channelInTransitionBDD.AddRange(CUDD.Function.And(guardDD, P2.channelInTransitionBDD));

            //CUDD.Ref(guardDD);
            result.channelOutTransitionBDD.AddRange(CUDD.Function.And(guardDD, P2.channelOutTransitionBDD));
        }
예제 #4
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);
        }
예제 #5
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);
        }
예제 #6
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="channelEventIndex"></param>
        /// <param name="guard">If no guard, give BoolConstant(true)</param>
        /// <param name="exps">List of expressions of channel in</param>
        /// <param name="P1">Process after channel in</param>
        /// <param name="model"></param>
        /// <param name="result"></param>
        private static void SyncChannelInputEncodeTransition(int channelEventIndex, Expression guard, List<Expression> exps, AutomataBDD P1, Model model, AutomataBDD result)
        {
            //temp = result.processName
            //!temp and guard and event' = channelEventIndex and temp' and Update_Channel and P1.init'

            guard = Expression.AND(guard, Expression.EQ(new Variable(result.newLocalVarName),
                                                                                    new IntConstant(0)));
            guard = Expression.AND(guard, new Assignment(Model.EVENT_NAME, new IntConstant(channelEventIndex)));
            guard = Expression.AND(guard, new Assignment(result.newLocalVarName, new IntConstant(1)));

            for (int i = 0; i < exps.Count; i++)
            {
                if (exps[i] is IntConstant)
                {
                    //eventParameterVariables[i]' = exps[i]
                    guard = Expression.AND(guard, new Assignment(model.eventParameterVariables[i], exps[i]));
                }
                else
                {
                    //eventParameterVariables[i]' = exps[i]'
                    guard = Expression.AND(guard,
                                 Expression.EQ(new VariablePrime(model.eventParameterVariables[i]),
                                                          new VariablePrime(exps[i].expressionID)));

                }
            }

            //
            List<CUDDNode> transition = guard.TranslateBoolExpToBDD(model).GuardDDs;

            transition = CUDD.Function.And(transition, P1.GetInitInColumn(model));
            transition = model.AddVarUnchangedConstraint(transition, model.GlobalVarIndex);
            result.channelInTransitionBDD.AddRange(transition);

            //
            CopyTransitionAfterEventChannel(P1, model, result);
        }
예제 #7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="channelEventIndex"></param>
        /// <param name="guard">If no guard, give BoolConstant(true)</param>
        /// <param name="exps">List of expressions of channel in</param>
        /// <param name="P1">Process after channel in</param>
        /// <param name="model"></param>
        /// <param name="result"></param>
        private static void SyncChannelInputEncodeTransition(int channelEventIndex, Expression guard, List <Expression> exps, AutomataBDD P1, Model model, AutomataBDD result)
        {
            //temp = result.processName
            //!temp and guard and event' = channelEventIndex and temp' and Update_Channel and P1.init'

            guard = new PrimitiveApplication(PrimitiveApplication.AND, guard, new PrimitiveApplication(PrimitiveApplication.EQUAL, new Variable(result.newLocalVarName),
                                                                                                       new IntConstant(0)));
            guard = new PrimitiveApplication(PrimitiveApplication.AND, guard, new Assignment(Model.EVENT_NAME, new IntConstant(channelEventIndex)));
            guard = new PrimitiveApplication(PrimitiveApplication.AND, guard, new Assignment(result.newLocalVarName, new IntConstant(1)));

            for (int i = 0; i < exps.Count; i++)
            {
                if (exps[i] is IntConstant)
                {
                    //eventParameterVariables[i]' = exps[i]
                    guard = new PrimitiveApplication(PrimitiveApplication.AND, guard, new Assignment(model.eventParameterVariables[i], exps[i]));
                }
                else
                {
                    //eventParameterVariables[i]' = exps[i]'
                    guard = new PrimitiveApplication(PrimitiveApplication.AND, guard,
                                                     new PrimitiveApplication(PrimitiveApplication.EQUAL, new VariablePrime(model.eventParameterVariables[i]),
                                                                              new VariablePrime(exps[i].expressionID)));
                }
            }

            //
            List <CUDDNode> transition = guard.TranslateBoolExpToBDD(model).GuardDDs;

            transition = CUDD.Function.And(transition, P1.GetInitInColumn(model));
            transition = model.AddVarUnchangedConstraint(transition, model.GlobalVarIndex);
            result.channelInTransitionBDD.AddRange(transition);

            //
            CopyTransitionAfterEventChannel(P1, model, result);
        }
예제 #8
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);
        }
예제 #9
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);
        }