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); } } }