Пример #1
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;
            }
        }
Пример #2
0
        /// <summary>
        /// [ REFS: 'result', DEREFS: 'P1.Trans, P1.Ticks, P2.Ticks']
        /// </summary>
        /// <param name="isP1Terminate"></param>
        /// <param name="P1"></param>
        /// <param name="P2"></param>
        /// <param name="model"></param>
        /// <param name="result"></param>
        private static void SequenceEncodeTick(string isP1Terminate, AutomataBDD P1, AutomataBDD P2, Model model, AutomataBDD result)
        {
            // Remove tick transition delays the tau transition to initial state of P2
            CUDDNode terminateTransInP1 = CUDD.Function.And(AutomataBDD.GetTerminationTransEncoding(model), P1.transitionBDD);

            CUDDNode terminatingStates    = CUDD.Abstract.ThereExists(terminateTransInP1, model.AllColVars);
            CUDDNode notTerminatingStates = CUDD.Function.Not(terminatingStates);

            //
            P1.Ticks = CUDD.Function.And(P1.Ticks, notTerminatingStates);


            //2. (temp and P2.tick ∧ temp')
            Expression guard = new PrimitiveApplication(PrimitiveApplication.AND,
                                                        new PrimitiveApplication(PrimitiveApplication.EQUAL,
                                                                                 new Variable(isP1Terminate),
                                                                                 new IntConstant(1)),
                                                        new Assignment(isP1Terminate, new IntConstant(1)));

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

            result.Ticks.AddRange(CUDD.Function.And(transition, P2.Ticks));
        }