/// <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; } }
/// <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 MCForTA(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> discreteTrans = CUDD.Abstract.ThereExists(automataBDD.transitionBDD, model.GetAllEventVars()); CUDD.Ref(automataBDD.Ticks); List<CUDDNode> tickTrans = CUDD.Abstract.ThereExists(automataBDD.Ticks, model.GetAllEventVars()); bool reachable = model.PathForTA(initDD, goalDD, discreteTrans, tickTrans, automataBDD.SimulationRel, SelectedEngineName); CUDD.Deref(discreteTrans, tickTrans); CUDD.Deref(initDD, goalDD); VerificationOutput.VerificationResult = (reachable) ? VerificationResultType.VALID : VerificationResultType.INVALID; } }