Esempio n. 1
0
        /// <summary>
        /// Create a new variable which know whether event is tick or not
        /// Later all event information is removed from the transition
        /// Return the justice based on that new varaible
        /// justice: event = tick, event != tick
        /// </summary>
        /// <param name="modelBDD"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        public List<CUDDNode> GetJustices(AutomataBDD modelBDD, Model model)
        {
            model.AddLocalVar(EVENT_DUMMY, 0, 1);

            //Because later event variables are removed, add new variable to check whether it is tick or not
            Expression guard = Expression.OR(
                                                        Expression.AND(
                                                                                 TimeBehaviors.GetTickTransExpression(),
                                                                                 new Assignment(EVENT_DUMMY,
                                                                                                new IntConstant(1))),
                                                        Expression.AND(
                                                                                 TimeBehaviors.GetNotTickTransExpression(),
                                                                                 new Assignment(EVENT_DUMMY,
                                                                                                new IntConstant(0))));
            modelBDD.transitionBDD = CUDD.Function.And(modelBDD.transitionBDD, guard.TranslateBoolExpToBDD(model).GuardDDs);

            //the cycle must contain tick transition (zeno) and other transitions (progress)
            List<CUDDNode> justices = new List<CUDDNode>();

            guard = Expression.EQ(new Variable(EVENT_DUMMY),
                                             new IntConstant(0));

            justices.Add(CUDD.Function.Or(guard.TranslateBoolExpToBDD(model).GuardDDs));

            guard = Expression.EQ(new Variable(EVENT_DUMMY),
                                             new IntConstant(1));

            justices.Add(CUDD.Function.Or(guard.TranslateBoolExpToBDD(model).GuardDDs));

            return justices;
        }
Esempio n. 2
0
        /// <summary>
        /// P.var : P1.var ∪ {temp}
        /// </summary>
        private static void EventPrefixSetVariable(AutomataBDD P1, Model model, AutomataBDD result)
        {
            result.variableIndex.AddRange(P1.variableIndex);

            result.newLocalVarName = Model.GetNewTempVarName();
            model.AddLocalVar(result.newLocalVarName, 0, 1);
            result.variableIndex.Add(model.GetNumberOfVars() - 1);
        }
Esempio n. 3
0
        /// <summary>
        /// P.var : P1.var
        /// </summary>
        private static void GuardSetVariable(AutomataBDD P1, Model model, AutomataBDD result)
        {
            result.variableIndex.AddRange(P1.variableIndex);

            result.newLocalVarName = Model.GetNewTempVarName();
            model.AddLocalVar(result.newLocalVarName, 0, 1);
            result.variableIndex.Add(model.GetNumberOfVars() - 1);
        }
Esempio n. 4
0
 /// <summary>
 /// P.var : [∪ {i = 1..n}Pi.var] ∪ {temp}
 /// </summary>
 private static void InternalChoiceSetVariable(List <AutomataBDD> choices, Model model, AutomataBDD result)
 {
     foreach (AutomataBDD choice in choices)
     {
         result.variableIndex.AddRange(choice.variableIndex);
     }
     result.newLocalVarName = Model.GetNewTempVarName();
     model.AddLocalVar(result.newLocalVarName, -1, choices.Count - 1);
     result.variableIndex.Add(model.GetNumberOfVars() - 1);
 }
Esempio n. 5
0
        private static void ChannelInputSetVariable(List<Expression> exps, AutomataBDD P1, Model model, AutomataBDD result)
        {
            //Add new variable used in channel input
            foreach (var expression in exps)
            {
                if (!(expression is IntConstant) && !model.ContainsVar(expression.ExpressionID))
                {
                    model.AddLocalVar(expression.ExpressionID, Model.MIN_ELEMENT_BUFFER, Model.MAX_ELEMENT_BUFFER);
                    result.variableIndex.Add(model.GetNumberOfVars() - 1);
                }
            }

            EventPrefixSetVariable(P1, model, result);
        }
