diff --git a/src/tmltranslator/toavatar/TML2Avatar.java b/src/tmltranslator/toavatar/TML2Avatar.java index fba2e902efda2ccaee6ce1ad6fc4c45ed0afb4fa..f38b2690d645e597ea96c9e6ccb2bc737f70ebfc 100644 --- a/src/tmltranslator/toavatar/TML2Avatar.java +++ b/src/tmltranslator/toavatar/TML2Avatar.java @@ -1297,8 +1297,9 @@ public class TML2Avatar { } else if (s.contains("JOIN")){ String t=""; - for (int i=1; i< s.split("__").length; i++){ - t+=s.split("__")[i]; + t+=s.split("__")[0]; + for (int i=2; i< s.split("__").length; i++){ + t+="JOIN"+s.split("__")[i]; } nameMap.put(s,t); return t; @@ -1585,7 +1586,73 @@ public class TML2Avatar { //Events are ?? to ?? AvatarBlock fifo = new AvatarBlock("FIFO", avspec,null); for (TMLChannel channel:tmlmodel.getChannels()){ - if (channel.isBasicChannel()){ + if (channel.getName().contains("JOINCHANNEL")){ + AvatarRelation ar= new AvatarRelation(channel.getName(), taskBlockMap.get(channel.getOriginTask()), taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject()); + ar.setPrivate(false); + if (channel.getType()==TMLChannel.BRBW){ + ar.setAsynchronous(true); + ar.setSizeOfFIFO(channel.getSize()); + ar.setBlocking(true); + } + else if (channel.getType()==TMLChannel.BRNBW){ + ar.setAsynchronous(true); + ar.setSizeOfFIFO(channel.getSize()); + ar.setBlocking(false); + } + else { + //Create new block, hope for best + if (mc){ + fifo = createFifo(channel.getName()); + ar.setAsynchronous(false); + } + } + //System.out.println(channel.getName() + " " +channel.getOriginTask().getName() + " " + channel.getDestinationTask().getName()); + //Find in signal + //Sig1 contains IN Signals, Sig2 contains OUT signals + List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>(); + List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>(); + for (AvatarSignal sig: taskBlockMap.get(channel.getDestinationTask()).getSignals()){ + if (sig.getInOut()==AvatarSignal.IN){ + String name = sig.getName(); + String tmp = getName(channel.getName()); + if (name.equals(tmp.split("JOIN")[tmp.split("JOIN").length-1]) || name.equals(tmp)){ + sig1.add(sig); + } + } + } + for (AvatarSignal sig: taskBlockMap.get(channel.getOriginTask()).getSignals()){ + if (sig.getInOut()==AvatarSignal.OUT){ + String name = sig.getName(); + String tmp = getName(channel.getName()); + if (name.equals(tmp.split("JOIN")[tmp.split("JOIN").length-1]) || name.equals(tmp)){ + sig2.add(sig); + } + } + } + System.out.println("Signals " +sig1 + " " + sig2); + if (sig1.size()==1 && sig2.size()==1){ + if (channel.getType()==TMLChannel.NBRNBW && mc){ + AvatarSignal read = fifo.getSignalByName("readSignal"); + + ar.block2= fifo; + //Set IN signal with read + ar.addSignals(sig1.get(0), read); + AvatarRelation ar2= new AvatarRelation(channel.getName()+"2", fifo, taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject()); + AvatarSignal write = fifo.getSignalByName("writeSignal"); + //set OUT signal with write + ar2.addSignals(write, sig2.get(0)); + System.out.println("Set " + sig2.get(0) + " and write"); + ar2.setAsynchronous(false); + avspec.addRelation(ar2); + } + else { + ar.addSignals(sig2.get(0), sig1.get(0)); + } + } + avspec.addRelation(ar); + } + + else if (channel.isBasicChannel()){ //System.out.println("checking channel " + channel.getName()); AvatarRelation ar= new AvatarRelation(channel.getName(), taskBlockMap.get(channel.getOriginTask()), taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject()); LinkedList<HwCommunicationNode> path =tmlmap.findNodesForElement(channel);