private static void TimeoutEncodeTransitionChannel(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' = tau and clk' = clk) or (event' != tau and clk' = -1)] guard = new PrimitiveApplication(PrimitiveApplication.AND, new PrimitiveApplication(PrimitiveApplication.LESS_EQUAL, new Variable(clk), new IntConstant(t)), new PrimitiveApplication(PrimitiveApplication.OR, new PrimitiveApplication(PrimitiveApplication.AND, AutomataBDD.GetTauTransExpression(), new Assignment(clk, new Variable(clk))), new PrimitiveApplication(PrimitiveApplication.AND, AutomataBDD.GetNotTauTransExpression(), new Assignment(clk, new IntConstant(-1))))); 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 = new PrimitiveApplication(PrimitiveApplication.AND, new PrimitiveApplication(PrimitiveApplication.EQUAL, new Variable(clk), new IntConstant(t)), new PrimitiveApplication(PrimitiveApplication.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 = new PrimitiveApplication(PrimitiveApplication.AND, new PrimitiveApplication(PrimitiveApplication.EQUAL, 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); }