Esempio n. 6
0
        private static void ChannelInputSetVariable(List <Expression> exps, AutomataBDD P1, Model model, AutomataBDD result)
        {
            //Add new variable used in channel input
            foreach (var expression in exps)
            {
                if (!(expression is IntConstant) && !model.ContainsVar(expression.ExpressionID))
                {
                    model.AddLocalVar(expression.ExpressionID, Model.MIN_ELEMENT_BUFFER, Model.MAX_ELEMENT_BUFFER);
                    result.variableIndex.Add(model.GetNumberOfVars() - 1);
                }
            }

            EventPrefixSetVariable(P1, model, result);
        }
Esempio n. 7
0
        /// <summary>
        /// P.var : P1.var ∪ P2.var ∪{isP1Terminate}
        /// </summary>
        public static List <string> SequenceSetVariable(AutomataBDD P1, AutomataBDD P2, Model model, AutomataBDD result)
        {
            //
            result.variableIndex.AddRange(P1.variableIndex);
            result.variableIndex.AddRange(P2.variableIndex);

            string isP1Terminate = Model.GetNewTempVarName();

            model.AddLocalVar(isP1Terminate, 0, 1);
            result.variableIndex.Add(model.GetNumberOfVars() - 1);

            return(new List <string>()
            {
                isP1Terminate
            });
        }
Esempio n. 8
0
        /// <summary>
        /// Create a new local variable
        /// </summary>
        public override ExpressionBDDEncoding TranslateStatementToBDD(ExpressionBDDEncoding resultBefore, Model model)
        {
            //Create new local variable if not exists
            if (!model.ContainsVar(this.Variable))
            {
                model.AddLocalVar(this.Variable, Model.BDD_INT_LOWER_BOUND, Model.BDD_INT_UPPER_BOUND);
            }

            //If there is an initialization then do it based on the resultBefore
            if (this.RightHandExpression == null)
            {
                return resultBefore;
            }
            else
            {
                return (new Assignment(this.Variable, RightHandExpression)).TranslateStatementToBDD(resultBefore, model);
            }
        }
Esempio n. 9
0
        /// <summary>
        /// General algorithm of the intersection of 2 automata
        /// Follow the algorithm in Linear Temporal Logic Symbolic Model Checking at http://ti.arc.nasa.gov/m/profile/kyrozier/papers/COSREV_62.pdf page 23
        /// [ REFS: 'result', DEREFS:'automata1, automata2' ]
        /// </summary>
        /// <param name="automata1"></param>
        /// <param name="automata2"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        public static AutomataBDD IntersectionGeneralAutomata(AutomataBDD automata1, AutomataBDD automata2, Model model)
        {
            //AddIdleTransAtDeadlockStates(automata1, model);

            AutomataBDD result = new AutomataBDD();

            string newVarName = Model.GetNewTempVarName();

            //Set var
            result.variableIndex.AddRange(automata1.variableIndex);
            result.variableIndex.AddRange(automata2.variableIndex);
            model.AddLocalVar(newVarName, 0, 1);
            result.variableIndex.Add(model.GetNumberOfVars() - 1);

            //Set Init
            Expression initTemp     = Expression.AND(automata1.initExpression, automata2.initExpression);
            Expression initValueOfT = Expression.EQ(new Variable(newVarName), new IntConstant(0));

            result.initExpression = Expression.AND(initTemp, initValueOfT);

            //Set Acceptance State
            result.acceptanceExpression = Expression.AND(automata1.acceptanceExpression, initValueOfT);

            //Set Transition
            //(temp = 0 and automata1.accept) or (temp = 1 and buchi.accept)
            Expression guard = Expression.OR(
                Expression.AND(
                    new PrimitiveApplication(
                        PrimitiveApplication.EQUAL,
                        new Variable(newVarName),
                        new IntConstant(0)),
                    automata1.acceptanceExpression),
                Expression.AND(
                    new PrimitiveApplication(
                        PrimitiveApplication.EQUAL,
                        new Variable(newVarName),
                        new IntConstant(1)),
                    automata2.acceptanceExpression));

            //guard and (temp' = 1 - temp)
            Expression transition1Exp = Expression.AND(guard,
                                                       new Assignment(newVarName,
                                                                      new PrimitiveApplication(
                                                                          PrimitiveApplication.MINUS,
                                                                          new IntConstant(1),
                                                                          new Variable(newVarName))));
            List <CUDDNode> transition1 = transition1Exp.TranslateBoolExpToBDD(model).GuardDDs;

            //!guard and (temp' = temp)
            Expression transition2Exp = Expression.AND(
                Expression.NOT(guard),
                new Assignment(newVarName, new Variable(newVarName)));

            List <CUDDNode> transition2 = transition2Exp.TranslateBoolExpToBDD(model).GuardDDs;

            //transition must happen at both automata1 + negation LTL
            List <CUDDNode> bothTransition = CUDD.Function.And(automata1.transitionBDD, automata2.transitionBDD);

            CUDD.Ref(bothTransition);
            transition1 = CUDD.Function.And(transition1, bothTransition);
            result.transitionBDD.AddRange(transition1);

            transition2 = CUDD.Function.And(transition2, bothTransition);
            result.transitionBDD.AddRange(transition2);

            //
            CUDD.Deref(automata1.channelInTransitionBDD, automata1.channelOutTransitionBDD, automata2.channelInTransitionBDD, automata2.channelOutTransitionBDD);

            return(result);
        }
