Exemplo n.º 1
0
        private static Case buildSynchNext(SMVModel nuSMV)
        {
            Case     newCase  = new Case();
            CaseLine caseLine = new CaseLine();

            foreach (var module in nuSMV.Modules)
            {
                string next  = SMVKeys.NEXT + "(" + module.Instance.Name + "." + CustomVariables.TURN + ")";
                string ready = TurnStates.READY;
                caseLine.Rule.AppendBoolExpression(new BoolExp(next, NuSMV.RelationalOperator.EQUAL, ready), BinaryOperator.AND);
                if (module.HasDivisionRule)
                {
                    foreach (var childIntstance in module.ChildInstances)
                    {
                        next  = SMVKeys.NEXT + "(" + childIntstance.Name + "." + CustomVariables.TURN + ")";
                        ready = TurnStates.READY;
                        caseLine.Rule.AppendBoolExpression(new BoolExp(next, NuSMV.RelationalOperator.EQUAL, ready), BinaryOperator.AND);
                    }
                }
            }
            caseLine.Result = new Expression(SynchStates.EXCHANGE);
            newCase.CaseLines.Add(caseLine);
            newCase.CaseLines.Add(BRulesStandardVar.trueCaseLine(SynchStates.BUSY));
            return(newCase);
        }
Exemplo n.º 2
0
        internal static void addCaseLineToCurrentCopyCommVar(Variable orjVariable, Variable copyCommVar, KpCore.Rule rule, Module module, Module targetModule, int strategyIndex)
        {
            //for each variable generate a case line
            CaseLine caseLine            = new CaseLine();
            OperExp  result              = new OperExp();
            int      resultValue         = 0;
            RewriteCommunicationRule rcr = (RewriteCommunicationRule)rule;

            foreach (var target in rcr.TargetRhs.Values)
            {
                TargetedMultiset   targetMultiSet = (TargetedMultiset)target;
                InstanceIdentifier targetType     = (InstanceIdentifier)targetMultiSet.Target;
                if (targetModule.Type == targetType.Value)
                {
                    Multiset ms = targetMultiSet.Multiset;
                    foreach (var obj in ms.Objects)
                    {
                        if (obj.Equals(orjVariable.Name))
                        {
                            resultValue += ms[obj];
                        }
                    }
                }
            }
            result.Exp = copyCommVar.Name;
            if (resultValue != 0)
            {
                result.Oper.Value = MathOper.ADD;
                result.Result     = new Expression(resultValue.ToString());
            }

            caseLine.Result = result;
            caseLine.Rule   = BRulesStandardVar.extractStandardRuleFromKPRule(rule, module, strategyIndex);

            ICondition             sequenceCondition = BRulesStandardVar.getSequenceCondition(module, strategyIndex, rule.Id);
            ICondition             targetBounds      = getBoundCondition(copyCommVar, caseLine.Result);
            CompoundBoolExpression sequenceAndBound  = new CompoundBoolExpression(sequenceCondition, BinaryOperator.AND, targetBounds);

            ICondition statusCondition = BRulesStandardVar.getTurnCondition(module, strategyIndex);

            CompoundBoolExpression statusAndSequence = new CompoundBoolExpression(statusCondition, BinaryOperator.AND, sequenceAndBound);

            // _conn = to_c2
            if (module.connectionToModuleExist(targetModule))
            {
                BoolExp connEqInstance = new BoolExp(module.getConnectionToModule(targetModule).Name, NuSMV.RelationalOperator.EQUAL, SMVPreFix.getConnectedTo(targetModule.Instance));
                caseLine.Rule.AddBoolExpression(connEqInstance, BinaryOperator.AND);
            }
            caseLine.Rule.AddBoolExpression(statusAndSequence, BinaryOperator.AND);
            caseLine.Rule.ID = rule.Id;

            if (copyCommVar.Next != null)
            {
                //if the case line has not added yet
                if (!ruleExist(copyCommVar.Next, caseLine))
                {
                    copyCommVar.Next.addCaseLine(caseLine);
                }
            }
        }
