diff --git a/src/main/java/tmltranslator/TMLModeling.java b/src/main/java/tmltranslator/TMLModeling.java index 59b987ddc942840c93979dff1253bd8d401d1d77..49a9a81230e9d7df01737e9ae6d34b628bf1ff71 100755 --- a/src/main/java/tmltranslator/TMLModeling.java +++ b/src/main/java/tmltranslator/TMLModeling.java @@ -697,6 +697,37 @@ public class TMLModeling<E> { return null; } + + public List<TMLElement> getAllElementsWithName(String name) { + Vector<TMLElement> elts = new Vector<>(); + + for(TMLTask task: tasks) { + if (task.getName().compareTo(name) == 0) { + elts.add(task); + } + } + + for(TMLChannel ch: channels) { + if (ch.getName().compareTo(name) == 0) { + elts.add(ch); + } + } + + for(TMLEvent evt: events) { + if (evt.getName().compareTo(name) == 0) { + elts.add(evt); + } + } + + for(TMLRequest req: requests) { + if (req.getName().compareTo(name) == 0) { + elts.add(req); + } + } + + return elts; + } + public List<TMLTask> getTasks() { return tasks; } @@ -753,7 +784,7 @@ public class TMLModeling<E> { list.add(ch); } for (TMLTask task: ch.getOriginTasks()){ - if (task ==t){ + if (task == t){ list.add(ch); } } diff --git a/src/main/java/tmltranslator/TMLSyntaxChecking.java b/src/main/java/tmltranslator/TMLSyntaxChecking.java index 23236b9df5f47e58457e5da8828a3ea5c38e2ee4..3f935dfef75c002f787cb4027d5f29d141e78695 100755 --- a/src/main/java/tmltranslator/TMLSyntaxChecking.java +++ b/src/main/java/tmltranslator/TMLSyntaxChecking.java @@ -48,10 +48,7 @@ import myutil.TraceManager; import tmltranslator.tomappingsystemc2.DiploSimulatorCodeGenerator; import java.io.StringReader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; +import java.util.*; /** @@ -78,6 +75,7 @@ public class TMLSyntaxChecking { private final String NO_NEXT_OPERATOR_ERROR = "No next operator"; private final String SAME_PORT_NAME = "Two ports have the same name"; private final String WRONG_PARAMS = "The number of params is not compatible"; + private final String DUPLICATE_NAMES = "Two elements have the same name"; private final String TOO_MANY_MEMORIES = "Channel is mapped on more than one memory"; private final String INVALID_CHANNEL_PATH = "Channel path is invalid"; @@ -118,6 +116,7 @@ public class TMLSyntaxChecking { TraceManager.addDev("Checking syntax of TML Mapping/ Modeling"); if (!syntaxCheckForMappingOnly) { + checkDuplicateNames(); checkReadAndWriteInChannelsEventsAndRequests(); @@ -208,6 +207,41 @@ public class TMLSyntaxChecking { } } + + public void checkDuplicateNames() { + List<TMLElement> elts; + + for(TMLTask task: tmlm.getTasks()) { + elts = tmlm.getAllElementsWithName(task.getName()); + if (elts.size() > 1) { + addError(null, null, DUPLICATE_NAMES + ": invalid task name " + task.getName(), TMLError.ERROR_STRUCTURE); + } + } + + for(TMLChannel ch: tmlm.getChannels()) { + elts = tmlm.getAllElementsWithName(ch.getName()); + if (elts.size() > 1) { + addError(null, null, DUPLICATE_NAMES + ": invalid channel name " + ch.getName(), TMLError.ERROR_STRUCTURE); + } + } + + for(TMLEvent evt: tmlm.getEvents()) { + elts = tmlm.getAllElementsWithName(evt.getName()); + if (elts.size() > 1) { + addError(null, null, DUPLICATE_NAMES + ": invalid event name " + evt.getName(), TMLError.ERROR_STRUCTURE); + } + } + + for(TMLRequest req: tmlm.getRequests()) { + elts = tmlm.getAllElementsWithName(req.getName()); + if (elts.size() > 1) { + addError(null, null, DUPLICATE_NAMES + ": invalid request name " + req.getName(), TMLError.ERROR_STRUCTURE); + } + } + + + } + //added by minh hiep public void checkAValidPortName() { List<TMLChannel> tmlChannels = tmlm.getChannels(); diff --git a/src/main/java/tmltranslator/TMLTask.java b/src/main/java/tmltranslator/TMLTask.java index 63eac9b8fe5a1503d04a830d134cb898242fd769..aed8f53460e78f0640902f589b9781867baef02b 100755 --- a/src/main/java/tmltranslator/TMLTask.java +++ b/src/main/java/tmltranslator/TMLTask.java @@ -389,9 +389,9 @@ public class TMLTask extends TMLElement { writeTMLChannelsList.add(_ch); } - public List<TMLChannel> getTMLChannels() { + /*public List<TMLChannel> getTMLChannels() { return new ArrayList<TMLChannel>(channelsList); - } + }*/ public List<TMLChannel> getReadTMLChannels() { return new ArrayList<TMLChannel>(readTMLChannelsList); diff --git a/src/main/java/tmltranslator/tomappingsystemc2/MappedSystemCTask.java b/src/main/java/tmltranslator/tomappingsystemc2/MappedSystemCTask.java index 60e391a4fcf9315fb2745b85dad826234e624b04..847d25b3aa8d861a07604dc66a7e9b7b47dc34be 100644 --- a/src/main/java/tmltranslator/tomappingsystemc2/MappedSystemCTask.java +++ b/src/main/java/tmltranslator/tomappingsystemc2/MappedSystemCTask.java @@ -244,9 +244,11 @@ public class MappedSystemCTask { constSig = reference + "(ID iID, Priority iPriority, std::string iName, FPGA** iCPUs, unsigned int iNumOfCPUs" + CR; } + TraceManager.addDev("\n***** Task name:" + task.getName()); for (TMLChannel ch : channels) { + TraceManager.addDev("Adding ch " + ch.getExtendedName()); constSig += ", TMLChannel* " + ch.getExtendedName() + CR; } for (TMLEvent evt : events) { diff --git a/src/main/java/tmltranslator/tonetwork/Link.java b/src/main/java/tmltranslator/tonetwork/Link.java index 1784f6ec90b3b029b55ae234194697d0aaff1939..9f402ea684f73f64b22fc188a7e999b84b13c06f 100644 --- a/src/main/java/tmltranslator/tonetwork/Link.java +++ b/src/main/java/tmltranslator/tonetwork/Link.java @@ -132,7 +132,7 @@ public class Link { feedbackPerVC = new TMLEvent[nbOfVCs]; for(int i=0; i<nbOfVCs; i++) { - feedbackPerVC[i] = new TMLEvent("Feedback__" + getNaming(), + feedbackPerVC[i] = new TMLEvent("Feedback__" + getNaming() + "_" + i, null, 8, true); tmlm.addEvent(feedbackPerVC[i]); } diff --git a/src/main/java/tmltranslator/tonetwork/TMAP2Network.java b/src/main/java/tmltranslator/tonetwork/TMAP2Network.java index 51573d8786b9730bfad92f2fbff70d6e68319eb9..6cbb7ce3571f010abdde47bc85df856c2a20945a 100644 --- a/src/main/java/tmltranslator/tonetwork/TMAP2Network.java +++ b/src/main/java/tmltranslator/tonetwork/TMAP2Network.java @@ -56,8 +56,7 @@ import java.util.List; */ public class TMAP2Network<E> { - private TMLModeling<?> tmlmodeling; - private TMLArchitecture tmlarchi; + private TMLMapping<?> tmlmapping; private boolean debug; @@ -224,7 +223,8 @@ public class TMAP2Network<E> { for(HwNode node: tmla.getHwNodes()) { if (node instanceof HwExecutionNode) { nbOfHwExecutionNode ++; - newList.add(node); + //newList.add(node); + HwBus bus = new HwBus(node.getName() + "__bus"); HwMemory mem = new HwMemory(node.getName() + "__mem"); newList.add(bus); @@ -239,6 +239,7 @@ public class TMAP2Network<E> { tmla.addHwLink(memToBus); } } + for(HwNode node: newList) { tmla.addHwNode(node); } @@ -317,8 +318,8 @@ public class TMAP2Network<E> { } // Create routers around - tmlmodeling = tmlmapping.getTMLModeling(); - tmlarchi = tmlmapping.getTMLArchitecture(); + //tmlmodeling = tmlmapping.getTMLModeling(); + //tmlarchi = tmlmapping.getTMLArchitecture(); // *** Create links and update routers accordingly // For each router, I consider all routers that are around the considered one @@ -331,7 +332,7 @@ public class TMAP2Network<E> { // There is a north router // link to next if (routers[i][j].playingTheRoleOfPrevious[k] == null) { - Link to = new Link(tmlarchi, tmlmodeling, routers[i][j], routers[i-1][j], nbOfVCs); + Link to = new Link(tmla, tmlm, routers[i][j], routers[i-1][j], nbOfVCs); routers[i][j].playingTheRoleOfPrevious[k] = to; routers[i-1][j].playingTheRoleOfNext[getFrom(k)] = to; } @@ -343,7 +344,7 @@ public class TMAP2Network<E> { // There is a south router // link to next if (routers[i][j].playingTheRoleOfPrevious[k] == null) { - Link to = new Link(tmlarchi, tmlmodeling, routers[i][j], routers[i+1][j], nbOfVCs); + Link to = new Link(tmla, tmlm, routers[i][j], routers[i+1][j], nbOfVCs); routers[i][j].playingTheRoleOfPrevious[k] = to; routers[i+1][j].playingTheRoleOfNext[getFrom(k)] = to; } @@ -354,7 +355,7 @@ public class TMAP2Network<E> { // There is an east router // link to next if (routers[i][j].playingTheRoleOfPrevious[k] == null) { - Link to = new Link(tmlarchi, tmlmodeling, routers[i][j], routers[i][j+1], nbOfVCs); + Link to = new Link(tmla, tmlm, routers[i][j], routers[i][j+1], nbOfVCs); routers[i][j].playingTheRoleOfPrevious[k] = to; routers[i][j+1].playingTheRoleOfNext[getFrom(k)] = to; } @@ -366,7 +367,7 @@ public class TMAP2Network<E> { // There is an east router // link to next if (routers[i][j].playingTheRoleOfPrevious[k] == null) { - Link to = new Link(tmlarchi, tmlmodeling, routers[i][j], routers[i][j-1], nbOfVCs); + Link to = new Link(tmla, tmlm, routers[i][j], routers[i][j-1], nbOfVCs); routers[i][j].playingTheRoleOfPrevious[k] = to; routers[i][j-1].playingTheRoleOfNext[getFrom(k)] = to; } @@ -382,7 +383,7 @@ public class TMAP2Network<E> { // Associate an id to all channels int id = 0; IDsOfChannels = new HashMap<>(); - for(TMLChannel ch: tmlmodeling.getChannels()) { + for(TMLChannel ch: tmlm.getChannels()) { IDsOfChannels.put(ch, "" + id); } diff --git a/src/main/java/tmltranslator/tonetwork/TaskINForDispatch.java b/src/main/java/tmltranslator/tonetwork/TaskINForDispatch.java index 7aa9303fac518739dccac74adee938518ba36987..bcd16f905f7aa515e7367358861d8e613065475b 100644 --- a/src/main/java/tmltranslator/tonetwork/TaskINForDispatch.java +++ b/src/main/java/tmltranslator/tonetwork/TaskINForDispatch.java @@ -64,8 +64,9 @@ public class TaskINForDispatch extends TMLTask { this.nbOfVCs = nbOfVCs; - inputEvent.setDestinationTask(this); - inputChannel.setDestinationTask(this); + //inputEvent.setDestinationTask(this); + //inputChannel.setDestinationTask(this); + for(TMLEvent evt: outputEvents) { evt.setOriginTask(this); } @@ -90,6 +91,7 @@ public class TaskINForDispatch extends TMLTask { for(TMLEvent evt: outputEvents) { addTMLEvent(evt); } + addReadTMLChannel(inputChannel); for(TMLChannel ch: outputChannels) { addWriteTMLChannel(ch); diff --git a/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java b/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java index 075c7d00803ca1ca75fb098318fa0984ff0bb50d..13def8b803a3d3066a18e23c3d4c5c07be69c300 100644 --- a/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java +++ b/src/main/java/tmltranslator/tonetwork/TaskMUXAppDispatch.java @@ -104,6 +104,14 @@ public class TaskMUXAppDispatch extends TMLTask { activity.addElement(loop); start.addNext(loop); + + if (inputEvents.size() == 0) { + TMLStopState stopNoEvent = new TMLStopState("StopNoEvent", referenceObject); + activity.addElement(stopNoEvent); + loop.addNext(stopNoEvent); + return; + } + TMLSelectEvt selectEvt = new TMLSelectEvt("selectEvent", referenceObject); activity.addElement(selectEvt); loop.addNext(selectEvt); diff --git a/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java b/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java index 7634d62656c1e86699dae73bfcb9363da1169036..31c12c293b3356e938e482525f18a41bcf50c87d 100644 --- a/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java +++ b/src/main/java/tmltranslator/tonetwork/TranslatedRouter.java @@ -214,7 +214,7 @@ public class TranslatedRouter<E> { // We need one event par outputChannel Vector<TMLEvent> inputEventsOfMUX = new Vector<>(); for (TMLChannel chan : outputChannels) { - TraceManager.addDev("Output Channel:" + chan.getName() + " VC=" + chan.getVC()); + //TraceManager.addDev("Output Channel:" + chan.getName() + " VC=" + chan.getVC()); if (chan.getVC() == i) { TMLEvent outputEventOfMux = new TMLEvent("EventMUXof__" + chan.getName(), null, 8, true); @@ -234,7 +234,7 @@ public class TranslatedRouter<E> { } // We also need an output event for MUX / NI_IN - TMLEvent eventForMUX_and_NI_IN = new TMLEvent("EventBetweenMUXandNI_IN_for_" + nameOfExecNode, + TMLEvent eventForMUX_and_NI_IN = new TMLEvent("EventBetweenMUXandNI_IN_for_" + nameOfExecNode + "_" + i, null, 8, true); tmlm.addEvent(eventForMUX_and_NI_IN); eventForMUX_and_NI_IN.addParam(new TMLType(TMLType.NATURAL)); @@ -288,7 +288,8 @@ public class TranslatedRouter<E> { dispatchIns = new HashMap<>(); for (int portNb = 0; portNb < NB_OF_PORTS; portNb++) { if (playingTheRoleOfNext[portNb] != null) { - TaskINForDispatch inDispatch = new TaskINForDispatch("IN_" + nameOfExecNode + "_" + portNb, null, + TaskINForDispatch inDispatch = new TaskINForDispatch("IN_" + nameOfExecNode + "_" + portNb + + "_x" + xPos + "_y" + yPos, null, null); tmlm.addTask(inDispatch); Vector<TMLEvent> listOfOutEvents = new Vector<TMLEvent>(); @@ -313,8 +314,10 @@ public class TranslatedRouter<E> { // We have to use events / channels coming from another router TMLEvent toInEvt = playingTheRoleOfNext[portNb].packetOut; toInEvt.setDestinationTask(inDispatch); + //tmlm.addEvent(toInEvt); TMLChannel toInCh = playingTheRoleOfNext[portNb].chOutToIN; toInCh.setDestinationTask(inDispatch); + tmlm.addChannel(toInCh); inDispatch.generate(nbOfVCs, toInEvt, toInCh, listOfOutEvents, listOfOutChannels); @@ -574,7 +577,7 @@ public class TranslatedRouter<E> { } public String getPositionNaming() { - return "_" + xPos + "_" + yPos; + return "_x" + xPos + "_y" + yPos; } public String toString() { @@ -618,7 +621,7 @@ public class TranslatedRouter<E> { TraceManager.addDev("NULL bus"); } - HwBridge mainBridge = new HwBridge("BridgeIntennal" + getPositionNaming()); + HwBridge mainBridge = new HwBridge("BridgeInternal_" + getPositionNaming()); tmla.addHwNode(mainBridge); tmla.makeHwLink(busToInternalDomain, mainBridge); @@ -692,7 +695,7 @@ public class TranslatedRouter<E> { 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()); + HwBus busINVC = new HwBus("busINVC_p" + portNb + "_vc" + i + getPositionNaming()); tmla.addHwNode(busINVC); tmla.makeHwLink(busINVC, cpuINVC); tmla.makeHwLink(busINVC, memINVC); @@ -707,7 +710,7 @@ public class TranslatedRouter<E> { // OUTVC and OUT for (int portNb = 0; portNb < NB_OF_PORTS; portNb++) { if (playingTheRoleOfPrevious[portNb] != null) { - // We have an IN on that port. Connects on the bus of the correcponding link + // We have an IN on that port. Connects on the bus of the corresponding link HwCPU cpuOUT = new HwCPU("cpuOUT_" + portNb + getPositionNaming()); tmla.addHwNode(cpuOUT); tmlmap.addTaskToHwExecutionNode(dispatchOuts.get(portNb), cpuOUT); @@ -904,7 +907,7 @@ public class TranslatedRouter<E> { // 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 - TMLChannel newChannel = new TMLChannel(ch.getName() + "__origin", ch.getReferenceObject()); + TMLChannel newChannel = new TMLChannel(ch.getName() + "__destination", ch.getReferenceObject()); newChannel.setType(TMLChannel.NBRNBW); newChannel.setOriginTask(t); newChannel.setDestinationTask(t);