Esempio n. 10
0
        /// <summary>
        /// P.var : m0 ∪ m1 ∪ {clk}
        /// </summary>
        private static List<string> TimeInterruptSetVariable(AutomataBDD m0, AutomataBDD m1, int t, Model model, AutomataBDD result)
        {
            result.variableIndex.AddRange(m0.variableIndex);
            result.variableIndex.AddRange(m1.variableIndex);
            //
            string clk = Model.GetNewTempVarName();
            model.AddLocalVar(clk, -1, t + 1);
            result.variableIndex.Add(model.GetNumberOfVars() - 1);

            return new List<string>() { clk };
        }
Esempio n. 11
0
 /// <summary>
 /// P.var = {temp}
 /// </summary>
 private static void SkipSetVariable(Model model, AutomataBDD result)
 {
     result.newLocalVarName = Model.GetNewTempVarName();
     model.AddLocalVar(result.newLocalVarName, 0, 1);
     result.variableIndex.Add(model.GetNumberOfVars() - 1);
 }
Esempio n. 12
0
        /// <summary>
        /// General algorithm of the intersection of 2 automata
        /// Follow the algorithm in Linear Temporal Logic Symbolic Model Checking at http://ti.arc.nasa.gov/m/profile/kyrozier/papers/COSREV_62.pdf page 23
        /// [ REFS: 'result', DEREFS:'automata1, automata2' ]
        /// </summary>
        /// <param name="automata1"></param>
        /// <param name="automata2"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        public static AutomataBDD IntersectionGeneralAutomata(AutomataBDD automata1, AutomataBDD automata2, Model model)
        {
            //AddIdleTransAtDeadlockStates(automata1, model);

            AutomataBDD result = new AutomataBDD();

            string newVarName = Model.GetNewTempVarName();

            //Set var
            result.variableIndex.AddRange(automata1.variableIndex);
            result.variableIndex.AddRange(automata2.variableIndex);
            model.AddLocalVar(newVarName, 0, 1);
            result.variableIndex.Add(model.GetNumberOfVars() - 1);

            //Set Init
            Expression initTemp = Expression.AND(automata1.initExpression, automata2.initExpression);
            Expression initValueOfT = Expression.EQ(new Variable(newVarName), new IntConstant(0));

            result.initExpression = Expression.AND(initTemp, initValueOfT);

            //Set Acceptance State
            result.acceptanceExpression = Expression.AND(automata1.acceptanceExpression, initValueOfT);

            //Set Transition
            //(temp = 0 and automata1.accept) or (temp = 1 and buchi.accept)
            Expression guard = Expression.OR(
                                                        Expression.AND(
                                                                                 new PrimitiveApplication(
                                                                                     PrimitiveApplication.EQUAL,
                                                                                     new Variable(newVarName),
                                                                                     new IntConstant(0)),
                                                                                 automata1.acceptanceExpression),
                                                        Expression.AND(
                                                                                 new PrimitiveApplication(
                                                                                     PrimitiveApplication.EQUAL,
                                                                                     new Variable(newVarName),
                                                                                     new IntConstant(1)),
                                                                                 automata2.acceptanceExpression));

            //guard and (temp' = 1 - temp)
            Expression transition1Exp = Expression.AND(guard,
                                                                 new Assignment(newVarName,
                                                                                new PrimitiveApplication(
                                                                                    PrimitiveApplication.MINUS,
                                                                                    new IntConstant(1),
                                                                                    new Variable(newVarName))));
            List<CUDDNode> transition1 = transition1Exp.TranslateBoolExpToBDD(model).GuardDDs;

            //!guard and (temp' = temp)
            Expression transition2Exp = Expression.AND(
                                                                 Expression.NOT(guard),
                                                                 new Assignment(newVarName, new Variable(newVarName)));

            List<CUDDNode> transition2 = transition2Exp.TranslateBoolExpToBDD(model).GuardDDs;

            //transition must happen at both automata1 + negation LTL
            List<CUDDNode> bothTransition = CUDD.Function.And(automata1.transitionBDD, automata2.transitionBDD);

            CUDD.Ref(bothTransition);
            transition1 = CUDD.Function.And(transition1, bothTransition);
            result.transitionBDD.AddRange(transition1);

            transition2 = CUDD.Function.And(transition2, bothTransition);
            result.transitionBDD.AddRange(transition2);

            //
            CUDD.Deref(automata1.channelInTransitionBDD, automata1.channelOutTransitionBDD, automata2.channelInTransitionBDD, automata2.channelOutTransitionBDD);

            return result;
        }