Exemplo n.º 3
0
        private static void buildDissolutionVariables(KPsystem kpSystem, KpCore.MType type, NuSMV.Module module, int strategyIndex, KpCore.Rule rule)
        {
            //Preserve variable value and update status value.
            DissolutionRule dissolutionRule = (DissolutionRule)rule;

            foreach (var leftHRule in dissolutionRule.Lhs)
            {
                Variable variable = new Variable(leftHRule.Key);
                if (!module.Variables.Contains(variable))
                {
                    variable.Type      = new BoundInt(0, setMax(kpSystem, type, module, variable));
                    variable.Behaviour = VariableBehaviour.REWRITING;
                    variable.Init      = setOrUpdateInit(module, variable);
                    module.Variables.Add(variable);
                }
                else
                {
                    //if variable exists then update the upperbound value.
                    variable = (Variable)module.Variables.First(item => item.Name.Equals(leftHRule.Key));
                }
                //add result of rule to caseline
                BRulesStandardVar.addCaseLineToStandardVariable(variable, rule, module, strategyIndex);
            }
            // add rule to status variable
            BRulesCustomVar.addRuleToStatusVariable(rule, module, strategyIndex);
        }
Exemplo n.º 4
0
        private static void assignLastCasesToNext(SMVModel nuSMV)
        {
            foreach (var module in nuSMV.Modules)
            {
                BRulesStandardVar.assignLastCasesToNext(module);

                if (module.HasDivisionRule)
                {
                    BRulesStandardVar.assignLastCasesToDivisionVars(module);
                }
            }
        }
Exemplo n.º 5
0
        private static Case buildPStepNext(SMVModel nuSMV)
        {
            Case     newCase  = new Case();
            CaseLine caseLine = new CaseLine();
            //_sync = _EXCH
            ICondition synchIsExch = new BoolExp(CustomVariables.SYNCH, NuSMV.RelationalOperator.EQUAL, SynchStates.EXCHANGE);

            caseLine.Rule.Condition = synchIsExch;
            caseLine.Result         = new Expression(Truth.TRUE);
            newCase.CaseLines.Add(caseLine);
            newCase.CaseLines.Add(BRulesStandardVar.trueCaseLine(Truth.FALSE));
            return(newCase);
        }
Exemplo n.º 6
0
        private static void buildDivisionVariables(NuSMV.Module module, KPsystem kpSystem, KpCore.MType type, int strategyIndex, KpCore.Rule rule)
        {
            DivisionRule divisionRule = (DivisionRule)rule;

            foreach (var leftHRule in divisionRule.Lhs)
            {
                Variable variable = new Variable(leftHRule.Key);
                if (!module.Variables.Contains(variable))
                {
                    variable.Type      = new BoundInt(0, setMax(kpSystem, type, module, variable));
                    variable.Behaviour = VariableBehaviour.REWRITING;
                    variable.Init      = setOrUpdateInit(module, variable);
                    module.Variables.Add(variable);
                }
                else
                {
                    //if variable exists then update the upperbound value.
                    variable = (Variable)module.Variables.First(item => item.Name.Equals(leftHRule.Key));
                }
                //add result of rule to caseline
                BRulesStandardVar.addCaseLineToStandardVariable(variable, rule, module, strategyIndex);
            }

            foreach (InstanceBlueprint compartment in divisionRule.Rhs)
            {
                MType compType = compartment.Type;
                if (type.Name.Equals(compType.Name))
                {
                    Multiset ms = compartment.Multiset;
                    foreach (var obj in ms.Objects)
                    {
                        Variable variable = new Variable(obj);
                        if (!module.Variables.Contains(variable))
                        {
                            variable.Type      = new BoundInt(0, setMax(kpSystem, compType, module, variable));
                            variable.Behaviour = VariableBehaviour.DIVISION;
                            variable.Init      = setOrUpdateInit(module, variable);
                            module.Variables.Add(variable);
                        }
                        else
                        {
                            variable           = (Variable)module.Variables.First(item => item.Name.Equals(obj));
                            variable.Behaviour = VariableBehaviour.DIVISION;
                        }
                    }
                }
            }
            // add rule to status variable
            BRulesCustomVar.addRuleToStatusVariable(rule, module, strategyIndex);
        }
Exemplo n.º 7
0
        private static void buildReWritingVariable(KPsystem kpSystem, KpCore.MType kpType, NuSMV.Module module, int strategyIndex, KpCore.Rule kpRule, string newVarName, VariableOrigin origin, bool isLeft)
        {
            Variable newVar = null;

            //if variable does not exist then create it,
            if (!module.isVariableExist(newVarName))
            {
                if (origin == VariableOrigin.Original)
                {
                    newVar = new Variable(newVarName);
                    setBoundIntType(kpSystem, kpType, module, newVar);
                    newVar.Behaviour = VariableBehaviour.REWRITING;
                    newVar.Init      = setOrUpdateInit(module, newVar);
                    newVar.Origin    = VariableOrigin.Original;
                    if (isLeft)
                    {
                        //if it is on left then add it, but do not add rules to first not-copy variable on right.
                        BRulesStandardVar.addCaseLineToStandardVariable(newVar, kpRule, module, strategyIndex);
                    }
                }
                else if (origin == VariableOrigin.Copy)
                {
                    newVar = new Variable(newVarName);
                    Variable orginalVariable = (Variable)module.getVariable(newVarName.Replace(SMVPreFix.COPY, ""));
                    newVar.Type      = orginalVariable.Type;
                    newVar.Behaviour = VariableBehaviour.REWRITING;
                    newVar.Init      = "0";
                    newVar.Origin    = VariableOrigin.Copy;
                    //add result of rule to caseline
                    BRulesStandardVar.addCaseLineToStandardVariable(newVar, kpRule, module, strategyIndex);
                }
                if (newVar != null)
                {
                    module.Variables.Add(newVar);
                }
                else
                {
                    throw new Exception("Cannot create variable : " + newVarName);
                }
            }
            else
            {
                //bring variable to add new rules.
                newVar = (Variable)module.Variables.First(item => item.Name.Equals(newVarName));
                BRulesStandardVar.addCaseLineToStandardVariable(newVar, kpRule, module, strategyIndex);
            }
        }
Exemplo n.º 8
0
        /// <summary> ((_status = _NONEXIST) & (next(_status) = _ACTIVE))) </summary> <param name="module"></param>
        /// <returns></returns>
        internal static CompoundBoolExpression getStatusNonExistNEXTActive(Module module)
        {
            CompoundBoolExpression statusNonExistNEXTActive = null;

            if (module.HasDivisionRule)
            {
                ICondition statusNONEXIST = BRulesStandardVar.getStatusCondition(module, StatusStates.NONEXIST);

                //next(child.status)=ACTIVE
                Expression left = new Expression();
                left.Exp = SMVKeys.NEXT + "(" + module.Status.Name + ")";
                Expression right            = new Expression(StatusStates.ACTIVE);
                BoolExp    nextStatusACTIVE = new BoolExp(left, NuSMV.RelationalOperator.EQUAL, right);
                statusNonExistNEXTActive = new CompoundBoolExpression(statusNONEXIST, NuSMV.BinaryOperator.AND, nextStatusACTIVE);
            }
            return(statusNonExistNEXTActive);
        }
        internal static void addRuleToStatusVariable(KpCore.Rule rule, NuSMV.Module module, int strategyIndex)
        {
            // ((main._status = _willDIVIDE) & (_sync = _BUSY)) : _willDIVIDE; ((main._status = _willDIVIDE) & (_sync =
            // _EXCH)) : _DIVIDED;
            if (module.HasDivisionRule)
            {
                CaseLine willDivideCaseLine = new CaseLine();
                //((main._status = _willDIVIDE) & (_sync = _BUSY)) : _willDIVIDE;
                ICondition willDivide = BRulesStandardVar.getStatusCondition(module, StatusStates.WILLDIVIDE);
                ICondition syncBusy   = new BoolExp(CustomVariables.SYNCH, NuSMV.RelationalOperator.EQUAL, SynchStates.BUSY);
                willDivideCaseLine.Rule.Condition = new CompoundBoolExpression(willDivide, BinaryOperator.AND, syncBusy);
                willDivideCaseLine.Result         = new Expression(StatusStates.WILLDIVIDE);
                if (!BRulesComVar.ruleExist(module.Status.Next, willDivideCaseLine))
                {
                    module.Status.Next.addCaseLine(willDivideCaseLine);
                }
                // ((main._status = _willDIVIDE) & (_sync = _EXCH)) : _DIVIDED;
                CaseLine   dividedCaseLine = new CaseLine();
                ICondition syncExch        = new BoolExp(CustomVariables.SYNCH, NuSMV.RelationalOperator.EQUAL, SynchStates.EXCHANGE);
                dividedCaseLine.Rule.Condition = new CompoundBoolExpression(willDivide, BinaryOperator.AND, syncExch);
                dividedCaseLine.Result         = new Expression(StatusStates.DIVIDED);
                if (!BRulesComVar.ruleExist(module.Status.Next, dividedCaseLine))
                {
                    module.Status.Next.addCaseLine(dividedCaseLine);
                }
            }
            // ((main._status = _willDISSOLVE) & (_sync = _BUSY)) : _willDISSOLVE; ((main._status = _willDISSOLVE) & (_sync =
            // _EXCH)) : _DISSOLVED;
            if (module.HasDissolutionRule)
            {
                CaseLine caseLine2 = new CaseLine();
                //status = willDissolve & (_sync = _BUSY) : willDissolve;
                ICondition willSolve = BRulesStandardVar.getStatusCondition(module, StatusStates.WILLDISSOLVE);
                ICondition syncBusy  = new BoolExp(CustomVariables.SYNCH, NuSMV.RelationalOperator.EQUAL, SynchStates.BUSY);
                caseLine2.Rule.Condition = new CompoundBoolExpression(willSolve, BinaryOperator.AND, syncBusy);
                caseLine2.Result         = new Expression(StatusStates.WILLDISSOLVE);
                if (!BRulesComVar.ruleExist(module.Status.Next, caseLine2))
                {
                    module.Status.Next.addCaseLine(caseLine2);
                }
                //((c1._status = _willDISSOLVE) & (_sync = _EXCH)) : _DISSOLVED;
                CaseLine   caseLine3 = new CaseLine();
                ICondition syncExch  = new BoolExp(CustomVariables.SYNCH, NuSMV.RelationalOperator.EQUAL, SynchStates.EXCHANGE);
                caseLine3.Rule.Condition = new CompoundBoolExpression(willSolve, BinaryOperator.AND, syncExch);
                caseLine3.Result         = new Expression(StatusStates.DISSOLVED);
                if (!BRulesComVar.ruleExist(module.Status.Next, caseLine3))
                {
                    module.Status.Next.addCaseLine(caseLine3);
                }
            }

            CaseLine caseLine = new CaseLine();

            caseLine.Result  = getResultOfStatusRuleFromKPRule(module, rule);
            caseLine.Rule    = BRulesStandardVar.extractStandardRuleFromKPRule(rule, module, strategyIndex);
            caseLine.Rule.ID = rule.Id;
            //if module has division rule then, dissolve process happens inside instances.
            // ICondition statusCondition = BRulesStandardVar.getStatusCondition(module); No need status=Active condition anymore
            ICondition sequence = BRulesStandardVar.getSequenceCondition(module, strategyIndex, rule.Id);

            //CompoundBoolExpression compound = new CompoundBoolExpression(statusCondition, BinaryOperator.AND, sequence);
            caseLine.Rule.AddBoolExpression(sequence, BinaryOperator.AND);
            //if the case line has not added yet
            if (!BRulesComVar.ruleExist(module.Status.Next, caseLine))
            {
                module.Status.Next.addCaseLine(caseLine);
            }
        }