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
=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/FunctionContact.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/FunctionContact.java 2014-06-27 14:48:42 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/FunctionContact.java 2014-07-07 13:25:20 +0000
@@ -25,15 +25,14 @@
25import org.workcraft.annotations.VisualClass;25import org.workcraft.annotations.VisualClass;
26import org.workcraft.observation.PropertyChangedEvent;26import org.workcraft.observation.PropertyChangedEvent;
27import org.workcraft.plugins.cpog.optimisation.BooleanFormula;27import org.workcraft.plugins.cpog.optimisation.BooleanFormula;
28import org.workcraft.plugins.cpog.optimisation.expressions.Zero;
2928
3029
31@DisplayName("FunctionContact")30@DisplayName("FunctionContact")
32@VisualClass(org.workcraft.plugins.circuit.VisualFunctionContact.class)31@VisualClass(org.workcraft.plugins.circuit.VisualFunctionContact.class)
3332
34public class FunctionContact extends Contact {33public class FunctionContact extends Contact {
35 private BooleanFormula setFunction=Zero.instance();34 private BooleanFormula setFunction = null;
36 private BooleanFormula resetFunction=null;35 private BooleanFormula resetFunction = null;
37 36
38 public FunctionContact(IOType ioType) {37 public FunctionContact(IOType ioType) {
39 super(ioType);38 super(ioType);
4039
=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/VisualContact.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/VisualContact.java 2014-06-27 14:48:42 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/VisualContact.java 2014-07-07 13:25:20 +0000
@@ -346,12 +346,12 @@
346 return (Contact)getReferencedComponent();346 return (Contact)getReferencedComponent();
347 }347 }
348348
349 public static boolean isDriver(Node contact) {349 public static boolean isDriver(Node node) {
350 if (!(contact instanceof VisualContact)) {350 if (node instanceof VisualContact) {
351 return false;351 VisualContact contact = (VisualContact)node;
352 return (contact.getIOType() == IOType.OUTPUT) || !(contact.getParent() instanceof VisualComponent);
352 }353 }
353 return ( (((VisualContact)contact).getIOType() == IOType.OUTPUT)354 return false;
354 == (((VisualContact)contact).getParent() instanceof VisualComponent) );
355 }355 }
356356
357 public HashSet<SignalTransition> getReferencedTransitions() {357 public HashSet<SignalTransition> getReferencedTransitions() {
358358
=== modified file 'CircuitPlugin/src/org/workcraft/plugins/circuit/tools/STGGenerator.java'
--- CircuitPlugin/src/org/workcraft/plugins/circuit/tools/STGGenerator.java 2014-06-27 14:48:42 +0000
+++ CircuitPlugin/src/org/workcraft/plugins/circuit/tools/STGGenerator.java 2014-07-07 13:25:20 +0000
@@ -31,6 +31,7 @@
31import org.workcraft.plugins.circuit.VisualFunctionContact;31import org.workcraft.plugins.circuit.VisualFunctionContact;
32import org.workcraft.plugins.circuit.VisualJoint;32import org.workcraft.plugins.circuit.VisualJoint;
33import org.workcraft.plugins.cpog.optimisation.BooleanFormula;33import org.workcraft.plugins.cpog.optimisation.BooleanFormula;
34import org.workcraft.plugins.cpog.optimisation.BooleanVariable;
34import org.workcraft.plugins.cpog.optimisation.Literal;35import org.workcraft.plugins.cpog.optimisation.Literal;
35import org.workcraft.plugins.cpog.optimisation.booleanvisitors.FormulaToString;36import org.workcraft.plugins.cpog.optimisation.booleanvisitors.FormulaToString;
36import org.workcraft.plugins.cpog.optimisation.dnf.Dnf;37import org.workcraft.plugins.cpog.optimisation.dnf.Dnf;
@@ -41,6 +42,7 @@
41import org.workcraft.plugins.stg.STG;42import org.workcraft.plugins.stg.STG;
42import org.workcraft.plugins.stg.SignalTransition;43import org.workcraft.plugins.stg.SignalTransition;
43import org.workcraft.plugins.stg.SignalTransition.Direction;44import org.workcraft.plugins.stg.SignalTransition.Direction;
45import org.workcraft.plugins.stg.SignalTransition.Type;
44import org.workcraft.plugins.stg.VisualSTG;46import org.workcraft.plugins.stg.VisualSTG;
45import org.workcraft.plugins.stg.VisualSignalTransition;47import org.workcraft.plugins.stg.VisualSignalTransition;
46import org.workcraft.util.Hierarchy;48import org.workcraft.util.Hierarchy;
@@ -144,71 +146,70 @@
144 // if it is a driver, add it to the list of drivers146 // if it is a driver, add it to the list of drivers
145 cstg = generatePlaces(circuit, stg, contact);147 cstg = generatePlaces(circuit, stg, contact);
146 drivers.put(contact, cstg);148 drivers.put(contact, cstg);
147
148 // attach driven wires to the place149 // attach driven wires to the place
149 attachConnections(circuit, contact, cstg);150 attachConnections(circuit, contact, cstg);
150
151 // put itself on a target list as well, so that it can be addressed by other drivers151 // put itself on a target list as well, so that it can be addressed by other drivers
152 targetDrivers.put(contact.getReferencedContact(), contact);152 targetDrivers.put(contact.getReferencedContact(), contact);
153 } else {153 } else {
154 // if not a driver, find related driver, add to the map of targets154 // if not a driver, find related driver, add to the map of targets
155 VisualContact driver = findDriver(circuit, contact);155 VisualContact driver = findDriver(circuit, contact);
156 156 if (driver == null) {
157 if (driver==null) {
158 // if target driver was not found, create artificial one that looks like input157 // if target driver was not found, create artificial one that looks like input
159 //driver = new VisualContact(new Contact(IOType.INPUT), VisualContact.flipDirection(contact.getDirection()), contact.getName());
160 //driver.setTransform(contact.getTransform());
161 //driver.setParent(contact.getParent());
162 driver = contact;158 driver = contact;
163 cstg = generatePlaces(circuit, stg, contact);159 cstg = generatePlaces(circuit, stg, contact);
164
165 drivers.put(driver, cstg);160 drivers.put(driver, cstg);
166 // attach driven wires to the place161 // attach driven wires to the place
167 attachConnections(circuit, contact, cstg);162 attachConnections(circuit, contact, cstg);
168 }163 }
169
170 targetDrivers.put(contact.getReferencedContact(), driver);164 targetDrivers.put(contact.getReferencedContact(), driver);
171 }165 }
172 }166 }
173 167
174 // Generate implementation for each of the drivers168 // Generate implementation for each of the drivers
175 for(VisualContact c : drivers.keySet()) {169 for(VisualContact driver : drivers.keySet()) {
176 if (c instanceof VisualFunctionContact) {170 BooleanFormula setFunc = null;
177 VisualFunctionContact contact = (VisualFunctionContact)c;171 BooleanFormula resetFunc = null;
178 // Determine I/O type of the contact 172 Type signalType = Type.INPUT;
179 SignalTransition.Type ttype = SignalTransition.Type.OUTPUT;173 if (driver instanceof VisualFunctionContact) {
180 boolean comesFromEnvironment = false;174 VisualFunctionContact contact = (VisualFunctionContact)driver;
181 if (contact.getParent() instanceof VisualCircuitComponent) {175 if ((contact.getIOType() == IOType.OUTPUT) && !isFromEnvironment(contact)) {
182 comesFromEnvironment = ((VisualCircuitComponent)contact.getParent()).getIsEnvironment();176 signalType = Type.OUTPUT;
183 }177 }
184 if (comesFromEnvironment || (contact.getIOType()==IOType.INPUT)) {178 if ((contact.getIOType() == IOType.OUTPUT) && !(contact.getParent() instanceof VisualCircuitComponent)) {
185 ttype = SignalTransition.Type.INPUT; 179 // Driver of the primary output port
186 }180 VisualContact outputDriver = findDriver(circuit, contact);
187 // Function based driver181 if (outputDriver != null) {
188 BooleanFormula setFunc = contact.getSetFunction();182 setFunc = outputDriver.getReferencedContact();
189 BooleanFormula resetFunc = contact.getResetFunction();183 }
190 if ((setFunc != null) && (resetFunc == null)) {184 } else {
191 resetFunc = new DumbBooleanWorker().not(setFunc);185 // Function based driver
192 } else if ((setFunc == null) && (resetFunc != null)) {186 setFunc = contact.getSetFunction();
193 setFunc = new DumbBooleanWorker().not(resetFunc);187 resetFunc = contact.getResetFunction();
194 }188 }
195 Dnf setDnf = DnfGenerator.generate(setFunc);189 }
196 Dnf resetDnf = DnfGenerator.generate(resetFunc);190 // Create complementary set/reset if only one of them is defined
197 implementDriver(circuit, stg, contact, drivers, targetDrivers, setDnf, resetDnf, ttype);191 if ((setFunc != null) && (resetFunc == null)) {
198 } else {192 resetFunc = new DumbBooleanWorker().not(setFunc);
199 // Some generic driver implementation otherwise193 } else if ((setFunc == null) && (resetFunc != null)) {
200 Dnf setDnf = new Dnf(new DnfClause());194 setFunc = new DumbBooleanWorker().not(resetFunc);
201 Dnf resetDnf = new Dnf(new DnfClause());195 }
202 implementDriver(circuit, stg, c, drivers, targetDrivers, setDnf, resetDnf, SignalTransition.Type.INPUT);196 Dnf setDnf = DnfGenerator.generate(setFunc);
203 }197 Dnf resetDnf = DnfGenerator.generate(resetFunc);
198 implementDriver(circuit, stg, driver, drivers, targetDrivers, setDnf, resetDnf, signalType);
204 }199 }
205 return stg;200 return stg;
206 } catch (InvalidConnectionException e) {201 } catch (InvalidConnectionException e) {
207 throw new RuntimeException(e);202 throw new RuntimeException(e);
208 }203 }
209 }204 }
205
206 private static boolean isFromEnvironment(VisualContact contact) {
207 if (contact.getParent() instanceof VisualCircuitComponent) {
208 return ((VisualCircuitComponent)contact.getParent()).getIsEnvironment();
209 }
210 return false;
211 }
210 212
211
212 private static void implementDriver(VisualCircuit circuit, VisualSTG stg,213 private static void implementDriver(VisualCircuit circuit, VisualSTG stg,
213 VisualContact contact,214 VisualContact contact,
214 Map<VisualContact, ContactSTG> drivers,215 Map<VisualContact, ContactSTG> drivers,
@@ -276,13 +277,11 @@
276 contact.getReferencedTransitions().clear();277 contact.getReferencedTransitions().clear();
277 278
278 nodes.addAll(buildTransitions(contact, stg, circuit, drivers, targetDrivers, 279 nodes.addAll(buildTransitions(contact, stg, circuit, drivers, targetDrivers,
279 set, 280 set, add(add(center, direction), pOffset), plusDirection,
280 add(add(center, direction), pOffset), plusDirection,
281 signalName, ttype, SignalTransition.Direction.PLUS, p.p0, p.p1));281 signalName, ttype, SignalTransition.Direction.PLUS, p.p0, p.p1));
282 282
283 nodes.addAll(buildTransitions(contact, stg, circuit, drivers, targetDrivers, 283 nodes.addAll(buildTransitions(contact, stg, circuit, drivers, targetDrivers,
284 reset, 284 reset, subtract(add(center, direction), pOffset), minusDirection,
285 subtract(add(center, direction), pOffset), minusDirection,
286 signalName, ttype, SignalTransition.Direction.MINUS, p.p1, p.p0));285 signalName, ttype, SignalTransition.Direction.MINUS, p.p1, p.p0));
287 286
288 stg.select(nodes);287 stg.select(nodes);

Subscribers

People subscribed via source and target branches