diff --git a/src/main/java/tmltranslator/TMLActivity.java b/src/main/java/tmltranslator/TMLActivity.java index 03594e919a5a9ddb4f88ac548bfaf0e4f3a57b95..2c291a1fa8521488b66b8c507a9ba747938ab488 100755 --- a/src/main/java/tmltranslator/TMLActivity.java +++ b/src/main/java/tmltranslator/TMLActivity.java @@ -149,7 +149,7 @@ public class TMLActivity extends TMLElement { return found; } - private void replaceAllNext(TMLActivityElement _oldE, TMLActivityElement _newE) { + public void replaceAllNext(TMLActivityElement _oldE, TMLActivityElement _newE) { TMLActivityElement tmlae; for (int i = 0; i < elements.size(); i++) { tmlae = elements.elementAt(i); diff --git a/src/main/java/tmltranslator/TMLActivityElement.java b/src/main/java/tmltranslator/TMLActivityElement.java index a223aab70097113122d13aec1f2fadb77c10cc08..a0511572ad70fc96d572a2d6bf45e96f2e043b68 100755 --- a/src/main/java/tmltranslator/TMLActivityElement.java +++ b/src/main/java/tmltranslator/TMLActivityElement.java @@ -50,7 +50,7 @@ import java.util.Vector; * @version 1.0 23/11/2005 * @author Ludovic APVRILLE */ -public abstract class TMLActivityElement extends TMLElement{ +public abstract class TMLActivityElement extends TMLElement { protected Vector<TMLActivityElement> nexts; public SecurityPattern securityPattern; private String value=""; diff --git a/src/main/java/tmltranslator/TMLChannel.java b/src/main/java/tmltranslator/TMLChannel.java index 9fbfa817c0dfc703dae014d020969828dbdd01d6..b4d32565ee4af6ad5a79f9747bcdf9d5678ab828 100755 --- a/src/main/java/tmltranslator/TMLChannel.java +++ b/src/main/java/tmltranslator/TMLChannel.java @@ -84,7 +84,7 @@ public class TMLChannel extends TMLCommunicationElement { private String SP = " "; private int priority; - private int vc = -1; + private int vc = 0; public ArrayList<TMLTask> originalOriginTasks = new ArrayList<TMLTask>(); public ArrayList<TMLTask> originalDestinationTasks = new ArrayList<TMLTask>(); @@ -191,6 +191,7 @@ public class TMLChannel extends TMLCommunicationElement { public int getNumberOfSamples() { return nbOfSamples;} public void setVC(int vc) { + TraceManager.addDev("Setting VC to " + vc + " for channel " + getName()); this.vc = vc; } diff --git a/src/main/java/tmltranslator/TMLTextSpecification.java b/src/main/java/tmltranslator/TMLTextSpecification.java index 299508698f43bbd7bf2d16e38470c19ca1e667c2..b3dcb6ba4459e5a8462207175027a605f3c25ee2 100755 --- a/src/main/java/tmltranslator/TMLTextSpecification.java +++ b/src/main/java/tmltranslator/TMLTextSpecification.java @@ -353,6 +353,9 @@ public class TMLTextSpecification<E> { String sb = ""; sb += "//Local variables" + CR; + TraceManager.addDev("Making activity of task:" + task.getTaskName()); + + for (TMLAttribute attr : task.getAttributes()) { sb += TMLType.getStringType(attr.getType().getType()) + SP + attr.getName(); if ((attr.getInitialValue() != null) && (attr.getInitialValue().length() > 0)) { diff --git a/src/main/java/tmltranslator/tonetwork/Link.java b/src/main/java/tmltranslator/tonetwork/Link.java index 3b5b2624489f346b03d3d2730bd89e386c923b44..1784f6ec90b3b029b55ae234194697d0aaff1939 100644 --- a/src/main/java/tmltranslator/tonetwork/Link.java +++ b/src/main/java/tmltranslator/tonetwork/Link.java @@ -121,6 +121,7 @@ public class Link { packetOut.addParam(new TMLType(TMLType.NATURAL)); packetOut.addParam(new TMLType(TMLType.NATURAL)); packetOut.addParam(new TMLType(TMLType.NATURAL)); + packetOut.addParam(new TMLType(TMLType.NATURAL)); tmlm.addEvent(packetOut); chOutToIN = new TMLChannel("channelBetweenOUTToIN__" + getNaming(), diff --git a/src/main/java/tmltranslator/tonetwork/TMAP2Network.java b/src/main/java/tmltranslator/tonetwork/TMAP2Network.java index d805b16f948a21c08b90b48276292878b81d8aac..633aa3dd7a3bbd4fdb6932dd2f567b3d29281ac9 100644 --- a/src/main/java/tmltranslator/tonetwork/TMAP2Network.java +++ b/src/main/java/tmltranslator/tonetwork/TMAP2Network.java @@ -75,6 +75,9 @@ public class TMAP2Network<E> { public final static String[] PORT_NAME = {"North", "South", "West", "East", "Internal"}; + private HashMap<TMLChannel, String> IDsOfChannels; + + public TMAP2Network(TMLMapping<?> _tmlmapping, int nocSize) { tmlmapping = _tmlmapping; @@ -82,6 +85,14 @@ public class TMAP2Network<E> { this.nocSize = nocSize; } + public String getChannelID(TMLChannel ch) { + return IDsOfChannels.get(ch); + } + + public void putTMLChannelID(TMLChannel ch, String id) { + IDsOfChannels.put(ch, "" + id); + } + public TMLMapping<?> getTMLMapping() { return tmlmapping; } @@ -369,6 +380,12 @@ public class TMAP2Network<E> { + // Associate an id to all channels + int id = 0; + IDsOfChannels = new HashMap<>(); + for(TMLChannel ch: tmlmodeling.getChannels()) { + IDsOfChannels.put(ch, "" + id); + } // Make internal channels & events of routers for(i=0; i<nocSize; i++) { @@ -388,8 +405,6 @@ public class TMAP2Network<E> { - - // Integrate into the TMLMapping for(i=0; i<nocSize; i++) { for(j=0; j<nocSize; j++) { @@ -419,24 +434,38 @@ public class TMAP2Network<E> { } } + // Handling origin channels + for(i=0; i<nocSize; i++) { + for(j=0; j<nocSize; j++) { + routers[i][j].makeOriginChannels(); + } + } - - // Printing routers + // Handling destination channels for(i=0; i<nocSize; i++) { for(j=0; j<nocSize; j++) { - TraceManager.addDev(routers[i][j].toString() + "\n"); + routers[i][j].makeDestinationChannels(); } } + // Post processing of routers + for(i=0; i<nocSize; i++) { + for(j=0; j<nocSize; j++) { + routers[i][j].postProcessing(); + } + } - // Connect channels to the NoC - // A bridge is put with the same position as the router as to allow classical paths not - // to use the router + // Printing routers + for(i=0; i<nocSize; i++) { + for(j=0; j<nocSize; j++) { + //TraceManager.addDev(routers[i][j].toString() + "\n"); + } + } - return null; // all ok + return null; // That's all folks! } } diff --git a/src/main/java/tmltranslator/tonetwork/TaskINForDispatch.java b/src/main/java/tmltranslator/tonetwork/TaskINForDispatch.java index b992fa8215fc2fb1326b2e1b6efa060a889f7fff..147cd7af7154f2173fb977f676602cbb9c4350f8 100644 --- a/src/main/java/tmltranslator/tonetwork/TaskINForDispatch.java +++ b/src/main/java/tmltranslator/tonetwork/TaskINForDispatch.java @@ -82,6 +82,8 @@ public class TaskINForDispatch extends TMLTask { this.addAttribute(vc); TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "0"); this.addAttribute(eop); + TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0"); + this.addAttribute(chid); // Events and channels addTMLEvent(inputEvent); @@ -108,6 +110,7 @@ public class TaskINForDispatch extends TMLTask { waitEvt.addParam("dst"); waitEvt.addParam("vc"); waitEvt.addParam("eop"); + waitEvt.addParam("chid"); activity.addElement(waitEvt); loop.addNext(waitEvt); @@ -121,6 +124,7 @@ public class TaskINForDispatch extends TMLTask { sendEvt.addParam("dst"); sendEvt.addParam("vc"); sendEvt.addParam("eop"); + waitEvt.addParam("chid"); activity.addElement(sendEvt); choice.addNext(sendEvt); choice.addGuard("vc == " + i); diff --git a/src/main/java/tmltranslator/tonetwork/TaskINForVC.java b/src/main/java/tmltranslator/tonetwork/TaskINForVC.java index 1ce233a3a49a403d4fc35e2a6a8961ab37d9205f..8d4534881c788c1357f25ab7461e99fcf6225f4c 100644 --- a/src/main/java/tmltranslator/tonetwork/TaskINForVC.java +++ b/src/main/java/tmltranslator/tonetwork/TaskINForVC.java @@ -74,6 +74,8 @@ public class TaskINForVC extends TMLTask { this.addAttribute(vc); TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "0"); this.addAttribute(eop); + TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0"); + this.addAttribute(chid); TMLAttribute feedbackDownstr = new TMLAttribute("feedbackDownstr", "feedbackDownstr", new TMLType(TMLType.NATURAL), "0"); this.addAttribute(feedbackDownstr); TMLAttribute bufferSize = new TMLAttribute("bufferSize", "bufferSize", new TMLType(TMLType.NATURAL), "2"); @@ -191,10 +193,6 @@ public class TaskINForVC extends TMLTask { - - - - // Main choice : second branch of secondSeq TMLChoice mainChoice = new TMLChoice("mainChoice", referenceObject); activity.addLinkElement(secondSeq, mainChoice); @@ -215,6 +213,7 @@ public class TaskINForVC extends TMLTask { sendEvt.addParam("dst"); sendEvt.addParam("vc"); sendEvt.addParam("eop"); + sendEvt.addParam("chid"); activity.addLinkElement(packetLoop, sendEvt); waitEvt = new TMLWaitEvent("FeedbackDownEvent", referenceObject); @@ -236,6 +235,7 @@ public class TaskINForVC extends TMLTask { waitEvt.addParam("dst"); waitEvt.addParam("vc"); waitEvt.addParam("eop"); + waitEvt.addParam("chid"); activity.addLinkElement(read, waitEvt); stop = new TMLStopState("StopStateInLoop", referenceObject); @@ -248,6 +248,7 @@ public class TaskINForVC extends TMLTask { sendEvt.addParam("dst"); sendEvt.addParam("vc"); sendEvt.addParam("eop"); + sendEvt.addParam("chid"); activity.addLinkElement(loop, sendEvt); waitEvt = new TMLWaitEvent("FeedbackDownEventO", referenceObject); diff --git a/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java b/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java index 5a67f0699b8ff8a00808b7827c38b330c700e60f..cdd9708d2e0fe1a0fa09af494387dc0ab87fc547 100644 --- a/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java +++ b/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java @@ -85,6 +85,8 @@ public class TaskMUXAppDispatch extends TMLTask { this.addAttribute(vc); TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "0"); this.addAttribute(eop); + TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0"); + this.addAttribute(eop); // Events and channels for(TMLEvent evt: inputEvents) { @@ -115,6 +117,7 @@ public class TaskMUXAppDispatch extends TMLTask { waitEvt.addParam("dst"); waitEvt.addParam("vc"); waitEvt.addParam("eop"); + waitEvt.addParam("chid"); activity.addElement(waitEvt); selectEvt.addNext(waitEvt); @@ -124,6 +127,7 @@ public class TaskMUXAppDispatch extends TMLTask { sendEvt.addParam("dst"); sendEvt.addParam("vc"); sendEvt.addParam("eop"); + sendEvt.addParam("chid"); activity.addElement(sendEvt); waitEvt.addNext(sendEvt); diff --git a/src/main/java/tmltranslator/tonetwork/TaskNetworkInterface.java b/src/main/java/tmltranslator/tonetwork/TaskNetworkInterface.java index c1dc504514f8251f66d23aaf8107938a98460ebe..fb3dcc3962b3ee781d03933977bf1e8128060fe0 100644 --- a/src/main/java/tmltranslator/tonetwork/TaskNetworkInterface.java +++ b/src/main/java/tmltranslator/tonetwork/TaskNetworkInterface.java @@ -111,6 +111,8 @@ public class TaskNetworkInterface extends TMLTask { this.addAttribute(dst); TMLAttribute vci = new TMLAttribute("vc"+i, "vc"+i, new TMLType(TMLType.NATURAL), ""+i); this.addAttribute(vci); + TMLAttribute chid = new TMLAttribute("chid"+i, "chid"+i, new TMLType(TMLType.NATURAL), ""+i); + this.addAttribute(chid); } @@ -192,6 +194,7 @@ public class TaskNetworkInterface extends TMLTask { waitingForStartPacket.addParam("dst" + i); waitingForStartPacket.addParam("vc"); waitingForStartPacket.addParam("eop"); + waitingForStartPacket.addParam("chid" + i); addElement(ispktChoice, waitingForStartPacket); ispktChoice.addGuard("ispkt == 0"); @@ -261,6 +264,7 @@ public class TaskNetworkInterface extends TMLTask { sendEvtpktin.addParam("dst" + i); sendEvtpktin.addParam("vc" + i); sendEvtpktin.addParam("0"); + sendEvtpktin.addParam("chid"+i); addElement(packetLengthChoice, sendEvtpktin); packetLengthChoice.addGuard("i" + i + " < pktlen" + i + " - 1"); @@ -292,6 +296,7 @@ public class TaskNetworkInterface extends TMLTask { sendEvtpktinRB.addParam("dst" + i); sendEvtpktinRB.addParam("vc" + i); sendEvtpktinRB.addParam("1"); + sendEvtpktinRB.addParam("chid"+i); addElement(packetLengthChoice, sendEvtpktinRB); packetLengthChoice.addGuard("i" + i + " == pktlen" + i + " - 1"); @@ -334,6 +339,7 @@ public class TaskNetworkInterface extends TMLTask { sendEvtpktin1.addParam("dst" + i); sendEvtpktin1.addParam("vc" + i); sendEvtpktin1.addParam("0"); + sendEvtpktin1.addParam("chid"+i); addElement(choiceLBSeq, sendEvtpktin1); choiceLBSeq.addGuard("i" + i + " < pktlen" + i + " - 1"); @@ -350,6 +356,7 @@ public class TaskNetworkInterface extends TMLTask { sendEvtpktinRB1.addParam("dst" + i); sendEvtpktinRB1.addParam("vc" + i); sendEvtpktinRB1.addParam("1"); + sendEvtpktinRB1.addParam("chid"+i); addElement(choiceLBSeq, sendEvtpktinRB1); choiceLBSeq.addGuard("i" + i + " == pktlen" + i + " - 1"); diff --git a/src/main/java/tmltranslator/tonetwork/TaskNetworkInterfaceOUT.java b/src/main/java/tmltranslator/tonetwork/TaskNetworkInterfaceOUT.java index 449388782e0c36c4c3bf1161b727a0f01a7631a7..160dbf4911e24fc6da4a31ad80122faa04b1ecc6 100644 --- a/src/main/java/tmltranslator/tonetwork/TaskNetworkInterfaceOUT.java +++ b/src/main/java/tmltranslator/tonetwork/TaskNetworkInterfaceOUT.java @@ -53,6 +53,7 @@ import java.util.Vector; */ public class TaskNetworkInterfaceOUT extends TMLTask { protected int nbOfVCs; + private TMLChoice packetChoice; public TaskNetworkInterfaceOUT(String name, Object referenceToClass, Object referenceToActivityDiagram) { super(name, referenceToClass, referenceToActivityDiagram); @@ -62,7 +63,7 @@ public class TaskNetworkInterfaceOUT extends TMLTask { // inputEvt, channels: one per task // outputChannel, output event: only one, common: this is a network interface, only one exit! public void generate(int nbOfVCs, Vector<TMLEvent> outputFeedbackEvents, TMLEvent packetOutFromOUT, - TMLEvent packetAvailable, TMLChannel outputChannelFromOUT) { + TMLChannel outputChannelFromOUT) { int i; this.nbOfVCs = nbOfVCs; @@ -76,6 +77,8 @@ public class TaskNetworkInterfaceOUT extends TMLTask { this.addAttribute(vc); TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "0"); this.addAttribute(eop); + TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0"); + this.addAttribute(chid); TMLAttribute memSpace = new TMLAttribute("memSpace", "memSpace", new TMLType(TMLType.NATURAL), "4096"); this.addAttribute(memSpace); @@ -85,7 +88,7 @@ public class TaskNetworkInterfaceOUT extends TMLTask { addTMLEvent(evt); } addTMLEvent(packetOutFromOUT); - addTMLEvent(packetAvailable); + addReadTMLChannel(outputChannelFromOUT); @@ -142,17 +145,14 @@ public class TaskNetworkInterfaceOUT extends TMLTask { addElement(internalSeq, testingEOP); // Left branch of choice: eop==1 - TMLSendEvent sendEvtPktAvailable = new TMLSendEvent("sendEvtPktAvailable", referenceObject); - sendEvtPktAvailable.setEvent(packetAvailable); - sendEvtPktAvailable.addParam("pktlen"); - sendEvtPktAvailable.addParam("dst"); - sendEvtPktAvailable.addParam("vc"); - sendEvtPktAvailable.addParam("eop"); - addElement(testingEOP, sendEvtPktAvailable); + //New choice on all possible destination depending on chid + packetChoice = new TMLChoice("testingPacket", referenceObject); + addElement(testingEOP, packetChoice); testingEOP.addGuard("eop == 1"); - TMLStopState stopOfLeftBranchOfChoice = new TMLStopState("stopOfLeftBranchOfChoice", referenceObject); - addElement(sendEvtPktAvailable, stopOfLeftBranchOfChoice); + + + // Right branch of choice TMLStopState stopOfRightBranchOfChoice = new TMLStopState("stopOfRightBranchOfChoice", referenceObject); @@ -175,7 +175,37 @@ public class TaskNetworkInterfaceOUT extends TMLTask { } + } + + public void postProcessing(Vector<TMLEvent> packetsAvailable, Vector<String> channelIDs) { + if (packetsAvailable.size() == 0) { + TMLStopState stopOfLeftBranchOfChoice = new TMLStopState("stopNoDestinationTask", referenceObject); + addElement(packetChoice, stopOfLeftBranchOfChoice); + return; + } + + + + for (TMLEvent packetAvailable: packetsAvailable) { + addTMLEvent(packetAvailable); + } + + int i = 0; + for(TMLEvent packetAvailable: packetsAvailable) { + TMLSendEvent sendEvtPktAvailable = new TMLSendEvent("sendEvtPktAvailable", referenceObject); + sendEvtPktAvailable.setEvent(packetAvailable); + sendEvtPktAvailable.addParam("pktlen"); + sendEvtPktAvailable.addParam("dst"); + sendEvtPktAvailable.addParam("vc"); + sendEvtPktAvailable.addParam("eop"); + sendEvtPktAvailable.addParam("chid"); + addElement(packetChoice, sendEvtPktAvailable); + packetChoice.addGuard("chid == " + channelIDs.get(i)); + TMLStopState stopOfLeftBranchOfChoice = new TMLStopState("stopOfLeftBranchOfChoice__" + channelIDs.get(i), referenceObject); + addElement(sendEvtPktAvailable, stopOfLeftBranchOfChoice); + i++; + } } diff --git a/src/main/java/tmltranslator/tonetwork/TaskOUTForDispatch.java b/src/main/java/tmltranslator/tonetwork/TaskOUTForDispatch.java index 35ec4ee506710dbb7208acd29caddfb2de654d14..d4e020e13a5ea2c3d2062af4eb7ea7f57a4e07b0 100644 --- a/src/main/java/tmltranslator/tonetwork/TaskOUTForDispatch.java +++ b/src/main/java/tmltranslator/tonetwork/TaskOUTForDispatch.java @@ -76,6 +76,8 @@ public class TaskOUTForDispatch extends TMLTask { this.addAttribute(vc); TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "0"); this.addAttribute(eop); + TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0"); + this.addAttribute(chid); TMLAttribute nEvt = new TMLAttribute("nEvt", "nEvt", new TMLType(TMLType.NATURAL), "0"); this.addAttribute(nEvt); TMLAttribute loopExit = new TMLAttribute("loopExit", "loopExit", new TMLType(TMLType.NATURAL), "0"); @@ -149,6 +151,7 @@ public class TaskOUTForDispatch extends TMLTask { waitEvt.addParam("dst"); waitEvt.addParam("vc"); waitEvt.addParam("eop"); + waitEvt.addParam("chid"); activity.addLinkElement(sendEvt, waitEvt); TMLActionState reqOut = new TMLActionState("ExitLoop" + i, referenceObject); @@ -161,6 +164,7 @@ public class TaskOUTForDispatch extends TMLTask { sendEvt.addParam("dst"); sendEvt.addParam("vc"); sendEvt.addParam("eop"); + waitEvt.addParam("chid"); activity.addLinkElement(reqOut, sendEvt); TMLWriteChannel write = new TMLWriteChannel("WriteChannel" + i, referenceObject); diff --git a/src/main/java/tmltranslator/tonetwork/TaskOUTForVC.java b/src/main/java/tmltranslator/tonetwork/TaskOUTForVC.java index 090251369306ca347b202a1ffb8017f65775a897..53d93acaa40276b610fc1bde4a07ff75d3ad0dff 100644 --- a/src/main/java/tmltranslator/tonetwork/TaskOUTForVC.java +++ b/src/main/java/tmltranslator/tonetwork/TaskOUTForVC.java @@ -75,6 +75,8 @@ public class TaskOUTForVC extends TMLTask { this.addAttribute(vc); TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "0"); this.addAttribute(eop); + TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0"); + this.addAttribute(chid); TMLAttribute j = new TMLAttribute("j", "j", new TMLType(TMLType.NATURAL), "0"); this.addAttribute(j); @@ -105,6 +107,7 @@ public class TaskOUTForVC extends TMLTask { waitEvt.addParam("dst"); waitEvt.addParam("vc"); waitEvt.addParam("eop"); + waitEvt.addParam("chid"); activity.addLinkElement(select, waitEvt); // loop on packet size @@ -121,6 +124,7 @@ public class TaskOUTForVC extends TMLTask { sendEvt.addParam("dst"); sendEvt.addParam("vc"); sendEvt.addParam("eop"); + waitEvt.addParam("chid"); activity.addLinkElement(packetLoop, sendEvt); waitEvt = new TMLWaitEvent("ReturnFromVC", referenceObject); diff --git a/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java b/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java index 573e03873831499da11916a2d018c9cb4a1e4077..1786b6b54790b746fbd5a5faa41cf6bb77ff9dfb 100644 --- a/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java +++ b/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java @@ -105,10 +105,12 @@ public class TranslatedRouter<E> { // Connection channels and events - private HashMap<TMLChannel, TMLEvent> mapOfAllOutputChannels; + private HashMap<TMLChannel, TMLEvent> mapOfAllOutputChannels; // Channels going to the NoC + private HashMap<TMLChannel, TMLEvent> mapOfAllInputChannels; // Channels getting out of the NoC + private Vector<TMLChannel> handledChannels; - // Hw - HwExecutionNode node; + + private Vector<TMLChannel> destChannels; public TranslatedRouter(TMAP2Network<?> main, TMLMapping<?> tmlmap, HwNoC noc, List<TMLChannel> channelsViaNoc, int nbOfVCs, int xPos, int yPos, HwExecutionNode myHwExecutionNode) { @@ -125,6 +127,7 @@ public class TranslatedRouter<E> { playingTheRoleOfNext = new Link[NB_OF_PORTS]; allTasks = new Vector<>(); + handledChannels = new Vector<>(); } public void setLinkFromPreviousRouter(int index, Link l) { @@ -211,12 +214,20 @@ public class TranslatedRouter<E> { for (i = 0; i < nbOfVCs; i++) { // 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) { + TraceManager.addDev("Output Channel:" + chan.getName() + " VC=" + chan.getVC()); if (chan.getVC() == i) { - TMLEvent outputEventOfMux = new TMLEvent("EventMUXof" + chan.getName(), null, 8, + TMLEvent outputEventOfMux = new TMLEvent("EventMUXof__" + chan.getName(), null, 8, true); + // PARAMS!!!!! + outputEventOfMux.setOriginTask(chan.getOriginTask()); + outputEventOfMux.addParam(new TMLType(TMLType.NATURAL)); + outputEventOfMux.addParam(new TMLType(TMLType.NATURAL)); + outputEventOfMux.addParam(new TMLType(TMLType.NATURAL)); + outputEventOfMux.addParam(new TMLType(TMLType.NATURAL)); + outputEventOfMux.addParam(new TMLType(TMLType.NATURAL)); + //mapOfOutputChannels.put(chan, outputEventOfMux); mapOfAllOutputChannels.put(chan, outputEventOfMux); inputEventsOfMUX.add(outputEventOfMux); @@ -228,6 +239,11 @@ public class TranslatedRouter<E> { TMLEvent eventForMUX_and_NI_IN = new TMLEvent("EventBetweenMUXandNI_IN_for_" + nameOfExecNode, null, 8, true); tmlm.addEvent(eventForMUX_and_NI_IN); + eventForMUX_and_NI_IN.addParam(new TMLType(TMLType.NATURAL)); + eventForMUX_and_NI_IN.addParam(new TMLType(TMLType.NATURAL)); + eventForMUX_and_NI_IN.addParam(new TMLType(TMLType.NATURAL)); + eventForMUX_and_NI_IN.addParam(new TMLType(TMLType.NATURAL)); + eventForMUX_and_NI_IN.addParam(new TMLType(TMLType.NATURAL)); TaskMUXAppDispatch muxTask = new TaskMUXAppDispatch("MUXof" + nameOfExecNode + "_VC" + i, null, null); tmlm.addTask(muxTask); @@ -446,7 +462,7 @@ public class TranslatedRouter<E> { //NetworkInterfaceOUT (1 per router) - TaskNetworkInterfaceOUT tniOut = new TaskNetworkInterfaceOUT("NI_OUT_" + nameOfExecNode, null, + tniOut = new TaskNetworkInterfaceOUT("NI_OUT_" + nameOfExecNode, null, null); tmlm.addTask(tniOut); allTasks.add(tniOut); @@ -463,24 +479,9 @@ public class TranslatedRouter<E> { TMLEvent pktoutFromOut = playingTheRoleOfPrevious[NB_OF_PORTS-1].packetOut; pktoutFromOut.setDestinationTask(tniOut); - TMLEvent packetOut = new TMLEvent("evtPktOutToAppFromOut__" + xPos + "_" + yPos, - null, 8, true); - packetOut.addParam(new TMLType(TMLType.NATURAL)); - packetOut.addParam(new TMLType(TMLType.NATURAL)); - packetOut.addParam(new TMLType(TMLType.NATURAL)); - packetOut.addParam(new TMLType(TMLType.NATURAL)); - tmlm.addEvent(packetOut); - packetOut.setOriginTask(tniOut); - - tniOut.generate(nbOfVCs, feedbackPerVC, pktoutFromOut, packetOut, chOfOut); - // Fake task out - fto = new FakeTaskOut("FakeTaskOutOfRouter_" + xPos + "_" + yPos, null, null); - tmlm.addTask(fto); - allTasks.add(fto); - packetOut.setDestinationTask(fto); - fto.generate(packetOut); + tniOut.generate(nbOfVCs, feedbackPerVC, pktoutFromOut, chOfOut); } @@ -504,6 +505,11 @@ public class TranslatedRouter<E> { pktInEvtsVCs[i][j] = new TMLEvent("evt_pktin" + i + "_vc" + j + "_" + xPos + "_" + yPos, null, 8, true); tmlm.addEvent(pktInEvtsVCs[i][j]); + pktInEvtsVCs[i][j].addParam(new TMLType(TMLType.NATURAL)); + pktInEvtsVCs[i][j].addParam(new TMLType(TMLType.NATURAL)); + pktInEvtsVCs[i][j].addParam(new TMLType(TMLType.NATURAL)); + pktInEvtsVCs[i][j].addParam(new TMLType(TMLType.NATURAL)); + pktInEvtsVCs[i][j].addParam(new TMLType(TMLType.NATURAL)); pktInChsVCs[i][j] = new TMLChannel("ch_pktin" + i + "_vc" + j + "_" + xPos + "_" + yPos, null); @@ -523,6 +529,11 @@ public class TranslatedRouter<E> { for (int k = 0; k < TMAP2Network.DOMAIN + 1; k++) { routeEvtVCs[i][j][k] = new TMLEvent("evtroute_" + i + "_vc" + j + "_" + k + "_" + xPos + "_" + yPos, null, 8, true); + routeEvtVCs[i][j][k].addParam(new TMLType(TMLType.NATURAL)); + routeEvtVCs[i][j][k].addParam(new TMLType(TMLType.NATURAL)); + routeEvtVCs[i][j][k].addParam(new TMLType(TMLType.NATURAL)); + routeEvtVCs[i][j][k].addParam(new TMLType(TMLType.NATURAL)); + routeEvtVCs[i][j][k].addParam(new TMLType(TMLType.NATURAL)); tmlm.addEvent(routeEvtVCs[i][j][k]); routeEvtVCsFeedback[i][j][k] = new TMLEvent("evtfeedback_" + i + "_vc" + j + "_" + k + "_" + xPos + "_" + yPos, null, 8, true); @@ -541,6 +552,11 @@ public class TranslatedRouter<E> { for (int j = 0; j < nbOfVCs; j++) { evtOutVCs[i][j] = new TMLEvent("evt_out" + i + "_vc" + j + "_" + xPos + "_" + yPos, null, 8, true); + evtOutVCs[i][j].addParam(new TMLType(TMLType.NATURAL)); + evtOutVCs[i][j].addParam(new TMLType(TMLType.NATURAL)); + evtOutVCs[i][j].addParam(new TMLType(TMLType.NATURAL)); + evtOutVCs[i][j].addParam(new TMLType(TMLType.NATURAL)); + evtOutVCs[i][j].addParam(new TMLType(TMLType.NATURAL)); tmlm.addEvent(evtOutVCs[i][j]); evtSelectVC[i][j] = new TMLEvent("evt_vcselect" + i + "_vc" + j + "_" + xPos + "_" + yPos, null, 8, true); @@ -617,7 +633,7 @@ public class TranslatedRouter<E> { tmla.addHwNode(busNIIN); // For each VC, we create a bus and a cpu. The bus connects to the main bridge - for(i=0; i<nbOfVCs; i++) { + for (i = 0; i < nbOfVCs; i++) { HwCPU cpu = new HwCPU("CPUForMUX_VC" + i + getPositionNaming()); tmla.addHwNode(cpu); tmlmap.addTaskToHwExecutionNode(muxTasks.get(i), cpu); @@ -637,7 +653,7 @@ public class TranslatedRouter<E> { HwMemory memNIIN = new HwMemory("MemNetworkiInterfaceIN" + getPositionNaming()); tmla.addHwNode(memNIIN); - tmlmap.addCommToHwCommNode(playingTheRoleOfPrevious[NB_OF_PORTS-1].chOutToIN, memNIIN); + tmlmap.addCommToHwCommNode(playingTheRoleOfPrevious[NB_OF_PORTS - 1].chOutToIN, memNIIN); HwBridge bridgeNIIN = new HwBridge("BridgeNetworkiInterfaceIN" + getPositionNaming()); @@ -655,10 +671,10 @@ public class TranslatedRouter<E> { tmlmap.addTaskToHwExecutionNode(dispatchIns.get(portNb), cpuIN); // connection to the right bus - if (portNb < NB_OF_PORTS-1) { + if (portNb < NB_OF_PORTS - 1) { // external tmla.makeHwLink(playingTheRoleOfNext[portNb].busBetweenRouters, cpuIN); - HwMemory memIN = new HwMemory("mem_IN" + portNb + getPositionNaming()); + HwMemory memIN = new HwMemory("mem_IN" + portNb + getPositionNaming()); tmla.addHwNode(memIN); tmla.makeHwLink(playingTheRoleOfNext[portNb].busBetweenRouters, memIN); tmlmap.addCommToHwCommNode(playingTheRoleOfNext[portNb].chOutToIN, memIN); @@ -672,11 +688,11 @@ public class TranslatedRouter<E> { } // For each IN VC, we do the Hw Arch: bus, cpu, mem - for(i=0; i<nbOfVCs; i++) { + for (i = 0; i < nbOfVCs; i++) { HwCPU cpuINVC = new HwCPU("cpuINVC_" + portNb + "_" + i + getPositionNaming()); tmla.addHwNode(cpuINVC); tmlmap.addTaskToHwExecutionNode(dispatchInVCs[portNb][i], cpuINVC); - HwMemory memINVC = new HwMemory("memINVC" + portNb + "_" + i+ getPositionNaming()); + HwMemory memINVC = new HwMemory("memINVC" + portNb + "_" + i + getPositionNaming()); tmla.addHwNode(memINVC); tmlmap.addCommToHwCommNode(pktInChsVCs[portNb][i], memINVC); HwBus busINVC = new HwBus("busINVC" + portNb + "_" + i + getPositionNaming()); @@ -700,7 +716,7 @@ public class TranslatedRouter<E> { tmlmap.addTaskToHwExecutionNode(dispatchOuts.get(portNb), cpuOUT); // connection to the right bus - if (portNb < NB_OF_PORTS-1) { + if (portNb < NB_OF_PORTS - 1) { // external tmla.makeHwLink(playingTheRoleOfPrevious[portNb].busBetweenRouters, cpuOUT); } else { @@ -713,11 +729,11 @@ public class TranslatedRouter<E> { } // For each IN VC, we do the Hw Arch: bus, cpu, mem - for(i=0; i<nbOfVCs; i++) { + for (i = 0; i < nbOfVCs; i++) { HwCPU cpuOUTVC = new HwCPU("cpuOUTVC_" + portNb + "_" + i + getPositionNaming()); tmla.addHwNode(cpuOUTVC); tmlmap.addTaskToHwExecutionNode(dispatchOutVCs[portNb][i], cpuOUTVC); - HwMemory memOUTVC = new HwMemory("memOUTVC" + portNb + "_" + i+ getPositionNaming()); + HwMemory memOUTVC = new HwMemory("memOUTVC" + portNb + "_" + i + getPositionNaming()); tmla.addHwNode(memOUTVC); HwBus busOUTVC = new HwBus("busINVC" + portNb + "_" + i + getPositionNaming()); tmla.addHwNode(busOUTVC); @@ -754,8 +770,10 @@ public class TranslatedRouter<E> { tmla.makeHwLink(busOUTToMainBridge, mainBridge); // fake task on CPU - tmlmap.addTaskToHwExecutionNode(fto, node); + // tmlmap.addTaskToHwExecutionNode(fto, myHwExecutionNode); + } + public void makeOriginChannels() { // We now need to modify the corresponding input tasks // The channel is modified to NBRNBW @@ -764,20 +782,175 @@ public class TranslatedRouter<E> { // For all channels whose origin task is mapped on the CPU of the router - + destChannels = new Vector<>(); for(TMLChannel ch: tmlmap.getTMLModeling().getChannels()) { TMLTask t = ch.getOriginTask(); HwExecutionNode mappedOn = tmlmap.getHwNodeOf(t); if (mappedOn == myHwExecutionNode) { - TraceManager.addDev("Found HwNode of task " + t.getTaskName() + " for channel " + ch.getName()); + TraceManager.addDev("Found HwNode of origin task " + t.getTaskName() + " for channel " + ch.getName()); // We must rework the channel of the task. // The channel is modified to a NBRNBW with the same task has sender / receiver // The channel is mapped to the local mem // Once the sample has been sent, an event is sent to the input task of the router // For a receiver, the event is first waited for, and then the read in the new channel is performed + + handledChannels.add(ch); + + ch.setType(TMLChannel.NBRNBW); + TMLTask dest = ch.getDestinationTask(); + + TMLChannel channelForDestination = new TMLChannel(ch.getName() + "_dest", ch.getReferenceObject()); + channelForDestination.setType(TMLChannel.NBRNBW); + channelForDestination.setDestinationTask(dest); + channelForDestination.setOriginTask(dest); + destChannels.add(channelForDestination); + main.putTMLChannelID(channelForDestination, main.getChannelID(ch)); + + ch.setDestinationTask(t); + + // Map modify channel to the right memory + HwMemory mem = tmlmap.getTMLArchitecture().getHwMemoryByName(myHwExecutionNode.getName() + "__mem"); + if (mem != null) { + TraceManager.addDev("Mapping channel " + ch.getName() + " on mem " + mem.getName()); + tmlmap.addCommToHwCommNode(ch, mem); + } + + // Must now modify the source app + TMLAttribute pktlen = new TMLAttribute("pktlen", "pktlen", new TMLType(TMLType.NATURAL), "0"); + t.addAttribute(pktlen); + TMLAttribute dst = new TMLAttribute("dst", "dst", new TMLType(TMLType.NATURAL), "0"); + t.addAttribute(dst); + TMLAttribute vc = new TMLAttribute("vc", "vc", new TMLType(TMLType.NATURAL), "0"); + t.addAttribute(vc); + TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "1"); + t.addAttribute(eop); + TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), + ""+main.getChannelID(ch)); + t.addAttribute(chid); + + TMLActivity activity = t.getActivityDiagram(); + Vector<TMLActivityElement> newElements = new Vector<>(); + TMLWriteChannel twc; + for(TMLElement elt: activity.getElements()) { + if (elt instanceof TMLWriteChannel) { + twc = (TMLWriteChannel) elt; + if (twc.getChannel(0) == ch) { + TraceManager.addDev("Modifying write ch of task " + t.getTaskName()); + TMLSendEvent tse = new TMLSendEvent("EvtForSending__" + ch.getName(), ch.getReferenceObject()); + newElements.add(tse); + tse.setEvent(mapOfAllOutputChannels.get(ch)); + tse.addParam("pktlen"); + tse.addParam("dst"); + tse.addParam("vc"); + tse.addParam("eop"); + tse.addParam("chid"); + tse.addNext(twc.getNextElement(0)); + twc.setNewNext(twc.getNextElement(0), tse); + + } + } + } + for(TMLActivityElement newElt: newElements) { + activity.addElement(newElt); + } } } + // Handling of destination part of channels + for(TMLChannel chd: destChannels) { + tmlmap.getTMLModeling().addChannel(chd); + } + } + + public void makeDestinationChannels() { + + TMLModeling tmlm = tmlmap.getTMLModeling(); + + Vector<TMLEvent> events = new Vector<>(); + Vector<String> ids = new Vector<>(); + + for(TMLChannel ch: destChannels) { + TMLTask t = ch.getDestinationTask(); + HwExecutionNode mappedOn = tmlmap.getHwNodeOf(t); + if (mappedOn == myHwExecutionNode) { + TMLEvent packetOut = new TMLEvent("evtPktOutToAppFromOut__" + xPos + "_" + yPos, + null, 8, true); + packetOut.addParam(new TMLType(TMLType.NATURAL)); + packetOut.addParam(new TMLType(TMLType.NATURAL)); + packetOut.addParam(new TMLType(TMLType.NATURAL)); + packetOut.addParam(new TMLType(TMLType.NATURAL)); + packetOut.addParam(new TMLType(TMLType.NATURAL)); + tmlm.addEvent(packetOut); + packetOut.setOriginTask(tniOut); + packetOut.setDestinationTask(ch.getDestinationTask()); + events.add(packetOut); + ids.add(main.getChannelID(ch)); + } + } + + tniOut.postProcessing(events, ids); + + + + for(TMLChannel ch: tmlmap.getTMLModeling().getChannels()) { + if (!handledChannels.contains(ch)) { + + TMLTask t = ch.getDestinationTask(); + HwExecutionNode mappedOn = tmlmap.getHwNodeOf(t); + if (mappedOn == myHwExecutionNode) { + TraceManager.addDev("Found HwNode of destination task " + t.getTaskName() + " for channel " + ch.getName()); + + // Map modify channel to the right memory + HwMemory mem = tmlmap.getTMLArchitecture().getHwMemoryByName(myHwExecutionNode.getName() + "__mem"); + if (mem != null) { + TraceManager.addDev("Mapping channel " + ch.getName() + " on mem " + mem.getName()); + tmlmap.addCommToHwCommNode(ch, mem); + } + + // Must now modify the dest app + TMLAttribute pktlen = new TMLAttribute("pktlen", "pktlen", new TMLType(TMLType.NATURAL), "0"); + t.addAttribute(pktlen); + TMLAttribute dst = new TMLAttribute("dst", "dst", new TMLType(TMLType.NATURAL), "0"); + t.addAttribute(dst); + TMLAttribute vc = new TMLAttribute("vc", "vc", new TMLType(TMLType.NATURAL), "0"); + t.addAttribute(vc); + TMLAttribute eop = new TMLAttribute("eop", "eop", new TMLType(TMLType.NATURAL), "1"); + t.addAttribute(eop); + TMLAttribute chid = new TMLAttribute("chid", "chid", new TMLType(TMLType.NATURAL), "0"); + t.addAttribute(chid); + + TMLActivity activity = t.getActivityDiagram(); + Vector<TMLActivityElement> newElements = new Vector<>(); + TMLReadChannel trc; + for (TMLElement elt : activity.getElements()) { + if (elt instanceof TMLReadChannel) { + trc = (TMLReadChannel) elt; + if (trc.getChannel(0) == ch) { + TraceManager.addDev("Modifying write ch of task " + t.getTaskName()); + TMLWaitEvent twe = new TMLWaitEvent("EvtForReceiving__" + ch.getName(), ch.getReferenceObject()); + newElements.add(twe); + twe.setEvent(mapOfAllInputChannels.get(ch)); + twe.addParam("pktlen"); + twe.addParam("dst"); + twe.addParam("vc"); + twe.addParam("eop"); + twe.addParam("" + main.getChannelID(ch)); + activity.replaceAllNext(trc, twe); + twe.addNext(trc); + } + } + } + for (TMLActivityElement newElt : newElements) { + activity.addElement(newElt); + } + } + } + } + + } + + + public void postProcessing() { diff --git a/src/main/java/ui/GTMLModeling.java b/src/main/java/ui/GTMLModeling.java index 4dc0892986058de1d611b0cbc0959768c5a057f4..71a75222d0b4270cd054cc8583c976aba8f2f8d4 100644 --- a/src/main/java/ui/GTMLModeling.java +++ b/src/main/java/ui/GTMLModeling.java @@ -908,6 +908,7 @@ public class GTMLModeling { channel.setMax(port1.getMax()); channel.ports.add(port1); channel.ports.add(port2); + TraceManager.addDev("Adding channel with port1 vc=" + port1.getVC()); channel.setVC(port1.getVC()); if (port1.isBlocking() && port2.isBlocking()) { channel.setType(TMLChannel.BRBW); diff --git a/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java b/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java index 1693ddfa2387b6f24fa5231073ea106c4634c181..675fdd0426628bcc59d8aaa99815283766505cdd 100755 --- a/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java +++ b/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java @@ -160,7 +160,7 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent protected String associatedEvent = "VOID"; // Network - protected int vc = -1; + protected int vc = 0; public int verification; @@ -910,7 +910,7 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent try { vc = Integer.decode(elt.getAttribute("vc")); } catch (Exception e) { - vc = -1; + vc = 0; } } diff --git a/src/main/java/ui/window/JDialogTMLCompositePort.java b/src/main/java/ui/window/JDialogTMLCompositePort.java index eda89b9c892cd3cf53aa3054b1f35075e1982dc2..2c1d3198bade69e523a254967220936596a09f4b 100644 --- a/src/main/java/ui/window/JDialogTMLCompositePort.java +++ b/src/main/java/ui/window/JDialogTMLCompositePort.java @@ -578,7 +578,7 @@ public class JDialogTMLCompositePort extends JDialogBase implements ActionListen panel5.add(lossPercentageLabel, c5); c5.gridwidth = GridBagConstraints.REMAINDER; //end row vcText = new JTextField("" + vc); - panel5.add(lossPercentageText, c5); + panel5.add(vcText, c5); @@ -844,7 +844,7 @@ public class JDialogTMLCompositePort extends JDialogBase implements ActionListen try { return Integer.decode(vcText.getText().trim()); } catch (Exception e) { - return -1; + return 0; } } }