Esempio n. 13
0
        /// <summary>
        /// P.var : P1.var ∪ P2.var ∪{isP1Terminate}
        /// </summary>
        public static List<string> SequenceSetVariable(AutomataBDD P1, AutomataBDD P2, Model model, AutomataBDD result)
        {
            //
            result.variableIndex.AddRange(P1.variableIndex);
            result.variableIndex.AddRange(P2.variableIndex);

            string isP1Terminate = Model.GetNewTempVarName();
            model.AddLocalVar(isP1Terminate, 0, 1);
            result.variableIndex.Add(model.GetNumberOfVars() - 1);

            return new List<string>() { isP1Terminate };
        }
Esempio n. 14
0
 /// <summary>
 /// P.var = {temp}
 /// </summary>
 private static void SkipSetVariable(Model model, AutomataBDD result)
 {
     result.newLocalVarName = Model.GetNewTempVarName();
     model.AddLocalVar(result.newLocalVarName, 0, 1);
     result.variableIndex.Add(model.GetNumberOfVars() - 1);
 }
Esempio n. 15
0
 /// <summary>
 /// P.var : [∪ {i = 1..n}Pi.var] ∪ {temp}
 /// </summary>
 private static void ExternalChoiceSetVariable(List<AutomataBDD> choices, Model model, AutomataBDD result)
 {
     foreach (AutomataBDD choice in choices)
     {
         result.variableIndex.AddRange(choice.variableIndex);
     }
     result.newLocalVarName = Model.GetNewTempVarName();
     model.AddLocalVar(result.newLocalVarName, -1, choices.Count - 1);
     result.variableIndex.Add(model.GetNumberOfVars() - 1);
 }
Esempio n. 16
0
        /// <summary>
        /// P.var : 0 <= state <= t + 1
        /// </summary>
        /// <param name="t"></param>
        /// <param name="model"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        private static List<string> WaitSetVariable(int t, Model model, AutomataBDD result)
        {
            string state = Model.GetNewTempVarName();
            model.AddLocalVar(state, 0, t + 1);
            result.variableIndex.Add(model.GetNumberOfVars() - 1);

            return new List<string>() { state };
        }