Skip to content
Snippets Groups Projects
Commit 53a7eda4 authored by Sebastian Ebert's avatar Sebastian Ebert
Browse files

reworked OR-connected signals, refactored flatter arch

parent e1239b87
No related branches found
No related tags found
No related merge requests found
...@@ -4,11 +4,10 @@ import de.tudresden.inf.st.pnml.flatter.config.ConfigReader; ...@@ -4,11 +4,10 @@ import de.tudresden.inf.st.pnml.flatter.config.ConfigReader;
import de.tudresden.inf.st.pnml.flatter.tina.TinaProxy; import de.tudresden.inf.st.pnml.flatter.tina.TinaProxy;
import de.tudresden.inf.st.pnml.flatter.transform.ChannelFlatter; import de.tudresden.inf.st.pnml.flatter.transform.ChannelFlatter;
import de.tudresden.inf.st.pnml.flatter.transform.ReferenceFlatter; import de.tudresden.inf.st.pnml.flatter.transform.ReferenceFlatter;
import de.tudresden.inf.st.pnml.flatter.transform.SignalFlatter;
import de.tudresden.inf.st.pnml.jastadd.model.*; import de.tudresden.inf.st.pnml.jastadd.model.*;
import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser; import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser;
import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException; import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import de.tudresden.inf.st.pnml.flatter.tina.NdrioProxy; import de.tudresden.inf.st.pnml.flatter.tina.NdrioProxy;
import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
...@@ -18,8 +17,6 @@ import java.util.UUID; ...@@ -18,8 +17,6 @@ import java.util.UUID;
public class Main { public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) throws IOException, InvalidIDException { public static void main(String[] args) throws IOException, InvalidIDException {
String configPath = (args.length > 1) ? args[1] : null; String configPath = (args.length > 1) ? args[1] : null;
...@@ -70,8 +67,8 @@ public class Main { ...@@ -70,8 +67,8 @@ public class Main {
// flat input signals // flat input signals
System.out.println("[FLATTER] Breaking down signals."); System.out.println("[FLATTER] Breaking down signals.");
PetriNet signalFlattedPetriNet = ChannelFlatter.flatSignals(serviceFlattedPetriNet); PetriNet signalFlattedPetriNet = SignalFlatter.flatSignals(serviceFlattedPetriNet);
// printNet(signalFlattedPetriNet); printNet(signalFlattedPetriNet);
// export flatted net to pnml // export flatted net to pnml
System.out.println("[FLATTER] Exporting to pnml."); System.out.println("[FLATTER] Exporting to pnml.");
...@@ -178,7 +175,6 @@ public class Main { ...@@ -178,7 +175,6 @@ public class Main {
System.out.println("----------------- ARCS -----------------"); System.out.println("----------------- ARCS -----------------");
for (Arc a : petriNet.allArcs()) { for (Arc a : petriNet.allArcs()) {
System.out.println("Arc: " + a.getId());
System.out.println("Arc: " + a.getId() + " -- source: " + a.getSource().getId() + " -- target: " + a.getTarget().getId()); System.out.println("Arc: " + a.getId() + " -- source: " + a.getSource().getId() + " -- target: " + a.getTarget().getId());
if(a.getNumToolspecific() > 0){ if(a.getNumToolspecific() > 0){
......
...@@ -37,18 +37,15 @@ public final class TemplateConstants { ...@@ -37,18 +37,15 @@ public final class TemplateConstants {
public static final String INPUT_SIGNAL_TEMPLATE_PAGE = "InputSignalTemplatePage"; public static final String INPUT_SIGNAL_TEMPLATE_PAGE = "InputSignalTemplatePage";
public static final String INPUT_SIGNAL_PLACE_ACTIVE = "InputSignalActivePlace"; public static final String INPUT_SIGNAL_PLACE_ACTIVE = "InputSignalActivePlace";
public static final String INPUT_SIGNAL_PLACE_INACTIVE = "InputSignalInactivePlace"; public static final String INPUT_SIGNAL_PLACE_INACTIVE = "InputSignalInactivePlace";
public static final String INPUT_SIGNAL_PLACE_OR_CONNECTION = "InputSignalOrConnection"; public static final String INPUT_SIGNAL_PLACE_OR_CONNECTION_FALSE_PREFIX = "DINEROS-InputSignalOrConnectionFalse";
public static final String INPUT_SIGNAL_PLACE_OR_RESET = "InputSignalOrReset"; public static final String INPUT_SIGNAL_PLACE_OR_CONNECTION_TRUE_PREFIX = "DINEROS-InputSignalOrConnectionTrue";
public static final String INPUT_SIGNAL_TO_OR = "InputSignalToOr";
public static final String INPUT_SIGNAL_TRANSITION_TO_ACTIVE = "InputSignalInactiveToActiveTransition"; public static final String INPUT_SIGNAL_TRANSITION_TO_ACTIVE = "InputSignalInactiveToActiveTransition";
public static final String INPUT_SIGNAL_TRANSITION_TO_INACTIVE = "InputSignalActiveToInactiveTransition"; public static final String INPUT_SIGNAL_TRANSITION_TO_INACTIVE = "InputSignalActiveToInactiveTransition";
public static final String ARC_ACTIVE_TO_OR = "ArcActiveToOr"; public static final String ARC_T_ACTIVE_TO_TRUE = "DINEROS-ArcTActiveToTrue";
public static final String ARC_OR_TO_ACTIVE = "ArcOrToActive"; public static final String ARC_FALSE_TO_T_ACTIVE = "DINEROS-ArcFalseToTActive";
public static final String ARC_OR_TO_PLACE = "ArcOrToPlace"; public static final String ARC_T_INACTIVE_TO_FALSE = "DINEROS-ArcTInactiveToFalse";
public static final String ARC_PLACE_TO_OR = "ArcPlaceToOr"; public static final String ARC_TRUE_TO_T_INACTIVE = "DINEROS-ArcTrueToTInactive";
public static final String ARC_TO_OR_RESET = "ArcToOrReset";
public static final String ARC_FROM_OR_RESET = "ArcFromOrReset";
// services // services
public static final String SERVICE_THREAD_PLACE = "ServiceThreadPlace"; public static final String SERVICE_THREAD_PLACE = "ServiceThreadPlace";
......
...@@ -13,279 +13,10 @@ import java.util.*; ...@@ -13,279 +13,10 @@ import java.util.*;
/** /**
* only works if pages / references got flatted before * only works if pages / references got flatted before
*/ */
public class ChannelFlatter { public class ChannelFlatter extends Flatter {
private static final Logger logger = LoggerFactory.getLogger(ChannelFlatter.class); private static final Logger logger = LoggerFactory.getLogger(ChannelFlatter.class);
public static PetriNet flatSignals(PetriNet petriNet) {
Page topPage = petriNet.getPage(0);
Map<String, List<InputSignalTransition>> signalMap = new HashMap<>();
// construct signal-id to transition mapping
for (Transition t : petriNet.allTransitions()) {
if (t.asInputSignalTransition().getStaticInputSignalBindingList() != null) {
for (InputSignalBinding isb : t.asInputSignalTransition().getStaticInputSignalBindingList()) {
if (signalMap.containsKey(isb.getInputSignalID())) {
signalMap.get(isb.getInputSignalID()).add(t.asInputSignalTransition());
} else {
List<InputSignalTransition> transitionList = new ArrayList<>();
transitionList.add(t.asInputSignalTransition());
signalMap.put(isb.getInputSignalID(), transitionList);
}
}
}
}
// build clauses
int signalCount = 0;
for (Map.Entry<String, List<InputSignalTransition>> entry : signalMap.entrySet()) {
// build signal root net
PetriNet signalTemplate = SignalTemplates.getInputSignalTemplate(entry.getKey() + "-base");
includeTemplateInstance(petriNet, signalTemplate, "signals", "signals");
String targetId = TemplateConstants.INPUT_SIGNAL_PLACE_ACTIVE + "-" + entry.getKey() + "-base";
String targetId2 = TemplateConstants.INPUT_SIGNAL_PLACE_INACTIVE + "-" + entry.getKey() + "-base";
Place coreInPlace = getPlaceByID(petriNet, targetId);
for (InputSignalBinding isb : entry.getValue().get(0).getStaticInputSignalBindingList()) {
if (isb.getInputSignalID().equals(entry.getKey())) {
if (isb.getInputSignalValue() == 1) {
getPlaceByID(petriNet, targetId).getInitialMarking().setText(1);
} else {
getPlaceByID(petriNet, targetId2).getInitialMarking().setText(1);
}
}
}
int andCount = 0;
int orCount = 0;
for (int i = 0; i < entry.getValue().size(); i++) {
String actToInActId = TemplateConstants.INPUT_SIGNAL_TRANSITION_TO_INACTIVE + "-" + entry.getKey() + "-base";
String inActToActId = TemplateConstants.INPUT_SIGNAL_TRANSITION_TO_ACTIVE + "-" + entry.getKey() + "-base";
boolean isActiveSignal = false;
for (InputSignalBinding isb : entry.getValue().get(i).getStaticInputSignalBindingList()) {
if (isb.getInputSignalID().equals(entry.getKey())) {
isActiveSignal = isb.getInputSignalValue() == 1;
break;
}
}
// build AND-based clauses
if (!entry.getValue().get(i).getInputSignalClause().printExp().contains("OR")) {
if (andCount == 0) {
createAndIncludeArc(topPage, "IoTransitionToSignal-" + entry.getKey() + "-base", entry.getValue().get(i), coreInPlace);
createAndIncludeArc(topPage, "IoTransitionFromSignal-" + entry.getKey() + "-base", coreInPlace, entry.getValue().get(i));
petriNet.flushTreeCache();
} else {
attachANDSignalNetToBaseSignalNet(petriNet, entry.getValue().get(i),
Objects.requireNonNull(getTransitionByID(petriNet, actToInActId)).asInputSignalTransition(),
getTransitionByID(petriNet, inActToActId).asInputSignalTransition(), i, entry.getKey(), isActiveSignal);
}
andCount++;
}
// build OR-based clauses
if (entry.getValue().get(i).getInputSignalClause().printExp().contains("OR")) {
// has already connected or signal connecting place?
Place orPlace = null;
for (Place p : entry.getValue().get(i).incomingPlaces()) {
if (p.getId().contains(TemplateConstants.INPUT_SIGNAL_PLACE_OR_CONNECTION)) {
orPlace = p;
break;
}
}
if (orPlace == null) {
orPlace = buildOrBaseNetElements(petriNet, topPage, signalCount, i, entry.getValue().get(i));
}
InputSignalTransition activeToOrConnector = PrimitiveTemplates.getInputSignalTransition();
activeToOrConnector.setId(TemplateConstants.INPUT_SIGNAL_TO_OR + "-" + entry.getKey() + "-" + i);
Name nameT = new Name();
nameT.setText(TemplateConstants.INPUT_SIGNAL_TO_OR + "-" + entry.getKey() + "-" + i);
activeToOrConnector.setName(nameT);
TransitionInformation pi3 = new DefaultTransitionInformation();
pi3.setLocation("signal");
pi3.setSubNet("signal");
activeToOrConnector.setMutualTransitionInformation(pi3);
topPage.addObject(activeToOrConnector);
petriNet.flushTreeCache();
if (andCount == 0 && orCount == 0) {
attachORSignalNetToBaseSignalNet(petriNet, getTransitionByID(petriNet, actToInActId).asInputSignalTransition(),
getTransitionByID(petriNet, inActToActId).asInputSignalTransition(), activeToOrConnector,
orPlace.asOutputSignalPlace(), i, entry.getKey(), true, isActiveSignal);
} else {
attachORSignalNetToBaseSignalNet(petriNet, getTransitionByID(petriNet, actToInActId).asInputSignalTransition(),
getTransitionByID(petriNet, inActToActId).asInputSignalTransition(), activeToOrConnector,
orPlace.asOutputSignalPlace(), i, entry.getKey(), false, isActiveSignal);
}
orCount++;
}
}
signalCount++;
}
// include negations
// TODO
return petriNet;
}
@NotNull
private static Place buildOrBaseNetElements(PetriNet petriNet, Page topPage, int signalCount, int i, Transition transition) {
OutputSignalPlace newOrPlace = PrimitiveTemplates.getOutputSignalPlace();
newOrPlace.setId(TemplateConstants.INPUT_SIGNAL_PLACE_OR_CONNECTION + "-" + signalCount + "-" + i);
Name name = new Name();
name.setText(TemplateConstants.INPUT_SIGNAL_PLACE_OR_CONNECTION + "-" + signalCount + "-" + i);
newOrPlace.setName(name);
PlaceInformation pi = new PlaceInformation();
pi.setLocation("signal");
pi.setSubNet("signal");
newOrPlace.setMutualPlaceInformation(pi);
InputSignalTransition orResetTransition = PrimitiveTemplates.getInputSignalTransition();
orResetTransition.setId(TemplateConstants.INPUT_SIGNAL_PLACE_OR_RESET + "-" + signalCount + "-" + i);
Name nameT = new Name();
nameT.setText(TemplateConstants.INPUT_SIGNAL_PLACE_OR_RESET + "-" + signalCount + "-" + i);
orResetTransition.setName(nameT);
TransitionInformation pi2 = new DefaultTransitionInformation();
pi2.setLocation("signal");
pi2.setSubNet("signal");
orResetTransition.setMutualTransitionInformation(pi2);
topPage.addObject(newOrPlace);
topPage.addObject(orResetTransition);
createAndIncludeArc(topPage, newOrPlace.getId() + "-to-" + orResetTransition.getId(), newOrPlace, orResetTransition);
createAndIncludeArc(topPage, newOrPlace.getId() + "-to-" + transition.getId(), newOrPlace, transition);
petriNet.flushTreeCache();
return newOrPlace;
}
private static void attachORSignalNetToBaseSignalNet(PetriNet petriNet, InputSignalTransition inactiveT,
InputSignalTransition activeT, InputSignalTransition activeToOrConnector,
OutputSignalPlace orPlace, int count, String signalId, boolean isBase, boolean isActive) {
Page topPage = petriNet.getPage(0);
OutputSignalPlace aOsp = getPlaceByID(petriNet, TemplateConstants.INPUT_SIGNAL_PLACE_ACTIVE + "-" + signalId + "-base").asOutputSignalPlace();
OutputSignalPlace iOsp = getPlaceByID(petriNet, TemplateConstants.INPUT_SIGNAL_PLACE_INACTIVE + "-" + signalId + "-base").asOutputSignalPlace();
if (!isBase) {
aOsp = getPlaceByID(petriNet, TemplateConstants.INPUT_SIGNAL_PLACE_ACTIVE + "-" + signalId + "-base").asOutputSignalPlace().treeCopy();
iOsp = getPlaceByID(petriNet, TemplateConstants.INPUT_SIGNAL_PLACE_INACTIVE + "-" + signalId + "-base").asOutputSignalPlace().treeCopy();
aOsp.setId(TemplateConstants.INPUT_SIGNAL_PLACE_ACTIVE + "-" + signalId + "-" + count);
iOsp.setId(TemplateConstants.INPUT_SIGNAL_PLACE_INACTIVE + "-" + signalId + "-" + count);
}
// marking
if (isActive) {
aOsp.getInitialMarking().setText(1);
} else {
iOsp.getInitialMarking().setText(1);
}
InputSignalTransition resetTransition = null;
for (Arc a : orPlace.getOutArcList()) {
if (a.getTarget().getId().contains(TemplateConstants.INPUT_SIGNAL_PLACE_OR_RESET)) {
resetTransition = a.getTarget().asTransitionNode().asTransition().asInputSignalTransition();
break;
}
}
createAndIncludeArc(topPage, TemplateConstants.ARC_ACTIVE_TO_OR + "-" + signalId + "-" + count, aOsp, activeToOrConnector);
createAndIncludeArc(topPage, TemplateConstants.ARC_OR_TO_ACTIVE + "-" + signalId + "-" + count, activeToOrConnector, aOsp);
createAndIncludeInhibitorArc(topPage, TemplateConstants.ARC_OR_TO_PLACE + "-" + signalId + "-" + count, orPlace, activeToOrConnector);
createAndIncludeArc(topPage, TemplateConstants.ARC_PLACE_TO_OR + "-" + signalId + "-" + count, activeToOrConnector, orPlace);
if (!isBase) {
createAndIncludeArc(topPage, "arc-or-1-" + signalId + "-" + count, aOsp, inactiveT);
createAndIncludeArc(topPage, "arc-or-2-" + signalId + "-" + count, inactiveT, iOsp);
createAndIncludeArc(topPage, "arc-or-3-" + signalId + "-" + count, iOsp, activeT);
createAndIncludeArc(topPage, "arc-or-4-" + signalId + "-" + count, activeT, aOsp);
}
createAndIncludeArc(topPage, TemplateConstants.ARC_TO_OR_RESET + "-" + signalId + "-" + count, iOsp, resetTransition);
createAndIncludeArc(topPage, TemplateConstants.ARC_FROM_OR_RESET + "-" + signalId + "-" + count, resetTransition, iOsp);
}
private static void attachANDSignalNetToBaseSignalNet(PetriNet petriNet, InputSignalTransition transition, InputSignalTransition inactiveT, InputSignalTransition activeT, int count, String signalId, boolean isActive) {
Page topPage = petriNet.getPage(0);
OutputSignalPlace aOsp = getPlaceByID(petriNet, TemplateConstants.INPUT_SIGNAL_PLACE_ACTIVE + "-" + signalId + "-base").asOutputSignalPlace().treeCopy();
OutputSignalPlace iOsp = getPlaceByID(petriNet, TemplateConstants.INPUT_SIGNAL_PLACE_INACTIVE + "-" + signalId + "-base").asOutputSignalPlace().treeCopy();
aOsp.setId(TemplateConstants.INPUT_SIGNAL_PLACE_ACTIVE + "-" + signalId + "-" + count);
iOsp.setId(TemplateConstants.INPUT_SIGNAL_PLACE_INACTIVE + "-" + signalId + "-" + count);
createAndIncludeArc(topPage, "arc-and-1-" + signalId + "-" + count, aOsp, inactiveT);
createAndIncludeArc(topPage, "arc-and-2-" + signalId + "-" + count, inactiveT, iOsp);
createAndIncludeArc(topPage, "arc-and-3-" + signalId + "-" + count, iOsp, activeT);
createAndIncludeArc(topPage, "arc-and-4-" + signalId + "-" + count, activeT, aOsp);
createAndIncludeArc(topPage, "IoTransitionToSignal-" + signalId + "-" + count, transition, aOsp);
createAndIncludeArc(topPage, "IoTransitionFromSignal-" + signalId + "-" + count, aOsp, transition);
topPage.addObject(aOsp);
topPage.addObject(iOsp);
// marking
if (isActive) {
aOsp.getInitialMarking().setText(1);
} else {
iOsp.getInitialMarking().setText(1);
}
petriNet.flushTreeCache();
}
private static Arc createArc(String id, Node s, Node t) {
Arc a = new Arc();
a.setId(id);
a.setSource(s);
a.setTarget(t);
return a;
}
private static Arc createAndIncludeArc(Page page, String id, Node s, Node t) {
Arc a = createArc(id, s, t);
page.addObject(a);
return a;
}
private static Arc createAndIncludeInhibitorArc(Page page, String id, Node s, Node t) {
Arc a = createArc(id, s, t);
ToolInfo ti = new ToolInfo();
String xml = "<toolspecific xmlns=\"http://www.pnml.org/version-2009/grammar/pnml\" tool=\"de.tudresden.inf.st.pnml.distributedPN\" version=\"0.1\">\n" +
" <type>inhibitor</type>\n" +
" </toolspecific>";
ti.setFormattedXMLBuffer(new StringBuffer(xml));
ti.setTool("de.tudresden.inf.st.pnml.distributedPN");
ti.setVersion("0.1");
a.addToolspecific(ti);
page.addObject(a);
return a;
}
public static PetriNet flatTopicChannels(PetriNet petriNet) { public static PetriNet flatTopicChannels(PetriNet petriNet) {
int publisherCount = 0; int publisherCount = 0;
...@@ -1092,89 +823,4 @@ public class ChannelFlatter { ...@@ -1092,89 +823,4 @@ public class ChannelFlatter {
return pnObjects; return pnObjects;
} }
private static void includeTemplateInstance(PetriNet petriNet, PetriNet templateInstance, String subnet, String location) {
// after tina-flat we do only have on page
Page topPage = petriNet.getPage(0);
// include places, transitions
for (Transition t : templateInstance.allTransitions()) {
TransitionInformation newTi = new DefaultTransitionInformation();
newTi.setLocation(location);
newTi.setSubNet(subnet);
newTi.setType(t.asInputSignalTransition().getStaticTransitionInformation().getType());
t.asInputSignalTransition().setMutualTransitionInformation(newTi);
topPage.addObject(t);
}
for (Place p : templateInstance.allPlaces()) {
PlaceInformation newPi = new PlaceInformation();
newPi.setLocation(location);
newPi.setSubNet(subnet);
newPi.setType(p.asOutputSignalPlace().getStaticPlaceInformation().getType());
p.asOutputSignalPlace().setMutualPlaceInformation(newPi);
topPage.addObject(p);
}
petriNet.flushTreeCache();
// connect elements by arcs
for (Arc a : templateInstance.allArcs()) {
Arc newArc = new Arc();
newArc.setId("arc-" + a.getSource().getId() + "-" + a.getTarget().getId());
// System.out.println("Target: " + a.getTarget().getId());
newArc.setTarget((Node) getPnObjectByID(petriNet, a.getTarget().getId()));
newArc.setSource((Node) getPnObjectByID(petriNet, a.getSource().getId()));
if (a.getNumToolspecific() > 0) {
ToolInfo ti = new ToolInfo();
ti.setFormattedXMLBuffer(a.getToolspecific(0).getFormattedXMLBuffer());
ti.setTool(a.getToolspecific(0).getTool());
ti.setVersion(a.getToolspecific(0).getVersion());
newArc.addToolspecific(ti);
}
topPage.addObject(newArc);
}
petriNet.flushTreeCache();
}
private static Place getPlaceByID(PetriNet petriNet, String Id) {
for (Place p : petriNet.allPlaces()) {
if (p.getId().equals(Id)) {
return p;
}
}
return null;
}
private static Transition getTransitionByID(PetriNet petriNet, String Id) {
for (Transition t : petriNet.allTransitions()) {
if (t.getId().equals(Id)) {
return t;
}
}
return null;
}
private static PnObject getPnObjectByID(PetriNet petriNet, String Id) {
for (PnObject po : petriNet.allObjects()) {
if (po.getId().equals(Id)) {
return po;
}
}
return null;
}
} }
package de.tudresden.inf.st.pnml.flatter.transform;
import de.tudresden.inf.st.pnml.jastadd.model.*;
public abstract class Flatter {
protected static Arc createArc(String id, Node s, Node t) {
Arc a = new Arc();
a.setId(id);
a.setSource(s);
a.setTarget(t);
return a;
}
protected static Arc createAndIncludeArc(Page page, String id, Node s, Node t) {
Arc a = createArc(id, s, t);
page.addObject(a);
return a;
}
protected static Arc createAndIncludeInhibitorArc(Page page, String id, Node s, Node t) {
Arc a = createArc(id, s, t);
ToolInfo ti = new ToolInfo();
String xml = "<toolspecific xmlns=\"http://www.pnml.org/version-2009/grammar/pnml\" tool=\"de.tudresden.inf.st.pnml.distributedPN\" version=\"0.1\">\n" +
" <type>inhibitor</type>\n" +
" </toolspecific>";
ti.setFormattedXMLBuffer(new StringBuffer(xml));
ti.setTool("de.tudresden.inf.st.pnml.distributedPN");
ti.setVersion("0.1");
a.addToolspecific(ti);
page.addObject(a);
return a;
}
protected static void includeTemplateInstance(PetriNet petriNet, PetriNet templateInstance, String subnet, String location) {
// after tina-flat we do only have on page
Page topPage = petriNet.getPage(0);
// include places, transitions
for (Transition t : templateInstance.allTransitions()) {
TransitionInformation newTi = new DefaultTransitionInformation();
newTi.setLocation(location);
newTi.setSubNet(subnet);
newTi.setType(t.asInputSignalTransition().getStaticTransitionInformation().getType());
t.asInputSignalTransition().setMutualTransitionInformation(newTi);
topPage.addObject(t);
}
for (Place p : templateInstance.allPlaces()) {
PlaceInformation newPi = new PlaceInformation();
newPi.setLocation(location);
newPi.setSubNet(subnet);
newPi.setType(p.asOutputSignalPlace().getStaticPlaceInformation().getType());
p.asOutputSignalPlace().setMutualPlaceInformation(newPi);
topPage.addObject(p);
}
petriNet.flushTreeCache();
// connect elements by arcs
for (Arc a : templateInstance.allArcs()) {
Arc newArc = new Arc();
newArc.setId("arc-" + a.getSource().getId() + "-" + a.getTarget().getId());
// System.out.println("Target: " + a.getTarget().getId());
newArc.setTarget((Node) getPnObjectByID(petriNet, a.getTarget().getId()));
newArc.setSource((Node) getPnObjectByID(petriNet, a.getSource().getId()));
if (a.getNumToolspecific() > 0) {
ToolInfo ti = new ToolInfo();
ti.setFormattedXMLBuffer(a.getToolspecific(0).getFormattedXMLBuffer());
ti.setTool(a.getToolspecific(0).getTool());
ti.setVersion(a.getToolspecific(0).getVersion());
newArc.addToolspecific(ti);
}
topPage.addObject(newArc);
}
petriNet.flushTreeCache();
}
protected static Place getPlaceByID(PetriNet petriNet, String Id) {
for (Place p : petriNet.allPlaces()) {
if (p.getId().equals(Id)) {
return p;
}
}
return null;
}
protected static Transition getTransitionByID(PetriNet petriNet, String Id) {
for (Transition t : petriNet.allTransitions()) {
if (t.getId().equals(Id)) {
return t;
}
}
return null;
}
protected static PnObject getPnObjectByID(PetriNet petriNet, String Id) {
for (PnObject po : petriNet.allObjects()) {
if (po.getId().equals(Id)) {
return po;
}
}
return null;
}
}
...@@ -5,7 +5,7 @@ import de.tudresden.inf.st.pnml.jastadd.model.*; ...@@ -5,7 +5,7 @@ import de.tudresden.inf.st.pnml.jastadd.model.*;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
public class ReferenceFlatter { public class ReferenceFlatter extends Flatter{
private static void findPlaceReferences(PlaceNode placeNode, Set<PlaceNode> nodes){ private static void findPlaceReferences(PlaceNode placeNode, Set<PlaceNode> nodes){
......
package de.tudresden.inf.st.pnml.flatter.transform; package de.tudresden.inf.st.pnml.flatter.transform;
public class SignalFlatter { import de.tudresden.inf.st.pnml.flatter.template.PrimitiveTemplates;
import de.tudresden.inf.st.pnml.flatter.template.SignalTemplates;
import de.tudresden.inf.st.pnml.flatter.template.TemplateConstants;
import de.tudresden.inf.st.pnml.jastadd.model.*;
import java.util.*;
public class SignalFlatter extends Flatter{
public static PetriNet flatSignals(PetriNet petriNet) {
Page topPage = petriNet.getPage(0);
Map<String, List<InputSignalTransition>> signalMap = new HashMap<>();
Map<String, OutputSignalPlace> orPlacePairs = new HashMap<>();
// construct signal-id to transition mapping
for (Transition t : petriNet.allTransitions()) {
if (t.asInputSignalTransition().getStaticInputSignalBindingList() != null) {
for (InputSignalBinding isb : t.asInputSignalTransition().getStaticInputSignalBindingList()) {
if (signalMap.containsKey(isb.getInputSignalID())) {
signalMap.get(isb.getInputSignalID()).add(t.asInputSignalTransition());
} else {
List<InputSignalTransition> transitionList = new ArrayList<>();
transitionList.add(t.asInputSignalTransition());
signalMap.put(isb.getInputSignalID(), transitionList);
}
}
}
}
// build clauses
int signalCount = 0;
for (Map.Entry<String, List<InputSignalTransition>> entry : signalMap.entrySet()) {
// build signal root net
PetriNet signalTemplate = SignalTemplates.getInputSignalTemplate(entry.getKey() + "-base");
includeTemplateInstance(petriNet, signalTemplate, "signals", "signals");
String targetId = TemplateConstants.INPUT_SIGNAL_PLACE_ACTIVE + "-" + entry.getKey() + "-base";
String targetId2 = TemplateConstants.INPUT_SIGNAL_PLACE_INACTIVE + "-" + entry.getKey() + "-base";
Place coreInPlace = getPlaceByID(petriNet, targetId);
for (InputSignalBinding isb : entry.getValue().get(0).getStaticInputSignalBindingList()) {
if (isb.getInputSignalID().equals(entry.getKey())) {
if (isb.getInputSignalValue() == 1) {
getPlaceByID(petriNet, targetId).getInitialMarking().setText(1);
} else {
getPlaceByID(petriNet, targetId2).getInitialMarking().setText(1);
}
}
}
int andCount = 0;
int orCount = 0;
for (int i = 0; i < entry.getValue().size(); i++) {
String actToInActId = TemplateConstants.INPUT_SIGNAL_TRANSITION_TO_INACTIVE + "-" + entry.getKey() + "-base";
String inActToActId = TemplateConstants.INPUT_SIGNAL_TRANSITION_TO_ACTIVE + "-" + entry.getKey() + "-base";
boolean isActiveSignal = false;
for (InputSignalBinding isb : entry.getValue().get(i).getStaticInputSignalBindingList()) {
if (isb.getInputSignalID().equals(entry.getKey())) {
isActiveSignal = isb.getInputSignalValue() == 1;
break;
}
}
// build AND-based clauses
if (!entry.getValue().get(i).getInputSignalClause().printExp().contains("OR")) {
if (andCount == 0) {
createAndIncludeArc(topPage, "IoTransitionToSignal-" + entry.getKey() + "-base", entry.getValue().get(i), coreInPlace);
createAndIncludeArc(topPage, "IoTransitionFromSignal-" + entry.getKey() + "-base", coreInPlace, entry.getValue().get(i));
petriNet.flushTreeCache();
} else {
attachANDSignalNetToBaseSignalNet(petriNet, entry.getValue().get(i),
Objects.requireNonNull(getTransitionByID(petriNet, actToInActId)).asInputSignalTransition(),
getTransitionByID(petriNet, inActToActId).asInputSignalTransition(), i, entry.getKey(), isActiveSignal);
}
andCount++;
}
// build OR-based clauses
if (entry.getValue().get(i).getInputSignalClause().printExp().contains("OR")) {
// has already connected or signal connecting place?
OutputSignalPlace orTruePlace = null;
OutputSignalPlace orFalsePlace = null;
for (Place p : entry.getValue().get(i).incomingPlaces()) {
if (p.getId().contains(TemplateConstants.INPUT_SIGNAL_PLACE_OR_CONNECTION_TRUE_PREFIX)) {
orTruePlace = p.asOutputSignalPlace();
orFalsePlace = orPlacePairs.get(orTruePlace.getId());
break;
}
}
if (orTruePlace == null) {
Pair<OutputSignalPlace, OutputSignalPlace> res =
buildOrBaseNetElements(petriNet, topPage, signalCount, i, entry.getValue().get(i), orPlacePairs);
orTruePlace = res._1;
orFalsePlace = res._2;
}
if (andCount == 0 && orCount == 0) {
attachORSignalNetToBaseSignalNet(petriNet, getTransitionByID(petriNet, actToInActId).asInputSignalTransition(),
getTransitionByID(petriNet, inActToActId).asInputSignalTransition(), orTruePlace,
orFalsePlace, i, entry.getKey(), true, isActiveSignal);
System.out.println("BASE");
} else {
attachORSignalNetToBaseSignalNet(petriNet, getTransitionByID(petriNet, actToInActId).asInputSignalTransition(),
getTransitionByID(petriNet, inActToActId).asInputSignalTransition(), orTruePlace,
orFalsePlace, i, entry.getKey(), false, isActiveSignal);
System.out.println("EXTEND");
}
orCount++;
}
}
signalCount++;
}
// include negations
// TODO
return petriNet;
}
private static Pair<OutputSignalPlace, OutputSignalPlace> buildOrBaseNetElements(
PetriNet petriNet, Page topPage, int signalCount, int i, Transition transition, Map<String, OutputSignalPlace> orPlacePairs) {
OutputSignalPlace orPlaceFalse = PrimitiveTemplates.getOutputSignalPlace();
orPlaceFalse.setId(TemplateConstants.INPUT_SIGNAL_PLACE_OR_CONNECTION_FALSE_PREFIX + "-" + signalCount + "-" + i);
Name fName = new Name();
fName.setText(TemplateConstants.INPUT_SIGNAL_PLACE_OR_CONNECTION_FALSE_PREFIX + "-" + signalCount + "-" + i);
orPlaceFalse.setName(fName);
PlaceInformation fPi = new PlaceInformation();
fPi.setLocation("signals");
fPi.setSubNet("signals");
orPlaceFalse.setMutualPlaceInformation(fPi);
OutputSignalPlace orPlaceTrue = PrimitiveTemplates.getOutputSignalPlace();
orPlaceTrue.setId(TemplateConstants.INPUT_SIGNAL_PLACE_OR_CONNECTION_TRUE_PREFIX + "-" + signalCount + "-" + i);
Name tName = new Name();
tName.setText(TemplateConstants.INPUT_SIGNAL_PLACE_OR_CONNECTION_TRUE_PREFIX + "-" + signalCount + "-" + i);
orPlaceTrue.setName(tName);
PlaceInformation tPi = new PlaceInformation();
tPi.setLocation("signals");
tPi.setSubNet("signals");
orPlaceTrue.setMutualPlaceInformation(tPi);
topPage.addObject(orPlaceTrue);
topPage.addObject(orPlaceFalse);
createAndIncludeArc(topPage, orPlaceTrue.getId() + "-to-" + transition.getId(), orPlaceTrue, transition);
createAndIncludeArc(topPage, transition.getId() + "-to-" + orPlaceTrue.getId(), transition, orPlaceTrue);
petriNet.flushTreeCache();
orPlacePairs.put(orPlaceTrue.getId(), orPlaceFalse);
return new Pair<>(orPlaceTrue, orPlaceFalse);
}
private static void attachORSignalNetToBaseSignalNet(PetriNet petriNet, InputSignalTransition inactiveT,
InputSignalTransition activeT, OutputSignalPlace orTruePlace, OutputSignalPlace orFalsePlace,
int count, String signalId, boolean isBase, boolean isActive) {
Page topPage = petriNet.getPage(0);
OutputSignalPlace aOsp = getPlaceByID(petriNet, TemplateConstants.INPUT_SIGNAL_PLACE_ACTIVE + "-" + signalId + "-base").asOutputSignalPlace();
OutputSignalPlace iOsp = getPlaceByID(petriNet, TemplateConstants.INPUT_SIGNAL_PLACE_INACTIVE + "-" + signalId + "-base").asOutputSignalPlace();
if (!isBase) {
aOsp = getPlaceByID(petriNet, TemplateConstants.INPUT_SIGNAL_PLACE_ACTIVE + "-" + signalId + "-base").asOutputSignalPlace().treeCopy();
iOsp = getPlaceByID(petriNet, TemplateConstants.INPUT_SIGNAL_PLACE_INACTIVE + "-" + signalId + "-base").asOutputSignalPlace().treeCopy();
aOsp.setId(TemplateConstants.INPUT_SIGNAL_PLACE_ACTIVE + "-" + signalId + "-" + count);
iOsp.setId(TemplateConstants.INPUT_SIGNAL_PLACE_INACTIVE + "-" + signalId + "-" + count);
topPage.addObject(aOsp);
topPage.addObject(iOsp);
petriNet.flushTreeCache();
}
// marking
if (isActive) {
aOsp.getInitialMarking().setText(1);
int orTruePlaceMarking = Integer.valueOf(orTruePlace.getInitialMarking().getText());
orTruePlace.getInitialMarking().setText(orTruePlaceMarking + 1);
} else {
iOsp.getInitialMarking().setText(1);
int orFalsePlaceMarking = Integer.valueOf(orFalsePlace.getInitialMarking().getText());
orFalsePlace.getInitialMarking().setText(orFalsePlaceMarking + 1);
}
createAndIncludeArc(topPage, TemplateConstants.ARC_T_ACTIVE_TO_TRUE + "-" + signalId + "-" + count, activeT, orTruePlace);
createAndIncludeArc(topPage, TemplateConstants.ARC_FALSE_TO_T_ACTIVE + "-" + signalId + "-" + count, orFalsePlace, activeT);
createAndIncludeArc(topPage, TemplateConstants.ARC_T_INACTIVE_TO_FALSE + "-" + signalId + "-" + count, inactiveT, orFalsePlace);
createAndIncludeArc(topPage, TemplateConstants.ARC_TRUE_TO_T_INACTIVE + "-" + signalId + "-" + count, orTruePlace, inactiveT);
if (!isBase) {
createAndIncludeArc(topPage, "arc-or-1-" + signalId + "-" + count, aOsp, inactiveT);
createAndIncludeArc(topPage, "arc-or-2-" + signalId + "-" + count, inactiveT, iOsp);
createAndIncludeArc(topPage, "arc-or-3-" + signalId + "-" + count, iOsp, activeT);
createAndIncludeArc(topPage, "arc-or-4-" + signalId + "-" + count, activeT, aOsp);
}
}
private static void attachANDSignalNetToBaseSignalNet(PetriNet petriNet, InputSignalTransition transition, InputSignalTransition inactiveT, InputSignalTransition activeT, int count, String signalId, boolean isActive) {
Page topPage = petriNet.getPage(0);
OutputSignalPlace aOsp = getPlaceByID(petriNet, TemplateConstants.INPUT_SIGNAL_PLACE_ACTIVE + "-" + signalId + "-base").asOutputSignalPlace().treeCopy();
OutputSignalPlace iOsp = getPlaceByID(petriNet, TemplateConstants.INPUT_SIGNAL_PLACE_INACTIVE + "-" + signalId + "-base").asOutputSignalPlace().treeCopy();
aOsp.setId(TemplateConstants.INPUT_SIGNAL_PLACE_ACTIVE + "-" + signalId + "-" + count);
iOsp.setId(TemplateConstants.INPUT_SIGNAL_PLACE_INACTIVE + "-" + signalId + "-" + count);
createAndIncludeArc(topPage, "arc-and-1-" + signalId + "-" + count, aOsp, inactiveT);
createAndIncludeArc(topPage, "arc-and-2-" + signalId + "-" + count, inactiveT, iOsp);
createAndIncludeArc(topPage, "arc-and-3-" + signalId + "-" + count, iOsp, activeT);
createAndIncludeArc(topPage, "arc-and-4-" + signalId + "-" + count, activeT, aOsp);
createAndIncludeArc(topPage, "IoTransitionToSignal-" + signalId + "-" + count, transition, aOsp);
createAndIncludeArc(topPage, "IoTransitionFromSignal-" + signalId + "-" + count, aOsp, transition);
topPage.addObject(aOsp);
topPage.addObject(iOsp);
// marking
if (isActive) {
aOsp.getInitialMarking().setText(1);
} else {
iOsp.getInitialMarking().setText(1);
}
petriNet.flushTreeCache();
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment