Beispiel #1
0
        private static List <NoNextVar> generateConnectionVariable(KPsystem kpSystem, MType kpType, Module module)
        {
            List <NoNextVar> connections = new List <NoNextVar>();

            foreach (MType mType in kpSystem.Types)
            {
                NoNextVar connection = new NoNextVar(SMVPreFix.getConnectionVar(mType));
                connection.Behaviour = VariableBehaviour.CUSTOM;
                SEnum connEnums = new SEnum();
                HashSet <Instance> connectedTo = new HashSet <Instance>();
                foreach (var connectedInstance in module.Instance.ConnectedTo)
                {
                    // if it has connection
                    if (connectedInstance.Module.Type == mType.Name)
                    {
                        bool communicationRuleToTargetExist = communicationRuleIncludesTargetType(kpType, mType);
                        if (communicationRuleToTargetExist)
                        {
                            connectedTo.Add(connectedInstance);
                        }
                    }
                }
                //if there is more than one connection of same type compartments exists, then add it to connections
                if (connectedTo.Count > 1)
                {
                    //sort them
                    IEnumerable <Instance> orderedConns = connectedTo.OrderBy(instance => instance.Name);

                    foreach (var connectedInstance in orderedConns)
                    {
                        connEnums.Values.Add(SMVPreFix.getConnectedTo(connectedInstance));
                    }
                    connection.Type = connEnums;
                    // connection.Init = setOrUpdateInit(module, connection); Commented out, since no need to get from parameter.
                    connections.Add(connection);
                }
            }
            return(connections);
        }
        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);
                }
            }
        }