Merge lp:~danilovesky/workcraft/trunk-bug-1338529 into lp:workcraft

Proposed by Danil Sokolov
Status: Merged
Merged at revision: 513
Proposed branch: lp:~danilovesky/workcraft/trunk-bug-1338529
Merge into: lp:workcraft
Diff against target: 190 lines (+50/-52)
3 files modified
CircuitPlugin/src/org/workcraft/plugins/circuit/FunctionContact.java (+2/-3)
CircuitPlugin/src/org/workcraft/plugins/circuit/VisualContact.java (+5/-5)
CircuitPlugin/src/org/workcraft/plugins/circuit/tools/STGGenerator.java (+43/-44)
To merge this branch: bzr merge lp:~danilovesky/workcraft/trunk-bug-1338529
Reviewer Review Type Date Requested Status
Danil Sokolov Approve
Review via email: mp+225825@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
1=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/FunctionContact.java'
2--- CircuitPlugin/src/org/workcraft/plugins/circuit/FunctionContact.java 2014-06-27 14:48:42 +0000
3+++ CircuitPlugin/src/org/workcraft/plugins/circuit/FunctionContact.java 2014-07-07 13:25:20 +0000
4@@ -25,15 +25,14 @@
5 import org.workcraft.annotations.VisualClass;
6 import org.workcraft.observation.PropertyChangedEvent;
7 import org.workcraft.plugins.cpog.optimisation.BooleanFormula;
8-import org.workcraft.plugins.cpog.optimisation.expressions.Zero;
9
10
11 @DisplayName("FunctionContact")
12 @VisualClass(org.workcraft.plugins.circuit.VisualFunctionContact.class)
13
14 public class FunctionContact extends Contact {
15- private BooleanFormula setFunction=Zero.instance();
16- private BooleanFormula resetFunction=null;
17+ private BooleanFormula setFunction = null;
18+ private BooleanFormula resetFunction = null;
19
20 public FunctionContact(IOType ioType) {
21 super(ioType);
22
23=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/VisualContact.java'
24--- CircuitPlugin/src/org/workcraft/plugins/circuit/VisualContact.java 2014-06-27 14:48:42 +0000
25+++ CircuitPlugin/src/org/workcraft/plugins/circuit/VisualContact.java 2014-07-07 13:25:20 +0000
26@@ -346,12 +346,12 @@
27 return (Contact)getReferencedComponent();
28 }
29
30- public static boolean isDriver(Node contact) {
31- if (!(contact instanceof VisualContact)) {
32- return false;
33+ public static boolean isDriver(Node node) {
34+ if (node instanceof VisualContact) {
35+ VisualContact contact = (VisualContact)node;
36+ return (contact.getIOType() == IOType.OUTPUT) || !(contact.getParent() instanceof VisualComponent);
37 }
38- return ( (((VisualContact)contact).getIOType() == IOType.OUTPUT)
39- == (((VisualContact)contact).getParent() instanceof VisualComponent) );
40+ return false;
41 }
42
43 public HashSet<SignalTransition> getReferencedTransitions() {
44
45=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/tools/STGGenerator.java'
46--- CircuitPlugin/src/org/workcraft/plugins/circuit/tools/STGGenerator.java 2014-06-27 14:48:42 +0000
47+++ CircuitPlugin/src/org/workcraft/plugins/circuit/tools/STGGenerator.java 2014-07-07 13:25:20 +0000
48@@ -31,6 +31,7 @@
49 import org.workcraft.plugins.circuit.VisualFunctionContact;
50 import org.workcraft.plugins.circuit.VisualJoint;
51 import org.workcraft.plugins.cpog.optimisation.BooleanFormula;
52+import org.workcraft.plugins.cpog.optimisation.BooleanVariable;
53 import org.workcraft.plugins.cpog.optimisation.Literal;
54 import org.workcraft.plugins.cpog.optimisation.booleanvisitors.FormulaToString;
55 import org.workcraft.plugins.cpog.optimisation.dnf.Dnf;
56@@ -41,6 +42,7 @@
57 import org.workcraft.plugins.stg.STG;
58 import org.workcraft.plugins.stg.SignalTransition;
59 import org.workcraft.plugins.stg.SignalTransition.Direction;
60+import org.workcraft.plugins.stg.SignalTransition.Type;
61 import org.workcraft.plugins.stg.VisualSTG;
62 import org.workcraft.plugins.stg.VisualSignalTransition;
63 import org.workcraft.util.Hierarchy;
64@@ -144,71 +146,70 @@
65 // if it is a driver, add it to the list of drivers
66 cstg = generatePlaces(circuit, stg, contact);
67 drivers.put(contact, cstg);
68-
69 // attach driven wires to the place
70 attachConnections(circuit, contact, cstg);
71-
72 // put itself on a target list as well, so that it can be addressed by other drivers
73 targetDrivers.put(contact.getReferencedContact(), contact);
74 } else {
75 // if not a driver, find related driver, add to the map of targets
76 VisualContact driver = findDriver(circuit, contact);
77-
78- if (driver==null) {
79+ if (driver == null) {
80 // if target driver was not found, create artificial one that looks like input
81- //driver = new VisualContact(new Contact(IOType.INPUT), VisualContact.flipDirection(contact.getDirection()), contact.getName());
82- //driver.setTransform(contact.getTransform());
83- //driver.setParent(contact.getParent());
84 driver = contact;
85 cstg = generatePlaces(circuit, stg, contact);
86-
87 drivers.put(driver, cstg);
88 // attach driven wires to the place
89 attachConnections(circuit, contact, cstg);
90 }
91-
92 targetDrivers.put(contact.getReferencedContact(), driver);
93 }
94 }
95-
96+
97 // Generate implementation for each of the drivers
98- for(VisualContact c : drivers.keySet()) {
99- if (c instanceof VisualFunctionContact) {
100- VisualFunctionContact contact = (VisualFunctionContact)c;
101- // Determine I/O type of the contact
102- SignalTransition.Type ttype = SignalTransition.Type.OUTPUT;
103- boolean comesFromEnvironment = false;
104- if (contact.getParent() instanceof VisualCircuitComponent) {
105- comesFromEnvironment = ((VisualCircuitComponent)contact.getParent()).getIsEnvironment();
106- }
107- if (comesFromEnvironment || (contact.getIOType()==IOType.INPUT)) {
108- ttype = SignalTransition.Type.INPUT;
109- }
110- // Function based driver
111- BooleanFormula setFunc = contact.getSetFunction();
112- BooleanFormula resetFunc = contact.getResetFunction();
113- if ((setFunc != null) && (resetFunc == null)) {
114- resetFunc = new DumbBooleanWorker().not(setFunc);
115- } else if ((setFunc == null) && (resetFunc != null)) {
116- setFunc = new DumbBooleanWorker().not(resetFunc);
117- }
118- Dnf setDnf = DnfGenerator.generate(setFunc);
119- Dnf resetDnf = DnfGenerator.generate(resetFunc);
120- implementDriver(circuit, stg, contact, drivers, targetDrivers, setDnf, resetDnf, ttype);
121- } else {
122- // Some generic driver implementation otherwise
123- Dnf setDnf = new Dnf(new DnfClause());
124- Dnf resetDnf = new Dnf(new DnfClause());
125- implementDriver(circuit, stg, c, drivers, targetDrivers, setDnf, resetDnf, SignalTransition.Type.INPUT);
126- }
127+ for(VisualContact driver : drivers.keySet()) {
128+ BooleanFormula setFunc = null;
129+ BooleanFormula resetFunc = null;
130+ Type signalType = Type.INPUT;
131+ if (driver instanceof VisualFunctionContact) {
132+ VisualFunctionContact contact = (VisualFunctionContact)driver;
133+ if ((contact.getIOType() == IOType.OUTPUT) && !isFromEnvironment(contact)) {
134+ signalType = Type.OUTPUT;
135+ }
136+ if ((contact.getIOType() == IOType.OUTPUT) && !(contact.getParent() instanceof VisualCircuitComponent)) {
137+ // Driver of the primary output port
138+ VisualContact outputDriver = findDriver(circuit, contact);
139+ if (outputDriver != null) {
140+ setFunc = outputDriver.getReferencedContact();
141+ }
142+ } else {
143+ // Function based driver
144+ setFunc = contact.getSetFunction();
145+ resetFunc = contact.getResetFunction();
146+ }
147+ }
148+ // Create complementary set/reset if only one of them is defined
149+ if ((setFunc != null) && (resetFunc == null)) {
150+ resetFunc = new DumbBooleanWorker().not(setFunc);
151+ } else if ((setFunc == null) && (resetFunc != null)) {
152+ setFunc = new DumbBooleanWorker().not(resetFunc);
153+ }
154+ Dnf setDnf = DnfGenerator.generate(setFunc);
155+ Dnf resetDnf = DnfGenerator.generate(resetFunc);
156+ implementDriver(circuit, stg, driver, drivers, targetDrivers, setDnf, resetDnf, signalType);
157 }
158 return stg;
159 } catch (InvalidConnectionException e) {
160 throw new RuntimeException(e);
161 }
162 }
163+
164+ private static boolean isFromEnvironment(VisualContact contact) {
165+ if (contact.getParent() instanceof VisualCircuitComponent) {
166+ return ((VisualCircuitComponent)contact.getParent()).getIsEnvironment();
167+ }
168+ return false;
169+ }
170
171-
172 private static void implementDriver(VisualCircuit circuit, VisualSTG stg,
173 VisualContact contact,
174 Map<VisualContact, ContactSTG> drivers,
175@@ -276,13 +277,11 @@
176 contact.getReferencedTransitions().clear();
177
178 nodes.addAll(buildTransitions(contact, stg, circuit, drivers, targetDrivers,
179- set,
180- add(add(center, direction), pOffset), plusDirection,
181+ set, add(add(center, direction), pOffset), plusDirection,
182 signalName, ttype, SignalTransition.Direction.PLUS, p.p0, p.p1));
183
184 nodes.addAll(buildTransitions(contact, stg, circuit, drivers, targetDrivers,
185- reset,
186- subtract(add(center, direction), pOffset), minusDirection,
187+ reset, subtract(add(center, direction), pOffset), minusDirection,
188 signalName, ttype, SignalTransition.Direction.MINUS, p.p1, p.p0));
189
190 stg.select(nodes);

Subscribers

People subscribed via source and target branches