diff --git a/bin/config.xml b/bin/config.xml index 56ec830d9bab6ea48903eb68e2a86b511dd0cc23..40386028d8e75b37bb924beeb30c0b7decb03446 100755 --- a/bin/config.xml +++ b/bin/config.xml @@ -42,18 +42,14 @@ <SystemCCodeInteractiveExecuteCommand data="/homes/apvrille/TechTTool/SystemCCode/generated/run.x -server" /> <TMLCodeDirectory data="/Users/ludovicapvrille/TTool/tmlcode" /> <GTKWavePath data="/opt/local/bin/gtkwave" /> -<<<<<<< .mine <VCDPath data="/Users/ludovicapvrille/TTool/vcd/" /> -======= -<VCDPath data="/Users/ludovicapvrille/TTool/vcd" /> ->>>>>>> .r2431 <UPPAALCodeDirectory data="/Users/ludovicapvrille/TTool/uppaal/" /> -<UPPAALVerifierPath data="/Applications/uppaal-4.0.7-aca/verifyta" /> +<UPPAALVerifierPath data="/Applications/uppaal-4.0.11/verifyta" /> <UPPAALVerifierHost data="localhost" /> <ExternalCommand1Host data="localhost"/> <ExternalCommand1 data="/opt/local/bin/gtkwave /Users/ludovicapvrille/simulators/c++2/vcddump.vcd"/> <ExternalCommand2Host data="localhost"/> -<ExternalCommand2 data="/Applications/uppaal-4.0.7-aca/uppaal /Users/ludovicapvrille/TTool/uppaal/spec.xml"/> +<ExternalCommand2 data="open /Applications/uppaal-4.0.11/UPPAAL.app /Users/ludovicapvrille/TTool/uppaal/spec.xml"/> <LastWindowAttributes x="367" y="47" width="1094" height="924" max="false" /> diff --git a/src/avatartranslator/AvatarRelation.java b/src/avatartranslator/AvatarRelation.java index e16b376e28d4ebd174db166dd0d8acd8179ad2c1..8439253f1cbe56422add9e79e97620d7874280d9 100644 --- a/src/avatartranslator/AvatarRelation.java +++ b/src/avatartranslator/AvatarRelation.java @@ -56,6 +56,8 @@ public class AvatarRelation extends AvatarElement { public AvatarBlock block1, block2; private LinkedList<AvatarSignal> signals1, signals2; + private boolean blocking, asynchronous; + private int sizeOfFIFO; public AvatarRelation(String _name, AvatarBlock _block1, AvatarBlock _block2, Object _referenceObject) { @@ -64,8 +66,28 @@ public class AvatarRelation extends AvatarElement { signals2 = new LinkedList<AvatarSignal>(); block1 = _block1; block2 = _block2; + blocking = false; + sizeOfFIFO = 1024; + asynchronous = false; + } + public void setAsynchronous(boolean _b) { + asynchronous = _b; + } + + public void setBlocking(boolean _b) { + blocking = _b; + } + + public void setSizeOfFIFO(int _sizeOfFIFO) { + sizeOfFIFO = _sizeOfFIFO; + } + + public boolean isAsynchronous() { + return asynchronous; + } + public void addSignals(AvatarSignal _sig1, AvatarSignal _sig2) { diff --git a/src/avatartranslator/touppaal/AVATAR2UPPAAL.java b/src/avatartranslator/touppaal/AVATAR2UPPAAL.java index 09030f831a858c6c6672b646a303396342173d39..8ee0b97d048caee79888f5d5d60f6a58b2791be1 100755 --- a/src/avatartranslator/touppaal/AVATAR2UPPAAL.java +++ b/src/avatartranslator/touppaal/AVATAR2UPPAAL.java @@ -68,6 +68,8 @@ public class AVATAR2UPPAAL { private LinkedList gatesNotSynchronized; // String private LinkedList gatesSynchronized; + private LinkedList gatesAsynchronized; + private int nbOfIntParameters, nbOfBooleanParameters; private Hashtable <AvatarStateMachineElement, UPPAALLocation> hash; @@ -154,6 +156,7 @@ public class AVATAR2UPPAAL { gatesNotSynchronized = new LinkedList(); gatesNotSynchronized.add("makeChoice"); gatesSynchronized = new LinkedList(); + gatesAsynchronized = new LinkedList(); // Deal with blocks translateBlocks(); @@ -234,16 +237,46 @@ public class AVATAR2UPPAAL { public void translationRelations() { AvatarSignal si1, sig2; for(AvatarRelation ar: avspec.getRelations()) { - for(int i=0; i<ar.nbOfSignals(); i++) { - gatesSynchronized.add(relationToString(ar, i)); + if (ar.isAsynchronous()) { + for(int i=0; i<ar.nbOfSignals(); i++) { + gatesAsynchronized.add(relationToString(ar, i, 0)); + gatesAsynchronized.add(relationToString(ar, i, 1)); + } + } else { + for(int i=0; i<ar.nbOfSignals(); i++) { + gatesSynchronized.add(relationToString(ar, i)); + } } } } + + // For synchronous relations public String relationToString(AvatarRelation _ar, int _index) { return _ar.block1.getName() + "_" + _ar.getSignal1(_index).getName() + "__" + _ar.block2.getName() + "_" + _ar.getSignal2(_index).getName(); } + // For asynchronous relations + public String relationToString(AvatarRelation _ar, int _index, int _indexOfBlock) { + String signalName; + AvatarSignal sig; + if (_indexOfBlock == 0) { + sig = _ar.getSignal1(_index); + signalName = _ar.block1.getName() + "_" + sig.getName() + "__"; + } else { + sig = _ar.getSignal2(_index); + signalName = _ar.block2.getName() + "_" + sig.getName() + "__"; + } + + if (sig.isIn()) { + signalName += "rd"; + } else { + signalName += "wr"; + } + + return signalName; + } + public String signalToUPPAALString(AvatarSignal _as) { AvatarRelation ar = avspec.getAvatarRelationWithSignal(_as); if (ar == null) { @@ -319,6 +352,8 @@ public class AVATAR2UPPAAL { spec.addGlobalDeclaration("urgent chan " + action + ";\n"); //spec.addGlobalDeclaration("int " + action + TURTLE2UPPAAL.SYNCID + " = 0;\n"); } + + } public void makeSynchronized() { @@ -326,7 +361,7 @@ public class AVATAR2UPPAAL { return; } - spec.addGlobalDeclaration("\n//Declarations used for synchronized gates\n"); + spec.addGlobalDeclaration("\n//Declarations for synchronous channels\n"); String action; ListIterator iterator = gatesSynchronized.listIterator(); @@ -334,6 +369,13 @@ public class AVATAR2UPPAAL { action = (String)(iterator.next()); spec.addGlobalDeclaration("urgent chan " + action + ";\n"); } + + spec.addGlobalDeclaration("\n//Declarations for asynchronous channels\n"); + iterator = gatesAsynchronized.listIterator(); + while(iterator.hasNext()) { + action = (String)(iterator.next()); + spec.addGlobalDeclaration("urgent chan " + action + ";\n"); + } } public void makeBehaviour(AvatarBlock _block, UPPAALTemplate _template) { diff --git a/src/ui/AvatarDesignPanelTranslator.java b/src/ui/AvatarDesignPanelTranslator.java index 46f8d0b7532eb66db6da5f03ed8638b445e61e66..a93ac0a63039355806bdec9cfeae9a638f77a1a4 100644 --- a/src/ui/AvatarDesignPanelTranslator.java +++ b/src/ui/AvatarDesignPanelTranslator.java @@ -712,6 +712,12 @@ public class AvatarDesignPanelTranslator { TraceManager.addDev("null gates in AVATAR relation: " + name1 + " " + name2); } } + + // Attribute of the relation + r.setBlocking(port.isBlocking()); + r.setAsynchronous(port.isAsynchronous()); + r.setSizeOfFIFO(port.getSizeOfFIFO()); + _as.addRelation(r); } } diff --git a/src/ui/avatarbd/AvatarBDPortConnector.java b/src/ui/avatarbd/AvatarBDPortConnector.java index d768997e97cf0b425293753e0aebbb521ac5f351..a59984c05eb3bfaa15e4e545537eeff147c797ae 100644 --- a/src/ui/avatarbd/AvatarBDPortConnector.java +++ b/src/ui/avatarbd/AvatarBDPortConnector.java @@ -73,6 +73,10 @@ public class AvatarBDPortConnector extends TGConnector implements ScalableTGCom protected LinkedList<String> inSignalsAtDestination; protected LinkedList<String> outSignalsAtOrigin; + protected boolean asynchronous; + protected int sizeOfFIFO; + protected boolean blockingFIFO; + public AvatarBDPortConnector(int _x, int _y, int _minX, int _minY, int _maxX, int _maxY, boolean _pos, TGComponent _father, TDiagramPanel _tdp, TGConnectingPoint _p1, TGConnectingPoint _p2, Vector _listPoint) { @@ -80,6 +84,7 @@ public class AvatarBDPortConnector extends TGConnector implements ScalableTGCom myImageIcon = IconManager.imgic202; value = ""; editable = true; + oldScaleFactor = tdp.getZoom(); inSignalsAtOrigin = new LinkedList<String>(); inSignalsAtDestination = new LinkedList<String>(); @@ -95,17 +100,38 @@ public class AvatarBDPortConnector extends TGConnector implements ScalableTGCom }*/ //g.drawLine(x1, y1, x2, y2); + Color col = g.getColor(); int cz = (int)(tdp.getZoom() * c); + if (isAsynchronous()) { + g.setColor(Color.WHITE); + } g.fillRect(x2-(cz/2), y2-(cz/2), cz, cz); g.fillRect(p1.getX()-(cz/2), p1.getY()-(cz/2), cz, cz); + g.setColor(col); + if (isAsynchronous()) { + g.drawRect(x2-(cz/2), y2-(cz/2), cz, cz); + g.drawRect(p1.getX()-(cz/2), p1.getY()-(cz/2), cz, cz); + if (isBlocking()) { + g.drawLine(x2-(cz/2), y2-(cz/2), x2-(cz/2)+cz, y2-(cz/2)+cz); + g.drawLine(x2-(cz/2), y2-(cz/2)+cz, x2-(cz/2)+cz, y2-(cz/2)); + g.drawLine(p1.getX()-(cz/2), p1.getY()+(cz/2), p1.getX()+(cz/2), p1.getY()-(cz/2)); + g.drawLine(p1.getX()-(cz/2), p1.getY()-(cz/2), p1.getX()+(cz/2), p1.getY()+(cz/2)); + } + } - Point p = GraphicLib.intersectionRectangleSegment(x2-(cz/2), y2-(cz/2), cz, cz, x1, y1, x2, y2); - if (p == null) { + Point p11 = GraphicLib.intersectionRectangleSegment(p1.getX()-(cz/2), p1.getY()-(cz/2), cz, cz, x1, y1, x2, y2); + if (p11 == null) { + p11 = new Point(p1.getX(), p1.getY()); + //System.out.println("null point"); + } + Point p22 = GraphicLib.intersectionRectangleSegment(x2-(cz/2), y2-(cz/2), cz, cz, x1, y1, x2, y2); + if (p22 == null) { + p22 = new Point(p2.getX(), p2.getY()); //System.out.println("null point"); - } else { - g.drawLine(x1, y1, p.x, p.y); } + g.drawLine(p11.x, p11.y, p22.x, p22.y); + Font f = g.getFont(); Font fold = f; f = f.deriveFont((float)fontSize); @@ -205,7 +231,7 @@ public class AvatarBDPortConnector extends TGConnector implements ScalableTGCom Vector v = getAssociationSignals(); JDialogSignalAssociation jdas = new JDialogSignalAssociation(frame, block1, block2, v, this, "Setting signal association"); - jdas.setSize(750, 400); + jdas.setSize(750, 500); GraphicLib.centerOnParent(jdas); jdas.show(); // blocked until dialog has been closed @@ -237,6 +263,21 @@ public class AvatarBDPortConnector extends TGConnector implements ScalableTGCom } } } + + asynchronous = jdas.isAsynchronous(); + blockingFIFO = jdas.isBlocking(); + + try { + sizeOfFIFO = Integer.decode(jdas.getSizeOfFIFO()).intValue(); + sizeOfFIFO = Math.max(1, sizeOfFIFO); + } catch (Exception e) { + JOptionPane.showMessageDialog(frame, + "Unvalid FIFO size: " + jdas.getSizeOfFIFO(), + "Error", + JOptionPane.INFORMATION_MESSAGE); + return false; + } + return true; } @@ -262,6 +303,11 @@ public class AvatarBDPortConnector extends TGConnector implements ScalableTGCom sb.append(oso); sb.append("\" />\n"); } + sb.append("<FIFOType asynchronous=\""); + sb.append(asynchronous); + sb.append("\" size=\"" + sizeOfFIFO); + sb.append("\" blocking=\"" + blockingFIFO); + sb.append("\" />\n"); sb.append("</extraparam>\n"); return new String(sb); @@ -272,7 +318,11 @@ public class AvatarBDPortConnector extends TGConnector implements ScalableTGCom NodeList nli; Node n1, n2; Element elt; - String val; + String val, val1, val2; + sizeOfFIFO = 1024; + blockingFIFO = false; + asynchronous = false; + //System.out.println("Loading attributes"); //System.out.println(nl.toString()); @@ -313,6 +363,38 @@ public class AvatarBDPortConnector extends TGConnector implements ScalableTGCom if ((val != null) && (!(val.equals("null")))) { outSignalsAtOrigin.add(val); + } + } + if (elt.getTagName().equals("FIFOType")) { + val = elt.getAttribute("asynchronous"); + val1 = elt.getAttribute("size"); + val2 = elt.getAttribute("blocking"); + + if ((val != null) && (!(val.equals("null")))) { + if (val.trim().toLowerCase().compareTo("true") == 0) { + asynchronous = true; + } else { + asynchronous = false; + } + + } + + if ((val1 != null) && (!(val1.equals("null")))) { + try { + sizeOfFIFO = Integer.decode(val1).intValue(); + } catch(Exception e) { + sizeOfFIFO = 1024; + } + } + + + if ((val2 != null) && (!(val2.equals("null")))) { + if (val2.trim().toLowerCase().compareTo("true") == 0) { + blockingFIFO = true; + } else { + blockingFIFO = false; + } + } } } @@ -498,5 +580,17 @@ public class AvatarBDPortConnector extends TGConnector implements ScalableTGCom return _s.substring(0, index).trim(); } + public boolean isAsynchronous() { + return asynchronous; + } + + public int getSizeOfFIFO() { + return sizeOfFIFO; + } + + public boolean isBlocking() { + return blockingFIFO; + } + } diff --git a/src/ui/window/JDialogSignalAssociation.java b/src/ui/window/JDialogSignalAssociation.java index d1a49e70e8129d3e2b383a44d8628d4317f01398..7729d85c8eea01047cc94768fb8eee756e490246 100644 --- a/src/ui/window/JDialogSignalAssociation.java +++ b/src/ui/window/JDialogSignalAssociation.java @@ -63,7 +63,11 @@ public class JDialogSignalAssociation extends javax.swing.JDialog implements Act private Vector available1, available2; private AvatarBDPortConnector connector; - private JPanel panel1, panel2; + private JRadioButton synchronous, asynchronous; + private JLabel labelFIFO; + private JTextField sizeOfFIFO; + private JCheckBox blocking; + private JPanel panel1, panel2, panel3; private boolean cancelled = false; @@ -112,9 +116,11 @@ public class JDialogSignalAssociation extends javax.swing.JDialog implements Act GridBagLayout gridbag0 = new GridBagLayout(); GridBagLayout gridbag1 = new GridBagLayout(); GridBagLayout gridbag2 = new GridBagLayout(); + GridBagLayout gridbag3 = new GridBagLayout(); GridBagConstraints c0 = new GridBagConstraints(); GridBagConstraints c1 = new GridBagConstraints(); GridBagConstraints c2 = new GridBagConstraints(); + GridBagConstraints c3 = new GridBagConstraints(); setFont(new Font("Helvetica", Font.PLAIN, 14)); c.setLayout(gridbag0); @@ -130,6 +136,11 @@ public class JDialogSignalAssociation extends javax.swing.JDialog implements Act panel2.setLayout(gridbag2); panel2.setBorder(new javax.swing.border.TitledBorder("Managing Signals")); panel2.setPreferredSize(new Dimension(300, 250)); + + panel3 = new JPanel(); + panel3.setLayout(gridbag3); + panel3.setBorder(new javax.swing.border.TitledBorder("Connector type")); + panel3.setPreferredSize(new Dimension(600, 100)); // first line panel1 c1.weighty = 1.0; @@ -206,7 +217,39 @@ public class JDialogSignalAssociation extends javax.swing.JDialog implements Act removeButton = new JButton("Remove signals"); removeButton.addActionListener(this); panel2.add(removeButton, c2); - + + // panel3 + c3.gridwidth = GridBagConstraints.REMAINDER; //end row + c3.fill = GridBagConstraints.BOTH; + c3.gridheight = 1; + c3.weighty = 1; + c3.weightx = 10.0; + synchronous = new JRadioButton("synchronous"); + synchronous.addActionListener(this); + panel3.add(synchronous, c3); + asynchronous = new JRadioButton("asynchronous"); + asynchronous.addActionListener(this); + panel3.add(asynchronous, c3); + ButtonGroup bt = new ButtonGroup(); + bt.add(synchronous); + bt.add(asynchronous); + asynchronous.setSelected(connector.isAsynchronous()); + synchronous.setSelected(!connector.isAsynchronous()); + + c3.gridwidth = 3; + labelFIFO = new JLabel("Size of FIFO:"); + panel3.add(labelFIFO, c3); + c3.gridwidth = GridBagConstraints.REMAINDER; //end row + sizeOfFIFO = new JTextField(""+connector.getSizeOfFIFO()); + panel3.add(sizeOfFIFO, c3); + + blocking = new JCheckBox("Blocking on write when FIFO is full"); + blocking.setSelected(connector.isBlocking()); + panel3.add(blocking, c3); + + updateSynchronousElements(); + + // main panel; c0.gridwidth = 1; c0.gridheight = 10; @@ -216,6 +259,7 @@ public class JDialogSignalAssociation extends javax.swing.JDialog implements Act c.add(panel1, c0); c0.gridwidth = GridBagConstraints.REMAINDER; //end row c.add(panel2, c0); + c.add(panel3, c0); c0.gridwidth = 1; c0.gridheight = 1; @@ -250,9 +294,20 @@ public class JDialogSignalAssociation extends javax.swing.JDialog implements Act updateAddButton(); } else if (evt.getSource() == signalsBlock2) { updateAddButton(); - } + } else if (evt.getSource() == synchronous) { + updateSynchronousElements(); + } else if (evt.getSource() == asynchronous) { + updateSynchronousElements(); + } } + private void updateSynchronousElements() { + boolean b = asynchronous.isSelected(); + labelFIFO.setEnabled(b); + sizeOfFIFO.setEnabled(b); + blocking.setEnabled(b); + } + private void updateAddButton() { TraceManager.addDev("updateAddButton"); int i1 = signalsBlock1.getSelectedIndex(); @@ -382,5 +437,17 @@ public class JDialogSignalAssociation extends javax.swing.JDialog implements Act } } } + + public boolean isAsynchronous() { + return asynchronous.isSelected(); + } + + public String getSizeOfFIFO() { + return sizeOfFIFO.getText(); + } + + public boolean isBlocking() { + return blocking.isSelected(); + } }