diff --git a/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java b/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java index fe9f1c62800299980ec01d0028c24f8cf5dd70ef..c7b6b1b23c9bf1a261aecac722d5adcf164d4d24 100644 --- a/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java +++ b/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java @@ -41,6 +41,7 @@ package tmltranslator.tonetwork; import tmltranslator.*; +import java.util.List; import java.util.Vector; @@ -52,16 +53,14 @@ import java.util.Vector; * @version 1.0 11/03/2019 */ public class TaskMUXAppDispatch extends TMLTask { - protected int nbOfApps; public TaskMUXAppDispatch(String name, Object referenceToClass, Object referenceToActivityDiagram) { super(name, referenceToClass, referenceToActivityDiagram); } // Output Channels are given in the order of VCs - public void generate(int nbOfApps, Vector<TMLEvent> inputEvents, TMLEvent outputEvent) { + public void generate(List<TMLEvent> inputEvents, TMLEvent outputEvent) { - this.nbOfApps = nbOfApps; // Attributes TMLAttribute pktlen = new TMLAttribute("pktlen", "pktlen", new TMLType(TMLType.NATURAL), "0"); @@ -95,7 +94,7 @@ public class TaskMUXAppDispatch extends TMLTask { // Branch for each app - for(int i=0; i<nbOfApps; i++) { + for(int i=0; i< inputEvents.size(); i++) { TMLWaitEvent waitEvt = new TMLWaitEvent("PacketEvent" + i, referenceObject); waitEvt.setEvent(inputEvents.get(i)); waitEvt.addParam("pktlen"); diff --git a/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java b/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java index 275658098c5aedd51834076a1b81e48cc8a5804b..8efb1edb02eb775c3db19ac46714ed89ceedd851 100644 --- a/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java +++ b/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java @@ -39,9 +39,11 @@ package tmltranslator.tonetwork; +import myutil.TraceManager; import tmltranslator.*; import ui.TGComponent; +import java.util.HashMap; import java.util.List; import java.util.Vector; @@ -96,6 +98,78 @@ public class TranslatedRouter<E> { String nameOfExecNode = noc.getHwExecutionNode(xPos, yPos); HwExecutionNode execNode = tmlmap.getTMLArchitecture().getHwExecutionNodeByName(nameOfExecNode); + if (nameOfExecNode == null) { + nameOfExecNode = "fakeCPU_" + xPos + "_" + yPos; + } + + + if (execNode == null) { + TraceManager.addDev("Could NOT find an exec node for (" + xPos + "," + yPos + ")"); + } else { + TraceManager.addDev("Found an exec node for (" + xPos + "," + yPos + "): " + execNode.getName()); + } + + // Then, we need to find the channels starting from/arriving to a task mapped on this execNode + Vector<TMLChannel> inputChannels = new Vector<>(); + Vector<TMLChannel> outputChannels = new Vector<>(); + if (execNode != null) { + for(TMLChannel ch: channelsViaNoc) { + TMLTask origin = ch.getOriginTask(); + TMLTask destination = ch.getDestinationTask(); + + if (origin != null) { + // find on which CPU is mapped this task + HwNode cpuOfOrigin = tmlmap.getHwNodeOf(origin); + if (cpuOfOrigin == execNode) { + TraceManager.addDev("Found an output channel:" + ch.getName()); + outputChannels.add(ch); + } + } + + if (destination != null) { + // find on which CPU is mapped this task + HwNode cpuOfDestination = tmlmap.getHwNodeOf(destination); + if (cpuOfDestination == execNode) { + TraceManager.addDev("Found an input channel:" + ch.getName()); + inputChannels.add(ch); + } + } + } + } + + // Now that we know all channels, we can generate the MUX tasks + // We need one event par outputChannel + HashMap<TMLChannel, TMLEvent> mapOfOutputChannels = new HashMap<>(); + Vector<TMLEvent> inputEventsOfMUX = new Vector<>(); + for(TMLChannel chan: outputChannels) { + TMLEvent outputEventOfMux = new TMLEvent("EventMUXof" + chan.getName(), null, 8, + true); + mapOfOutputChannels.put(chan, outputEventOfMux); + inputEventsOfMUX.add(outputEventOfMux); + tmlm.addEvent(outputEventOfMux); + } + + // We also need an output event for MUX / NI_IN + TMLEvent eventForMUX_and_NI_IN = new TMLEvent("EventBetweenMUXandNI_IN_for_" + nameOfExecNode, + null, 8, true); + tmlm.addEvent(eventForMUX_and_NI_IN); + + // We can create the MUX task + TaskMUXAppDispatch muxTask = new TaskMUXAppDispatch("MUXof" + nameOfExecNode, null, null); + tmlm.addTask(muxTask); + muxTask.generate(inputEventsOfMUX, eventForMUX_and_NI_IN); + + + // Finally, we need to modify the src apps with the new event, and modifying the channel as well to write in the local memory + + + // All done for MUX + + + + + + // VC DISPATCHERS // One dispatcher per port