diff --git a/modeling/AVATAR/testQuery.xml b/modeling/AVATAR/testQuery.xml index ee7c50f73ccab0efcf146bb41988722211ee0b63..8b79961176c7a606dcee44f9ab74b3f7fb1e49a3 100644 --- a/modeling/AVATAR/testQuery.xml +++ b/modeling/AVATAR/testQuery.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> -<TURTLEGMODELING version="1.0beta" ANIMATE_INTERACTIVE_SIMULATION="false" ACTIVATE_PENALTIES="true" UPDATE_INFORMATION_DIPLO_SIM="false" ANIMATE_WITH_INFO_DIPLO_SIM="true" OPEN_DIAG_DIPLO_SIM="false" LAST_SELECTED_MAIN_TAB="0" LAST_SELECTED_SUB_TAB="2"> +<TURTLEGMODELING version="1.0beta" ANIMATE_INTERACTIVE_SIMULATION="false" ACTIVATE_PENALTIES="true" UPDATE_INFORMATION_DIPLO_SIM="false" ANIMATE_WITH_INFO_DIPLO_SIM="true" OPEN_DIAG_DIPLO_SIM="false" LAST_SELECTED_MAIN_TAB="0" LAST_SELECTED_SUB_TAB="0"> <Modeling type="AVATAR Design" nameTab="Design" tabs="Block Diagram$RandomGenerator$Reader" > <AVATARBlockDiagramPanel name="Block Diagram" minX="10" maxX="2500" minY="10" maxY="1500" zoom="1.0" > diff --git a/src/main/java/avatartranslator/AvatarBlock.java b/src/main/java/avatartranslator/AvatarBlock.java index 0d8cd59cb9a13d75f3160bf55af3b0908ee955cc..1136c88f3459e5f8e4dd581947ffbca7f643f7f7 100644 --- a/src/main/java/avatartranslator/AvatarBlock.java +++ b/src/main/java/avatartranslator/AvatarBlock.java @@ -71,6 +71,7 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne this.avspec = _avspec; attributes = new LinkedList<AvatarAttribute>(); + constants = new LinkedList<AvatarAttribute>(); methods = new LinkedList<AvatarMethod>(); signals = new LinkedList<AvatarSignal>(); asm = new AvatarStateMachine(this, "statemachineofblock__" + _name, _referenceObject); @@ -142,6 +143,10 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne return attributes; } + public List<AvatarAttribute> getConstants() { + return constants; + } + public List<AvatarMethod> getMethods() { return methods; } @@ -797,8 +802,12 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne toKeep = true; } for (AvatarStateMachineElement elt : asm.getListOfElements()) { + if (elt instanceof AvatarTransition) { at = (AvatarTransition) elt; + + + for (AvatarAction aa : at.getActions()) { if (aa instanceof AvatarActionAssignment) { if (((AvatarActionAssignment) aa).leftHand.getName().compareTo(attr.name) == 0) { @@ -822,6 +831,9 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne toKeep = true; } } + + + if (toKeep) { break; } @@ -864,6 +876,33 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne } + // Returns the number of replaced queries + public int replaceQueriesWithReadSignal(AvatarSignal _origin, AvatarSignal _newSignal) { + List<AvatarQueryOnSignal> elts = new LinkedList<>(); + AvatarQueryOnSignal aqos; + + // Getting all related ops + for(AvatarStateMachineElement elt: asm.getListOfElements()) { + if (elt instanceof AvatarQueryOnSignal) { + aqos = (AvatarQueryOnSignal) elt; + if (aqos.getSignal() == _origin) { + elts.add(aqos); + } + } + } + + // Replacing ops + for(AvatarQueryOnSignal q: elts) { + AvatarActionOnSignal aaosQuery = new AvatarActionOnSignal("query", _newSignal, q.getReferenceObject()); + aaosQuery.addValue(q.getAttribute().getName()); + asm.replace(q, aaosQuery); + } + + return elts.size(); + + + } + @Override public AvatarBlock advancedClone(AvatarSpecification avspec) { diff --git a/src/main/java/avatartranslator/AvatarBlockTemplate.java b/src/main/java/avatartranslator/AvatarBlockTemplate.java index 7470f141fe95bb010be047100b52d704c0a6fc31..e344d6a5382941e0023677db886be02fe3c2147f 100644 --- a/src/main/java/avatartranslator/AvatarBlockTemplate.java +++ b/src/main/java/avatartranslator/AvatarBlockTemplate.java @@ -149,13 +149,16 @@ public class AvatarBlockTemplate { 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); + ab.setName(_name); // Create the read and write signals AvatarSignal write = new AvatarSignal("write", AvatarSignal.IN, _referenceRelation); AvatarSignal read = new AvatarSignal("read", AvatarSignal.OUT, _referenceRelation); + AvatarSignal queryS = new AvatarSignal("query", AvatarSignal.OUT, _referenceRelation); ab.addSignal(write); // corresponds to sig1 ab.addSignal(read); // corresponds to sig2 + ab.addSignal(queryS); // Creating the attributes of the signals @@ -167,6 +170,11 @@ public class AvatarBlockTemplate { read.addParameter(aa.advancedClone(null)); } + AvatarAttribute queryA = new AvatarAttribute("queryA", AvatarType.INTEGER, ab, _referenceRelation); + ab.addAttribute(queryA); + queryS.addParameter(queryA.advancedClone(null)); + + // Creating the attributes to support the FIFO // For each parameter, we create an attribute that is similar to the one of e.g. sig1 @@ -303,6 +311,12 @@ public class AvatarBlockTemplate { at.addAction("size = size - 1"); } + // Query + AvatarActionOnSignal aaosQuery = new AvatarActionOnSignal("query", queryS, _referenceRelation); + asm.addElement(aaosQuery); + aaosQuery.addValue("size"); + at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaosQuery, _referenceRelation); + at = makeAvatarEmptyTransitionBetween(ab, asm, aaosQuery, main, _referenceRelation); // Block is finished! diff --git a/src/main/java/avatartranslator/AvatarSpecification.java b/src/main/java/avatartranslator/AvatarSpecification.java index 4766df8ba430b1f5a9cecbe24a63a6479c77c29a..4e7f4cead807512b6a68eef7e7d0501f1d1599ab 100644 --- a/src/main/java/avatartranslator/AvatarSpecification.java +++ b/src/main/java/avatartranslator/AvatarSpecification.java @@ -521,25 +521,44 @@ public class AvatarSpecification extends AvatarElement { return FIFO_ID; } - private int removeFIFO(AvatarRelation _ar, AvatarSignal _sig1, AvatarSignal _sig2, int _sizeOfInfiniteFifo, List<AvatarRelation> _oldOnes, List<AvatarRelation> _newOnes, int FIFO_ID) { + private int removeFIFO(AvatarRelation _ar, AvatarSignal _sig1, AvatarSignal _sig2, int _sizeOfInfiniteFifo, List<AvatarRelation> _oldOnes, + List<AvatarRelation> _newOnes, int FIFO_ID) { // We create the new block, and the new relation towards the new block - String nameOfBlock = "FIFO__" + _sig1.getName() + "__" + _sig2.getName() + "__" + FIFO_ID; + String nameOfBlock = "FIFO_" + _sig1.getName() + "_" + _sig2.getName() + "_" + FIFO_ID; AvatarBlock fifoBlock = AvatarBlockTemplate.getFifoBlock(nameOfBlock, this, _ar, _ar.getReferenceObject(), _sig1, _sig2, _sizeOfInfiniteFifo, FIFO_ID); blocks.add(fifoBlock); // We now need to create the new relation - AvatarRelation newAR1 = new AvatarRelation("FIFO__write_" + FIFO_ID, _ar.block1, fifoBlock, _ar.getReferenceObject()); + AvatarRelation newAR1 = new AvatarRelation("FIFO_write_" + FIFO_ID, _ar.block1, fifoBlock, _ar.getReferenceObject()); newAR1.setAsynchronous(false); newAR1.setPrivate(_ar.isPrivate()); newAR1.addSignals(_sig1, fifoBlock.getSignalByName("write")); _newOnes.add(newAR1); - AvatarRelation newAR2 = new AvatarRelation("FIFO__read_" + FIFO_ID, fifoBlock, _ar.block2, _ar.getReferenceObject()); + AvatarRelation newAR2 = new AvatarRelation("FIFO_read_" + FIFO_ID, fifoBlock, _ar.block2, _ar.getReferenceObject()); newAR2.setAsynchronous(false); newAR2.setPrivate(_ar.isPrivate()); newAR2.addSignals(fifoBlock.getSignalByName("read"), _sig2); _newOnes.add(newAR2); + // We also add the query signals to the newAR2 relation + + + AvatarSignal queryS = new AvatarSignal("query_FIFO_read_" + FIFO_ID, AvatarSignal.IN, _sig2.getReferenceObject()); + _ar.block2.addSignal(queryS); + AvatarAttribute queryA = new AvatarAttribute("queryA", AvatarType.INTEGER, null, _sig2.getReferenceObject()); + queryS.addParameter(queryA); + + AvatarRelation newAR3 = new AvatarRelation("FIFO_query_" + FIFO_ID, fifoBlock, _ar.block2, _ar.getReferenceObject()); + newAR3.setAsynchronous(false); + newAR3.setPrivate(_ar.isPrivate()); + newAR2.addSignals(fifoBlock.getSignalByName("query"), queryS); + _newOnes.add(newAR3); + + // Replace query in block2 for _sig2 by readOnSignal with signal queryS. Use the same attribute as before + _ar.block2.replaceQueriesWithReadSignal(_sig2, queryS); + + FIFO_ID++; return FIFO_ID; } diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java index 2e7d385a1401c1580a19f40383d8f34427d7642f..ca1357d51e158a8edf323260d3f01a143a46e690 100644 --- a/src/main/java/ui/GTURTLEModeling.java +++ b/src/main/java/ui/GTURTLEModeling.java @@ -9018,6 +9018,17 @@ public class GTURTLEModeling { SMDMap.put(asme, smdr); locMap.put(asme, smdr); } + + if (asme instanceof AvatarQueryOnSignal) { + AvatarSMDQueryReceiveSignal smdqrs = new AvatarSMDQueryReceiveSignal(x, y, smp.getMinX(), smp.getMaxX(), smp.getMinY(), smp.getMaxY(), false, null, + smp); + smdqrs.setNames(((AvatarQueryOnSignal) asme).getAttribute().getName(), ((AvatarQueryOnSignal) asme).getSignal().getName()); + smp.addComponent(smdqrs, x, y, false, true); + tgcomp = smdqrs; + SMDMap.put(asme, smdqrs); + locMap.put(asme, smdqrs); + } + if (asme instanceof AvatarActionOnSignal) { avatartranslator.AvatarSignal sig = ((AvatarActionOnSignal) asme).getSignal(); if (sig.isIn()) { @@ -9176,6 +9187,8 @@ public class GTURTLEModeling { typeIds[i] = attr.getName(); i++; } + + //TraceManager.addDev("Adding signal " + sig + " with name=" + name); bl.addSignal(new ui.AvatarSignal(sig.getInOut(), name, types, typeIds)); } @@ -9200,6 +9213,26 @@ public class GTURTLEModeling { bl.addCryptoElements(); } } + + for (AvatarAttribute attr : ab.getConstants()) { + int type = 5; + if (attr.getType() == AvatarType.BOOLEAN) { + type = 4; + } + if (attr.getType() == AvatarType.INTEGER) { + type = 0; + } + if (attr.hasInitialValue()) { + bl.addAttribute(new TAttribute(0, attr.getName(), attr.getInitialValue(), type)); + } else { + bl.addAttribute(new TAttribute(0, attr.getName(), attr.getType().getDefaultInitialValue(), type)); + } + if (attr.getName().contains("key_") || attr.getName().contains("privKey_")) { + hasCrypto = true; + bl.addCryptoElements(); + } + } + for (avatartranslator.AvatarMethod method : ab.getMethods()) { bl.addMethodIfApplicable(method.toString().replaceAll(" = 0", "")); } @@ -9700,6 +9733,7 @@ public class GTURTLEModeling { AvatarStartState start = asm.getStartState(); addStates(start, smx, smy, smp, bl, SMDMap, locMap, tranDestMap, tranSourceMap); + //Add transitions for (AvatarTransition t : tranSourceMap.keySet()) { if (tranSourceMap.get(t) == null || tranDestMap.get(t) == null || locMap.get(tranDestMap.get(t)) == null) { diff --git a/src/main/java/ui/avatarsmd/AvatarSMDQueryReceiveSignal.java b/src/main/java/ui/avatarsmd/AvatarSMDQueryReceiveSignal.java index b64d547a297187b64cbb1e244d990a744bc27ec2..c109da75661c0769a86d982ab2ebf25160dd3e9c 100644 --- a/src/main/java/ui/avatarsmd/AvatarSMDQueryReceiveSignal.java +++ b/src/main/java/ui/avatarsmd/AvatarSMDQueryReceiveSignal.java @@ -378,6 +378,13 @@ public class AvatarSMDQueryReceiveSignal extends AvatarSMDBasicCanBeDisabledComp } return value.substring(0, index).trim(); } + + + + public void setNames(String _attributeName, String _sigName) { + value = _attributeName + " =? " + _sigName; + } + diff --git a/src/main/java/ui/window/JDialogAvatarModelChecker.java b/src/main/java/ui/window/JDialogAvatarModelChecker.java index 84c38a8d972d15c202cd60df3844c8f767cf19d3..8a59e1f5ebd3bd2c6d973c927e6a515bcbe8fa0a 100644 --- a/src/main/java/ui/window/JDialogAvatarModelChecker.java +++ b/src/main/java/ui/window/JDialogAvatarModelChecker.java @@ -982,6 +982,13 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act TraceManager.addDev("Model checking done"); + if (generateDesignSelected) { + TraceManager.addDev("Drawing modified avatar spec"); + if ((mgui != null) && (spec != null)) { + mgui.drawAvatarSpecification(amc.getReworkedAvatarSpecification()); + } + } + //TraceManager.addDev("RG:" + amc.statesToString() + "\n\n");