Skip to content
Snippets Groups Projects
Commit 5997ba45 authored by apvrille's avatar apvrille
Browse files

Adding start of Matteo block

parent ca7b3194
No related branches found
No related tags found
No related merge requests found
...@@ -37,21 +37,21 @@ ...@@ -37,21 +37,21 @@
*/ */
package avatartranslator; package avatartranslator;
import myutil.TraceManager; import myutil.TraceManager;
import java.util.Vector;
/** /**
* Class AvatarBlockTemplate * Class AvatarBlockTemplate
* Templates of AVATAR blocks (Timers, etc.) * Templates of AVATAR blocks (Timers, etc.)
* Creation: 09/07/2010 * Creation: 09/07/2010
* @version 1.0 09/07/2010 *
* @author Ludovic APVRILLE * @author Ludovic APVRILLE
* @version 2.0 14/11/2019
*/ */
public class AvatarBlockTemplate { public class AvatarBlockTemplate {
public AvatarBlockTemplate() { public AvatarBlockTemplate() {
} }
...@@ -69,7 +69,7 @@ public class AvatarBlockTemplate { ...@@ -69,7 +69,7 @@ public class AvatarBlockTemplate {
AvatarSignal set = new AvatarSignal("set", AvatarSignal.IN, _referenceBlock); AvatarSignal set = new AvatarSignal("set", AvatarSignal.IN, _referenceBlock);
AvatarSignal reset = new AvatarSignal("reset", AvatarSignal.IN, _referenceBlock); AvatarSignal reset = new AvatarSignal("reset", AvatarSignal.IN, _referenceBlock);
AvatarSignal expire = new AvatarSignal("expire", AvatarSignal.OUT, _referenceBlock); AvatarSignal expire = new AvatarSignal("expire", AvatarSignal.OUT, _referenceBlock);
AvatarAttribute val = new AvatarAttribute("value", AvatarType.INTEGER, ab, aa.getReferenceObject()); AvatarAttribute val = new AvatarAttribute("value", AvatarType.INTEGER, ab, aa.getReferenceObject());
set.addParameter(val); set.addParameter(val);
ab.addSignal(set); ab.addSignal(set);
...@@ -143,172 +143,207 @@ public class AvatarBlockTemplate { ...@@ -143,172 +143,207 @@ public class AvatarBlockTemplate {
return at; return at;
} }
// WARNING: Does not handle the non blocking case // WARNING: Does not handle the non blocking case
public static AvatarBlock getFifoBlock(String _name, AvatarSpecification _avspec, AvatarRelation _ar, Object _referenceRelation, AvatarSignal _sig1, AvatarSignal _sig2, int _sizeOfFifo, int FIFO_ID) { public static AvatarBlock getFifoBlock(String _name, AvatarSpecification _avspec, AvatarRelation _ar, Object _referenceRelation, AvatarSignal _sig1, AvatarSignal _sig2, int _sizeOfFifo, int FIFO_ID) {
AvatarBlock ab = new AvatarBlock(_name, _avspec, _referenceRelation); AvatarBlock ab = new AvatarBlock(_name, _avspec, _referenceRelation);
// Create the read and write signals // Create the read and write signals
AvatarSignal write = new AvatarSignal("write", AvatarSignal.IN, _referenceRelation); AvatarSignal write = new AvatarSignal("write", AvatarSignal.IN, _referenceRelation);
AvatarSignal read = new AvatarSignal("read", AvatarSignal.OUT, _referenceRelation); AvatarSignal read = new AvatarSignal("read", AvatarSignal.OUT, _referenceRelation);
ab.addSignal(write); // corresponds to sig1 ab.addSignal(write); // corresponds to sig1
ab.addSignal(read); // corresponds to sig2 ab.addSignal(read); // corresponds to sig2
// Creating the attributes of the signals // Creating the attributes of the signals
// Same attributes for all signals // Same attributes for all signals
for(AvatarAttribute aa: _sig1.getListOfAttributes()) { for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
write.addParameter(aa.advancedClone(null)); write.addParameter(aa.advancedClone(null));
} }
for(AvatarAttribute aa: _sig2.getListOfAttributes()) { for (AvatarAttribute aa : _sig2.getListOfAttributes()) {
read.addParameter(aa.advancedClone(null)); read.addParameter(aa.advancedClone(null));
} }
// Creating the attributes to support the FIFO // Creating the attributes to support the FIFO
// For each parameter, we create an attribute that is similar to the one of e.g. sig1 // For each parameter, we create an attribute that is similar to the one of e.g. sig1
// We duplicate this for the size of the fifo // We duplicate this for the size of the fifo
for(AvatarAttribute aa: _sig1.getListOfAttributes()) { for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
for(int i=0; i<_sizeOfFifo; i++) { for (int i = 0; i < _sizeOfFifo; i++) {
AvatarAttribute newA = aa.advancedClone(null); AvatarAttribute newA = aa.advancedClone(null);
newA.setName("arg__" + aa.getName() + "__" + i); newA.setName("arg__" + aa.getName() + "__" + i);
ab.addAttribute(newA); ab.addAttribute(newA);
} }
} }
// If lossy, add corresponding lossy attributes // If lossy, add corresponding lossy attributes
if (_ar.isLossy()) { if (_ar.isLossy()) {
for(AvatarAttribute aa: _sig1.getListOfAttributes()) { for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
AvatarAttribute newL = aa.advancedClone(null); AvatarAttribute newL = aa.advancedClone(null);
newL.setName("loss__" + aa.getName()); newL.setName("loss__" + aa.getName());
ab.addAttribute(newL); ab.addAttribute(newL);
} }
} }
// If non blocking, then, we need extra attributes // If non blocking, then, we need extra attributes
if (!(_ar.isBlocking())) { if (!(_ar.isBlocking())) {
for(AvatarAttribute aa: _sig1.getListOfAttributes()) { for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
AvatarAttribute newL = aa.advancedClone(null); AvatarAttribute newL = aa.advancedClone(null);
newL.setName("bucket__" + aa.getName()); newL.setName("bucket__" + aa.getName());
ab.addAttribute(newL); ab.addAttribute(newL);
} }
} }
// We create the attribute to manage the FIFO // We create the attribute to manage the FIFO
AvatarAttribute size = new AvatarAttribute("size", AvatarType.INTEGER, ab, _referenceRelation); AvatarAttribute size = new AvatarAttribute("size", AvatarType.INTEGER, ab, _referenceRelation);
size.setInitialValue("0"); size.setInitialValue("0");
ab.addAttribute(size); ab.addAttribute(size);
AvatarAttribute maxSize = new AvatarAttribute("maxSize", AvatarType.INTEGER, ab, _referenceRelation); AvatarAttribute maxSize = new AvatarAttribute("maxSize", AvatarType.INTEGER, ab, _referenceRelation);
TraceManager.addDev("*********************************** Size of FIFO=" + _sizeOfFifo); TraceManager.addDev("*********************************** Size of FIFO=" + _sizeOfFifo);
maxSize.setInitialValue("" + _sizeOfFifo); maxSize.setInitialValue("" + _sizeOfFifo);
ab.addAttribute(maxSize); ab.addAttribute(maxSize);
// Where we write: the head // Where we write: the head
AvatarAttribute head = new AvatarAttribute("head", AvatarType.INTEGER, ab, _referenceRelation); AvatarAttribute head = new AvatarAttribute("head", AvatarType.INTEGER, ab, _referenceRelation);
head.setInitialValue("0"); head.setInitialValue("0");
ab.addAttribute(head); ab.addAttribute(head);
// Where we read: the tail // Where we read: the tail
AvatarAttribute tail = new AvatarAttribute("tail", AvatarType.INTEGER, ab, _referenceRelation); AvatarAttribute tail = new AvatarAttribute("tail", AvatarType.INTEGER, ab, _referenceRelation);
tail.setInitialValue("0"); tail.setInitialValue("0");
ab.addAttribute(tail); ab.addAttribute(tail);
// Creating the state machine // Creating the state machine
// Don't forget the isLossy // Don't forget the isLossy
AvatarTransition at; AvatarTransition at;
AvatarStateMachine asm = ab.getStateMachine(); AvatarStateMachine asm = ab.getStateMachine();
// Start state // Start state
AvatarStartState ass = new AvatarStartState("start", _referenceRelation); AvatarStartState ass = new AvatarStartState("start", _referenceRelation);
asm.setStartState(ass); asm.setStartState(ass);
asm.addElement(ass); asm.addElement(ass);
// Main state: Wait4Request // Main state: Wait4Request
AvatarState main = new AvatarState("Wait4Request", _referenceRelation); AvatarState main = new AvatarState("Wait4Request", _referenceRelation);
asm.addElement(main); asm.addElement(main);
at = makeAvatarEmptyTransitionBetween(ab, asm, ass, main, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, ass, main, _referenceRelation);
// Can write only if fifo is not full only if transition // Can write only if fifo is not full only if transition
AvatarState testHead = new AvatarState("testHead", _referenceRelation); AvatarState testHead = new AvatarState("testHead", _referenceRelation);
asm.addElement(testHead); asm.addElement(testHead);
at = makeAvatarEmptyTransitionBetween(ab, asm, testHead, main, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, testHead, main, _referenceRelation);
at.setGuard("[head<maxSize]"); at.setGuard("[head<maxSize]");
at = makeAvatarEmptyTransitionBetween(ab, asm, testHead, main, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, testHead, main, _referenceRelation);
at.setGuard("[head==maxSize]"); at.setGuard("[head==maxSize]");
at.addAction("head=0"); at.addAction("head=0");
for(int i=0; i<_sizeOfFifo; i++) { for (int i = 0; i < _sizeOfFifo; i++) {
AvatarActionOnSignal aaos_write = new AvatarActionOnSignal("write__" + i, write, _referenceRelation); AvatarActionOnSignal aaos_write = new AvatarActionOnSignal("write__" + i, write, _referenceRelation);
for(AvatarAttribute aa: _sig1.getListOfAttributes()) { for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
aaos_write.addValue("arg__" + aa.getName() + "__" + i); aaos_write.addValue("arg__" + aa.getName() + "__" + i);
} }
asm.addElement(aaos_write); asm.addElement(aaos_write);
at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaos_write, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaos_write, _referenceRelation);
at.setGuard("[(size < maxSize) && (head==" + i + ")]"); at.setGuard("[(size < maxSize) && (head==" + i + ")]");
at = makeAvatarEmptyTransitionBetween(ab, asm, aaos_write, testHead, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, aaos_write, testHead, _referenceRelation);
at.addAction("head = head + 1"); at.addAction("head = head + 1");
at.addAction("size = size + 1"); at.addAction("size = size + 1");
} }
// if is lossy, can write, and does not store this nor increase the fifo size // if is lossy, can write, and does not store this nor increase the fifo size
if (_ar.isLossy()) { if (_ar.isLossy()) {
AvatarActionOnSignal aaos_write_loss = new AvatarActionOnSignal("writeloss__", write, _referenceRelation); AvatarActionOnSignal aaos_write_loss = new AvatarActionOnSignal("writeloss__", write, _referenceRelation);
for(AvatarAttribute aa: _sig1.getListOfAttributes()) { for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
aaos_write_loss.addValue("loss__" + aa.getName()); aaos_write_loss.addValue("loss__" + aa.getName());
} }
asm.addElement(aaos_write_loss); asm.addElement(aaos_write_loss);
at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaos_write_loss, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaos_write_loss, _referenceRelation);
at.setGuard("[(size < maxSize)]"); at.setGuard("[(size < maxSize)]");
at = makeAvatarEmptyTransitionBetween(ab, asm, aaos_write_loss, main, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, aaos_write_loss, main, _referenceRelation);
} }
// If it is blocking, then, the new message is written but not added // If it is blocking, then, the new message is written but not added
if (!(_ar.isBlocking())) { if (!(_ar.isBlocking())) {
AvatarActionOnSignal aaos_write_bucket = new AvatarActionOnSignal("writebucket__", write, _referenceRelation); AvatarActionOnSignal aaos_write_bucket = new AvatarActionOnSignal("writebucket__", write, _referenceRelation);
for(AvatarAttribute aa: _sig1.getListOfAttributes()) { for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
aaos_write_bucket.addValue("bucket__" + aa.getName()); aaos_write_bucket.addValue("bucket__" + aa.getName());
} }
asm.addElement(aaos_write_bucket); asm.addElement(aaos_write_bucket);
at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaos_write_bucket, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaos_write_bucket, _referenceRelation);
at.setGuard("[(size == maxSize)]"); at.setGuard("[(size == maxSize)]");
at = makeAvatarEmptyTransitionBetween(ab, asm, aaos_write_bucket, main, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, aaos_write_bucket, main, _referenceRelation);
} }
// Read // Read
AvatarState testTail = new AvatarState("testTail", _referenceRelation); AvatarState testTail = new AvatarState("testTail", _referenceRelation);
asm.addElement(testTail); asm.addElement(testTail);
at = makeAvatarEmptyTransitionBetween(ab, asm, testTail, main, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, testTail, main, _referenceRelation);
at.setGuard("[tail<maxSize]"); at.setGuard("[tail<maxSize]");
at = makeAvatarEmptyTransitionBetween(ab, asm, testTail, main, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, testTail, main, _referenceRelation);
at.setGuard("[tail==maxSize]"); at.setGuard("[tail==maxSize]");
at.addAction("tail=0"); at.addAction("tail=0");
for(int i=0; i<_sizeOfFifo; i++) { for (int i = 0; i < _sizeOfFifo; i++) {
AvatarActionOnSignal aaos_read = new AvatarActionOnSignal("read__" + i, read, _referenceRelation); AvatarActionOnSignal aaos_read = new AvatarActionOnSignal("read__" + i, read, _referenceRelation);
for(AvatarAttribute aa: _sig1.getListOfAttributes()) { for (AvatarAttribute aa : _sig1.getListOfAttributes()) {
aaos_read.addValue("arg__" + aa.getName() + "__" + i); aaos_read.addValue("arg__" + aa.getName() + "__" + i);
} }
asm.addElement(aaos_read); asm.addElement(aaos_read);
at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaos_read, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaos_read, _referenceRelation);
at.setGuard("[(size > 0) && (tail==" + i + ")]"); at.setGuard("[(size > 0) && (tail==" + i + ")]");
at = makeAvatarEmptyTransitionBetween(ab, asm, aaos_read, testTail, _referenceRelation); at = makeAvatarEmptyTransitionBetween(ab, asm, aaos_read, testTail, _referenceRelation);
at.addAction("tail = tail + 1"); at.addAction("tail = tail + 1");
at.addAction("size = size - 1"); at.addAction("size = size - 1");
} }
// Block is finished!
// Block is finished!
return ab;
return ab; }
public static AvatarBlock getSWGraphBlock(String _name, AvatarSpecification _avspec, Object _referenceBlock,
int duration, Vector<String> unblocks, Vector<String> blocks) {
AvatarBlock ab = new AvatarBlock(_name, _avspec, _referenceBlock);
// Create signals
AvatarSignal selectP = new AvatarSignal("selectP", AvatarSignal.IN, _referenceBlock);
AvatarSignal stepP = new AvatarSignal("stepP", AvatarSignal.IN, _referenceBlock);
AvatarAttribute att1 = new AvatarAttribute("step", AvatarType.INTEGER, ab, _referenceBlock);
stepP.addParameter(att1);
AvatarSignal preemptP = new AvatarSignal("preemptP", AvatarSignal.IN, _referenceBlock);
AvatarSignal finishP = new AvatarSignal("finishP", AvatarSignal.OUT, _referenceBlock);
ab.addSignal(selectP);
ab.addSignal(stepP);
ab.addSignal(preemptP);
ab.addSignal(finishP);
// block / unblock signals
//for(int)
// Create attributes
AvatarAttribute durationAtt = new AvatarAttribute("duration", AvatarType.INTEGER, ab, _referenceBlock);
durationAtt.setInitialValue(""+duration);
ab.addAttribute(durationAtt);
AvatarAttribute stepAtt = new AvatarAttribute("step", AvatarType.INTEGER, ab, _referenceBlock);
ab.addAttribute(stepAtt);
// State machines
return ab;
} }
} }
/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
*
* ludovic.apvrille AT enst.fr
*
* This software is a computer program whose purpose is to allow the
* edition of TURTLE analysis, design and deployment diagrams, to
* allow the generation of RT-LOTOS or Java code from this diagram,
* and at last to allow the analysis of formal validation traces
* obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
* from INRIA Rhone-Alpes.
*
* This software is governed by the CeCILL license under French law and
* abiding by the rules of distribution of free software. You can use,
* modify and/ or redistribute the software under the terms of the CeCILL
* license as circulated by CEA, CNRS and INRIA at the following URL
* "http://www.cecill.info".
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited
* liability.
*
* In this respect, the user's attention is drawn to the risks associated
* with loading, using, modifying and/or developing or reproducing the
* software by the user in light of its specific status of free software,
* that may mean that it is complicated to manipulate, and that also
* therefore means that it is reserved for developers and experienced
* professionals having in-depth computer knowledge. Users are therefore
* encouraged to load and test the software's suitability as regards their
* requirements in conditions enabling the security of their systems and/or
* data to be ensured and, more generally, to use and operate it in the
* same conditions as regards security.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL license and that you accept its terms.
*/
package tmltranslator.schedulegraph;
import tmltranslator.*;
import java.util.Vector;
/**
* Class SWTask
* Creation: 14/11/2019
*
* @author Ludovic Apvrille
* @version 1.0 14/11/2019
*/
public class SWTask extends TMLTask {
private int duration = 10;
public SWTask(String name, Object referenceToClass, Object referenceToActivityDiagram) {
super(name, referenceToClass, referenceToActivityDiagram);
}
public void setDuration(int duration) {
this.duration = duration;
}
public void generate() {
TMLSendEvent sendEvt;
TMLWaitEvent waitEvt;
TMLStopState stop;
// Attributes
TMLAttribute durationAtt = new TMLAttribute("duraction", "duraction", new TMLType(TMLType.NATURAL), "0");
this.addAttribute(durationAtt);
TMLAttribute dstX = new TMLAttribute("dstX", "dstX", new TMLType(TMLType.NATURAL), "0");
this.addAttribute(dstX);
TMLAttribute dstY = new TMLAttribute("dstY", "dstY", new TMLType(TMLType.NATURAL), "0");
this.addAttribute(dstY);
TMLAttribute vc = new TMLAttribute("vc", "vc", new TMLType(TMLType.NATURAL), "0");
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);
// Events
addTMLEvent(vcSelect);
for(TMLEvent evt: inPacketEvents) {
addTMLEvent(evt);
}
addTMLEvent(outVCEvent);
for(TMLEvent evt: outFeedbackEvents) {
addTMLEvent(evt);
}
// Activity Diagram
TMLStartState start = new TMLStartState("mainStart", referenceObject);
activity.setFirst(start);
// Loop forever
TMLForLoop mainLoop = new TMLForLoop("MainLoop", referenceObject);
mainLoop.setInfinite(true);
activity.addLinkElement(start,mainLoop);
// Select Event
TMLSelectEvt select = new TMLSelectEvt("selectEvent", referenceObject);
activity.addLinkElement(mainLoop, select);
// Branch for each input event
for(int i=0; i<inPacketEvents.size(); i++) {
TMLWaitEvent waitPacket = new TMLWaitEvent("WaitForFirstFlit", referenceObject);
waitPacket.setEvent(inPacketEvents.get(i));
waitPacket.addParam("pktlen");
waitPacket.addParam("dstX");
waitPacket.addParam("dstY");
waitPacket.addParam("vc");
waitPacket.addParam("eop");
waitPacket.addParam("chid");
activity.addLinkElement(select, waitPacket);
// loop on packet size
TMLForLoop packetLoop = new TMLForLoop("packetLoop", referenceObject);
packetLoop.setInit("j=0");
packetLoop.setCondition("j<pktlen");
packetLoop.setIncrement("j=j+1");
activity.addLinkElement(waitPacket, packetLoop);
// Inside packetloop
TMLSendEvent sendFlitEvt = new TMLSendEvent("PacketInfo", referenceObject);
sendFlitEvt.setEvent(outVCEvent);
sendFlitEvt.addParam("pktlen");
sendFlitEvt.addParam("dstX");
sendFlitEvt.addParam("dstY");
sendFlitEvt.addParam("vc");
sendFlitEvt.addParam("eop");
sendFlitEvt.addParam("chid");
activity.addLinkElement(packetLoop, sendFlitEvt);
waitEvt = new TMLWaitEvent("ReturnFromVC", referenceObject);
waitEvt.setEvent(vcSelect);
activity.addLinkElement(sendFlitEvt, waitEvt);
sendEvt = new TMLSendEvent("Feedback", referenceObject);
sendEvt.setEvent(outFeedbackEvents.get(i));
activity.addLinkElement(waitEvt, sendEvt);
TMLChoice choice = new TMLChoice("ChoiceOnEOP", referenceObject);
activity.addLinkElement(sendEvt, choice);
// Left branch of choice
TMLWaitEvent waitNextFlit = new TMLWaitEvent("WaitForNextFlit", referenceObject);
waitNextFlit.setEvent(inPacketEvents.get(i));
waitNextFlit.addParam("pktlen");
waitNextFlit.addParam("dstX");
waitNextFlit.addParam("dstY");
waitNextFlit.addParam("vc");
waitNextFlit.addParam("eop");
waitNextFlit.addParam("chid");
activity.addLinkElement(choice, waitNextFlit);
choice.addGuard("eop == 0");
TMLStopState stopAfterFlit = new TMLStopState("StopStateLeftChoice", referenceObject);
activity.addLinkElement(waitNextFlit, stopAfterFlit);
//Right branch of choice
TMLStopState stopEOP = new TMLStopState("StopStateRightChoice", referenceObject);
activity.addLinkElement(choice, stopEOP);
choice.addGuard("eop > 0");
// Exit of the loop
stop = new TMLStopState("EndOfPacketLoop", referenceObject);
activity.addLinkElement(packetLoop, stop);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment