From 993dad55f9eee69d8c37d2112d871287536fa961 Mon Sep 17 00:00:00 2001
From: Emna Gharbi <amna.gharbi@telecom-paristech.fr>
Date: Mon, 1 Apr 2019 14:04:25 +0200
Subject: [PATCH] added mapping channels to controllers variables

---
 .../dsez3engine/OptimizationModel.java        | 76 +++++++++++++++++++
 1 file changed, 76 insertions(+)

diff --git a/src/main/java/tmltranslator/dsez3engine/OptimizationModel.java b/src/main/java/tmltranslator/dsez3engine/OptimizationModel.java
index 697f25ff42..2d8b796612 100644
--- a/src/main/java/tmltranslator/dsez3engine/OptimizationModel.java
+++ b/src/main/java/tmltranslator/dsez3engine/OptimizationModel.java
@@ -6,6 +6,7 @@ import tmltranslator.*;
 
 import javax.swing.*;
 import java.lang.reflect.Array;
+import java.nio.channels.Channel;
 import java.util.*;
 
 
@@ -469,6 +470,9 @@ public class OptimizationModel {
         //Definition of start time variable for each task
         IntExpr[] start = new IntExpr[inputInstance.getModeling().getTasks().size()];
 
+        //Definition of Y1: mapping variable of channel --> PE for transfer
+        IntExpr[][] Y1 = new IntExpr[inputInstance.getModeling().getChannels().size()][inputInstance.getArchitecture().getCPUs().size()];
+
 
         //Mapping Constraints :
         BoolExpr mapping_constraints = ctx.mkTrue();
@@ -510,8 +514,45 @@ public class OptimizationModel {
             //TraceManager.addDev(c_bound_start[t].toString());
         }
 
+        //Matrix of constraints to define the interval of Y1 : 0 <= Y1 <= 1
+        BoolExpr[][] c_bound_y1 = new BoolExpr[inputInstance.getModeling().getChannels().size()][inputInstance.getArchitecture().getCPUs().size()];
+
+        for (Object channel : inputInstance.getModeling().getChannels()) {
+            int c = inputInstance.getModeling().getChannels().indexOf(channel);
+            TMLChannel channelCast = (TMLChannel) channel;
+
+            for (HwNode hwNode : inputInstance.getArchitecture().getCPUs()) {
+                int p = inputInstance.getArchitecture().getCPUs().indexOf(hwNode);
+                Y1[c][p] = ctx.mkIntConst("Y1_" + channelCast.getName() + "_" + hwNode.getName());
+
+                // Constraints: 0 <= Y1 <= 1
+                c_bound_y1[c][p] = ctx.mkAnd(ctx.mkLe(ctx.mkInt(0), Y1[c][p]),
+                        ctx.mkLe(Y1[c][p], ctx.mkInt(1)));
+
+                mapping_constraints = ctx.mkAnd(mapping_constraints, c_bound_y1[c][p]);
+
+
+            }
+
+        }
 
         //CONSTRAINTS//
+
+        //Each channel must be mapped to exactly 1 processing unit:
+
+        // ∀ch, SUM p (Y 1) = 1
+
+        BoolExpr[] c_unique_y1 = new BoolExpr[inputInstance.getModeling().getChannels().size()];
+        for (Object channel : inputInstance.getModeling().getChannels()) {
+            int c = inputInstance.getModeling().getChannels().indexOf(channel);
+            TMLChannel channelCast = (TMLChannel) channel;
+
+            ArithExpr sum_Y1 = ctx.mkAdd(Y1[c]);
+            c_unique_y1[c] = ctx.mkEq(sum_Y1, ctx.mkInt(1));
+            mapping_constraints = ctx.mkAnd(mapping_constraints, c_unique_y1[c]);
+
+        }
+
         //Each task must be mapped to exactly 1 processing unit in its eligibility set:
 
         // ∀t, SUM p (X tp) ≤ 1
@@ -779,6 +820,8 @@ public class OptimizationModel {
             Model m = opt.getModel();
             Expr[][] optimized_result_X = new Expr[inputInstance.getModeling().getTasks().size()][inputInstance.getArchitecture().getCPUs().size()];
             Expr[] optimized_result_start = new Expr[inputInstance.getModeling().getTasks().size()];
+            Expr[][] optimized_result_Y1 = new Expr[inputInstance.getModeling().getChannels().size()][inputInstance.getArchitecture().getCPUs().size()];
+
 
             tmlMapping = new TMLMapping<>(inputInstance.getModeling(), inputInstance.getArchitecture(), false);
 
@@ -868,6 +911,39 @@ public class OptimizationModel {
                 outputToDisplay = outputToDisplay + entry.getKey() + " = " + entry.getValue() + "\n";
             }
 
+            //mapping of communication channels
+            outputToDisplay = outputToDisplay + "\n\n(3) Spatial mapping of channels onto controllers:\n";
+            for (Object channel : inputInstance.getModeling().getChannels()) {
+                int c = inputInstance.getModeling().getChannels().indexOf(channel);
+                TMLChannel channelCast = (TMLChannel) channel;
+
+                for (HwNode hwNode : inputInstance.getArchitecture().getCPUs()) {
+                    int p = inputInstance.getArchitecture().getCPUs().indexOf(hwNode);
+                    //evaluate optimal solution
+                    optimized_result_Y1[c][p] = m.evaluate(Y1[c][p], true);
+
+
+                    if (Integer.parseInt(optimized_result_Y1[c][p].toString()) == 1) {
+
+                        //TODO Add this mapping in tmlmapping
+                        // mapping of R/W channels on local memory of hwExecutionNode TODO get(0)
+                    /*    if (!taskCast.getReadChannels().isEmpty())
+                            tmlMapping.addCommToHwCommNode(taskCast.getReadChannels().get(0), inputInstance.getLocalMemoryOfHwExecutionNode(hwNode));
+
+                        if (!taskCast.getWriteChannels().isEmpty())
+                            tmlMapping.addCommToHwCommNode(taskCast.getWriteChannels().get(0), inputInstance.getLocalMemoryOfHwExecutionNode(hwNode));
+
+                        outputToDisplay = outputToDisplay + "\n" + taskCast.getName() + "      -->      " + hwNode.getName();
+
+                    }*/
+
+
+                        outputToDisplay += "\nChannel(" + channelCast.getOriginTask().getTaskName() + "," +
+                                channelCast.getDestinationTask().getTaskName() + ")  -->  " + hwNode.getName();
+                    }
+                }
+            }
+
 
             TraceManager.addDev(outputToDisplay);
             result.mappingFound = true;
-- 
GitLab