Ejemplo n.º 1
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));
        }
Ejemplo n.º 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));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// [ REFS: traces, DEREFS: ]
        /// </summary>
        /// <param name="automataBDD"></param>
        /// <param name="model"></param>
        public void MCForTA(AutomataBDD automataBDD, Model model)
        {
            //Clear the old data
            this.traces.Clear();

            List<CUDDNode> allTransitions = new List<CUDDNode>(automataBDD.transitionBDD);

            CUDDNode deadlockGoadDD = GetDeadlockDD(allTransitions, model);
            ExpressionBDDEncoding initEncoding = automataBDD.initExpression.TranslateBoolExpToBDD(model);
            if (initEncoding.GuardDDs.Count == 0)
            {
                this.VerificationOutput.VerificationResult = VerificationResultType.VALID;
            }
            else
            {
                CUDD.Ref(automataBDD.transitionBDD);
                List<CUDDNode> discreteTrans = CUDD.Function.And(automataBDD.transitionBDD,
                                                                       CUDD.Function.Not(AutomataBDD.GetTerminationTransEncoding(model)));
                discreteTrans = CUDD.Abstract.ThereExists(discreteTrans, model.GetAllEventVars());

                CUDD.Ref(automataBDD.Ticks);
                List<CUDDNode> tickTrans = CUDD.Function.And(automataBDD.Ticks,
                                                                       CUDD.Function.Not(AutomataBDD.GetTerminationTransEncoding(model)));
                tickTrans = CUDD.Abstract.ThereExists(tickTrans, model.GetAllEventVars());

                bool reachable = model.PathForTA(CUDD.Function.Or(initEncoding.GuardDDs), deadlockGoadDD, discreteTrans,
                                                 tickTrans, automataBDD.SimulationRel, SelectedEngineName);

                CUDD.Deref(discreteTrans, tickTrans);

                this.VerificationOutput.VerificationResult = (reachable) ? VerificationResultType.INVALID : VerificationResultType.VALID;
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Return a computation of a buchi automata in form "prefix (period)*"
        /// [ REFS: 'prefix, period', DEREFS:]
        /// </summary>
        /// <param name="automataBDD"></param>
        /// <param name="model"></param>
        public void MC(AutomataBDD automataBDD, Model model)
        {
            //Clear the old data
            this.transitionsNoEvents.Clear();
            this.prefix.Clear();
            this.period.Clear();

            ExpressionBDDEncoding initEncoding = automataBDD.initExpression.TranslateBoolExpToBDD(model);

            if (initEncoding.GuardDDs.Count == 0)
            {
                return;
            }

            ExpressionBDDEncoding finalStateEncoding = automataBDD.acceptanceExpression.TranslateBoolExpToBDD(model);
            if (finalStateEncoding.GuardDDs.Count == 0)
            {
                return;
            }

            CUDDNode initState = CUDD.Function.Or(initEncoding.GuardDDs);
            CUDDNode finalState = CUDD.Function.Or(finalStateEncoding.GuardDDs);
            CUDDNode finalStateWithNoEvent = CUDD.Abstract.ThereExists(finalState, model.GetAllEventVars());

            CUDD.Ref(automataBDD.transitionBDD);
            this.transitionsNoEvents = CUDD.Abstract.ThereExists(automataBDD.transitionBDD, model.GetAllEventVars());

            CUDDNode allSCCs = SCCHull(model, initState, finalStateWithNoEvent);

            if (!allSCCs.Equals(CUDD.ZERO) && VerificationOutput.GenerateCounterExample)
            {
                this.VerificationOutput.VerificationResult = VerificationResultType.INVALID;

                //Transitions out from allSCCs
                CUDD.Ref(transitionsNoEvents);
                CUDD.Ref(allSCCs);
                List<CUDDNode> R = CUDD.Function.And(transitionsNoEvents, allSCCs);

                //pick one state from the set final
                CUDD.Ref(allSCCs);
                CUDDNode s = CUDD.RestrictToFirst(allSCCs, model.AllRowVars);

                //while the states from which we can reach s are not all states that can be reached from s
                CUDDNode scc;
                while (true)
                {
                    CUDD.Ref(s);
                    CUDDNode backwardOfS = model.PredecessorsStart(s, R);

                    CUDD.Ref(s);
                    CUDDNode forwardOfS = model.SuccessorsStart(s, R);

                    //
                    CUDD.Ref(backwardOfS, forwardOfS);
                    CUDDNode temp = CUDD.Function.Different(backwardOfS, forwardOfS);
                    if (temp.Equals(CUDD.ZERO))
                    {
                        scc = backwardOfS;
                        CUDD.Deref(forwardOfS, temp);
                        break;
                    }
                    else
                    {
                        CUDD.Deref(backwardOfS, forwardOfS, s);
                        s = CUDD.RestrictToFirst(temp, model.AllRowVars);
                    }
                }

                //R now contains only transitions within the SCC scc
                CUDD.Ref(scc, scc, scc, scc);
                R[0] = CUDD.Function.And(CUDD.Function.And(R[0], scc), model.SwapRowColVars(scc));
                R[1] = CUDD.Function.And(CUDD.Function.And(R[1], scc), model.SwapRowColVars(scc));

                CUDD.Ref(scc);
                CUDDNode notInSCC = CUDD.Function.Not(scc);

                List<CUDDNode> transitionNotInSCC = new List<CUDDNode>();

                CUDD.Ref(transitionsNoEvents, transitionsNoEvents);
                CUDD.Ref(notInSCC, notInSCC);
                transitionNotInSCC.AddRange(CUDD.Function.And(transitionsNoEvents, notInSCC));
                transitionNotInSCC.AddRange(CUDD.Function.And(transitionsNoEvents, model.SwapRowColVars(notInSCC)));

                //prefix is now a shortest path from an initial state to a state in final
                model.Path(initState, scc, transitionNotInSCC, prefix, true);
                CUDD.Deref(transitionNotInSCC[0], transitionNotInSCC[1]);

                //Dummy value
                period.Add((prefix.Count == 0) ? initState : prefix[prefix.Count - 1]);

                //cycle must pass final state
                CUDD.Ref(period);
                CUDD.Ref(finalStateWithNoEvent);
                CUDDNode temp1 = CUDD.Function.And(CUDD.Function.Or(period), finalStateWithNoEvent);
                if (temp1.Equals(CUDD.ZERO))
                {
                    CUDD.Ref(scc, finalStateWithNoEvent);
                    CUDDNode acceptanceStateInCyle = CUDD.Function.And(scc, finalStateWithNoEvent);
                    model.Path(period[period.Count - 1], acceptanceStateInCyle, R, period, true);

                    CUDD.Deref(acceptanceStateInCyle);
                }
                CUDD.Deref(temp1);

                //
                bool isEmptyPathAllowed = period.Count != 1;
                model.Path(period[period.Count - 1], period[0], R, period, isEmptyPathAllowed);

                //Remove dummy
                CUDD.Deref(period[0]); period.RemoveAt(0);

                //
                CUDD.Deref(initState, finalStateWithNoEvent, allSCCs, s, scc, notInSCC);
                CUDD.Deref(transitionsNoEvents[0], transitionsNoEvents[1]);
                CUDD.Deref(R[0], R[1]);

            }
            else
            {
                this.VerificationOutput.VerificationResult = VerificationResultType.VALID;
                CUDD.Deref(initState, finalStateWithNoEvent, allSCCs);
                CUDD.Deref(transitionsNoEvents[0], transitionsNoEvents[1]);
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Check whethere the goal can be reachable from the initial state of automataBDD
        /// [ REFS: traces, DEREFS: ]
        /// </summary>
        /// <param name="automataBDD"></param>
        /// <param name="goal"></param>
        /// <param name="model"></param>
        public void MC(AutomataBDD automataBDD, Expression goal, Model model)
        {
            //Clear the old data
            this.traces.Clear();

            ExpressionBDDEncoding goalBddEncoding = goal.TranslateBoolExpToBDD(model);

            ExpressionBDDEncoding initEncoding = automataBDD.initExpression.TranslateBoolExpToBDD(model);
            if (initEncoding.GuardDDs.Count == 0)
            {
                VerificationOutput.VerificationResult = VerificationResultType.INVALID;
            }
            else
            {
                CUDDNode initDD = CUDD.Function.Or(initEncoding.GuardDDs);
                CUDDNode goalDD = CUDD.Function.Or(goalBddEncoding.GuardDDs);

                CUDD.Ref(automataBDD.transitionBDD);
                List<CUDDNode> noEventTrans = CUDD.Abstract.ThereExists(automataBDD.transitionBDD, model.GetAllEventVars());

                bool reachable = model.Path(initDD, goalDD, noEventTrans, traces, SelectedEngineName, VerificationOutput.GenerateCounterExample);
                CUDD.Deref(noEventTrans);

                //
                CUDD.Deref(initDD, goalDD);

                VerificationOutput.VerificationResult = (reachable) ? VerificationResultType.VALID : VerificationResultType.INVALID;
            }
        }