diff --git a/src/main/jastadd/flatter/transforms/SignalTransforms.jadd b/src/main/jastadd/flatter/transforms/SignalTransforms.jadd index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..65f7f930f0ac6ea24331945e47e77e95f3f254ec 100644 --- a/src/main/jastadd/flatter/transforms/SignalTransforms.jadd +++ b/src/main/jastadd/flatter/transforms/SignalTransforms.jadd @@ -0,0 +1,83 @@ +aspect SignalTransforms { + + // apply rule I4 + syn PetriNet PetriNet.transformSignalElements(Page signalValuePage){ + + Map<String, String> signalDefs = this.getInputSignalDefinition(); + Page topPage = this.getPage(0); + + for (Map.Entry<String, String> entry : signalDefs.entrySet()) { + + PetriNet pubNet = SignalTemplates.getInputSignalTemplate(entry.getKey()); + + if(Boolean.parseBoolean(entry.getValue())){ + pubNet.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_TRUE + entry.getKey()).getInitialMarking().setText(1); + pubNet.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_FALSE + entry.getKey()).getInitialMarking().setText(0); + } else { + pubNet.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_TRUE + entry.getKey()).getInitialMarking().setText(0); + pubNet.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_FALSE + entry.getKey()).getInitialMarking().setText(1); + } + + TransformationUtils.includeTemplateInstance(signalValuePage, this, pubNet, "signal", "signal"); + } + return this; + } + + syn Page InputSignalClause.transformClauseElement(DinerosTransition t, PetriNet net) { + + Page res = new Page(); + res.setId(TemplateConstants.INPUT_SIGNAL_PAGE_PREFIX + t.getId()); + + // apply rule I1 + int i = 0; + for(Disjunction dj : this.getDisjunctions()){ + DinerosPlace pdi = PrimitiveTemplates.getDinerosPlace(); + pdi.setId("PD-" + i + "-" + t.getId()); + pdi.getName().setText(pdi.getId()); + RefTransition rt = PrimitiveTemplates.getReferenceTransition(t); + rt.setId("PD-REF-" + i + "-" + t.getId()); + rt.getName().setText(rt.getId()); + + int j = 0; + for(Literal l : dj.getLiterals()){ + + Transition toTrue = net.getTransitionById(TemplateConstants.INPUT_SIGNAL_TRANSITION_TO_TRUE + "-" + l.getName()); + Transition toFalse = net.getTransitionById(TemplateConstants.INPUT_SIGNAL_TRANSITION_TO_FALSE + "-" + l.getName()); + + // create elements for rule I2 & I3 + RefTransition toTrueRt = PrimitiveTemplates.getReferenceTransition(toTrue); + toTrueRt.setId(toTrue.getId() + "REF-" + i + "-" + j); + toTrueRt.getName().setText(toTrueRt.getId()); + res.addObject(toTrueRt); + RefTransition toFalseRt = PrimitiveTemplates.getReferenceTransition(toFalse); + toFalseRt.setId(toFalse.getId() + "REF-" + i + "-" + j); + toFalseRt.getName().setText(toFalseRt.getId()); + res.addObject(toFalseRt); + RefPlace djRefPlace = PrimitiveTemplates.getReferencePlace(pdi); + + // apply rule I2 + if(l.isPositiveLiteral()){ + TransformationUtils.createAndIncludeArc(res, toFalse.getId() + "-to-" + djRefPlace.getId(), toFalseRt, djRefPlace); + TransformationUtils.createAndIncludeArc(res, djRefPlace.getId() + "-to-" + toTrueRt.getId(), djRefPlace, toTrueRt); + + if(Boolean.parseBoolean(net.getInputSignalDefinition().get(l.getName()))){ + pdi.getInitialMarking().setText(pdi.getInitialMarking().getText() + 1); + } + } + + // apply rule I3 + if(l.isNegativeLiteral()){ + TransformationUtils.createAndIncludeArc(res, toTrueRt.getId() + "-to-" + djRefPlace.getId(), toTrueRt, djRefPlace); + TransformationUtils.createAndIncludeArc(res, djRefPlace.getId() + "-to-" + toTrueRt.getId(), djRefPlace, toFalseRt); + + if(!Boolean.parseBoolean(net.getInputSignalDefinition().get(l.getName()))){ + pdi.getInitialMarking().setText(pdi.getInitialMarking().getText() + 1); + } + } + j++; + } + i++; + } + return res; + } +} \ No newline at end of file diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java index e6ce7a4a1343a5eea1597446865a5e3e1d8ec25c..644805e618a8cb4ef04afc3df4c29cb63cb79997 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java +++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java @@ -3,6 +3,7 @@ package de.tudresden.inf.st.pnml.flatter; import de.tudresden.inf.st.jastadd.dumpAst.ast.DumpBuilder; import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper; import de.tudresden.inf.st.jastadd.dumpAst.ast.SkinParamBooleanSetting; +import de.tudresden.inf.st.pnml.base.constants.PnmlConstants; import de.tudresden.inf.st.pnml.flatter.config.ConfigReader; import de.tudresden.inf.st.pnml.flatter.tina.KtzioProxy; import de.tudresden.inf.st.pnml.flatter.tina.SiftProxy; @@ -70,7 +71,19 @@ public class Main { } // [STAGE 4] Transform signals - // TODO + Page signalValuePage = new Page(); + signalValuePage.setId(PnmlConstants.SIGNAL_VALUE_PAGE_ID); + petriNet.addPage(signalValuePage); + petriNet.transformSignalElements(signalValuePage); + petriNet.flushTreeCache(); + + for(DinerosTransition dt : petriNet.allDinerosTransitions()){ + Page dtClausePage = dt.getStaticTransitionInformation().asSignalTransitionInformation() + .getClause().transformClauseElement(dt, petriNet); + petriNet.addPage(dtClausePage); + } + + petriNet.flushTreeCache(); // DumpBuilder builder = Dumper.read(petriNet).skinParam(SkinParamBooleanSetting.Shadowing, false); // builder.dumpAsPNG(Paths.get("net.png")); diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/template/PrimitiveTemplates.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/template/PrimitiveTemplates.java index 7190bb7314dda1ae64fe1ec1b2d5ebe2e1ac902b..537ebc3f795d1d5ad2aa689ed868ce238729e18f 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/flatter/template/PrimitiveTemplates.java +++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/template/PrimitiveTemplates.java @@ -29,4 +29,28 @@ public class PrimitiveTemplates extends PnmlTemplate{ return null; } + + public static RefTransition getReferenceTransition(Transition target){ + + PetriNet templateNet = PnmlParser.parsePnml(homeDirectory + "/src/main/resources/elements/RefTransition.pnml").get(0); + + for(RefTransition rt : templateNet.allRefTransitions()){ + rt.setRef(target); + return rt; + } + + return null; + } + + public static RefPlace getReferencePlace(Place target){ + + PetriNet templateNet = PnmlParser.parsePnml(homeDirectory + "/src/main/resources/elements/RefPlace.pnml").get(0); + + for(RefPlace rp : templateNet.allRefPlaces()){ + rp.setRef(target); + return rp; + } + + return null; + } } diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/template/SignalTemplates.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/template/SignalTemplates.java index baf688bb7fa12526454c5bb22bcfd5247ba6d48f..7734e6e1385a9de2b72d1f2d6d407e8ed81c553d 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/flatter/template/SignalTemplates.java +++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/template/SignalTemplates.java @@ -1,6 +1,5 @@ package de.tudresden.inf.st.pnml.flatter.template; -import de.tudresden.inf.st.pnml.jastadd.model.Name; import de.tudresden.inf.st.pnml.jastadd.model.PetriNet; import de.tudresden.inf.st.pnml.jastadd.model.PnObject; import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser; @@ -12,9 +11,7 @@ public class SignalTemplates extends PnmlTemplate{ PetriNet templateNet = PnmlParser.parsePnml(homeDirectory + "/src/main/resources/templates/InputSignal.pnml").get(0); for(PnObject po : templateNet.allObjects()){ - if(!po.getId().equals(TemplateConstants.INPUT_SIGNAL_TEMPLATE_PAGE)){ - updatePnObjectIdAndName(po, idSuffix); - } + updatePnObjectIdAndName(po, idSuffix); } return templateNet; diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TemplateConstants.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TemplateConstants.java index d3d2a77dcd54e3fa9a71ded64fa009b2557a83db..707903472508fca53ad0afc1cdda90318af8b2fc 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TemplateConstants.java +++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TemplateConstants.java @@ -38,21 +38,14 @@ public final class TemplateConstants { public static final String CHANNEL_TOPIC_PLACE = "ChannelConnectorPlace"; public static final String CHANNEL_TOPIC_TRANSITION = "ChannelConnectorTransition"; public static final String CHANNEL_TOPIC_PAGE_PREFIX = "ChannelTopicPage"; - public static final String CHANNEL_SERVICE_PAGE_PREFIX = "ChannelServicePage"; + public static final String CHANNEL_SERVICE_PAGE_PREFIX = "SIGNAL-PAGE-"; // signal elements - 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_INACTIVE = "InputSignalInactivePlace"; - public static final String INPUT_SIGNAL_PLACE_OR_CONNECTION_FALSE_PREFIX = "DINEROS-InputSignalOrConnectionFalse"; - public static final String INPUT_SIGNAL_PLACE_OR_CONNECTION_TRUE_PREFIX = "DINEROS-InputSignalOrConnectionTrue"; - public static final String INPUT_SIGNAL_TRANSITION_TO_ACTIVE = "InputSignalInactiveToActiveTransition"; - public static final String INPUT_SIGNAL_TRANSITION_TO_INACTIVE = "InputSignalActiveToInactiveTransition"; - - public static final String ARC_T_ACTIVE_TO_TRUE = "DINEROS-ArcTActiveToTrue"; - public static final String ARC_FALSE_TO_T_ACTIVE = "DINEROS-ArcFalseToTActive"; - public static final String ARC_T_INACTIVE_TO_FALSE = "DINEROS-ArcTInactiveToFalse"; - public static final String ARC_TRUE_TO_T_INACTIVE = "DINEROS-ArcTrueToTInactive"; + public static final String INPUT_SIGNAL_PLACE_TRUE = "InputSignalTruePlace"; + public static final String INPUT_SIGNAL_PLACE_FALSE = "InputSignalFalsePlace"; + public static final String INPUT_SIGNAL_TRANSITION_TO_TRUE = "InputSignalToTrueTransition"; + public static final String INPUT_SIGNAL_TRANSITION_TO_FALSE = "InputSignalToFalseTransition"; + public static final String INPUT_SIGNAL_PAGE_PREFIX = "InputSignalTruePlace"; // services // S3 diff --git a/src/main/resources/elements/RefPlace.pnml b/src/main/resources/elements/RefPlace.pnml new file mode 100644 index 0000000000000000000000000000000000000000..ca63563bea17233b827dfbd1eab2210e76e8e27e --- /dev/null +++ b/src/main/resources/elements/RefPlace.pnml @@ -0,0 +1,46 @@ +<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> + <net id="DinerosTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet"> + <name> + <text>DinerosTemplate</text> + </name> + <page id="DinerosTransitionPage"> + <referencePlace id="DinerosRefPlace" ref="DinerosPlace"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>none</location> + <subnet>none</subnet> + </toolspecific> + <name> + <text>DinerosRefPlace</text> + <graphics> + <offset x="0" y="0" /> + </graphics> + </name> + <graphics> + <position x="20" y="20"/> + </graphics> + </referencePlace> + + <place id="DinerosPlace"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>none</location> + <subnet>none</subnet> + <type>discretePlaceType</type> + <outputsignalbindings> + </outputsignalbindings> + </toolspecific> + <name> + <text>DinerosPlace</text> + <graphics> + <offset x="0" y="0" /> + </graphics> + </name> + <initialMarking> + <text>0</text> + </initialMarking> + <graphics> + <position x="0" y="0"/> + </graphics> + </place> + </page> + </net> +</pnml> \ No newline at end of file diff --git a/src/main/resources/elements/RefTransition.pnml b/src/main/resources/elements/RefTransition.pnml new file mode 100644 index 0000000000000000000000000000000000000000..08f037d8279504b6c11aa2bcc5dc4ea4d69d0ed0 --- /dev/null +++ b/src/main/resources/elements/RefTransition.pnml @@ -0,0 +1,34 @@ +<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> + <net id="DinerosTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet"> + <name> + <text>DinerosTemplate</text> + </name> + <page id="DinerosTransitionPage"> + <transition id="DinerosTransition"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>none</location> + <subnet>none</subnet> + <type>discreteTransitionType</type> + <inputsignalbindings> + </inputsignalbindings> + <inputsignalclause></inputsignalclause> + </toolspecific> + <name> + <text>ServiceClientOutputTransition</text> + <graphics> + <offset x="0" y="0" /> + </graphics> + </name> + <graphics> + <position x="0" y="0"/> + </graphics> + </transition> + <referenceTransition id="DinerosRefTransition" ref="DinerosTransition"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>none</location> + <subnet>none</subnet> + </toolspecific> + </referenceTransition> + </page> + </net> +</pnml> \ No newline at end of file diff --git a/src/main/resources/templates/InputSignal.pnml b/src/main/resources/templates/InputSignal.pnml index 81eec344548c468c24419d87c7f8765d4125181a..c484c9fad4e469f3986b59de08fed409acef645c 100644 --- a/src/main/resources/templates/InputSignal.pnml +++ b/src/main/resources/templates/InputSignal.pnml @@ -3,8 +3,8 @@ <name> <text>DinerosTemplate</text> </name> - <page id="InputSignalTemplatePage"> - <place id="InputSignalActivePlace"> + <page id="DinerosTemplatePage"> + <place id="InputSignalTruePlace"> <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <location>none</location> <subnet>none</subnet> @@ -13,7 +13,7 @@ </outputsignalbindings> </toolspecific> <name> - <text>InputSignalActivePlace</text> + <text>InputSignalTruePlace</text> <graphics> <offset x="0" y="0" /> </graphics> @@ -25,7 +25,7 @@ <position x="0" y="0"/> </graphics> </place> - <place id="InputSignalInactivePlace"> + <place id="InputSignalFalsePlace"> <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <location>none</location> <subnet>none</subnet> @@ -34,7 +34,7 @@ </outputsignalbindings> </toolspecific> <name> - <text>InputSignalInactivePlace</text> + <text>InputSignalFalsePlace</text> <graphics> <offset x="0" y="0" /> </graphics> @@ -47,7 +47,7 @@ </graphics> </place> - <transition id="InputSignalActiveToInactiveTransition"> + <transition id="InputSignalToFalseTransition"> <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <location>none</location> <subnet>none</subnet> @@ -57,7 +57,7 @@ <inputsignalclause></inputsignalclause> </toolspecific> <name> - <text>InputSignalActiveToInactiveTransition</text> + <text>InputSignalToFalseTransition</text> <graphics> <offset x="0" y="0" /> </graphics> @@ -66,7 +66,7 @@ <position x="0" y="0"/> </graphics> </transition> - <transition id="InputSignalInactiveToActiveTransition"> + <transition id="InputSignalToTrueTransition"> <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> <location>none</location> <subnet>none</subnet> @@ -76,7 +76,7 @@ <inputsignalclause></inputsignalclause> </toolspecific> <name> - <text>InputSignalInactiveToActiveTransition</text> + <text>InputSignalToTrueTransition</text> <graphics> <offset x="0" y="0" /> </graphics> @@ -86,13 +86,13 @@ </graphics> </transition> - <arc id="arc-1" source="InputSignalActivePlace" target="InputSignalActiveToInactiveTransition"> + <arc id="arc-1" source="InputSignalTruePlace" target="InputSignalToFalseTransition"> </arc> - <arc id="arc-2" source="InputSignalActiveToInactiveTransition" target="InputSignalInactivePlace"> + <arc id="arc-2" source="InputSignalToFalseTransition" target="InputSignalFalsePlace"> </arc> - <arc id="arc-3" source="InputSignalInactivePlace" target="InputSignalInactiveToActiveTransition"> + <arc id="arc-3" source="InputSignalFalsePlace" target="InputSignalToTrueTransition"> </arc> - <arc id="arc-4" source="InputSignalInactiveToActiveTransition" target="InputSignalActivePlace"> + <arc id="arc-4" source="InputSignalToTrueTransition" target="InputSignalTruePlace"> </arc> </page> </net>