/// <summary> /// Can support array of array /// </summary> /// <param name="model"></param> /// <returns></returns> private ExpressionBDDEncoding TranslateArrayExpression(Model model) { if (this.Argument2 is IntConstant) { int indexValue = ((IntConstant)this.Argument2).Value; if(Operator == ARRAY) { return new Variable(this.Argument1 + Model.NAME_SEPERATOR + indexValue).TranslateIntExpToBDD(model); } else { return new VariablePrime(this.Argument1 + Model.NAME_SEPERATOR + indexValue).TranslateIntExpToBDD(model); } } ExpressionBDDEncoding indexBddEncoding = this.Argument2.TranslateIntExpToBDD(model); //Get the array range int min = model.GetArrayRange(this.Argument1.ExpressionID)[0]; int max = model.GetArrayRange(this.Argument1.ExpressionID)[1]; ExpressionBDDEncoding result = new ExpressionBDDEncoding(); //a[i] for (int i = min; i <= max; i++) { for(int j = 0; j < indexBddEncoding.Count(); j++) { //index = i & guard of index CUDD.Ref(indexBddEncoding.ExpressionDDs[j], indexBddEncoding.GuardDDs[j]); CUDDNode guard = CUDD.Function.And(CUDD.Function.Equal(indexBddEncoding.ExpressionDDs[j], CUDD.Constant(i)), indexBddEncoding.GuardDDs[j]); if(guard != CUDD.ZERO) { //a[i] result.GuardDDs.Add(guard); Expression arrayExpression; if(Operator == ARRAY) { arrayExpression = new Variable(this.Argument1.ExpressionID + Model.NAME_SEPERATOR + i); } else { arrayExpression = new VariablePrime(this.Argument1.ExpressionID + Model.NAME_SEPERATOR + i); } result.ExpressionDDs.Add(arrayExpression.TranslateIntExpToBDD(model).ExpressionDDs[0]); } else { CUDD.Deref(guard); } } } //dereference later because 2 loops above indexBddEncoding.DeRef(); return result; }