Merge lp:~danilovesky/workcraft/trunk-circuit-env-stg into lp:workcraft

Proposed by Danil Sokolov
Status: Merged
Merged at revision: 501
Proposed branch: lp:~danilovesky/workcraft/trunk-circuit-env-stg
Merge into: lp:workcraft
Diff against target: 2369 lines (+815/-640)
39 files modified
CircuitPlugin/src/org/workcraft/plugins/circuit/CircuitModule.java (+60/-16)
CircuitPlugin/src/org/workcraft/plugins/circuit/Environment.java (+21/-0)
CircuitPlugin/src/org/workcraft/plugins/circuit/VisualCircuit.java (+55/-47)
CircuitPlugin/src/org/workcraft/plugins/circuit/VisualContact.java (+2/-1)
CircuitPlugin/src/org/workcraft/plugins/circuit/VisualFunctionContact.java (+8/-4)
CircuitPlugin/src/org/workcraft/plugins/circuit/tasks/CheckCircuitDeadlockTask.java (+0/-111)
CircuitPlugin/src/org/workcraft/plugins/circuit/tasks/CheckCircuitHazardTask.java (+0/-110)
CircuitPlugin/src/org/workcraft/plugins/circuit/tasks/CheckCircuitTask.java (+213/-68)
CircuitPlugin/src/org/workcraft/plugins/circuit/tools/CheckCircuitDeadlockTool.java (+0/-43)
CircuitPlugin/src/org/workcraft/plugins/circuit/tools/CheckCircuitHazardTool.java (+0/-43)
CircuitPlugin/src/org/workcraft/plugins/circuit/tools/CheckCircuitTool.java (+15/-3)
CircuitPlugin/src/org/workcraft/plugins/circuit/tools/STGGenerator.java (+20/-23)
CpogsPlugin/src/org/workcraft/plugins/cpog/optimisation/dnf/DnfGenerator.java (+3/-1)
DfsPlugin/src/org/workcraft/plugins/dfs/VisualDfs.java (+1/-9)
DfsPlugin/src/org/workcraft/plugins/dfs/tasks/CheckDataflowDeadlockTask.java (+15/-8)
DfsPlugin/src/org/workcraft/plugins/dfs/tasks/CheckDataflowHazardTask.java (+15/-8)
DfsPlugin/src/org/workcraft/plugins/dfs/tasks/CheckDataflowTask.java (+16/-10)
MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatChainResultHandler.java (+44/-37)
MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatMode.java (+2/-2)
MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatSettings.java (+127/-17)
MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatStgReachabilityResultHandler.java (+15/-7)
MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatUndefinedResultHandler.java (+32/-0)
MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatUtilitySettings.java (+22/-0)
MpsatPlugin/src/org/workcraft/plugins/mpsat/gui/MpsatConfigurationDialog.java (+1/-1)
MpsatPlugin/src/org/workcraft/plugins/mpsat/gui/SolutionPanel.java (+1/-1)
MpsatPlugin/src/org/workcraft/plugins/mpsat/tasks/MpsatChainResult.java (+28/-23)
MpsatPlugin/src/org/workcraft/plugins/mpsat/tasks/MpsatChainTask.java (+4/-4)
MpsatPlugin/src/org/workcraft/plugins/pcomp/tasks/PcompResultHandler.java (+2/-2)
MpsatPlugin/src/org/workcraft/plugins/pcomp/tools/PcompTool.java (+3/-1)
PolicyNetPlugin/src/org/workcraft/plugins/policy/tasks/CheckDeadlockTask.java (+15/-8)
STGPlugin/src/org/workcraft/plugins/stg/LabelParser.java (+1/-1)
STGPlugin/src/org/workcraft/plugins/stg/STG.java (+3/-8)
STGPlugin/src/org/workcraft/plugins/stg/VisualSTG.java (+0/-7)
WorkcraftCore/src/org/workcraft/dom/AbstractModel.java (+9/-1)
WorkcraftCore/src/org/workcraft/gui/propertyeditor/FileCellEditor.java (+0/-3)
WorkcraftCore/src/org/workcraft/plugins/BuiltinSerialisers.java (+4/-0)
WorkcraftCore/src/org/workcraft/plugins/serialisation/xml/FileDeserialiser.java (+19/-0)
WorkcraftCore/src/org/workcraft/plugins/serialisation/xml/FileSerialiser.java (+22/-0)
WorkcraftCore/src/org/workcraft/plugins/shared/CommonEditorSettings.java (+17/-12)
To merge this branch: bzr merge lp:~danilovesky/workcraft/trunk-circuit-env-stg
Reviewer Review Type Date Requested Status
Danil Sokolov Approve
Review via email: mp+217640@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Danil Sokolov (danilovesky) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/CircuitModule.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/CircuitModule.java 2013-09-17 14:58:15 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/CircuitModule.java 2014-04-29 16:24:51 +0000
@@ -9,8 +9,6 @@
9import org.workcraft.gui.propertyeditor.SettingsPage;9import org.workcraft.gui.propertyeditor.SettingsPage;
10import org.workcraft.plugins.circuit.serialisation.FunctionDeserialiser;10import org.workcraft.plugins.circuit.serialisation.FunctionDeserialiser;
11import org.workcraft.plugins.circuit.serialisation.FunctionSerialiser;11import org.workcraft.plugins.circuit.serialisation.FunctionSerialiser;
12import org.workcraft.plugins.circuit.tools.CheckCircuitDeadlockTool;
13import org.workcraft.plugins.circuit.tools.CheckCircuitHazardTool;
14import org.workcraft.plugins.circuit.tools.CheckCircuitTool;12import org.workcraft.plugins.circuit.tools.CheckCircuitTool;
15import org.workcraft.plugins.circuit.tools.STGGeneratorTool;13import org.workcraft.plugins.circuit.tools.STGGeneratorTool;
16import org.workcraft.serialisation.xml.XMLDeserialiser;14import org.workcraft.serialisation.xml.XMLDeserialiser;
@@ -34,20 +32,6 @@
34 return new STGGeneratorTool(framework);32 return new STGGeneratorTool(framework);
35 }33 }
36 });34 });
37
38 pm.registerClass(Tool.class, new Initialiser<Tool>() {
39 @Override
40 public Tool create() {
41 return new CheckCircuitDeadlockTool(framework);
42 }
43 });
44
45 pm.registerClass(Tool.class, new Initialiser<Tool>() {
46 @Override
47 public Tool create() {
48 return new CheckCircuitHazardTool(framework);
49 }
50 });
5135
52 pm.registerClass(Tool.class, new Initialiser<Tool>() {36 pm.registerClass(Tool.class, new Initialiser<Tool>() {
53 @Override37 @Override
@@ -56,6 +40,66 @@
56 }40 }
57 });41 });
5842
43 pm.registerClass(Tool.class, new Initialiser<Tool>() {
44 @Override
45 public Tool create() {
46 return new CheckCircuitTool(framework) {
47 @Override
48 public String getDisplayName() {
49 return "Check circuit only for conformation";
50 }
51 @Override
52 public boolean checkDeadlock() {
53 return false;
54 }
55 @Override
56 public boolean checkHazard() {
57 return false;
58 }
59 };
60 }
61 });
62
63 pm.registerClass(Tool.class, new Initialiser<Tool>() {
64 @Override
65 public Tool create() {
66 return new CheckCircuitTool(framework) {
67 @Override
68 public String getDisplayName() {
69 return "Check circuit only for deadlocks";
70 }
71 @Override
72 public boolean checkConformation() {
73 return false;
74 }
75 @Override
76 public boolean checkHazard() {
77 return false;
78 }
79 };
80 }
81 });
82
83 pm.registerClass(Tool.class, new Initialiser<Tool>() {
84 @Override
85 public Tool create() {
86 return new CheckCircuitTool(framework) {
87 @Override
88 public String getDisplayName() {
89 return "Check circuit only for hazards";
90 }
91 @Override
92 public boolean checkConformation() {
93 return false;
94 }
95 @Override
96 public boolean checkDeadlock() {
97 return false;
98 }
99 };
100 }
101 });
102
59 pm.registerClass(ModelDescriptor.class, CircuitModelDescriptor.class);103 pm.registerClass(ModelDescriptor.class, CircuitModelDescriptor.class);
60 pm.registerClass(XMLSerialiser.class, FunctionSerialiser.class);104 pm.registerClass(XMLSerialiser.class, FunctionSerialiser.class);
61 pm.registerClass(XMLDeserialiser.class, FunctionDeserialiser.class);105 pm.registerClass(XMLDeserialiser.class, FunctionDeserialiser.class);
62106
=== added file 'CircuitPlugin/src/org/workcraft/plugins/circuit/Environment.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/Environment.java 1970-01-01 00:00:00 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/Environment.java 2014-04-29 16:24:51 +0000
@@ -0,0 +1,21 @@
1package org.workcraft.plugins.circuit;
2
3import java.io.File;
4
5import org.workcraft.dom.math.MathNode;
6
7public class Environment extends MathNode {
8 private File file;
9
10 public Environment() {
11
12 }
13
14 public File getFile() {
15 return file;
16 }
17
18 public void setFile(File file) {
19 this.file = file;
20 }
21}
022
=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/VisualCircuit.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/VisualCircuit.java 2014-04-09 22:33:19 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/VisualCircuit.java 2014-04-29 16:24:51 +0000
@@ -37,6 +37,7 @@
37import org.workcraft.exceptions.VisualModelInstantiationException;37import org.workcraft.exceptions.VisualModelInstantiationException;
38import org.workcraft.gui.propertyeditor.Properties;38import org.workcraft.gui.propertyeditor.Properties;
39import org.workcraft.plugins.circuit.Contact.IOType;39import org.workcraft.plugins.circuit.Contact.IOType;
40import org.workcraft.serialisation.xml.NoAutoSerialisation;
40import org.workcraft.util.Hierarchy;41import org.workcraft.util.Hierarchy;
4142
4243
@@ -45,10 +46,9 @@
45public class VisualCircuit extends AbstractVisualModel {46public class VisualCircuit extends AbstractVisualModel {
4647
47 private Circuit circuit;48 private Circuit circuit;
48 private File environmentFile;
49 49
50 @Override50 @Override
51 public void validateConnection(Node first, Node second) throws InvalidConnectionException {51 public void validateConnection(Node first, Node second) throws InvalidConnectionException {
52 if (first==second) {52 if (first==second) {
53 throw new InvalidConnectionException ("Connections are only valid between different objects");53 throw new InvalidConnectionException ("Connections are only valid between different objects");
54 }54 }
@@ -77,24 +77,12 @@
77 }77 }
78 }78 }
79 79
80/* 80 public VisualCircuit(Circuit model, VisualGroup root) {
81 private final class StateSupervisorExtension extends StateSupervisor {
82 @Override
83 public void handleEvent(StateEvent e) {
84// if(e instanceof PropertyChangedEvent)
85
86 }
87 }
88*/
89
90 public VisualCircuit(Circuit model, VisualGroup root)
91 {
92 super(model, root);81 super(model, root);
93 circuit=model;82 circuit=model;
94 }83 }
9584
96 public VisualCircuit(Circuit model)85 public VisualCircuit(Circuit model) throws VisualModelInstantiationException {
97 throws VisualModelInstantiationException {
98 super(model);86 super(model);
99 circuit=model;87 circuit=model;
100 try {88 try {
@@ -102,13 +90,10 @@
102 } catch (NodeCreationException e) {90 } catch (NodeCreationException e) {
103 throw new VisualModelInstantiationException(e);91 throw new VisualModelInstantiationException(e);
104 }92 }
105
106 //new StateSupervisorExtension().attach(getRoot());
107 }93 }
10894
109 @Override95 @Override
110 public void connect(Node first, Node second)96 public void connect(Node first, Node second) throws InvalidConnectionException {
111 throws InvalidConnectionException {
112 validateConnection(first, second);97 validateConnection(first, second);
113 98
114 if (first instanceof VisualComponent && second instanceof VisualComponent) {99 if (first instanceof VisualComponent && second instanceof VisualComponent) {
@@ -121,6 +106,56 @@
121 nearestAncestor.add(connection);106 nearestAncestor.add(connection);
122 }107 }
123 }108 }
109
110 public VisualFunctionContact getOrCreateOutput(String name, double x, double y) {
111 for(VisualFunctionContact c : Hierarchy.filterNodesByType(
112 getRoot().getChildren(), VisualFunctionContact.class)) {
113 if(c.getName().equals(name)) return c;
114 }
115 VisualFunctionContact vc = new VisualFunctionContact(new FunctionContact(IOType.OUTPUT));
116 vc.setPosition(new Point2D.Double(x, y));
117 addFunctionContact(vc);
118 vc.setName(name);
119 return vc;
120 }
121
122 public void addFunctionComponent(VisualFunctionComponent component) {
123 for (Node node : component.getMathReferences()) {
124 circuit.add(node);
125 }
126 super.add(component);
127 }
128
129 public void addJoint(VisualJoint joint) {
130 for (Node node : joint.getMathReferences()) {
131 circuit.add(node);
132 }
133 super.add(joint);
134 }
135
136 public void addFunctionContact(VisualFunctionContact contact) {
137 circuit.add(contact.getFunction());
138 super.add(contact);
139 }
140
141 @NoAutoSerialisation
142 public File getEnvironmentFile() {
143 File result = null;
144 for (Environment env: Hierarchy.filterNodesByType(getRoot().getChildren(), Environment.class)) {
145 result = env.getFile();
146 }
147 return result;
148 }
149
150 @NoAutoSerialisation
151 public void setEnvironmentFile(File value) {
152 for (Environment env: Hierarchy.filterNodesByType(getRoot().getChildren(), Environment.class)) {
153 remove(env);
154 }
155 Environment env = new Environment();
156 env.setFile(value);
157 add(env);
158 }
124 159
125 @Override160 @Override
126 public Properties getProperties(Node node) {161 public Properties getProperties(Node node) {
@@ -138,31 +173,4 @@
138 return properties;173 return properties;
139 }174 }
140175
141 public VisualFunctionContact getOrCreateOutput(String name, double x, double y) {
142
143 for(VisualFunctionContact c : Hierarchy.filterNodesByType(getRoot().getChildren(), VisualFunctionContact.class)) {
144 if(c.getName().equals(name)) return c;
145 }
146
147 FunctionContact fc = new FunctionContact(IOType.OUTPUT);
148 VisualFunctionContact vc = new VisualFunctionContact(fc);
149 Point2D p2d = new Point2D.Double();
150 p2d.setLocation(x,y);
151 vc.setPosition(p2d);
152 circuit.add(fc);
153 this.add(vc);
154
155 vc.setName(name);
156
157 return vc;
158 }
159
160 public File getEnvironmentFile() {
161 return environmentFile;
162 }
163
164 public void setEnvironmentFile(File value) {
165 this.environmentFile = value;
166 }
167
168}176}
169177
=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/VisualContact.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/VisualContact.java 2014-01-15 14:11:43 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/VisualContact.java 2014-04-29 16:24:51 +0000
@@ -375,7 +375,8 @@
375 public static boolean isDriver(Node contact) {375 public static boolean isDriver(Node contact) {
376 if (!(contact instanceof VisualContact)) return false;376 if (!(contact instanceof VisualContact)) return false;
377 377
378 return (((VisualContact)contact).getIOType() == IOType.OUTPUT) == (((VisualContact)contact).getParent() instanceof VisualComponent);378 return (((VisualContact)contact).getIOType() == IOType.OUTPUT)
379 == (((VisualContact)contact).getParent() instanceof VisualComponent);
379 }380 }
380381
381382
382383
=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/VisualFunctionContact.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/VisualFunctionContact.java 2014-04-09 17:11:48 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/VisualFunctionContact.java 2014-04-29 16:24:51 +0000
@@ -89,16 +89,18 @@
89 }89 }
90 90
91 FormulaRenderingResult getRenderedSetFormula(FontRenderContext fcon) {91 FormulaRenderingResult getRenderedSetFormula(FontRenderContext fcon) {
92 if (renderedSetFormula == null) {92 if (((FunctionContact)getReferencedContact()).getSetFunction() == null) {
93 return null;
94 } else if (renderedSetFormula == null) {
93 renderedSetFormula = FormulaToGraphics.render(((FunctionContact)getReferencedContact()).getSetFunction(), fcon, font);95 renderedSetFormula = FormulaToGraphics.render(((FunctionContact)getReferencedContact()).getSetFunction(), fcon, font);
94 }96 }
95 return renderedSetFormula;97 return renderedSetFormula;
96 }98 }
97 99
98 FormulaRenderingResult getRenderedResetFormula(FontRenderContext fcon) {100 FormulaRenderingResult getRenderedResetFormula(FontRenderContext fcon) {
99 if (((FunctionContact)getReferencedContact()).getResetFunction()==null) return null;101 if (((FunctionContact)getReferencedContact()).getResetFunction() == null) {
100 102 return null;
101 if (renderedResetFormula == null) {103 } else if (renderedResetFormula == null) {
102 renderedResetFormula = FormulaToGraphics.render(((FunctionContact)getReferencedContact()).getResetFunction(), fcon, font);104 renderedResetFormula = FormulaToGraphics.render(((FunctionContact)getReferencedContact()).getResetFunction(), fcon, font);
103 }105 }
104 return renderedResetFormula;106 return renderedResetFormula;
@@ -154,6 +156,8 @@
154 156
155 157
156 private void drawFormula(Graphics2D g, int arrowType, float xOffset, float yOffset, Color foreground, Color background, FormulaRenderingResult result) {158 private void drawFormula(Graphics2D g, int arrowType, float xOffset, float yOffset, Color foreground, Color background, FormulaRenderingResult result) {
159 if (result == null) return;
160
157 Rectangle2D textBB = result.boundingBox;161 Rectangle2D textBB = result.boundingBox;
158 float textX = 0;162 float textX = 0;
159 float textY = (float)-textBB.getCenterY()-(float)0.5-yOffset;163 float textY = (float)-textBB.getCenterY()-(float)0.5-yOffset;
160164
=== removed file 'CircuitPlugin/src/org/workcraft/plugins/circuit/tasks/CheckCircuitDeadlockTask.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/tasks/CheckCircuitDeadlockTask.java 2014-04-16 21:55:15 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/tasks/CheckCircuitDeadlockTask.java 1970-01-01 00:00:00 +0000
@@ -1,111 +0,0 @@
1package org.workcraft.plugins.circuit.tasks;
2
3import java.io.File;
4
5import org.workcraft.Framework;
6import org.workcraft.interop.Exporter;
7import org.workcraft.plugins.circuit.VisualCircuit;
8import org.workcraft.plugins.circuit.tools.STGGenerator;
9import org.workcraft.plugins.mpsat.MpsatMode;
10import org.workcraft.plugins.mpsat.MpsatResultParser;
11import org.workcraft.plugins.mpsat.MpsatSettings;
12import org.workcraft.plugins.mpsat.MpsatUtilitySettings;
13import org.workcraft.plugins.mpsat.tasks.MpsatChainResult;
14import org.workcraft.plugins.mpsat.tasks.MpsatChainTask;
15import org.workcraft.plugins.mpsat.tasks.MpsatTask;
16import org.workcraft.plugins.mpsat.tasks.PunfTask;
17import org.workcraft.plugins.shared.tasks.ExternalProcessResult;
18import org.workcraft.plugins.stg.STGModel;
19import org.workcraft.serialisation.Format;
20import org.workcraft.tasks.ProgressMonitor;
21import org.workcraft.tasks.Result;
22import org.workcraft.tasks.Result.Outcome;
23import org.workcraft.tasks.SubtaskMonitor;
24import org.workcraft.util.Export;
25import org.workcraft.util.Export.ExportTask;
26import org.workcraft.workspace.WorkspaceEntry;
27
28
29public class CheckCircuitDeadlockTask extends MpsatChainTask {
30 private final MpsatSettings settings;
31 private final WorkspaceEntry we;
32 private final Framework framework;
33
34 public CheckCircuitDeadlockTask(WorkspaceEntry we, Framework framework) {
35 super (we, null, framework);
36 this.we = we;
37 this.framework = framework;
38 this.settings = new MpsatSettings("Deadlock freedom", MpsatMode.DEADLOCK, 0,
39 MpsatUtilitySettings.getSolutionMode(), MpsatUtilitySettings.getSolutionCount(), null);
40 }
41
42 @Override
43 public Result<? extends MpsatChainResult> run(ProgressMonitor<? super MpsatChainResult> monitor) {
44 try {
45 monitor.progressUpdate(0.05);
46 VisualCircuit circuit = (VisualCircuit) we.getModelEntry().getVisualModel();
47 STGModel model = (STGModel) STGGenerator.generate(circuit).getMathModel();
48 monitor.progressUpdate(0.10);
49
50 Exporter exporter = Export.chooseBestExporter(framework.getPluginManager(), model, Format.STG);
51 if (exporter == null) {
52 throw new RuntimeException ("Exporter not available: model class " + model.getClass().getName() + " to format STG.");
53 }
54
55 File netFile = File.createTempFile("net", exporter.getExtenstion());
56 ExportTask exportTask = new ExportTask(exporter, model, netFile.getCanonicalPath());
57 SubtaskMonitor<Object> mon = new SubtaskMonitor<Object>(monitor);
58 Result<? extends Object> exportResult = framework.getTaskManager().execute(exportTask, "Exporting .g", mon);
59 if (exportResult.getOutcome() != Outcome.FINISHED) {
60 netFile.delete();
61 if (exportResult.getOutcome() == Outcome.CANCELLED) {
62 return new Result<MpsatChainResult>(Outcome.CANCELLED);
63 }
64 return new Result<MpsatChainResult>(Outcome.FAILED,
65 new MpsatChainResult(exportResult, null, null, settings));
66 }
67 monitor.progressUpdate(0.20);
68
69 File mciFile = File.createTempFile("unfolding", ".mci");
70 PunfTask punfTask = new PunfTask(netFile.getCanonicalPath(), mciFile.getCanonicalPath());
71 Result<? extends ExternalProcessResult> punfResult = framework.getTaskManager().execute(punfTask, "Unfolding .g", mon);
72 netFile.delete();
73 if (punfResult.getOutcome() != Outcome.FINISHED) {
74 mciFile.delete();
75 if (punfResult.getOutcome() == Outcome.CANCELLED) {
76 return new Result<MpsatChainResult>(Outcome.CANCELLED);
77 }
78 return new Result<MpsatChainResult>(Outcome.FAILED,
79 new MpsatChainResult(exportResult, punfResult, null, settings));
80 }
81 monitor.progressUpdate(0.70);
82
83 MpsatTask mpsatTask = new MpsatTask(settings.getMpsatArguments(), mciFile.getCanonicalPath());
84 Result<? extends ExternalProcessResult> mpsatResult = framework.getTaskManager().execute(mpsatTask, "Running deadlock checking [MPSat]", mon);
85 if (mpsatResult.getOutcome() != Outcome.FINISHED) {
86 if (mpsatResult.getOutcome() == Outcome.CANCELLED) {
87 return new Result<MpsatChainResult>(Outcome.CANCELLED);
88 }
89 return new Result<MpsatChainResult>(Outcome.FAILED,
90 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings ));
91 }
92 monitor.progressUpdate(0.90);
93
94 MpsatResultParser mdp = new MpsatResultParser(mpsatResult.getReturnValue());
95 if (!mdp.getSolutions().isEmpty()) {
96 mciFile.delete();
97 return new Result<MpsatChainResult>(Outcome.FINISHED,
98 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings, "Circuit has a deadlock"));
99 }
100 monitor.progressUpdate(1.0);
101
102 mciFile.delete();
103 return new Result<MpsatChainResult>(Outcome.FINISHED,
104 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings, "Circuit is deadlock-free"));
105
106 } catch (Throwable e) {
107 return new Result<MpsatChainResult>(e);
108 }
109 }
110
111}
1120
=== removed file 'CircuitPlugin/src/org/workcraft/plugins/circuit/tasks/CheckCircuitHazardTask.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/tasks/CheckCircuitHazardTask.java 2014-04-16 21:55:15 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/tasks/CheckCircuitHazardTask.java 1970-01-01 00:00:00 +0000
@@ -1,110 +0,0 @@
1package org.workcraft.plugins.circuit.tasks;
2
3import java.io.File;
4
5import org.workcraft.Framework;
6import org.workcraft.interop.Exporter;
7import org.workcraft.plugins.circuit.VisualCircuit;
8import org.workcraft.plugins.circuit.tools.STGGenerator;
9import org.workcraft.plugins.mpsat.MpsatMode;
10import org.workcraft.plugins.mpsat.MpsatResultParser;
11import org.workcraft.plugins.mpsat.MpsatSettings;
12import org.workcraft.plugins.mpsat.MpsatUtilitySettings;
13import org.workcraft.plugins.mpsat.tasks.MpsatChainResult;
14import org.workcraft.plugins.mpsat.tasks.MpsatChainTask;
15import org.workcraft.plugins.mpsat.tasks.MpsatTask;
16import org.workcraft.plugins.mpsat.tasks.PunfTask;
17import org.workcraft.plugins.shared.tasks.ExternalProcessResult;
18import org.workcraft.plugins.stg.STGModel;
19import org.workcraft.serialisation.Format;
20import org.workcraft.tasks.ProgressMonitor;
21import org.workcraft.tasks.Result;
22import org.workcraft.tasks.Result.Outcome;
23import org.workcraft.tasks.SubtaskMonitor;
24import org.workcraft.util.Export;
25import org.workcraft.util.Export.ExportTask;
26import org.workcraft.workspace.WorkspaceEntry;
27
28
29public class CheckCircuitHazardTask extends MpsatChainTask {
30 private final MpsatSettings settings;
31 private final WorkspaceEntry we;
32 private final Framework framework;
33
34 public CheckCircuitHazardTask(WorkspaceEntry we, Framework framework) {
35 super (we, null, framework);
36 this.we = we;
37 this.framework = framework;
38 this.settings = new MpsatSettings("Output persistence", MpsatMode.STG_REACHABILITY, 0,
39 MpsatUtilitySettings.getSolutionMode(), MpsatUtilitySettings.getSolutionCount(),
40 MpsatSettings.reachSemimodularity);
41}
42
43 @Override
44 public Result<? extends MpsatChainResult> run(ProgressMonitor<? super MpsatChainResult> monitor) {
45 try {
46 monitor.progressUpdate(0.05);
47 VisualCircuit circuit = (VisualCircuit) we.getModelEntry().getVisualModel();
48 STGModel model = (STGModel) STGGenerator.generate(circuit).getMathModel();
49 monitor.progressUpdate(0.10);
50
51 Exporter exporter = Export.chooseBestExporter(framework.getPluginManager(), model, Format.STG);
52 if (exporter == null) {
53 throw new RuntimeException ("Exporter not available: model class " + model.getClass().getName() + " to format STG.");
54 }
55
56 File netFile = File.createTempFile("net", exporter.getExtenstion());
57 ExportTask exportTask = new ExportTask(exporter, model, netFile.getCanonicalPath());
58 SubtaskMonitor<Object> mon = new SubtaskMonitor<Object>(monitor);
59 Result<? extends Object> exportResult = framework.getTaskManager().execute(exportTask, "Exporting .g", mon);
60 if (exportResult.getOutcome() != Outcome.FINISHED) {
61 netFile.delete();
62 if (exportResult.getOutcome() == Outcome.CANCELLED) {
63 return new Result<MpsatChainResult>(Outcome.CANCELLED);
64 }
65 return new Result<MpsatChainResult>(Outcome.FAILED, new MpsatChainResult(exportResult, null, null, settings));
66 }
67 monitor.progressUpdate(0.20);
68
69 File mciFile = File.createTempFile("unfolding", ".mci");
70 PunfTask punfTask = new PunfTask(netFile.getCanonicalPath(), mciFile.getCanonicalPath());
71 Result<? extends ExternalProcessResult> punfResult = framework.getTaskManager().execute(punfTask, "Unfolding .g", mon);
72 netFile.delete();
73 if (punfResult.getOutcome() != Outcome.FINISHED) {
74 mciFile.delete();
75 if (punfResult.getOutcome() == Outcome.CANCELLED) {
76 return new Result<MpsatChainResult>(Outcome.CANCELLED);
77 }
78 return new Result<MpsatChainResult>(Outcome.FAILED,
79 new MpsatChainResult(exportResult, punfResult, null, settings));
80 }
81 monitor.progressUpdate(0.70);
82
83 MpsatTask mpsatTask = new MpsatTask(settings.getMpsatArguments(), mciFile.getCanonicalPath());
84 Result<? extends ExternalProcessResult> mpsatResult = framework.getTaskManager().execute(mpsatTask, "Running semimodularity checking [MPSat]", mon);
85 if (mpsatResult.getOutcome() != Outcome.FINISHED) {
86 if (mpsatResult.getOutcome() == Outcome.CANCELLED)
87 return new Result<MpsatChainResult>(Outcome.CANCELLED);
88
89 return new Result<MpsatChainResult>(Outcome.FAILED,
90 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings));
91 }
92
93 MpsatResultParser mdp = new MpsatResultParser(mpsatResult.getReturnValue());
94 if (!mdp.getSolutions().isEmpty()) {
95 mciFile.delete();
96 return new Result<MpsatChainResult>(Outcome.FINISHED,
97 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings, "Circuit has hazard(s)"));
98 }
99 monitor.progressUpdate(1.0);
100
101 mciFile.delete();
102 return new Result<MpsatChainResult>(Outcome.FINISHED,
103 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings, "Circuit is hazard-free"));
104
105 } catch (Throwable e) {
106 return new Result<MpsatChainResult>(e);
107 }
108 }
109
110}
1110
=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/tasks/CheckCircuitTask.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/tasks/CheckCircuitTask.java 2014-04-16 21:55:15 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/tasks/CheckCircuitTask.java 2014-04-29 16:24:51 +0000
@@ -14,8 +14,10 @@
14import org.workcraft.plugins.mpsat.tasks.MpsatChainTask;14import org.workcraft.plugins.mpsat.tasks.MpsatChainTask;
15import org.workcraft.plugins.mpsat.tasks.MpsatTask;15import org.workcraft.plugins.mpsat.tasks.MpsatTask;
16import org.workcraft.plugins.mpsat.tasks.PunfTask;16import org.workcraft.plugins.mpsat.tasks.PunfTask;
17import org.workcraft.plugins.pcomp.PCompOutputMode;
18import org.workcraft.plugins.pcomp.tasks.PcompTask;
17import org.workcraft.plugins.shared.tasks.ExternalProcessResult;19import org.workcraft.plugins.shared.tasks.ExternalProcessResult;
18import org.workcraft.plugins.stg.STGModel;20import org.workcraft.plugins.stg.STG;
19import org.workcraft.serialisation.Format;21import org.workcraft.serialisation.Format;
20import org.workcraft.tasks.ProgressMonitor;22import org.workcraft.tasks.ProgressMonitor;
21import org.workcraft.tasks.Result;23import org.workcraft.tasks.Result;
@@ -23,111 +25,254 @@
23import org.workcraft.tasks.SubtaskMonitor;25import org.workcraft.tasks.SubtaskMonitor;
24import org.workcraft.util.Export;26import org.workcraft.util.Export;
25import org.workcraft.util.Export.ExportTask;27import org.workcraft.util.Export.ExportTask;
28import org.workcraft.util.FileUtils;
26import org.workcraft.workspace.WorkspaceEntry;29import org.workcraft.workspace.WorkspaceEntry;
2730
2831
29public class CheckCircuitTask extends MpsatChainTask {32public class CheckCircuitTask extends MpsatChainTask {
30 private final MpsatSettings deadlockSettings;33 private final MpsatSettings toolchainPreparationSettings = new MpsatSettings("Toolchain preparation of data",
31 private final MpsatSettings hazardSettings;34 MpsatMode.UNDEFINED, 0, null, 0, null);
35
36 private final MpsatSettings toolchainCompletionSettings = new MpsatSettings("Toolchain completion",
37 MpsatMode.UNDEFINED, 0, null, 0, null);
38
39 private final MpsatSettings deadlockSettings = new MpsatSettings("Deadlock freedom",
40 MpsatMode.DEADLOCK, 0, MpsatUtilitySettings.getSolutionMode(),
41 MpsatUtilitySettings.getSolutionCount(), null);
42
43 private final MpsatSettings hazardSettings = new MpsatSettings("Output persistence",
44 MpsatMode.STG_REACHABILITY, 0, MpsatUtilitySettings.getSolutionMode(),
45 MpsatUtilitySettings.getSolutionCount(), MpsatSettings.reachSemimodularity);
46
32 private final WorkspaceEntry we;47 private final WorkspaceEntry we;
33 private final Framework framework;48 private final Framework framework;
49 private final boolean checkConformation;
50 private final boolean checkDeadlock;
51 private final boolean checkHazard;
34 52
35 public CheckCircuitTask(WorkspaceEntry we, Framework framework) {53 public CheckCircuitTask(WorkspaceEntry we, Framework framework,
54 boolean checkConformation, boolean checkDeadlock, boolean checkHazard) {
36 super (we, null, framework);55 super (we, null, framework);
37 this.we = we;56 this.we = we;
38 this.framework = framework;57 this.framework = framework;
39 58 this.checkConformation = checkConformation;
40 this.deadlockSettings = new MpsatSettings("Deadlock freedom", MpsatMode.DEADLOCK, 0, 59 this.checkDeadlock = checkDeadlock;
41 MpsatUtilitySettings.getSolutionMode(), MpsatUtilitySettings.getSolutionCount(), null);60 this.checkHazard = checkHazard;
42
43 this.hazardSettings = new MpsatSettings("Output persistence", MpsatMode.STG_REACHABILITY, 0,
44 MpsatUtilitySettings.getSolutionMode(), MpsatUtilitySettings.getSolutionCount(),
45 MpsatSettings.reachSemimodularity);
46 }61 }
47 62
48 @Override63 @Override
49 public Result<? extends MpsatChainResult> run(ProgressMonitor<? super MpsatChainResult> monitor) {64 public Result<? extends MpsatChainResult> run(ProgressMonitor<? super MpsatChainResult> monitor) {
50 try {65 try {
66 // Common variables
51 monitor.progressUpdate(0.05);67 monitor.progressUpdate(0.05);
52 VisualCircuit circuit = (VisualCircuit) we.getModelEntry().getVisualModel();68 String title = we.getWorkspacePath().getNode();
53 STGModel model = (STGModel) STGGenerator.generate(circuit).getMathModel();69 if (title.endsWith(".work")) {
70 title = title.substring(0, title.length() - 5);
71 }
72 VisualCircuit visualCircuit = (VisualCircuit)we.getModelEntry().getVisualModel();
73 STG circuitStg = (STG)STGGenerator.generate(visualCircuit).getMathModel();
74 Exporter stgExporter = Export.chooseBestExporter(framework.getPluginManager(), circuitStg, Format.STG);
75 if (stgExporter == null) {
76 throw new RuntimeException ("Exporter not available: model class " + circuitStg.getClass().getName() + " to format STG.");
77 }
78 SubtaskMonitor<Object> subtaskMonitor = new SubtaskMonitor<Object>(monitor);
54 monitor.progressUpdate(0.10);79 monitor.progressUpdate(0.10);
55 80
56 Exporter exporter = Export.chooseBestExporter(framework.getPluginManager(), model, Format.STG);81 // Generating .g for the circuit
57 if (exporter == null) {82 File circuitStgFile = File.createTempFile(title + "-circuit-", stgExporter.getExtenstion());
58 throw new RuntimeException ("Exporter not available: model class " + model.getClass().getName() + " to format STG.");83 ExportTask circuitExportTask = new ExportTask(stgExporter, circuitStg, circuitStgFile.getCanonicalPath());
59 }84 Result<? extends Object> circuitExportResult = framework.getTaskManager().execute(
60 85 circuitExportTask, "Exporting circuit .g", subtaskMonitor);
61 File netFile = File.createTempFile("net", exporter.getExtenstion());86
62 ExportTask exportTask = new ExportTask(exporter, model, netFile.getCanonicalPath());87 if (circuitExportResult.getOutcome() != Outcome.FINISHED) {
63 SubtaskMonitor<Object> mon = new SubtaskMonitor<Object>(monitor);88 circuitStgFile.delete();
64 Result<? extends Object> exportResult = framework.getTaskManager().execute(exportTask, "Exporting .g", mon);89 if (circuitExportResult.getOutcome() == Outcome.CANCELLED) {
65 if (exportResult.getOutcome() != Outcome.FINISHED) {
66 netFile.delete();
67 if (exportResult.getOutcome() == Outcome.CANCELLED) {
68 return new Result<MpsatChainResult>(Outcome.CANCELLED);90 return new Result<MpsatChainResult>(Outcome.CANCELLED);
69 }91 }
70 return new Result<MpsatChainResult>(Outcome.FAILED,92 return new Result<MpsatChainResult>(Outcome.FAILED,
71 new MpsatChainResult(exportResult, null, null, deadlockSettings));93 new MpsatChainResult(circuitExportResult, null, null, null, toolchainPreparationSettings));
72 }94 }
73 monitor.progressUpdate(0.20);95 monitor.progressUpdate(0.20);
74 96
75 File mciFile = File.createTempFile("unfolding", ".mci");97 // Generating .g for the environment
76 PunfTask punfTask = new PunfTask(netFile.getCanonicalPath(), mciFile.getCanonicalPath());98 File stgFile;
77 Result<? extends ExternalProcessResult> punfResult = framework.getTaskManager().execute(punfTask, "Unfolding .g", mon);99 STG stg;
78 netFile.delete();100 Result<? extends ExternalProcessResult> pcompResult = null;
101 File environmentFile = visualCircuit.getEnvironmentFile();
102 boolean hasEnvironment = ((environmentFile != null) && environmentFile.exists());
103 if ( !hasEnvironment ) {
104 // No environment to compose with
105 stgFile = circuitStgFile;
106 stg = circuitStg;
107 } else {
108 // Compose circuit with its environment
109 File environmentStgFile;
110 if (environmentFile.getName().endsWith(".g")) {
111 environmentStgFile = environmentFile;
112 } else {
113 STG environementStg = (STG)framework.loadFile(environmentFile).getMathModel();
114 environmentStgFile = File.createTempFile(title + "-environment-", stgExporter.getExtenstion());
115 ExportTask environmentExportTask = new ExportTask(stgExporter, environementStg, environmentStgFile.getCanonicalPath());
116 Result<? extends Object> environmentExportResult = framework.getTaskManager().execute(
117 environmentExportTask, "Exporting environment .g", subtaskMonitor);
118
119 if (environmentExportResult.getOutcome() != Outcome.FINISHED) {
120 environmentStgFile.delete();
121 if (environmentExportResult.getOutcome() == Outcome.CANCELLED) {
122 return new Result<MpsatChainResult>(Outcome.CANCELLED);
123 }
124 return new Result<MpsatChainResult>(Outcome.FAILED,
125 new MpsatChainResult(environmentExportResult, null, null, null, toolchainPreparationSettings));
126 }
127 }
128 monitor.progressUpdate(0.25);
129
130 // Generating .g for the whole system (circuit and environment)
131 stgFile = File.createTempFile(title + "-system-", stgExporter.getExtenstion());
132 PcompTask pcompTask = new PcompTask(new File[]{circuitStgFile, environmentStgFile}, PCompOutputMode.OUTPUT, false);
133 pcompResult = framework.getTaskManager().execute(
134 pcompTask, "Running pcomp", subtaskMonitor);
135
136 if (pcompResult.getOutcome() != Outcome.FINISHED) {
137 circuitStgFile.delete();
138 if (pcompResult.getOutcome() == Outcome.CANCELLED) {
139 return new Result<MpsatChainResult>(Outcome.CANCELLED);
140 }
141 return new Result<MpsatChainResult>(Outcome.FAILED,
142 new MpsatChainResult(circuitExportResult, pcompResult, null, null, toolchainPreparationSettings));
143 }
144 FileUtils.writeAllText(stgFile, new String(pcompResult.getReturnValue().getOutput()));
145 WorkspaceEntry stgWorkspaceEntry = framework.getWorkspace().open(stgFile, true);
146 stg = (STG)stgWorkspaceEntry.getModelEntry().getMathModel();
147 }
148 monitor.progressUpdate(0.30);
149
150 // Generate unfolding
151 File mciFile = File.createTempFile(title+"-unfolding-", ".mci");
152 PunfTask punfTask = new PunfTask(stgFile.getCanonicalPath(), mciFile.getCanonicalPath());
153 Result<? extends ExternalProcessResult> punfResult = framework.getTaskManager().execute(
154 punfTask, "Unfolding .g", subtaskMonitor);
155
156 stgFile.delete();
79 if (punfResult.getOutcome() != Outcome.FINISHED) {157 if (punfResult.getOutcome() != Outcome.FINISHED) {
80 mciFile.delete();158 mciFile.delete();
81 if (punfResult.getOutcome() == Outcome.CANCELLED) {159 if (punfResult.getOutcome() == Outcome.CANCELLED) {
82 return new Result<MpsatChainResult>(Outcome.CANCELLED);160 return new Result<MpsatChainResult>(Outcome.CANCELLED);
83 }161 }
84 return new Result<MpsatChainResult>(Outcome.FAILED, 162 return new Result<MpsatChainResult>(Outcome.FAILED,
85 new MpsatChainResult(exportResult, punfResult, null, deadlockSettings));163 new MpsatChainResult(circuitExportResult, pcompResult, punfResult, null, toolchainPreparationSettings));
86 }164 }
87 monitor.progressUpdate(0.40);165 monitor.progressUpdate(0.40);
88166
89 MpsatTask mpsatTask = new MpsatTask(deadlockSettings.getMpsatArguments(), mciFile.getCanonicalPath());167 // Check for interface conformation (only if the environment is specified)
90 Result<? extends ExternalProcessResult> mpsatResult = framework.getTaskManager().execute(mpsatTask, "Running deadlock checking [MPSat]", mon);168 if (hasEnvironment && checkConformation) {
91 if (mpsatResult.getOutcome() != Outcome.FINISHED) {169 String reachConformation = MpsatSettings.genReachConformation(stg, circuitStg);
92 if (mpsatResult.getOutcome() == Outcome.CANCELLED) {170 if (MpsatUtilitySettings.getDebugReach()) {
93 return new Result<MpsatChainResult>(Outcome.CANCELLED);171 System.out.println("\nReach expression for the interface conformation property:");
94 }172 System.out.println(reachConformation);
95 return new Result<MpsatChainResult>(Outcome.FAILED, 173 }
96 new MpsatChainResult(exportResult, punfResult, mpsatResult, deadlockSettings));174 MpsatSettings conformationSettings = new MpsatSettings("Interface conformation",
175 MpsatMode.STG_REACHABILITY, 0, MpsatUtilitySettings.getSolutionMode(),
176 MpsatUtilitySettings.getSolutionCount(), reachConformation);
177
178 MpsatTask mpsatConformationTask = new MpsatTask(conformationSettings.getMpsatArguments(), mciFile.getCanonicalPath());
179 Result<? extends ExternalProcessResult> mpsatConformationResult = framework.getTaskManager().execute(
180 mpsatConformationTask, "Running conformation check [MPSat]", subtaskMonitor);
181
182 if (mpsatConformationResult.getOutcome() != Outcome.FINISHED) {
183 if (mpsatConformationResult.getOutcome() == Outcome.CANCELLED) {
184 return new Result<MpsatChainResult>(Outcome.CANCELLED);
185 }
186 return new Result<MpsatChainResult>(Outcome.FAILED,
187 new MpsatChainResult(circuitExportResult, pcompResult, punfResult, mpsatConformationResult, conformationSettings));
188 }
189 monitor.progressUpdate(0.50);
190
191 MpsatResultParser mpsatConformationParser = new MpsatResultParser(mpsatConformationResult.getReturnValue());
192 if (!mpsatConformationParser.getSolutions().isEmpty()) {
193 mciFile.delete();
194 return new Result<MpsatChainResult>(Outcome.FINISHED,
195 new MpsatChainResult(circuitExportResult, pcompResult, punfResult, mpsatConformationResult, conformationSettings,
196 "Circuit does not conform to the environment after the following trace:"));
197 }
97 }198 }
98 monitor.progressUpdate(0.60);199 monitor.progressUpdate(0.60);
99 200
100 MpsatResultParser mdp = new MpsatResultParser(mpsatResult.getReturnValue());201 // Check for deadlock
101 if (!mdp.getSolutions().isEmpty()) {202 if (checkDeadlock) {
102 mciFile.delete();203 MpsatTask mpsatDeadlockTask = new MpsatTask(deadlockSettings.getMpsatArguments(), mciFile.getCanonicalPath());
103 return new Result<MpsatChainResult>(Outcome.FINISHED, 204 Result<? extends ExternalProcessResult> mpsatDeadlockResult = framework.getTaskManager().execute(
104 new MpsatChainResult(exportResult, punfResult, mpsatResult, deadlockSettings, "Circuit has a deadlock"));205 mpsatDeadlockTask, "Running deadlock check [MPSat]", subtaskMonitor);
105 }206
106 monitor.progressUpdate(0.70);207 if (mpsatDeadlockResult.getOutcome() != Outcome.FINISHED) {
107 208 if (mpsatDeadlockResult.getOutcome() == Outcome.CANCELLED) {
108 mpsatTask = new MpsatTask(hazardSettings.getMpsatArguments(), mciFile.getCanonicalPath());209 return new Result<MpsatChainResult>(Outcome.CANCELLED);
109 mpsatResult = framework.getTaskManager().execute(mpsatTask, "Running semimodularity checking [MPSat]", mon);210 }
110 if (mpsatResult.getOutcome() != Outcome.FINISHED) {211 return new Result<MpsatChainResult>(Outcome.FAILED,
111 if (mpsatResult.getOutcome() == Outcome.CANCELLED)212 new MpsatChainResult(circuitExportResult, pcompResult, punfResult, mpsatDeadlockResult, deadlockSettings));
112 return new Result<MpsatChainResult>(Outcome.CANCELLED);213 }
113 214 monitor.progressUpdate(0.70);
114 return new Result<MpsatChainResult>(Outcome.FAILED, 215
115 new MpsatChainResult(exportResult, punfResult, mpsatResult, hazardSettings));216 MpsatResultParser mpsatDeadlockParser = new MpsatResultParser(mpsatDeadlockResult.getReturnValue());
116 }217 if (!mpsatDeadlockParser.getSolutions().isEmpty()) {
117 monitor.progressUpdate(0.90);218 mciFile.delete();
118219 return new Result<MpsatChainResult>(Outcome.FINISHED,
119 mdp = new MpsatResultParser(mpsatResult.getReturnValue());220 new MpsatChainResult(circuitExportResult, pcompResult, punfResult, mpsatDeadlockResult, deadlockSettings,
120 if (!mdp.getSolutions().isEmpty()) {221 "Circuit has a deadlock after the following trace:"));
121 mciFile.delete();222 }
122 return new Result<MpsatChainResult>(Outcome.FINISHED, 223 }
123 new MpsatChainResult(exportResult, punfResult, mpsatResult, hazardSettings, "Circuit has hazard(s)"));224 monitor.progressUpdate(0.80);
225
226 // Check for hazards
227 if (checkHazard) {
228 MpsatTask mpsatHazardTask = new MpsatTask(hazardSettings.getMpsatArguments(), mciFile.getCanonicalPath());
229 if (MpsatUtilitySettings.getDebugReach()) {
230 System.out.println("\nReach expression for the hazard property:");
231 System.out.println(hazardSettings.getReach());
232 }
233 Result<? extends ExternalProcessResult> mpsatHazardResult = framework.getTaskManager().execute(
234 mpsatHazardTask, "Running hazard check [MPSat]", subtaskMonitor);
235
236 if (mpsatHazardResult.getOutcome() != Outcome.FINISHED) {
237 if (mpsatHazardResult.getOutcome() == Outcome.CANCELLED) {
238 return new Result<MpsatChainResult>(Outcome.CANCELLED);
239 }
240 return new Result<MpsatChainResult>(Outcome.FAILED,
241 new MpsatChainResult(circuitExportResult, pcompResult, punfResult, mpsatHazardResult, hazardSettings));
242 }
243 monitor.progressUpdate(0.90);
244
245 MpsatResultParser mpsatHazardParser = new MpsatResultParser(mpsatHazardResult.getReturnValue());
246 if (!mpsatHazardParser.getSolutions().isEmpty()) {
247 mciFile.delete();
248 return new Result<MpsatChainResult>(Outcome.FINISHED,
249 new MpsatChainResult(circuitExportResult, pcompResult, punfResult, mpsatHazardResult, hazardSettings,
250 "Circuit has a hazard after the following trace:"));
251 }
124 }252 }
125 monitor.progressUpdate(1.0);253 monitor.progressUpdate(1.0);
126254
255 // Success
127 mciFile.delete();256 mciFile.delete();
257 String message = "";
258 if (hasEnvironment) {
259 message = "Under the given environment (" + environmentFile.getName() + ")";
260 } else {
261 message = "Without environment restrictions";
262 }
263 message += " the circuit is:\n";
264 if (checkConformation) {
265 message += " * conformant\n";
266 }
267 if (checkDeadlock) {
268 message += " * deadlock-free\n";
269 }
270 if (checkHazard) {
271 message += " * hazard-free\n";
272 }
128 return new Result<MpsatChainResult>(Outcome.FINISHED, 273 return new Result<MpsatChainResult>(Outcome.FINISHED,
129 new MpsatChainResult(exportResult, punfResult, mpsatResult, hazardSettings, "Circuit is deadlock-free and hazard-free"));274 new MpsatChainResult(circuitExportResult, pcompResult, punfResult, null, toolchainCompletionSettings, message));
130 275
131 } catch (Throwable e) {276 } catch (Throwable e) {
132 return new Result<MpsatChainResult>(e);277 return new Result<MpsatChainResult>(e);
133 }278 }
134279
=== removed file 'CircuitPlugin/src/org/workcraft/plugins/circuit/tools/CheckCircuitDeadlockTool.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/tools/CheckCircuitDeadlockTool.java 2013-09-17 14:58:15 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/tools/CheckCircuitDeadlockTool.java 1970-01-01 00:00:00 +0000
@@ -1,43 +0,0 @@
1package org.workcraft.plugins.circuit.tools;
2
3import org.workcraft.Framework;
4import org.workcraft.Tool;
5import org.workcraft.plugins.circuit.Circuit;
6import org.workcraft.plugins.circuit.tasks.CheckCircuitDeadlockTask;
7import org.workcraft.plugins.mpsat.MpsatChainResultHandler;
8import org.workcraft.workspace.WorkspaceEntry;
9
10public class CheckCircuitDeadlockTool implements Tool {
11 private final Framework framework;
12
13 public CheckCircuitDeadlockTool(Framework framework) {
14 this.framework = framework;
15 }
16
17 public String getDisplayName() {
18 return "Check circuit for deadlocks";
19 }
20
21
22 @Override
23 public String getSection() {
24 return "Verification";
25 }
26
27 @Override
28 public boolean isApplicableTo(WorkspaceEntry we) {
29 return we.getModelEntry().getMathModel() instanceof Circuit;
30 }
31
32 @Override
33 public void run(WorkspaceEntry we) {
34 final CheckCircuitDeadlockTask task = new CheckCircuitDeadlockTask(we, framework);
35 String description = "MPSat tool chain";
36 String title = we.getModelEntry().getModel().getTitle();
37 if (!title.isEmpty()) {
38 description += "(" + title +")";
39 }
40 framework.getTaskManager().queue(task, description, new MpsatChainResultHandler(task));
41 }
42
43}
440
=== removed file 'CircuitPlugin/src/org/workcraft/plugins/circuit/tools/CheckCircuitHazardTool.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/tools/CheckCircuitHazardTool.java 2013-09-17 14:58:15 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/tools/CheckCircuitHazardTool.java 1970-01-01 00:00:00 +0000
@@ -1,43 +0,0 @@
1package org.workcraft.plugins.circuit.tools;
2
3import org.workcraft.Framework;
4import org.workcraft.Tool;
5import org.workcraft.plugins.circuit.Circuit;
6import org.workcraft.plugins.circuit.tasks.CheckCircuitHazardTask;
7import org.workcraft.plugins.mpsat.MpsatChainResultHandler;
8import org.workcraft.workspace.WorkspaceEntry;
9
10public class CheckCircuitHazardTool implements Tool {
11 private final Framework framework;
12
13 public CheckCircuitHazardTool(Framework framework) {
14 this.framework = framework;
15 }
16
17 public String getDisplayName() {
18 return "Check circuit for hazards";
19 }
20
21
22 @Override
23 public String getSection() {
24 return "Verification";
25 }
26
27 @Override
28 public boolean isApplicableTo(WorkspaceEntry we) {
29 return we.getModelEntry().getMathModel() instanceof Circuit;
30 }
31
32 @Override
33 public void run(WorkspaceEntry we) {
34 final CheckCircuitHazardTask task = new CheckCircuitHazardTask(we, framework);
35 String description = "MPSat tool chain";
36 String title = we.getModelEntry().getModel().getTitle();
37 if (!title.isEmpty()) {
38 description += "(" + title +")";
39 }
40 framework.getTaskManager().queue(task, description, new MpsatChainResultHandler(task));
41 }
42
43}
440
=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/tools/CheckCircuitTool.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/tools/CheckCircuitTool.java 2013-09-17 14:58:15 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/tools/CheckCircuitTool.java 2014-04-29 16:24:51 +0000
@@ -15,10 +15,9 @@
15 }15 }
16 16
17 public String getDisplayName() {17 public String getDisplayName() {
18 return "Check circuit for deadlocks and hazards (reuse unfolding data)";18 return "Check circuit for conformation, deadlocks and hazards (reuse unfolding)";
19 }19 }
2020
21
22 @Override21 @Override
23 public String getSection() {22 public String getSection() {
24 return "Verification";23 return "Verification";
@@ -31,7 +30,8 @@
3130
32 @Override31 @Override
33 public void run(WorkspaceEntry we) {32 public void run(WorkspaceEntry we) {
34 final CheckCircuitTask task = new CheckCircuitTask(we, framework);33 final CheckCircuitTask task = new CheckCircuitTask(we, framework,
34 checkConformation(), checkDeadlock(), checkHazard());
35 String description = "MPSat tool chain";35 String description = "MPSat tool chain";
36 String title = we.getModelEntry().getModel().getTitle();36 String title = we.getModelEntry().getModel().getTitle();
37 if (!title.isEmpty()) {37 if (!title.isEmpty()) {
@@ -40,4 +40,16 @@
40 framework.getTaskManager().queue(task, description, new MpsatChainResultHandler(task));40 framework.getTaskManager().queue(task, description, new MpsatChainResultHandler(task));
41 }41 }
4242
43 public boolean checkConformation() {
44 return true;
45 }
46
47 public boolean checkDeadlock() {
48 return true;
49 }
50
51 public boolean checkHazard() {
52 return true;
53 }
54
43}55}
4456
=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/tools/STGGenerator.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/tools/STGGenerator.java 2014-01-14 10:38:16 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/tools/STGGenerator.java 2014-04-29 16:24:51 +0000
@@ -22,6 +22,7 @@
22import org.workcraft.dom.visual.VisualNode;22import org.workcraft.dom.visual.VisualNode;
23import org.workcraft.exceptions.InvalidConnectionException;23import org.workcraft.exceptions.InvalidConnectionException;
24import org.workcraft.plugins.circuit.Contact;24import org.workcraft.plugins.circuit.Contact;
25import org.workcraft.plugins.circuit.Contact.IOType;
25import org.workcraft.plugins.circuit.VisualCircuit;26import org.workcraft.plugins.circuit.VisualCircuit;
26import org.workcraft.plugins.circuit.VisualCircuitComponent;27import org.workcraft.plugins.circuit.VisualCircuitComponent;
27import org.workcraft.plugins.circuit.VisualCircuitConnection;28import org.workcraft.plugins.circuit.VisualCircuitConnection;
@@ -29,7 +30,6 @@
29import org.workcraft.plugins.circuit.VisualFunctionComponent;30import org.workcraft.plugins.circuit.VisualFunctionComponent;
30import org.workcraft.plugins.circuit.VisualFunctionContact;31import org.workcraft.plugins.circuit.VisualFunctionContact;
31import org.workcraft.plugins.circuit.VisualJoint;32import org.workcraft.plugins.circuit.VisualJoint;
32import org.workcraft.plugins.circuit.Contact.IOType;
33import org.workcraft.plugins.cpog.optimisation.Literal;33import org.workcraft.plugins.cpog.optimisation.Literal;
34import org.workcraft.plugins.cpog.optimisation.booleanvisitors.FormulaToString;34import org.workcraft.plugins.cpog.optimisation.booleanvisitors.FormulaToString;
35import org.workcraft.plugins.cpog.optimisation.dnf.Dnf;35import org.workcraft.plugins.cpog.optimisation.dnf.Dnf;
@@ -40,9 +40,9 @@
40import org.workcraft.plugins.petri.VisualPlace;40import org.workcraft.plugins.petri.VisualPlace;
41import org.workcraft.plugins.stg.STG;41import org.workcraft.plugins.stg.STG;
42import org.workcraft.plugins.stg.SignalTransition;42import org.workcraft.plugins.stg.SignalTransition;
43import org.workcraft.plugins.stg.SignalTransition.Direction;
43import org.workcraft.plugins.stg.VisualSTG;44import org.workcraft.plugins.stg.VisualSTG;
44import org.workcraft.plugins.stg.VisualSignalTransition;45import org.workcraft.plugins.stg.VisualSignalTransition;
45import org.workcraft.plugins.stg.SignalTransition.Direction;
46import org.workcraft.util.Hierarchy;46import org.workcraft.util.Hierarchy;
4747
48public class STGGenerator {48public class STGGenerator {
@@ -172,36 +172,34 @@
172 }172 }
173 173
174 // generate implementation for each of the drivers174 // generate implementation for each of the drivers
175 for(VisualContact c : drivers.keySet())175 for(VisualContact c : drivers.keySet()) {
176 {
177 if (c instanceof VisualFunctionContact) {176 if (c instanceof VisualFunctionContact) {
178 // function based driver177 // function based driver
178 Dnf set = null;
179 Dnf reset = null;
179 VisualFunctionContact contact = (VisualFunctionContact)c;180 VisualFunctionContact contact = (VisualFunctionContact)c;
180 Dnf set = DnfGenerator.generate(contact.getFunction().getSetFunction());
181 Dnf reset = null;
182
183 if (contact.getFunction().getResetFunction()!=null)
184 reset = DnfGenerator.generate(contact.getFunction().getResetFunction());
185 else {
186 BooleanOperations.worker = new DumbBooleanWorker();
187 reset = DnfGenerator.generate(BooleanOperations.worker.not(contact.getFunction().getSetFunction()));
188 }
189
190 SignalTransition.Type ttype = SignalTransition.Type.OUTPUT;181 SignalTransition.Type ttype = SignalTransition.Type.OUTPUT;
191
192
193 if (contact.getParent() instanceof VisualCircuitComponent) {182 if (contact.getParent() instanceof VisualCircuitComponent) {
194 if (((VisualCircuitComponent)contact.getParent()).getIsEnvironment()) 183 set = DnfGenerator.generate(contact.getFunction().getSetFunction());
195 ttype = SignalTransition.Type.INPUT; 184 if (contact.getFunction().getResetFunction() != null) {
196 else if (contact.getIOType()==IOType.INPUT)185 reset = DnfGenerator.generate(contact.getFunction().getResetFunction());
186 } else {
187 BooleanOperations.worker = new DumbBooleanWorker();
188 reset = DnfGenerator.generate(BooleanOperations.worker.not(contact.getFunction().getSetFunction()));
189 }
190 if (((VisualCircuitComponent)contact.getParent()).getIsEnvironment()) {
191 ttype = SignalTransition.Type.INPUT;
192 } else if (contact.getIOType()==IOType.INPUT) {
197 ttype = SignalTransition.Type.INPUT;193 ttype = SignalTransition.Type.INPUT;
194 }
198 } else {195 } else {
199 if (contact.getIOType()==IOType.INPUT)196 set = DnfGenerator.generate(contact.getFunction().getSetFunction());
197 reset = DnfGenerator.generate(contact.getFunction().getResetFunction());
198 if (contact.getIOType()==IOType.INPUT) {
200 ttype = SignalTransition.Type.INPUT;199 ttype = SignalTransition.Type.INPUT;
200 }
201 }201 }
202
203 implementDriver(circuit, stg, contact, drivers, targetDrivers, set, reset, ttype);202 implementDriver(circuit, stg, contact, drivers, targetDrivers, set, reset, ttype);
204
205 } else {203 } else {
206 // some generic driver implementation otherwise204 // some generic driver implementation otherwise
207 Dnf set = new Dnf(new DnfClause());205 Dnf set = new Dnf(new DnfClause());
@@ -209,7 +207,6 @@
209 implementDriver(circuit, stg, c, drivers, targetDrivers, set, reset, SignalTransition.Type.INPUT);207 implementDriver(circuit, stg, c, drivers, targetDrivers, set, reset, SignalTransition.Type.INPUT);
210 }208 }
211 }209 }
212
213 return stg;210 return stg;
214 } catch (InvalidConnectionException e) {211 } catch (InvalidConnectionException e) {
215 throw new RuntimeException(e);212 throw new RuntimeException(e);
216213
=== modified file 'CpogsPlugin/src/org/workcraft/plugins/cpog/optimisation/dnf/DnfGenerator.java'
--- CpogsPlugin/src/org/workcraft/plugins/cpog/optimisation/dnf/DnfGenerator.java 2012-07-25 10:32:14 +0000
+++ CpogsPlugin/src/org/workcraft/plugins/cpog/optimisation/dnf/DnfGenerator.java 2014-04-29 16:24:51 +0000
@@ -20,6 +20,9 @@
20public class DnfGenerator {20public class DnfGenerator {
21 public static Dnf generate(BooleanFormula formula)21 public static Dnf generate(BooleanFormula formula)
22 {22 {
23 if (formula == null) {
24 formula = One.instance();
25 }
23 return formula.accept(new BooleanVisitor<Dnf>()26 return formula.accept(new BooleanVisitor<Dnf>()
24 {27 {
25 boolean negation = false;28 boolean negation = false;
@@ -218,7 +221,6 @@
218 221
219 }222 }
220 223
221
222 return simplifyDnf(result);224 return simplifyDnf(result);
223 }225 }
224226
225227
=== modified file 'DfsPlugin/src/org/workcraft/plugins/dfs/VisualDfs.java'
--- DfsPlugin/src/org/workcraft/plugins/dfs/VisualDfs.java 2014-04-08 08:59:38 +0000
+++ DfsPlugin/src/org/workcraft/plugins/dfs/VisualDfs.java 2014-04-29 16:24:51 +0000
@@ -28,7 +28,6 @@
2828
29import org.workcraft.annotations.CustomTools;29import org.workcraft.annotations.CustomTools;
30import org.workcraft.annotations.DisplayName;30import org.workcraft.annotations.DisplayName;
31import org.workcraft.dom.Connection;
32import org.workcraft.dom.Node;31import org.workcraft.dom.Node;
33import org.workcraft.dom.math.MathConnection;32import org.workcraft.dom.math.MathConnection;
34import org.workcraft.dom.math.MathNode;33import org.workcraft.dom.math.MathNode;
@@ -221,11 +220,4 @@
221 return result;220 return result;
222 } 221 }
223 222
224 public Connection getConnection(Node first, Node second) {
225 for(Connection connection : getConnections(first)) {
226 if (connection.getSecond() == second) return connection;
227 }
228 return null;
229 }
230
231}
232\ No newline at end of file223\ No newline at end of file
224}
233225
=== modified file 'DfsPlugin/src/org/workcraft/plugins/dfs/tasks/CheckDataflowDeadlockTask.java'
--- DfsPlugin/src/org/workcraft/plugins/dfs/tasks/CheckDataflowDeadlockTask.java 2014-04-16 21:55:15 +0000
+++ DfsPlugin/src/org/workcraft/plugins/dfs/tasks/CheckDataflowDeadlockTask.java 2014-04-29 16:24:51 +0000
@@ -53,20 +53,24 @@
53 File netFile = File.createTempFile("net", exporter.getExtenstion());53 File netFile = File.createTempFile("net", exporter.getExtenstion());
54 ExportTask exportTask = new ExportTask(exporter, model, netFile.getCanonicalPath());54 ExportTask exportTask = new ExportTask(exporter, model, netFile.getCanonicalPath());
55 SubtaskMonitor<Object> mon = new SubtaskMonitor<Object>(monitor);55 SubtaskMonitor<Object> mon = new SubtaskMonitor<Object>(monitor);
56 Result<? extends Object> exportResult = framework.getTaskManager().execute(exportTask, "Exporting .g", mon);56 Result<? extends Object> exportResult = framework.getTaskManager().execute(
57 exportTask, "Exporting .g", mon);
58
57 if (exportResult.getOutcome() != Outcome.FINISHED) {59 if (exportResult.getOutcome() != Outcome.FINISHED) {
58 netFile.delete();60 netFile.delete();
59 if (exportResult.getOutcome() == Outcome.CANCELLED) {61 if (exportResult.getOutcome() == Outcome.CANCELLED) {
60 return new Result<MpsatChainResult>(Outcome.CANCELLED);62 return new Result<MpsatChainResult>(Outcome.CANCELLED);
61 }63 }
62 return new Result<MpsatChainResult>(Outcome.FAILED, 64 return new Result<MpsatChainResult>(Outcome.FAILED,
63 new MpsatChainResult(exportResult, null, null, settings));65 new MpsatChainResult(exportResult, null, null, null, settings));
64 }66 }
65 monitor.progressUpdate(0.20);67 monitor.progressUpdate(0.20);
66 68
67 File mciFile = File.createTempFile("unfolding", ".mci");69 File mciFile = File.createTempFile("unfolding", ".mci");
68 PunfTask punfTask = new PunfTask(netFile.getCanonicalPath(), mciFile.getCanonicalPath());70 PunfTask punfTask = new PunfTask(netFile.getCanonicalPath(), mciFile.getCanonicalPath());
69 Result<? extends ExternalProcessResult> punfResult = framework.getTaskManager().execute(punfTask, "Unfolding .g", mon);71 Result<? extends ExternalProcessResult> punfResult = framework.getTaskManager().execute(
72 punfTask, "Unfolding .g", mon);
73
70 netFile.delete();74 netFile.delete();
71 if (punfResult.getOutcome() != Outcome.FINISHED) {75 if (punfResult.getOutcome() != Outcome.FINISHED) {
72 mciFile.delete();76 mciFile.delete();
@@ -74,18 +78,21 @@
74 return new Result<MpsatChainResult>(Outcome.CANCELLED);78 return new Result<MpsatChainResult>(Outcome.CANCELLED);
75 }79 }
76 return new Result<MpsatChainResult>(Outcome.FAILED, 80 return new Result<MpsatChainResult>(Outcome.FAILED,
77 new MpsatChainResult(exportResult, punfResult, null, settings));81 new MpsatChainResult(exportResult, null, punfResult, null, settings));
78 }82 }
79 monitor.progressUpdate(0.70);83 monitor.progressUpdate(0.70);
8084
81 MpsatTask mpsatTask = new MpsatTask(settings.getMpsatArguments(), mciFile.getCanonicalPath());85 MpsatTask mpsatTask = new MpsatTask(settings.getMpsatArguments(), mciFile.getCanonicalPath());
82 Result<? extends ExternalProcessResult> mpsatResult = framework.getTaskManager().execute(mpsatTask, "Running deadlock checking [MPSat]", mon);86 Result<? extends ExternalProcessResult> mpsatResult = framework.getTaskManager().execute(
87 mpsatTask, "Running deadlock checking [MPSat]", mon);
88
83 if (mpsatResult.getOutcome() != Outcome.FINISHED) {89 if (mpsatResult.getOutcome() != Outcome.FINISHED) {
84 if (mpsatResult.getOutcome() == Outcome.CANCELLED) {90 if (mpsatResult.getOutcome() == Outcome.CANCELLED) {
85 return new Result<MpsatChainResult>(Outcome.CANCELLED);91 return new Result<MpsatChainResult>(Outcome.CANCELLED);
86 }92 }
87 return new Result<MpsatChainResult>(Outcome.FAILED, 93 return new Result<MpsatChainResult>(Outcome.FAILED,
88 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings, new String(mpsatResult.getReturnValue().getErrors())));94 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, settings,
95 new String(mpsatResult.getReturnValue().getErrors())));
89 }96 }
90 monitor.progressUpdate(0.90);97 monitor.progressUpdate(0.90);
91 98
@@ -93,13 +100,13 @@
93 if (!mdp.getSolutions().isEmpty()) {100 if (!mdp.getSolutions().isEmpty()) {
94 mciFile.delete();101 mciFile.delete();
95 return new Result<MpsatChainResult>(Outcome.FINISHED, 102 return new Result<MpsatChainResult>(Outcome.FINISHED,
96 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings, "Dataflow has a deadlock"));103 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, settings, "Dataflow has a deadlock"));
97 }104 }
98 monitor.progressUpdate(1.0);105 monitor.progressUpdate(1.0);
99106
100 mciFile.delete();107 mciFile.delete();
101 return new Result<MpsatChainResult>(Outcome.FINISHED, 108 return new Result<MpsatChainResult>(Outcome.FINISHED,
102 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings, "Dataflow is deadlock-free"));109 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, settings, "Dataflow is deadlock-free"));
103 110
104 } catch (Throwable e) {111 } catch (Throwable e) {
105 return new Result<MpsatChainResult>(e);112 return new Result<MpsatChainResult>(e);
106113
=== modified file 'DfsPlugin/src/org/workcraft/plugins/dfs/tasks/CheckDataflowHazardTask.java'
--- DfsPlugin/src/org/workcraft/plugins/dfs/tasks/CheckDataflowHazardTask.java 2014-04-16 21:55:15 +0000
+++ DfsPlugin/src/org/workcraft/plugins/dfs/tasks/CheckDataflowHazardTask.java 2014-04-29 16:24:51 +0000
@@ -54,38 +54,45 @@
54 File netFile = File.createTempFile("net", exporter.getExtenstion());54 File netFile = File.createTempFile("net", exporter.getExtenstion());
55 ExportTask exportTask = new ExportTask(exporter, model, netFile.getCanonicalPath());55 ExportTask exportTask = new ExportTask(exporter, model, netFile.getCanonicalPath());
56 SubtaskMonitor<Object> mon = new SubtaskMonitor<Object>(monitor);56 SubtaskMonitor<Object> mon = new SubtaskMonitor<Object>(monitor);
57 Result<? extends Object> exportResult = framework.getTaskManager().execute(exportTask, "Exporting .g", mon);57 Result<? extends Object> exportResult = framework.getTaskManager().execute(
58 exportTask, "Exporting .g", mon);
59
58 if (exportResult.getOutcome() != Outcome.FINISHED) {60 if (exportResult.getOutcome() != Outcome.FINISHED) {
59 netFile.delete();61 netFile.delete();
60 if (exportResult.getOutcome() == Outcome.CANCELLED) {62 if (exportResult.getOutcome() == Outcome.CANCELLED) {
61 return new Result<MpsatChainResult>(Outcome.CANCELLED);63 return new Result<MpsatChainResult>(Outcome.CANCELLED);
62 }64 }
63 return new Result<MpsatChainResult>(Outcome.FAILED, 65 return new Result<MpsatChainResult>(Outcome.FAILED,
64 new MpsatChainResult(exportResult, null, null, settings));66 new MpsatChainResult(exportResult, null, null, null, settings));
65 }67 }
66 monitor.progressUpdate(0.20);68 monitor.progressUpdate(0.20);
67 69
68 File mciFile = File.createTempFile("unfolding", ".mci");70 File mciFile = File.createTempFile("unfolding", ".mci");
69 PunfTask punfTask = new PunfTask(netFile.getCanonicalPath(), mciFile.getCanonicalPath());71 PunfTask punfTask = new PunfTask(netFile.getCanonicalPath(), mciFile.getCanonicalPath());
70 Result<? extends ExternalProcessResult> punfResult = framework.getTaskManager().execute(punfTask, "Unfolding .g", mon);72 Result<? extends ExternalProcessResult> punfResult = framework.getTaskManager().execute(
73 punfTask, "Unfolding .g", mon);
74
71 netFile.delete();75 netFile.delete();
72 if (punfResult.getOutcome() != Outcome.FINISHED) {76 if (punfResult.getOutcome() != Outcome.FINISHED) {
73 mciFile.delete();77 mciFile.delete();
74 if (punfResult.getOutcome() == Outcome.CANCELLED) {78 if (punfResult.getOutcome() == Outcome.CANCELLED) {
75 return new Result<MpsatChainResult>(Outcome.CANCELLED);79 return new Result<MpsatChainResult>(Outcome.CANCELLED);
76 }80 }
77 return new Result<MpsatChainResult>(Outcome.FAILED, new MpsatChainResult(exportResult, punfResult, null, settings));81 return new Result<MpsatChainResult>(Outcome.FAILED,
82 new MpsatChainResult(exportResult, null, punfResult, null, settings));
78 }83 }
79 monitor.progressUpdate(0.40);84 monitor.progressUpdate(0.40);
8085
81 MpsatTask mpsatTask = new MpsatTask(settings.getMpsatArguments(), mciFile.getCanonicalPath());86 MpsatTask mpsatTask = new MpsatTask(settings.getMpsatArguments(), mciFile.getCanonicalPath());
82 Result<? extends ExternalProcessResult> mpsatResult = framework.getTaskManager().execute(mpsatTask, "Running semimodularity checking [MPSat]", mon);87 Result<? extends ExternalProcessResult> mpsatResult = framework.getTaskManager().execute(
88 mpsatTask, "Running semimodularity checking [MPSat]", mon);
89
83 if (mpsatResult.getOutcome() != Outcome.FINISHED) {90 if (mpsatResult.getOutcome() != Outcome.FINISHED) {
84 if (mpsatResult.getOutcome() == Outcome.CANCELLED) {91 if (mpsatResult.getOutcome() == Outcome.CANCELLED) {
85 return new Result<MpsatChainResult>(Outcome.CANCELLED);92 return new Result<MpsatChainResult>(Outcome.CANCELLED);
86 }93 }
87 return new Result<MpsatChainResult>(Outcome.FAILED, 94 return new Result<MpsatChainResult>(Outcome.FAILED,
88 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings));95 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, settings));
89 }96 }
90 monitor.progressUpdate(0.90);97 monitor.progressUpdate(0.90);
91 98
@@ -93,13 +100,13 @@
93 if (!mdp.getSolutions().isEmpty()) {100 if (!mdp.getSolutions().isEmpty()) {
94 mciFile.delete();101 mciFile.delete();
95 return new Result<MpsatChainResult>(Outcome.FINISHED, 102 return new Result<MpsatChainResult>(Outcome.FINISHED,
96 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings, "Dataflow has hazard(s)"));103 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, settings, "Dataflow has hazard(s)"));
97 }104 }
98 monitor.progressUpdate(1.0);105 monitor.progressUpdate(1.0);
99106
100 mciFile.delete();107 mciFile.delete();
101 return new Result<MpsatChainResult>(Outcome.FINISHED, 108 return new Result<MpsatChainResult>(Outcome.FINISHED,
102 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings, "Dataflow is hazard-free"));109 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, settings, "Dataflow is hazard-free"));
103 110
104 } catch (Throwable e) {111 } catch (Throwable e) {
105 return new Result<MpsatChainResult>(e);112 return new Result<MpsatChainResult>(e);
106113
=== modified file 'DfsPlugin/src/org/workcraft/plugins/dfs/tasks/CheckDataflowTask.java'
--- DfsPlugin/src/org/workcraft/plugins/dfs/tasks/CheckDataflowTask.java 2014-04-16 21:55:15 +0000
+++ DfsPlugin/src/org/workcraft/plugins/dfs/tasks/CheckDataflowTask.java 2014-04-29 16:24:51 +0000
@@ -59,20 +59,24 @@
59 File netFile = File.createTempFile("net", exporter.getExtenstion());59 File netFile = File.createTempFile("net", exporter.getExtenstion());
60 ExportTask exportTask = new ExportTask(exporter, model, netFile.getCanonicalPath());60 ExportTask exportTask = new ExportTask(exporter, model, netFile.getCanonicalPath());
61 SubtaskMonitor<Object> mon = new SubtaskMonitor<Object>(monitor);61 SubtaskMonitor<Object> mon = new SubtaskMonitor<Object>(monitor);
62 Result<? extends Object> exportResult = framework.getTaskManager().execute(exportTask, "Exporting .g", mon);62 Result<? extends Object> exportResult = framework.getTaskManager().execute(
63 exportTask, "Exporting .g", mon);
64
63 if (exportResult.getOutcome() != Outcome.FINISHED) {65 if (exportResult.getOutcome() != Outcome.FINISHED) {
64 netFile.delete();66 netFile.delete();
65 if (exportResult.getOutcome() == Outcome.CANCELLED) {67 if (exportResult.getOutcome() == Outcome.CANCELLED) {
66 return new Result<MpsatChainResult>(Outcome.CANCELLED);68 return new Result<MpsatChainResult>(Outcome.CANCELLED);
67 }69 }
68 return new Result<MpsatChainResult>(Outcome.FAILED, 70 return new Result<MpsatChainResult>(Outcome.FAILED,
69 new MpsatChainResult(exportResult, null, null, deadlockSettings));71 new MpsatChainResult(exportResult, null, null, null, deadlockSettings));
70 }72 }
71 monitor.progressUpdate(0.20);73 monitor.progressUpdate(0.20);
72 74
73 File mciFile = File.createTempFile("unfolding", ".mci");75 File mciFile = File.createTempFile("unfolding", ".mci");
74 PunfTask punfTask = new PunfTask(netFile.getCanonicalPath(), mciFile.getCanonicalPath());76 PunfTask punfTask = new PunfTask(netFile.getCanonicalPath(), mciFile.getCanonicalPath());
75 Result<? extends ExternalProcessResult> punfResult = framework.getTaskManager().execute(punfTask, "Unfolding .g", mon);77 Result<? extends ExternalProcessResult> punfResult = framework.getTaskManager().execute(
78 punfTask, "Unfolding .g", mon);
79
76 netFile.delete();80 netFile.delete();
77 if (punfResult.getOutcome() != Outcome.FINISHED) {81 if (punfResult.getOutcome() != Outcome.FINISHED) {
78 mciFile.delete();82 mciFile.delete();
@@ -80,18 +84,20 @@
80 return new Result<MpsatChainResult>(Outcome.CANCELLED);84 return new Result<MpsatChainResult>(Outcome.CANCELLED);
81 }85 }
82 return new Result<MpsatChainResult>(Outcome.FAILED, 86 return new Result<MpsatChainResult>(Outcome.FAILED,
83 new MpsatChainResult(exportResult, punfResult, null, deadlockSettings));87 new MpsatChainResult(exportResult, null, punfResult, null, deadlockSettings));
84 }88 }
85 monitor.progressUpdate(0.40);89 monitor.progressUpdate(0.40);
8690
87 MpsatTask mpsatTask = new MpsatTask(deadlockSettings.getMpsatArguments(), mciFile.getCanonicalPath());91 MpsatTask mpsatTask = new MpsatTask(deadlockSettings.getMpsatArguments(), mciFile.getCanonicalPath());
88 Result<? extends ExternalProcessResult> mpsatResult = framework.getTaskManager().execute(mpsatTask, "Running deadlock checking [MPSat]", mon);92 Result<? extends ExternalProcessResult> mpsatResult = framework.getTaskManager().execute(
93 mpsatTask, "Running deadlock checking [MPSat]", mon);
94
89 if (mpsatResult.getOutcome() != Outcome.FINISHED) {95 if (mpsatResult.getOutcome() != Outcome.FINISHED) {
90 if (mpsatResult.getOutcome() == Outcome.CANCELLED) {96 if (mpsatResult.getOutcome() == Outcome.CANCELLED) {
91 return new Result<MpsatChainResult>(Outcome.CANCELLED);97 return new Result<MpsatChainResult>(Outcome.CANCELLED);
92 }98 }
93 return new Result<MpsatChainResult>(Outcome.FAILED, 99 return new Result<MpsatChainResult>(Outcome.FAILED,
94 new MpsatChainResult(exportResult, punfResult, mpsatResult, deadlockSettings));100 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, deadlockSettings));
95 }101 }
96 monitor.progressUpdate(0.60);102 monitor.progressUpdate(0.60);
97 103
@@ -99,7 +105,7 @@
99 if (!mdp.getSolutions().isEmpty()) {105 if (!mdp.getSolutions().isEmpty()) {
100 mciFile.delete();106 mciFile.delete();
101 return new Result<MpsatChainResult>(Outcome.FINISHED, 107 return new Result<MpsatChainResult>(Outcome.FINISHED,
102 new MpsatChainResult(exportResult, punfResult, mpsatResult, deadlockSettings, "Dataflow has a deadlock"));108 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, deadlockSettings, "Dataflow has a deadlock"));
103 }109 }
104 monitor.progressUpdate(0.70);110 monitor.progressUpdate(0.70);
105111
@@ -110,7 +116,7 @@
110 return new Result<MpsatChainResult>(Outcome.CANCELLED);116 return new Result<MpsatChainResult>(Outcome.CANCELLED);
111 }117 }
112 return new Result<MpsatChainResult>(Outcome.FAILED, 118 return new Result<MpsatChainResult>(Outcome.FAILED,
113 new MpsatChainResult(exportResult, punfResult, mpsatResult, hazardSettings));119 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, hazardSettings));
114 }120 }
115 monitor.progressUpdate(0.90);121 monitor.progressUpdate(0.90);
116 122
@@ -118,13 +124,13 @@
118 if (!mdp.getSolutions().isEmpty()) {124 if (!mdp.getSolutions().isEmpty()) {
119 mciFile.delete();125 mciFile.delete();
120 return new Result<MpsatChainResult>(Outcome.FINISHED, 126 return new Result<MpsatChainResult>(Outcome.FINISHED,
121 new MpsatChainResult(exportResult, punfResult, mpsatResult, hazardSettings, "Dataflow has hazard(s)"));127 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, hazardSettings, "Dataflow has hazard(s)"));
122 }128 }
123 monitor.progressUpdate(1.0);129 monitor.progressUpdate(1.0);
124130
125 mciFile.delete();131 mciFile.delete();
126 return new Result<MpsatChainResult>(Outcome.FINISHED, 132 return new Result<MpsatChainResult>(Outcome.FINISHED,
127 new MpsatChainResult(exportResult, punfResult, mpsatResult, hazardSettings, "Dataflow is deadlock-free and hazard-free"));133 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, hazardSettings, "Dataflow is deadlock-free and hazard-free"));
128 134
129 } catch (Throwable e) {135 } catch (Throwable e) {
130 return new Result<MpsatChainResult>(e);136 return new Result<MpsatChainResult>(e);
131137
=== modified file 'MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatChainResultHandler.java'
--- MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatChainResultHandler.java 2014-04-16 21:55:15 +0000
+++ MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatChainResultHandler.java 2014-04-29 16:24:51 +0000
@@ -26,6 +26,9 @@
26 if (result.getOutcome() == Outcome.FINISHED) {26 if (result.getOutcome() == Outcome.FINISHED) {
27 final MpsatMode mpsatMode = result.getReturnValue().getMpsatSettings().getMode();27 final MpsatMode mpsatMode = result.getReturnValue().getMpsatSettings().getMode();
28 switch (mpsatMode) {28 switch (mpsatMode) {
29 case UNDEFINED:
30 SwingUtilities.invokeLater(new MpsatUndefinedResultHandler(task, result));
31 break;
29 case STG_REACHABILITY:32 case STG_REACHABILITY:
30 case CSC_CONFLICT_DETECTION:33 case CSC_CONFLICT_DETECTION:
31 case USC_CONFLICT_DETECTION:34 case USC_CONFLICT_DETECTION:
@@ -41,7 +44,6 @@
41 case COMPLEX_GATE_IMPLEMENTATION:44 case COMPLEX_GATE_IMPLEMENTATION:
42 SwingUtilities.invokeLater(new MpsatSynthesisResultHandler(task, result));45 SwingUtilities.invokeLater(new MpsatSynthesisResultHandler(task, result));
43 break;46 break;
44
45 default:47 default:
46 SwingUtilities.invokeLater(new Runnable() {48 SwingUtilities.invokeLater(new Runnable() {
47 @Override49 @Override
@@ -53,57 +55,62 @@
53 });55 });
54 break;56 break;
55 } 57 }
56 }58 } else if (result.getOutcome() != Outcome.CANCELLED) {
57 else if (result.getOutcome() != Outcome.CANCELLED) {
58 errorMessage = "MPSat tool chain execution failed :-(";59 errorMessage = "MPSat tool chain execution failed :-(";
59
60 Throwable cause1 = result.getCause();60 Throwable cause1 = result.getCause();
6161
62 if (cause1 != null) {62 if (cause1 != null) {
63 // Exception was thrown somewhere in the chain task run() method (not in any of the subtasks)63 // Exception was thrown somewhere in the chain task run() method (not in any of the subtasks)
64 errorMessage += "\n\nFailure caused by: " + cause1.toString() + "\nPlease see the \"Problems\" tab for more details.";64 errorMessage += "\n\nFailure caused by: " + cause1.toString() + "\nPlease see the \"Problems\" tab for more details.";
65 } else65 } else {
66 {66 MpsatChainResult returnValue = result.getReturnValue();
67 Result<? extends Object> exportResult = result.getReturnValue().getExportResult();67 Result<? extends Object> exportResult = returnValue.getExportResult();
68 if (exportResult.getOutcome() == Outcome.FAILED) {68 Result<? extends ExternalProcessResult> pcompResult = returnValue.getPcompResult();
69 Result<? extends ExternalProcessResult> punfResult = returnValue.getPunfResult();
70 Result<? extends ExternalProcessResult> mpsatResult = returnValue.getMpsatResult();
71 if (exportResult != null && exportResult.getOutcome() == Outcome.FAILED) {
69 errorMessage += "\n\nFailed to export the model as a .g file.";72 errorMessage += "\n\nFailed to export the model as a .g file.";
70 Throwable cause = exportResult.getCause();73 Throwable cause = exportResult.getCause();
71 if (cause != null)74 if (cause != null) {
72 errorMessage += "\n\nFailure caused by: " + cause.toString() + "\nPlease see the \"Problems\" tab for more details.";75 errorMessage += "\n\nFailure caused by: " + cause.toString();
73 else76 } else {
74 errorMessage += "\n\nThe exporter class did not offer further explanation.";77 errorMessage += "\n\nThe exporter class did not offer further explanation.";
78 }
79 } else if (pcompResult != null && pcompResult.getOutcome() == Outcome.FAILED) {
80 errorMessage += "\n\nPcomp could not compose the STGs.";
81 Throwable cause = pcompResult.getCause();
82 if (cause != null) {
83 errorMessage += "\n\nFailure caused by: " + cause.toString();
84 } else {
85 errorMessage += "\n\nFailure caused by the following errors:\n" + new String(pcompResult.getReturnValue().getErrors());
86 }
87 } else if (punfResult != null && punfResult.getOutcome() == Outcome.FAILED) {
88 errorMessage += "\n\nPunf could not build the unfolding prefix.";
89 Throwable cause = punfResult.getCause();
90 if (cause != null) {
91 errorMessage += "\n\nFailure caused by: " + cause.toString();
92 } else {
93 errorMessage += "\n\nFailure caused by the following errors:\n" + new String(punfResult.getReturnValue().getErrors());
94 }
95 } else if (mpsatResult != null && mpsatResult.getOutcome() == Outcome.FAILED) {
96 errorMessage += "\n\nMPSat failed to execute as expected.";
97 Throwable cause = mpsatResult.getCause();
98 if (cause != null) {
99 errorMessage += "\n\nFailure caused by: " + cause.toString();
100 } else {
101 errorMessage += "\n\nFailure caused by the following errors:\n" + new String(mpsatResult.getReturnValue().getErrors());
102 }
75 } else {103 } else {
76 Result<? extends ExternalProcessResult> punfResult = result.getReturnValue().getPunfResult();104 errorMessage += "\n\nMPSat chain task returned failure status without further explanation.";
77
78 if (punfResult.getOutcome() == Outcome.FAILED) {
79 errorMessage += "\n\nPunf could not build the unfolding prefix.";
80 Throwable cause = punfResult.getCause();
81 if (cause != null)
82 errorMessage += "\n\nFailure caused by: " + cause.toString() + "\nPlease see the \"Problems\" tab for more details.";
83 else
84 errorMessage += "\n\nFailure caused by the following errors:\n" + new String(punfResult.getReturnValue().getErrors());
85 } else {
86 Result<? extends ExternalProcessResult> mpsatResult = result.getReturnValue().getMpsatResult();
87
88 if (mpsatResult.getOutcome() == Outcome.FAILED) {
89 errorMessage += "\n\nMPSat failed to execute as expected.";
90 Throwable cause = mpsatResult.getCause();
91 if (cause != null)
92 errorMessage += "\n\nFailure caused by: " + cause.toString() + "\nPlease see the \"Problems\" tab for more details.";
93 else
94 errorMessage += "\n\nFailure caused by the following errors:\n" + new String(mpsatResult.getReturnValue().getErrors());
95 }
96 else {
97 errorMessage += "\n\nMPSat chain task returned failure status without further explanation. This should not have happened -_-a.";
98 }
99 }
100 }105 }
101 }106 }
102 SwingUtilities.invokeLater(new Runnable() {107 SwingUtilities.invokeLater(new Runnable() {
103 @Override108 @Override
104 public void run() {109 public void run() {
105 JOptionPane.showMessageDialog(null, errorMessage, "Oops..", JOptionPane.ERROR_MESSAGE); }110 JOptionPane.showMessageDialog(null, errorMessage, "Oops..", JOptionPane.ERROR_MESSAGE);
111 }
106 });112 });
107 }113 }
108 }114 }
109}
110\ No newline at end of file115\ No newline at end of file
116
117}
111118
=== modified file 'MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatMode.java'
--- MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatMode.java 2010-10-06 15:51:01 +0000
+++ MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatMode.java 2014-04-29 16:24:51 +0000
@@ -4,6 +4,7 @@
4package org.workcraft.plugins.mpsat;4package org.workcraft.plugins.mpsat;
55
6public enum MpsatMode {6public enum MpsatMode {
7 UNDEFINED (null, null, false), // Special mode to integrate foreign tasks into Mpsat toolchain (export, composition, unfolding)
7 DEADLOCK ("-D", "Deadlock checking", false),8 DEADLOCK ("-D", "Deadlock checking", false),
8 REACHABILITY ("-F", "Reachability analysis", true), 9 REACHABILITY ("-F", "Reachability analysis", true),
9 STG_REACHABILITY ("-Fs", "STG reachability analysis", true),10 STG_REACHABILITY ("-Fs", "STG reachability analysis", true),
@@ -20,8 +21,7 @@
20 private String description;21 private String description;
21 private boolean reach;22 private boolean reach;
22 23
23 public static final MpsatMode[] modes = 24 public static final MpsatMode[] modes = {
24 {
25 DEADLOCK,25 DEADLOCK,
26 REACHABILITY,26 REACHABILITY,
27 STG_REACHABILITY,27 STG_REACHABILITY,
2828
=== modified file 'MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatSettings.java'
--- MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatSettings.java 2014-04-16 21:55:15 +0000
+++ MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatSettings.java 2014-04-29 16:24:51 +0000
@@ -6,9 +6,14 @@
6import java.io.File;6import java.io.File;
7import java.io.IOException;7import java.io.IOException;
8import java.util.ArrayList;8import java.util.ArrayList;
9import java.util.HashSet;
9import java.util.LinkedHashMap;10import java.util.LinkedHashMap;
10import java.util.Map;11import java.util.Map;
1112
13import org.workcraft.dom.Node;
14import org.workcraft.plugins.stg.STG;
15import org.workcraft.plugins.stg.SignalTransition;
16import org.workcraft.plugins.stg.SignalTransition.Type;
12import org.workcraft.util.FileUtils;17import org.workcraft.util.FileUtils;
1318
14public class MpsatSettings {19public class MpsatSettings {
@@ -33,12 +38,12 @@
33 }38 }
34 }39 }
3540
36 private String name = null;41 private final String name;
37 private MpsatMode mode = MpsatMode.DEADLOCK;42 private final MpsatMode mode;
38 private int verbosity = 0;43 private final int verbosity;
39 private SolutionMode solutionMode = SolutionMode.FIRST;44 private final SolutionMode solutionMode;
40 private int solutionNumberLimit = 0;45 private final int solutionNumberLimit;
41 private String reach = "";46 private final String reach;
42 47
43 // Reach expression for checking signal consistency48 // Reach expression for checking signal consistency
44 public static final String reachConsistency = 49 public static final String reachConsistency =
@@ -52,17 +57,121 @@
5257
53 // Reach expression for checking semimodularity (output persistency)58 // Reach expression for checking semimodularity (output persistency)
54 public static final String reachSemimodularity =59 public static final String reachSemimodularity =
55 "card DUMMY != 0 ? fail \"This property can be checked only on STGs without dummies\" :\n"+60 "card DUMMY != 0 ? fail \"This property can be checked only on STGs without dummies\" :\n" +
56 " exists t1 in tran EVENTS s.t. sig t1 in LOCAL {\n"+61 " exists t1 in tran EVENTS s.t. sig t1 in LOCAL {\n" +
57 " @t1 &\n"+62 " @t1 &\n" +
58 " exists t2 in tran EVENTS s.t. sig t2 != sig t1 & card (pre t1 * (pre t2 \\ post t2)) != 0 {\n"+63 " exists t2 in tran EVENTS s.t. sig t2 != sig t1 & card (pre t1 * (pre t2 \\ post t2)) != 0 {\n" +
59 " @t2 &\n"+64 " @t2 &\n" +
60 " forall t3 in tran EVENTS * (tran sig t1 \\ {t1}) s.t. card (pre t3 * (pre t2 \\ post t2)) = 0 {\n"+65 " forall t3 in tran EVENTS * (tran sig t1 \\ {t1}) s.t. card (pre t3 * (pre t2 \\ post t2)) = 0 {\n" +
61 " exists p in pre t3 \\ post t2 { ~$p }\n"+66 " exists p in pre t3 \\ post t2 { ~$p }\n" +
62 " }\n"+67 " }\n" +
63 " }\n"+68 " }\n" +
64 " }\n";69 " }\n";
65 70
71 // Reach expression for checking conformation (this is a template,
72 // the list of places needs to be updated for each circuit)
73 public static final String reachConformation =
74 "let CPnames = {\"in1_0\", \"in1_1\", \"in0_0\", \"in0_1\", \"out0_0\", \"out0_1\"},\n" +
75 "CP=gather n in CPnames { P n } {\n" +
76 " exists s in SIGNALS \\ DUMMY {\n" +
77 " exists t in tran s {\n" +
78 " forall p in pre t * CP { $p }\n" +
79 " }\n" +
80 " &\n" +
81 " forall t in tran s {\n" +
82 " exists p in pre t \\ CP { ~$p }\n" +
83 " }\n" +
84 " }\n" +
85 "}\n";
86
87 // FIXME: Currently Punf does not support dead signals, transitions and places well
88 // (e.g. a dead transition may disappear from unfolding), therefore the
89 // conformation property cannot be checked reliably.
90 public static String genReachConformation(STG stg, STG circuitStg) {
91 // Form a set of system STG places which came from the circuitStg
92 HashSet<Node> circuitPlaces = new HashSet<Node>();
93 for (Type type: Type.values()) {
94 for (String s : circuitStg.getSignalNames(type)) {
95 Node p0 = stg.getNodeByReference(s + "_0");
96 if (p0 == null) {
97 p0 = stg.getNodeByReference("<" + s + "-," + s + "+>");
98 }
99 if (p0 != null) {
100 circuitPlaces.add(p0);
101 }
102 Node p1 = stg.getNodeByReference(s + "_1");
103 if (p1 == null) {
104 p1 = stg.getNodeByReference("<" + s + "+," + s + "->");
105 }
106 if (p1 != null) {
107 circuitPlaces.add(p1);
108 }
109 }
110 }
111 // Generate Reach expression
112 String result = "";
113 for (String s : circuitStg.getSignalNames(Type.OUTPUT)) {
114 String circuitPredicate = "";
115 String environmentPredicate = "";
116 for (SignalTransition t: stg.getSignalTransitions(Type.OUTPUT)) {
117 if (!t.getSignalName().equals(s)) continue;
118 String circuitPreset = "";
119 String environmentPreset = "";
120 for (Node p: stg.getPreset(t)) {
121 String name = stg.getNodeReference(p);
122 if (circuitPlaces.contains(p)) {
123 if (circuitPreset.isEmpty()) {
124 circuitPreset += "{";
125 } else {
126 circuitPreset += ", ";
127 }
128 circuitPreset += "\"" + name + "\"";
129 } else {
130 if (environmentPreset.isEmpty()) {
131 environmentPreset += "{";
132 } else {
133 environmentPreset += ", ";
134 }
135 environmentPreset += "\"" + name + "\"";
136 }
137 }
138 circuitPreset += "}";
139 environmentPreset += "}";
140
141 if (circuitPredicate.isEmpty()) {
142 circuitPredicate += " (\n";
143 } else {
144 circuitPredicate += " |\n";
145 }
146 circuitPredicate += " forall p in " + circuitPreset + " {\n";
147 circuitPredicate += " $ P p\n";
148 circuitPredicate += " }\n";
149
150 if (environmentPredicate.isEmpty()) {
151 environmentPredicate += " (\n";
152 } else {
153 environmentPredicate += " &\n";
154 }
155 environmentPredicate += " exists p in " + environmentPreset + " {\n";
156 environmentPredicate += " ~$ P p\n";
157 environmentPredicate += " }\n";
158 }
159 circuitPredicate += " )\n";
160 environmentPredicate += " )\n";
161 if (!result.isEmpty()) {
162 result += "|\n";
163 }
164 result += "/* Conformation check for signal " + s + " */\n";
165 result += "(\n";
166 result += circuitPredicate;
167 result += " &\n";
168 result += environmentPredicate;
169 result += ")\n";
170 }
171 return result;
172 }
173
174
66 public MpsatSettings(String name, MpsatMode mode, int verbosity, SolutionMode solutionMode, int solutionNumberLimit, String reach) {175 public MpsatSettings(String name, MpsatMode mode, int verbosity, SolutionMode solutionMode, int solutionNumberLimit, String reach) {
67 super();176 super();
68 this.name = name;177 this.name = name;
@@ -122,10 +231,11 @@
122 break;231 break;
123 case ALL:232 case ALL:
124 int solutionNumberLimit = getSolutionNumberLimit();233 int solutionNumberLimit = getSolutionNumberLimit();
125 if (solutionNumberLimit>0)234 if (solutionNumberLimit>0) {
126 args.add("-a" + Integer.toString(solutionNumberLimit));235 args.add("-a" + Integer.toString(solutionNumberLimit));
127 else236 } else {
128 args.add("-a");237 args.add("-a");
238 }
129 }239 }
130240
131 return args.toArray(new String[args.size()]);241 return args.toArray(new String[args.size()]);
132242
=== modified file 'MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatStgReachabilityResultHandler.java'
--- MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatStgReachabilityResultHandler.java 2014-04-16 21:55:15 +0000
+++ MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatStgReachabilityResultHandler.java 2014-04-29 16:24:51 +0000
@@ -22,24 +22,32 @@
22 this.result = result;22 this.result = result;
23 }23 }
24 24
25 private String getPropertyName() {
26 String propertyName;
27 MpsatSettings settings = task.getSettings();
28 if (settings != null && settings.getName() != null) {
29 propertyName = settings.getName();
30 } else {
31 propertyName = "The property";
32 }
33 return propertyName;
34 }
25 35
26 @Override36 @Override
27 public void run() {37 public void run() {
28 MpsatResultParser mdp = new MpsatResultParser(result.getReturnValue().getMpsatResult().getReturnValue());38 MpsatResultParser mdp = new MpsatResultParser(result.getReturnValue().getMpsatResult().getReturnValue());
29 List<Trace> solutions = mdp.getSolutions();39 List<Trace> solutions = mdp.getSolutions();
30 String propertyName = task.getSettings().getName();40 String message = result.getReturnValue().getMessage();
31 if (propertyName == null) {
32 propertyName = "The property";
33 }
34 if (!solutions.isEmpty()) {41 if (!solutions.isEmpty()) {
35 String message = propertyName + " is violated with the following trace:\n";42 if (message == null) {
43 message = getPropertyName() + " is violated with the following trace:\n";
44 }
36 final SolutionsDialog solutionsDialog = new SolutionsDialog(task, message, solutions);45 final SolutionsDialog solutionsDialog = new SolutionsDialog(task, message, solutions);
37 GUI.centerAndSizeToParent(solutionsDialog, task.getFramework().getMainWindow());46 GUI.centerAndSizeToParent(solutionsDialog, task.getFramework().getMainWindow());
38 solutionsDialog.setVisible(true);47 solutionsDialog.setVisible(true);
39 } else {48 } else {
40 String message = result.getReturnValue().getMessage();
41 if (message == null) {49 if (message == null) {
42 message = propertyName + " is satisfied.";50 message = getPropertyName() + " is satisfied.";
43 }51 }
44 JOptionPane.showMessageDialog(null, message);52 JOptionPane.showMessageDialog(null, message);
45 }53 }
4654
=== added file 'MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatUndefinedResultHandler.java'
--- MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatUndefinedResultHandler.java 1970-01-01 00:00:00 +0000
+++ MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatUndefinedResultHandler.java 2014-04-29 16:24:51 +0000
@@ -0,0 +1,32 @@
1package org.workcraft.plugins.mpsat;
2
3import javax.swing.JOptionPane;
4
5import org.workcraft.plugins.mpsat.tasks.MpsatChainResult;
6import org.workcraft.plugins.mpsat.tasks.MpsatChainTask;
7import org.workcraft.tasks.Result;
8
9
10final class MpsatUndefinedResultHandler implements Runnable {
11
12 private final Result<? extends MpsatChainResult> result;
13 private final MpsatChainTask task;
14
15 MpsatUndefinedResultHandler(MpsatChainTask task, Result<? extends MpsatChainResult> result) {
16 this.task = task;
17 this.result = result;
18 }
19
20 @Override
21 public void run() {
22 String message = result.getReturnValue().getMessage();
23 if (message == null) {
24 MpsatSettings settings = task.getSettings();
25 if (settings != null && settings.getName() != null) {
26 message = settings.getName();
27 }
28 }
29 JOptionPane.showMessageDialog(null, message);
30 }
31
32}
033
=== modified file 'MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatUtilitySettings.java'
--- MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatUtilitySettings.java 2013-10-15 12:25:49 +0000
+++ MpsatPlugin/src/org/workcraft/plugins/mpsat/MpsatUtilitySettings.java 2014-04-29 16:24:51 +0000
@@ -35,10 +35,12 @@
35 private static final String commandKey = "Tools.mpsat.command";35 private static final String commandKey = "Tools.mpsat.command";
36 private static final String solutionModeKey = "Tools.mpsat.solutionMode";36 private static final String solutionModeKey = "Tools.mpsat.solutionMode";
37 private static final String extraArgsKey = "Tools.mpsat.args";37 private static final String extraArgsKey = "Tools.mpsat.args";
38 private static final String debugReachKey = "Tools.mpsat.debugReach";
38 39
39 private static String command = "mpsat";40 private static String command = "mpsat";
40 private static SolutionMode solutionMode = SolutionMode.MINIMUM_COST;41 private static SolutionMode solutionMode = SolutionMode.MINIMUM_COST;
41 private static String extraArgs = "";42 private static String extraArgs = "";
43 private static Boolean debugReach = false;
4244
43 public MpsatUtilitySettings() {45 public MpsatUtilitySettings() {
44 properties = new LinkedList<PropertyDescriptor>();46 properties = new LinkedList<PropertyDescriptor>();
@@ -72,6 +74,16 @@
72 return MpsatUtilitySettings.getExtraArgs();74 return MpsatUtilitySettings.getExtraArgs();
73 }75 }
74 });76 });
77
78 properties.add(new PropertyDeclaration<MpsatUtilitySettings, Boolean>(
79 this, "MPSat debug", Boolean.class) {
80 protected void setter(MpsatUtilitySettings object, Boolean value) {
81 MpsatUtilitySettings.setDebugReach(value);
82 }
83 protected Boolean getter(MpsatUtilitySettings object) {
84 return MpsatUtilitySettings.getDebugReach();
85 }
86 });
75 }87 }
76 88
77 @Override89 @Override
@@ -84,6 +96,7 @@
84 command = config.getString(commandKey, "mpsat");96 command = config.getString(commandKey, "mpsat");
85 solutionMode = config.getEnum(solutionModeKey, SolutionMode.class, SolutionMode.FIRST);97 solutionMode = config.getEnum(solutionModeKey, SolutionMode.class, SolutionMode.FIRST);
86 extraArgs = config.getString(extraArgsKey, "");98 extraArgs = config.getString(extraArgsKey, "");
99 debugReach = config.getBoolean(debugReachKey, false);
87 }100 }
88101
89 @Override102 @Override
@@ -91,6 +104,7 @@
91 config.set(commandKey, command);104 config.set(commandKey, command);
92 config.setEnum(solutionModeKey, SolutionMode.class, solutionMode);105 config.setEnum(solutionModeKey, SolutionMode.class, solutionMode);
93 config.set(extraArgsKey, extraArgs);106 config.set(extraArgsKey, extraArgs);
107 config.setBoolean(debugReachKey, debugReach);
94 }108 }
95 109
96 @Override110 @Override
@@ -130,4 +144,12 @@
130 public static int getSolutionCount() {144 public static int getSolutionCount() {
131 return (MpsatUtilitySettings.solutionMode == SolutionMode.ALL) ? 10 : 1;145 return (MpsatUtilitySettings.solutionMode == SolutionMode.ALL) ? 10 : 1;
132 }146 }
147
148 public static Boolean getDebugReach() {
149 return debugReach;
150 }
151
152 public static void setDebugReach(Boolean debug) {
153 MpsatUtilitySettings.debugReach = debug;
154 }
133}155}
134\ No newline at end of file156\ No newline at end of file
135157
=== modified file 'MpsatPlugin/src/org/workcraft/plugins/mpsat/gui/MpsatConfigurationDialog.java'
--- MpsatPlugin/src/org/workcraft/plugins/mpsat/gui/MpsatConfigurationDialog.java 2014-04-16 22:13:32 +0000
+++ MpsatPlugin/src/org/workcraft/plugins/mpsat/gui/MpsatConfigurationDialog.java 2014-04-29 16:24:51 +0000
@@ -154,7 +154,7 @@
154 }154 }
155155
156 private void createSolutionModeButtons() {156 private void createSolutionModeButtons() {
157 firstSolutionButton = new JRadioButton ("Find any solution (default)");157 firstSolutionButton = new JRadioButton ("Find any solution");
158 firstSolutionButton.setSelected(true);158 firstSolutionButton.setSelected(true);
159 firstSolutionButton.addActionListener(new ActionListener() {159 firstSolutionButton.addActionListener(new ActionListener() {
160 @Override160 @Override
161161
=== modified file 'MpsatPlugin/src/org/workcraft/plugins/mpsat/gui/SolutionPanel.java'
--- MpsatPlugin/src/org/workcraft/plugins/mpsat/gui/SolutionPanel.java 2014-04-16 21:55:15 +0000
+++ MpsatPlugin/src/org/workcraft/plugins/mpsat/gui/SolutionPanel.java 2014-04-29 16:24:51 +0000
@@ -43,7 +43,7 @@
43 43
44 JButton saveButton = new JButton("Save"); 44 JButton saveButton = new JButton("Save");
45 45
46 JButton playButton = new JButton("Play trace");46 JButton playButton = new JButton("Play");
47 playButton.addActionListener(new ActionListener()47 playButton.addActionListener(new ActionListener()
48 {48 {
49 @Override49 @Override
5050
=== modified file 'MpsatPlugin/src/org/workcraft/plugins/mpsat/tasks/MpsatChainResult.java'
--- MpsatPlugin/src/org/workcraft/plugins/mpsat/tasks/MpsatChainResult.java 2010-11-18 02:08:34 +0000
+++ MpsatPlugin/src/org/workcraft/plugins/mpsat/tasks/MpsatChainResult.java 2014-04-29 16:24:51 +0000
@@ -5,38 +5,47 @@
5import org.workcraft.tasks.Result;5import org.workcraft.tasks.Result;
66
7public class MpsatChainResult {7public class MpsatChainResult {
8 private Result<? extends Object> exportResult;
9 private Result<? extends ExternalProcessResult> pcompResult;
8 private Result<? extends ExternalProcessResult> punfResult;10 private Result<? extends ExternalProcessResult> punfResult;
9 private Result<? extends ExternalProcessResult> mpsatResult;11 private Result<? extends ExternalProcessResult> mpsatResult;
10 private Result<? extends Object> exportResult;
11 private MpsatSettings mpsatSettings;12 private MpsatSettings mpsatSettings;
12 private String message;13 private String message;
14
15 public MpsatChainResult(Result<? extends Object> exportResult,
16 Result<? extends ExternalProcessResult> pcompResult,
17 Result<? extends ExternalProcessResult> punfResult,
18 Result<? extends ExternalProcessResult> mpsatResult,
19 MpsatSettings mpsatSettings, String message) {
13 20
21 this.exportResult = exportResult;
22 this.pcompResult = pcompResult;
23 this.punfResult = punfResult;
24 this.mpsatResult = mpsatResult;
25 this.mpsatSettings = mpsatSettings;
26 this.message = message;
27 }
28
14 public MpsatChainResult(Result<? extends Object> exportResult,29 public MpsatChainResult(Result<? extends Object> exportResult,
15 Result<? extends ExternalProcessResult> punfResult,30 Result<? extends ExternalProcessResult> pcompResult,
31 Result<? extends ExternalProcessResult> punfResult,
16 Result<? extends ExternalProcessResult> mpsatResult,32 Result<? extends ExternalProcessResult> mpsatResult,
17 MpsatSettings mpsatSettings) {33 MpsatSettings mpsatSettings) {
18 this.punfResult = punfResult;34
19 this.mpsatResult = mpsatResult;35 this(exportResult, pcompResult, punfResult, mpsatResult, mpsatSettings, null);
20 this.exportResult = exportResult;
21 this.mpsatSettings = mpsatSettings;
22 }
23
24 public MpsatChainResult(Result<? extends Object> exportResult,
25 Result<? extends ExternalProcessResult> punfResult,
26 Result<? extends ExternalProcessResult> mpsatResult,
27 MpsatSettings mpsatSettings, String message) {
28
29 this.punfResult = punfResult;
30 this.mpsatResult = mpsatResult;
31 this.exportResult = exportResult;
32 this.mpsatSettings = mpsatSettings;
33
34 this.message = message;
35 }36 }
36 37
37 public MpsatSettings getMpsatSettings() {38 public MpsatSettings getMpsatSettings() {
38 return mpsatSettings;39 return mpsatSettings;
39 }40 }
41
42 public Result<? extends Object> getExportResult() {
43 return exportResult;
44 }
45
46 public Result<? extends ExternalProcessResult> getPcompResult() {
47 return pcompResult;
48 }
4049
41 public Result<? extends ExternalProcessResult> getPunfResult() {50 public Result<? extends ExternalProcessResult> getPunfResult() {
42 return punfResult;51 return punfResult;
@@ -49,8 +58,4 @@
49 public String getMessage() {58 public String getMessage() {
50 return message;59 return message;
51 }60 }
52
53 public Result<? extends Object> getExportResult() {
54 return exportResult;
55 }
56}61}
57\ No newline at end of file62\ No newline at end of file
5863
=== modified file 'MpsatPlugin/src/org/workcraft/plugins/mpsat/tasks/MpsatChainTask.java'
--- MpsatPlugin/src/org/workcraft/plugins/mpsat/tasks/MpsatChainTask.java 2014-04-16 21:55:15 +0000
+++ MpsatPlugin/src/org/workcraft/plugins/mpsat/tasks/MpsatChainTask.java 2014-04-29 16:24:51 +0000
@@ -50,7 +50,7 @@
50 netFile.delete();50 netFile.delete();
51 if (exportResult.getOutcome() == Outcome.CANCELLED)51 if (exportResult.getOutcome() == Outcome.CANCELLED)
52 return new Result<MpsatChainResult>(Outcome.CANCELLED);52 return new Result<MpsatChainResult>(Outcome.CANCELLED);
53 return new Result<MpsatChainResult>(Outcome.FAILED, new MpsatChainResult(exportResult, null, null, settings));53 return new Result<MpsatChainResult>(Outcome.FAILED, new MpsatChainResult(exportResult, null, null, null, settings));
54 }54 }
55 monitor.progressUpdate(0.33);55 monitor.progressUpdate(0.33);
56 56
@@ -63,7 +63,7 @@
63 mciFile.delete();63 mciFile.delete();
64 if (punfResult.getOutcome() == Outcome.CANCELLED)64 if (punfResult.getOutcome() == Outcome.CANCELLED)
65 return new Result<MpsatChainResult>(Outcome.CANCELLED);65 return new Result<MpsatChainResult>(Outcome.CANCELLED);
66 return new Result<MpsatChainResult>(Outcome.FAILED, new MpsatChainResult(exportResult, punfResult, null, settings));66 return new Result<MpsatChainResult>(Outcome.FAILED, new MpsatChainResult(exportResult, null, punfResult, null, settings));
67 }67 }
6868
69 monitor.progressUpdate(0.66);69 monitor.progressUpdate(0.66);
@@ -75,12 +75,12 @@
75 if (mpsatResult.getOutcome() != Outcome.FINISHED) {75 if (mpsatResult.getOutcome() != Outcome.FINISHED) {
76 if (mpsatResult.getOutcome() == Outcome.CANCELLED)76 if (mpsatResult.getOutcome() == Outcome.CANCELLED)
77 return new Result<MpsatChainResult>(Outcome.CANCELLED);77 return new Result<MpsatChainResult>(Outcome.CANCELLED);
78 return new Result<MpsatChainResult>(Outcome.FAILED, new MpsatChainResult(exportResult, punfResult, mpsatResult, settings ));78 return new Result<MpsatChainResult>(Outcome.FAILED, new MpsatChainResult(exportResult, null, punfResult, mpsatResult, settings ));
79 }79 }
80 80
81 monitor.progressUpdate(1.0);81 monitor.progressUpdate(1.0);
82 82
83 return new Result<MpsatChainResult>(Outcome.FINISHED, new MpsatChainResult(exportResult, punfResult, mpsatResult, settings));83 return new Result<MpsatChainResult>(Outcome.FINISHED, new MpsatChainResult(exportResult, null, punfResult, mpsatResult, settings));
84 } catch (Throwable e) {84 } catch (Throwable e) {
85 return new Result<MpsatChainResult>(e);85 return new Result<MpsatChainResult>(e);
86 }86 }
8787
=== modified file 'MpsatPlugin/src/org/workcraft/plugins/pcomp/tasks/PcompResultHandler.java'
--- MpsatPlugin/src/org/workcraft/plugins/pcomp/tasks/PcompResultHandler.java 2010-09-21 15:39:20 +0000
+++ MpsatPlugin/src/org/workcraft/plugins/pcomp/tasks/PcompResultHandler.java 2014-04-29 16:24:51 +0000
@@ -40,9 +40,9 @@
40 if (result.getCause() != null) {40 if (result.getCause() != null) {
41 message = result.getCause().getMessage();41 message = result.getCause().getMessage();
42 result.getCause().printStackTrace();42 result.getCause().printStackTrace();
43 }43 } else {
44 else
45 message = "Pcomp errors: \n" + new String(result.getReturnValue().getErrors());44 message = "Pcomp errors: \n" + new String(result.getReturnValue().getErrors());
45 }
46 JOptionPane.showMessageDialog(framework.getMainWindow(), message, "Parallel composition failed", JOptionPane.ERROR_MESSAGE);46 JOptionPane.showMessageDialog(framework.getMainWindow(), message, "Parallel composition failed", JOptionPane.ERROR_MESSAGE);
47 } else if (result.getOutcome() == Outcome.FINISHED) {47 } else if (result.getOutcome() == Outcome.FINISHED) {
48 try {48 try {
4949
=== modified file 'MpsatPlugin/src/org/workcraft/plugins/pcomp/tools/PcompTool.java'
--- MpsatPlugin/src/org/workcraft/plugins/pcomp/tools/PcompTool.java 2014-04-16 17:52:01 +0000
+++ MpsatPlugin/src/org/workcraft/plugins/pcomp/tools/PcompTool.java 2014-04-29 16:24:51 +0000
@@ -45,7 +45,9 @@
45 inputs.add(dotGProvider.getDotG(p));45 inputs.add(dotGProvider.getDotG(p));
46 }46 }
47 47
48 framework.getTaskManager().queue(new PcompTask(inputs.toArray(new File[0]), dialog.getMode(), dialog.isImprovedPcompChecked()), "Running pcomp", new PcompResultHandler(framework, dialog.showInEditor()));48 PcompTask pcompTask = new PcompTask(inputs.toArray(new File[0]), dialog.getMode(), dialog.isImprovedPcompChecked());
49 PcompResultHandler pcompResult = new PcompResultHandler(framework, dialog.showInEditor());
50 framework.getTaskManager().queue(pcompTask, "Running pcomp", pcompResult);
49 }51 }
50 }52 }
5153
5254
=== modified file 'PolicyNetPlugin/src/org/workcraft/plugins/policy/tasks/CheckDeadlockTask.java'
--- PolicyNetPlugin/src/org/workcraft/plugins/policy/tasks/CheckDeadlockTask.java 2014-04-16 21:55:15 +0000
+++ PolicyNetPlugin/src/org/workcraft/plugins/policy/tasks/CheckDeadlockTask.java 2014-04-29 16:24:51 +0000
@@ -53,20 +53,24 @@
53 File netFile = File.createTempFile("net", exporter.getExtenstion());53 File netFile = File.createTempFile("net", exporter.getExtenstion());
54 ExportTask exportTask = new ExportTask(exporter, model, netFile.getCanonicalPath());54 ExportTask exportTask = new ExportTask(exporter, model, netFile.getCanonicalPath());
55 SubtaskMonitor<Object> mon = new SubtaskMonitor<Object>(monitor);55 SubtaskMonitor<Object> mon = new SubtaskMonitor<Object>(monitor);
56 Result<? extends Object> exportResult = framework.getTaskManager().execute(exportTask, "Exporting .g", mon);56 Result<? extends Object> exportResult = framework.getTaskManager().execute(
57 exportTask, "Exporting .g", mon);
58
57 if (exportResult.getOutcome() != Outcome.FINISHED) {59 if (exportResult.getOutcome() != Outcome.FINISHED) {
58 netFile.delete();60 netFile.delete();
59 if (exportResult.getOutcome() == Outcome.CANCELLED) {61 if (exportResult.getOutcome() == Outcome.CANCELLED) {
60 return new Result<MpsatChainResult>(Outcome.CANCELLED);62 return new Result<MpsatChainResult>(Outcome.CANCELLED);
61 }63 }
62 return new Result<MpsatChainResult>(Outcome.FAILED, 64 return new Result<MpsatChainResult>(Outcome.FAILED,
63 new MpsatChainResult(exportResult, null, null, settings));65 new MpsatChainResult(exportResult, null, null, null, settings));
64 }66 }
65 monitor.progressUpdate(0.20);67 monitor.progressUpdate(0.20);
66 68
67 File mciFile = File.createTempFile("unfolding", ".mci");69 File mciFile = File.createTempFile("unfolding", ".mci");
68 PunfTask punfTask = new PunfTask(netFile.getCanonicalPath(), mciFile.getCanonicalPath());70 PunfTask punfTask = new PunfTask(netFile.getCanonicalPath(), mciFile.getCanonicalPath());
69 Result<? extends ExternalProcessResult> punfResult = framework.getTaskManager().execute(punfTask, "Unfolding .g", mon);71 Result<? extends ExternalProcessResult> punfResult = framework.getTaskManager().execute(
72 punfTask, "Unfolding .g", mon);
73
70 netFile.delete();74 netFile.delete();
71 if (punfResult.getOutcome() != Outcome.FINISHED) {75 if (punfResult.getOutcome() != Outcome.FINISHED) {
72 mciFile.delete();76 mciFile.delete();
@@ -74,18 +78,21 @@
74 return new Result<MpsatChainResult>(Outcome.CANCELLED);78 return new Result<MpsatChainResult>(Outcome.CANCELLED);
75 }79 }
76 return new Result<MpsatChainResult>(Outcome.FAILED, 80 return new Result<MpsatChainResult>(Outcome.FAILED,
77 new MpsatChainResult(exportResult, punfResult, null, settings));81 new MpsatChainResult(exportResult, null, punfResult, null, settings));
78 }82 }
79 monitor.progressUpdate(0.70);83 monitor.progressUpdate(0.70);
8084
81 MpsatTask mpsatTask = new MpsatTask(settings.getMpsatArguments(), mciFile.getCanonicalPath());85 MpsatTask mpsatTask = new MpsatTask(settings.getMpsatArguments(), mciFile.getCanonicalPath());
82 Result<? extends ExternalProcessResult> mpsatResult = framework.getTaskManager().execute(mpsatTask, "Running deadlock checking [MPSat]", mon);86 Result<? extends ExternalProcessResult> mpsatResult = framework.getTaskManager().execute(
87 mpsatTask, "Running deadlock checking [MPSat]", mon);
88
83 if (mpsatResult.getOutcome() != Outcome.FINISHED) {89 if (mpsatResult.getOutcome() != Outcome.FINISHED) {
84 if (mpsatResult.getOutcome() == Outcome.CANCELLED) {90 if (mpsatResult.getOutcome() == Outcome.CANCELLED) {
85 return new Result<MpsatChainResult>(Outcome.CANCELLED);91 return new Result<MpsatChainResult>(Outcome.CANCELLED);
86 }92 }
87 return new Result<MpsatChainResult>(Outcome.FAILED, 93 return new Result<MpsatChainResult>(Outcome.FAILED,
88 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings, new String(mpsatResult.getReturnValue().getErrors())));94 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, settings,
95 new String(mpsatResult.getReturnValue().getErrors())));
89 }96 }
90 monitor.progressUpdate(0.90);97 monitor.progressUpdate(0.90);
91 98
@@ -93,13 +100,13 @@
93 if (!mdp.getSolutions().isEmpty()) {100 if (!mdp.getSolutions().isEmpty()) {
94 mciFile.delete();101 mciFile.delete();
95 return new Result<MpsatChainResult>(Outcome.FINISHED, 102 return new Result<MpsatChainResult>(Outcome.FINISHED,
96 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings, "Policy net has a deadlock"));103 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, settings, "Policy net has a deadlock"));
97 }104 }
98 monitor.progressUpdate(1.0);105 monitor.progressUpdate(1.0);
99106
100 mciFile.delete();107 mciFile.delete();
101 return new Result<MpsatChainResult>(Outcome.FINISHED, 108 return new Result<MpsatChainResult>(Outcome.FINISHED,
102 new MpsatChainResult(exportResult, punfResult, mpsatResult, settings, "Policy net is deadlock-free"));109 new MpsatChainResult(exportResult, null, punfResult, mpsatResult, settings, "Policy net is deadlock-free"));
103 110
104 } catch (Throwable e) {111 } catch (Throwable e) {
105 return new Result<MpsatChainResult>(e);112 return new Result<MpsatChainResult>(e);
106113
=== modified file 'STGPlugin/src/org/workcraft/plugins/stg/LabelParser.java'
--- STGPlugin/src/org/workcraft/plugins/stg/LabelParser.java 2014-04-03 17:30:41 +0000
+++ STGPlugin/src/org/workcraft/plugins/stg/LabelParser.java 2014-04-29 16:24:51 +0000
@@ -20,7 +20,7 @@
20 20
21 public static Pair<String, String> parseImplicitPlaceReference(String ref) {21 public static Pair<String, String> parseImplicitPlaceReference(String ref) {
22 String[] parts = ref.replaceAll(" ", "").split(",");22 String[] parts = ref.replaceAll(" ", "").split(",");
23 if (parts.length < 2 || !parts[0].startsWith("<") || !parts[0].endsWith(">")) {23 if (parts.length < 2 || !parts[0].startsWith("<") || !parts[1].endsWith(">")) {
24 return null;24 return null;
25 }25 }
26 return Pair.of(parts[0].substring(1), parts[1].substring(0, parts[1].length()-1));26 return Pair.of(parts[0].substring(1), parts[1].substring(0, parts[1].length()-1));
2727
=== modified file 'STGPlugin/src/org/workcraft/plugins/stg/STG.java'
--- STGPlugin/src/org/workcraft/plugins/stg/STG.java 2014-04-22 13:51:18 +0000
+++ STGPlugin/src/org/workcraft/plugins/stg/STG.java 2014-04-29 16:24:51 +0000
@@ -320,12 +320,8 @@
320 throw new RuntimeException(320 throw new RuntimeException(
321 "An implicit place cannot have more that one transition in its preset or postset.");321 "An implicit place cannot have more that one transition in its preset or postset.");
322 }322 }
323 return "<"323 return "<" + referenceManager.getNodeReference(preset.iterator().next()) + ","
324 + referenceManager.getNodeReference(preset.iterator()324 + referenceManager.getNodeReference(postset.iterator().next()) + ">";
325 .next())
326 + ","
327 + referenceManager.getNodeReference(postset.iterator()
328 .next()) + ">";
329 } else {325 } else {
330 return referenceManager.getNodeReference(node);326 return referenceManager.getNodeReference(node);
331 }327 }
@@ -335,8 +331,7 @@
335 }331 }
336332
337 public Node getNodeByReference(String reference) {333 public Node getNodeByReference(String reference) {
338 Pair<String, String> implicitPlaceTransitions = LabelParser334 Pair<String, String> implicitPlaceTransitions = LabelParser.parseImplicitPlaceReference(reference);
339 .parseImplicitPlaceReference(reference);
340 if (implicitPlaceTransitions != null) {335 if (implicitPlaceTransitions != null) {
341 Node t1 = referenceManager336 Node t1 = referenceManager
342 .getNodeByReference(implicitPlaceTransitions.getFirst());337 .getNodeByReference(implicitPlaceTransitions.getFirst());
343338
=== modified file 'STGPlugin/src/org/workcraft/plugins/stg/VisualSTG.java'
--- STGPlugin/src/org/workcraft/plugins/stg/VisualSTG.java 2014-04-17 15:33:40 +0000
+++ STGPlugin/src/org/workcraft/plugins/stg/VisualSTG.java 2014-04-29 16:24:51 +0000
@@ -246,12 +246,5 @@
246 }246 }
247 return null;247 return null;
248 }248 }
249
250 public Connection getConnection(Node first, Node second) {
251 for(Connection connection : getConnections(first)) {
252 if (connection.getSecond() == second) return connection;
253 }
254 return null;
255 }
256249
257}250}
258251
=== modified file 'WorkcraftCore/src/org/workcraft/dom/AbstractModel.java'
--- WorkcraftCore/src/org/workcraft/dom/AbstractModel.java 2014-01-29 19:00:22 +0000
+++ WorkcraftCore/src/org/workcraft/dom/AbstractModel.java 2014-04-29 16:24:51 +0000
@@ -131,4 +131,12 @@
131 protected ReferenceManager getReferenceManager() {131 protected ReferenceManager getReferenceManager() {
132 return referenceManager;132 return referenceManager;
133 }133 }
134}
135\ No newline at end of file134\ No newline at end of file
135
136 public Connection getConnection(Node first, Node second) {
137 for(Connection connection : getConnections(first)) {
138 if (connection.getSecond() == second) return connection;
139 }
140 return null;
141 }
142
143}
136144
=== modified file 'WorkcraftCore/src/org/workcraft/gui/propertyeditor/FileCellEditor.java'
--- WorkcraftCore/src/org/workcraft/gui/propertyeditor/FileCellEditor.java 2014-04-09 22:33:19 +0000
+++ WorkcraftCore/src/org/workcraft/gui/propertyeditor/FileCellEditor.java 2014-04-29 16:24:51 +0000
@@ -11,8 +11,6 @@
11import javax.swing.JTable;11import javax.swing.JTable;
12import javax.swing.table.TableCellEditor;12import javax.swing.table.TableCellEditor;
1313
14import org.workcraft.gui.FileFilters;
15
16@SuppressWarnings("serial")14@SuppressWarnings("serial")
17public class FileCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {15public class FileCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
18 16
@@ -34,7 +32,6 @@
34 if (EDIT.equals(e.getActionCommand())) {32 if (EDIT.equals(e.getActionCommand())) {
35 JFileChooser fc = new JFileChooser();33 JFileChooser fc = new JFileChooser();
36 fc.setDialogType(JFileChooser.OPEN_DIALOG);34 fc.setDialogType(JFileChooser.OPEN_DIALOG);
37 fc.setFileFilter(FileFilters.DOCUMENT_FILES);
38 fc.setMultiSelectionEnabled(false);35 fc.setMultiSelectionEnabled(false);
39 fc.setSelectedFile(file);36 fc.setSelectedFile(file);
40 fc.setDialogTitle("Open environment file");37 fc.setDialogTitle("Open environment file");
4138
=== modified file 'WorkcraftCore/src/org/workcraft/plugins/BuiltinSerialisers.java'
--- WorkcraftCore/src/org/workcraft/plugins/BuiltinSerialisers.java 2012-05-22 09:39:39 +0000
+++ WorkcraftCore/src/org/workcraft/plugins/BuiltinSerialisers.java 2014-04-29 16:24:51 +0000
@@ -20,6 +20,8 @@
20import org.workcraft.plugins.serialisation.xml.DoubleSerialiser;20import org.workcraft.plugins.serialisation.xml.DoubleSerialiser;
21import org.workcraft.plugins.serialisation.xml.EnumDeserialiser;21import org.workcraft.plugins.serialisation.xml.EnumDeserialiser;
22import org.workcraft.plugins.serialisation.xml.EnumSerialiser;22import org.workcraft.plugins.serialisation.xml.EnumSerialiser;
23import org.workcraft.plugins.serialisation.xml.FileDeserialiser;
24import org.workcraft.plugins.serialisation.xml.FileSerialiser;
23import org.workcraft.plugins.serialisation.xml.IntDeserialiser;25import org.workcraft.plugins.serialisation.xml.IntDeserialiser;
24import org.workcraft.plugins.serialisation.xml.IntSerialiser;26import org.workcraft.plugins.serialisation.xml.IntSerialiser;
25import org.workcraft.plugins.serialisation.xml.StringDeserialiser;27import org.workcraft.plugins.serialisation.xml.StringDeserialiser;
@@ -46,6 +48,7 @@
46 p.registerClass(org.workcraft.serialisation.xml.XMLSerialiser.class, BezierSerialiser.class);48 p.registerClass(org.workcraft.serialisation.xml.XMLSerialiser.class, BezierSerialiser.class);
47 p.registerClass(org.workcraft.serialisation.xml.XMLSerialiser.class, ConnectionSerialiser.class);49 p.registerClass(org.workcraft.serialisation.xml.XMLSerialiser.class, ConnectionSerialiser.class);
48 p.registerClass(org.workcraft.serialisation.xml.XMLSerialiser.class, VisualConnectionSerialiser.class);50 p.registerClass(org.workcraft.serialisation.xml.XMLSerialiser.class, VisualConnectionSerialiser.class);
51 p.registerClass(org.workcraft.serialisation.xml.XMLSerialiser.class, FileSerialiser.class);
49 52
50 p.registerClass(org.workcraft.serialisation.xml.XMLDeserialiser.class, AffineTransformDeserialiser.class);53 p.registerClass(org.workcraft.serialisation.xml.XMLDeserialiser.class, AffineTransformDeserialiser.class);
51 p.registerClass(org.workcraft.serialisation.xml.XMLDeserialiser.class, BooleanDeserialiser.class);54 p.registerClass(org.workcraft.serialisation.xml.XMLDeserialiser.class, BooleanDeserialiser.class);
@@ -57,6 +60,7 @@
57 p.registerClass(org.workcraft.serialisation.xml.XMLDeserialiser.class, BezierDeserialiser.class);60 p.registerClass(org.workcraft.serialisation.xml.XMLDeserialiser.class, BezierDeserialiser.class);
58 p.registerClass(org.workcraft.serialisation.xml.XMLDeserialiser.class, ConnectionDeserialiser.class);61 p.registerClass(org.workcraft.serialisation.xml.XMLDeserialiser.class, ConnectionDeserialiser.class);
59 p.registerClass(org.workcraft.serialisation.xml.XMLDeserialiser.class, VisualConnectionDeserialiser.class);62 p.registerClass(org.workcraft.serialisation.xml.XMLDeserialiser.class, VisualConnectionDeserialiser.class);
63 p.registerClass(org.workcraft.serialisation.xml.XMLDeserialiser.class, FileDeserialiser.class);
60 }64 }
6165
62 @Override66 @Override
6367
=== added file 'WorkcraftCore/src/org/workcraft/plugins/serialisation/xml/FileDeserialiser.java'
--- WorkcraftCore/src/org/workcraft/plugins/serialisation/xml/FileDeserialiser.java 1970-01-01 00:00:00 +0000
+++ WorkcraftCore/src/org/workcraft/plugins/serialisation/xml/FileDeserialiser.java 2014-04-29 16:24:51 +0000
@@ -0,0 +1,19 @@
1package org.workcraft.plugins.serialisation.xml;
2
3import java.io.File;
4
5import org.w3c.dom.Element;
6import org.workcraft.exceptions.DeserialisationException;
7import org.workcraft.serialisation.xml.BasicXMLDeserialiser;
8
9public class FileDeserialiser implements BasicXMLDeserialiser{
10
11 public String getClassName() {
12 return File.class.getName();
13 }
14
15 public Object deserialise(Element element) throws DeserialisationException {
16 return new File(element.getAttribute("path"));
17 }
18
19}
020
=== added file 'WorkcraftCore/src/org/workcraft/plugins/serialisation/xml/FileSerialiser.java'
--- WorkcraftCore/src/org/workcraft/plugins/serialisation/xml/FileSerialiser.java 1970-01-01 00:00:00 +0000
+++ WorkcraftCore/src/org/workcraft/plugins/serialisation/xml/FileSerialiser.java 2014-04-29 16:24:51 +0000
@@ -0,0 +1,22 @@
1package org.workcraft.plugins.serialisation.xml;
2
3import java.io.File;
4
5import org.w3c.dom.Element;
6import org.workcraft.exceptions.SerialisationException;
7import org.workcraft.serialisation.xml.BasicXMLSerialiser;
8
9public class FileSerialiser implements BasicXMLSerialiser {
10
11 public String getClassName() {
12 return File.class.getName();
13 }
14
15 public void serialise(Element element, Object object)
16 throws SerialisationException {
17 if (object != null) {
18 element.setAttribute("path", ((File)object).getPath());
19 }
20 }
21
22}
023
=== modified file 'WorkcraftCore/src/org/workcraft/plugins/shared/CommonEditorSettings.java'
--- WorkcraftCore/src/org/workcraft/plugins/shared/CommonEditorSettings.java 2014-03-13 15:09:13 +0000
+++ WorkcraftCore/src/org/workcraft/plugins/shared/CommonEditorSettings.java 2014-04-29 16:24:51 +0000
@@ -31,12 +31,17 @@
3131
32public class CommonEditorSettings implements SettingsPage {32public class CommonEditorSettings implements SettingsPage {
33 private static LinkedList<PropertyDescriptor> properties;33 private static LinkedList<PropertyDescriptor> properties;
3434
35 private static final String backgroundColorKey = "CommonEditorSettings.backgroundColor";
36 private static final String showGridKey = "CommonEditorSettings.showGrid";
37 private static final String showRulersKey = "CommonEditorSettings.showRulers";
38 private static final String iconSizeKey = "CommonEditorSettings.iconSize";
39 private static final String debugClipboardKey = "CommonEditorSettings.debugClipboard";
40
35 protected static Color backgroundColor = Color.WHITE;41 protected static Color backgroundColor = Color.WHITE;
36 private static boolean showGrid = true;42 private static boolean showGrid = true;
37 private static boolean showRulers = true;43 private static boolean showRulers = true;
38 protected static int iconSize = 24;44 protected static int iconSize = 24;
39
40 private static boolean debugClipboard = false; 45 private static boolean debugClipboard = false;
4146
42 public String getSection() {47 public String getSection() {
@@ -115,19 +120,19 @@
115 }120 }
116121
117 public void load(Config config) {122 public void load(Config config) {
118 backgroundColor = config.getColor("CommonEditorSettings.backgroundColor", Color.WHITE);123 backgroundColor = config.getColor(backgroundColorKey, Color.WHITE);
119 showGrid = config.getBoolean("CommonEditorSettings.showGrid", true);124 showGrid = config.getBoolean(showGridKey, true);
120 showRulers = config.getBoolean("CommonEditorSettings.showRullers", true);125 showRulers = config.getBoolean(showRulersKey, true);
121 iconSize = config.getInt("CommonEditorSettings.iconSize", 24);126 iconSize = config.getInt(iconSizeKey, 24);
122 debugClipboard = config.getBoolean("CommonEditorSettings.debugClipboard", false);127 debugClipboard = config.getBoolean(debugClipboardKey, false);
123 }128 }
124129
125 public void save(Config config) {130 public void save(Config config) {
126 config.setColor("CommonEditorSettings.backgroundColor", backgroundColor);131 config.setColor(backgroundColorKey, backgroundColor);
127 config.setBoolean("CommonEditorSettings.showGrid", showGrid);132 config.setBoolean(showGridKey, showGrid);
128 config.setBoolean("CommonEditorSettings.showRullers", showRulers);133 config.setBoolean(showRulersKey, showRulers);
129 config.setInt("CommonEditorSettings.iconSize", iconSize);134 config.setInt(iconSizeKey, iconSize);
130 config.setBoolean("CommonEditorSettings.debugClipboard", debugClipboard);135 config.setBoolean(debugClipboardKey, debugClipboard);
131 }136 }
132 137
133 public static Color getBackgroundColor() {138 public static Color getBackgroundColor() {

Subscribers

People subscribed via source and target branches