diff --git a/build.gradle b/build.gradle index 6e7f87d515e66ec4e97c392952518d784df80f0e..eedc254b7a20e75d695753815bc0d5fcb7707778 100644 --- a/build.gradle +++ b/build.gradle @@ -30,6 +30,11 @@ idea.module.generatedSourceDirs += file('src/gen/java') sourceSets.main.java.srcDir "src/gen/java" jar.manifest.attributes('Main-Class': 'de.tudresden.inf.st.pnml.Main') + +configurations { + myBeaver +} + dependencies { implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jackson_version}" implementation group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11' @@ -53,10 +58,13 @@ dependencies { compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.0' + myBeaver group: 'net.sf.beaver', name: 'beaver-ant', version: '0.9.11' + jastadd2 "org.jastadd:jastadd:2.3.4" } // Default run configuration + run { mainClassName = 'de.tudresden.inf.st.pnml.Main' standardInput = System.in @@ -116,13 +124,41 @@ task relastToJastAdd(type: JavaExec) { "--file", relastFile, "./src/main/jastadd/marking/Marking.relast", - "./src/main/jastadd/io/IoPN.relast" + "./src/main/jastadd/io/IoPN.relast", + "./src/main/jastadd/clauses/expressions.relast" +} + +task generateBeaver(type: JavaExec) { + + inputs.files { + project.file("src/main/jastadd/clauses/Parser.beaver") + } + outputs.dir { + // This closure is needed to delay reading the genDir setting. + project.file("src/gen/java/de/tudresden/inf/st/pnml/jastadd/parser") + } + + classpath = configurations.myBeaver + main = 'beaver.comp.run.Make' + + doFirst { + def outdir = project.file("src/gen/java/de/tudresden/inf/st/pnml/jastadd/parser") + if (!outdir.isDirectory()) { + outdir.mkdirs() + } + def inputFile = project.file("src/main/jastadd/clauses/Parser.beaver") + args ([ '-d', outdir.path, '-t', '-c', '-w', inputFile.path ]) + } } // Third phase: JastAdd -> Java (using JastAdd Gradle plugin) jastadd { + configureModuleBuild() modules { + + + module("pnml") { java { @@ -143,6 +179,7 @@ jastadd { scanner { include "src/main/jastadd/PnmlScanner.flex" + include "src/main/jastadd/clauses/expressions.flex" } parser { @@ -174,6 +211,6 @@ jastadd { // Workflow configuration for phases relastToJastAdd.dependsOn ecoreToRelast generateAst.dependsOn relastToJastAdd - +compileJava.dependsOn generateBeaver //// always run jastadd //jastadd.outputs.upToDateWhen {false} diff --git a/src/main/jastadd/clauses/Parser.beaver b/src/main/jastadd/clauses/Parser.beaver new file mode 100644 index 0000000000000000000000000000000000000000..9505a3cc1db834710e67ca01573a0868db96cce5 --- /dev/null +++ b/src/main/jastadd/clauses/Parser.beaver @@ -0,0 +1,22 @@ +%header {: +package de.tudresden.inf.st.pnml.jastadd.parser; + import de.tudresden.inf.st.pnml.jastadd.model.*; :}; +%terminals AND; +%terminals OR; +%terminals NOT; +%terminals VARIABLE; +%typeof goal = "expressions"; +%typeof exp = "Exp"; +%goal goal; +goal = + exp.exp {: return new Symbol(new Root(exp)); :} + ; +exp = + exp.a AND.AND exp.b {: return new Symbol(new AndExp(a, b)); :} + + | exp.a OR.OR exp.b {: return new Symbol(new OrExp(a, b)); :} + + | NOT.NOT exp.exp {: return new Symbol(new NotExp(exp)); :} + + | VARIABLE.v {: return new Symbol(new Var(((String)v.value))); :} + ; diff --git a/src/main/jastadd/clauses/expressions.flex b/src/main/jastadd/clauses/expressions.flex new file mode 100644 index 0000000000000000000000000000000000000000..eb1089f5639d44fb28d4c28548531855dcbd4c37 --- /dev/null +++ b/src/main/jastadd/clauses/expressions.flex @@ -0,0 +1,39 @@ +package de.tudresden.inf.st.pnml.jastadd.scanner; + +import de.tudresden.inf.st.pnml.jastadd.parser.Parser.Terminals; + +%% + +%public +%final +%class ExpressionScanner +%extends beaver.Scanner + +%type beaver.Symbol +%function nextToken +%yylexthrow beaver.Scanner.Exception + +%line +%column + +%{ + private beaver.Symbol sym(short id) { + return new beaver.Symbol(id, yyline + 1, yycolumn + 1, yylength(), yytext()); + } +%} + +WhiteSpace = [ ] | \t | \f +NewLine = \n | \r | \r\n +Variable = [:jletter:][:jletterdigit:]* + +%% + +// discard whitespace information +{WhiteSpace} { } + +// token definitions +"AND" { return sym(Terminals.AND); } +"OR" { return sym(Terminals.OR); } +"NOT" { return sym(Terminals.NOT); } +{Variable} { return sym(Terminals.VARIABLE); } +<<EOF>> { return sym(Terminals.EOF); } diff --git a/src/main/jastadd/clauses/expressions.jadd b/src/main/jastadd/clauses/expressions.jadd new file mode 100644 index 0000000000000000000000000000000000000000..9ca151c061bda63de53da1749fc57ae36f52e50f --- /dev/null +++ b/src/main/jastadd/clauses/expressions.jadd @@ -0,0 +1,26 @@ +import de.tudresden.inf.st.data.ClauseValuesDefinition; + +aspect SignalExpressions { + + syn String ASTNode.printExp(); + syn boolean Exp.eval(ClauseValuesDefinition defs); + + eq ASTNode.printExp() = ""; + + eq Root.printExp() { + String result = ""; + result += getExp().printExp(); + return result; + } + + eq AndExp.printExp() = getA().printExp() + " AND " + getB().printExp(); + eq OrExp.printExp() = getA().printExp() + " OR " + getB().printExp(); + eq Var.printExp() = getName(); + eq NotExp.printExp() = "NOT " + getExp().printExp(); + + eq AndExp.eval(ClauseValuesDefinition defs) = getA().eval(defs) && getB().eval(defs); + eq OrExp.eval(ClauseValuesDefinition defs) = getA().eval(defs) || getB().eval(defs); + eq Var.eval(ClauseValuesDefinition defs) = defs.getDef(this.getName()); + eq NotExp.eval(ClauseValuesDefinition defs) = !getExp().eval(defs); + +} \ No newline at end of file diff --git a/src/main/jastadd/clauses/expressions.relast b/src/main/jastadd/clauses/expressions.relast new file mode 100644 index 0000000000000000000000000000000000000000..ade97b2562eb5c0f0e7d0b4880f07fca1ac7e53d --- /dev/null +++ b/src/main/jastadd/clauses/expressions.relast @@ -0,0 +1,11 @@ +Root ::= Exp ; + +abstract Exp ; +abstract UnaryExp:Exp ::= Exp ; + +abstract BinExp:Exp ::= A:Exp B:Exp ; +AndExp:BinExp ; +OrExp:BinExp ; + +Var:Exp ::= <Name:String> ; +NotExp:UnaryExp ; diff --git a/src/main/jastadd/distribution/DistributedPN.jadd b/src/main/jastadd/distribution/DistributedPN.jadd index 1205d2aa1f22e24444e68ffd70d6ddfeeb93d1cb..a84f4b511ae6999712578bc99bde7198090fd5c8 100644 --- a/src/main/jastadd/distribution/DistributedPN.jadd +++ b/src/main/jastadd/distribution/DistributedPN.jadd @@ -35,4 +35,8 @@ aspect PnDistribution { syn lazy String RefTransition.getSubnet() { return de.tudresden.inf.st.pnml.ToolSpecificsParser.getSubnetFromToolSpecifics(this.getToolspecificList()); } + + syn lazy Root InputSignalTransition.getInputSignalClause(){ + return de.tudresden.inf.st.pnml.ToolSpecificsParser.getClauseFromToolSpecifics(this.getToolspecificList()); + } } \ No newline at end of file diff --git a/src/main/jastadd/io/IoPN.relast b/src/main/jastadd/io/IoPN.relast index e16c996f0c36d188a1137f8fe46abc876e7696e0..60241c875f4e54b45d956c02c5bca6ba686daba0 100644 --- a/src/main/jastadd/io/IoPN.relast +++ b/src/main/jastadd/io/IoPN.relast @@ -8,11 +8,12 @@ DefaultTransitionInformation : TransitionInformation; PlaceInformation ::= <Location:String> <Type:String> <SubNet:String> <Instance:String>; -InputSignalTransition : Transition ::= /StaticInputSignalBinding:InputSignalBinding*/ MutualInputSignalBinding:InputSignalBinding* /StaticTransitionInformation:TransitionInformation/ [MutualTransitionInformation:TransitionInformation]; +InputSignalTransition : Transition ::= /StaticInputSignalBinding:InputSignalBinding*/ MutualInputSignalBinding:InputSignalBinding* /StaticTransitionInformation:TransitionInformation/ [MutualTransitionInformation:TransitionInformation] /InputSignalClause:Root/; OutputSignalPlace : Place ::= /OutputSignalBinding*/ /StaticPlaceInformation:PlaceInformation/ [MutualPlaceInformation:PlaceInformation]; OutputMapping; EqualityOutputMapping : OutputMapping ::= <Value:java.lang.Integer> <Result:java.lang.Integer>; ThresholdOutputMapping : OutputMapping ::= <Value:java.lang.Integer> <Result:java.lang.Integer>; -RangeOutputMapping : OutputMapping ::= <UpperBound:java.lang.Integer> <LowerBound:java.lang.Integer> <Result:java.lang.Integer>; \ No newline at end of file +RangeOutputMapping : OutputMapping ::= <UpperBound:java.lang.Integer> <LowerBound:java.lang.Integer> <Result:java.lang.Integer>; + diff --git a/src/main/java/de/tudresden/inf/st/constants/PnmlConstants.java b/src/main/java/de/tudresden/inf/st/constants/PnmlConstants.java index dcbf9ad432bf9718bec01a91610a36a55efb4510..70335cf8da9ff4fd954f0092caf26a0b60939409 100644 --- a/src/main/java/de/tudresden/inf/st/constants/PnmlConstants.java +++ b/src/main/java/de/tudresden/inf/st/constants/PnmlConstants.java @@ -64,4 +64,6 @@ public final class PnmlConstants { public static final String RESULT_KEY = "result"; public static final String UPPER_BOUND_KEY = "upperbound"; public static final String LOWER_BOUND_KEY = "lowerbound"; + + public static final String CLAUSE_KEY = "inputsignalclause"; } diff --git a/src/main/java/de/tudresden/inf/st/data/ClauseValuesDefinition.java b/src/main/java/de/tudresden/inf/st/data/ClauseValuesDefinition.java new file mode 100644 index 0000000000000000000000000000000000000000..af3559e08f5dc4748f4f74c949ec6220c0e440df --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/data/ClauseValuesDefinition.java @@ -0,0 +1,24 @@ +package de.tudresden.inf.st.data; + +import java.util.HashMap; + +public class ClauseValuesDefinition { + + private HashMap<String, Boolean> defs; + + public ClauseValuesDefinition(){ + defs = new HashMap<String, Boolean>(); + } + + public HashMap<String, Boolean> getDefs() { + return defs; + } + + public Boolean getDef(String id) { + return defs.get(id); + } + + public void addDef(String id, Boolean def) { + defs.put(id, def); + } +} diff --git a/src/main/java/de/tudresden/inf/st/pnml/Main.java b/src/main/java/de/tudresden/inf/st/pnml/Main.java index f47221e64f5926296229b02a31b881ab35d91265..c159d5637a88f50eeec52827ec87d272334d80a7 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/Main.java +++ b/src/main/java/de/tudresden/inf/st/pnml/Main.java @@ -19,13 +19,13 @@ public class Main { String inputPath = (args.length > 0) ? args[0] : null; - if(inputPath == null){ - logger.error("No model found on given input path."); - return; - } + // if(inputPath == null){ + // logger.error("No model found on given input path."); + // return; + // } - //List<PetriNet> petriNets = PnmlParser.parsePnml("src/main/nets/refNet2.pnml"); - List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath); + List<PetriNet> petriNets = PnmlParser.parsePnml("src/main/nets/inputSignalNet.pnml"); + // List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath); List<List<PetriNet>> disconnectedPetriNets = new ArrayList<>(); // petriNets.forEach(pn -> disconnectedPetriNets.add(GlobalToLocalNetsPostProcessor.disconnectNets(pn))); diff --git a/src/main/java/de/tudresden/inf/st/pnml/ToolSpecificsParser.java b/src/main/java/de/tudresden/inf/st/pnml/ToolSpecificsParser.java index d757b1c916d28f0d091371b1d48ef8313739180f..89b0baac328c0c9d3eb61c55fa46bf517e44267f 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/ToolSpecificsParser.java +++ b/src/main/java/de/tudresden/inf/st/pnml/ToolSpecificsParser.java @@ -1,5 +1,6 @@ package de.tudresden.inf.st.pnml; +import beaver.Symbol; import de.tudresden.inf.st.constants.PnmlConstants; import de.tudresden.inf.st.pnml.jastadd.model.*; @@ -16,11 +17,38 @@ import org.xml.sax.SAXException; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.io.StringReader; + +import de.tudresden.inf.st.pnml.jastadd.scanner.ExpressionScanner; +import de.tudresden.inf.st.pnml.jastadd.parser.Parser; public class ToolSpecificsParser { private static final Logger logger = LoggerFactory.getLogger(ToolSpecificsParser.class); + public static Root getClauseFromToolSpecifics(JastAddList<ToolInfo> toolInfos) { + + if (toolInfos.getNumChild() > 0) { + try { + Document doc = parseToolSpecifics(toolInfos); + NodeList locationList = doc.getElementsByTagName(PnmlConstants.CLAUSE_KEY); + + if (locationList.getLength() > 0 && locationList.item(0) != null) { + String content = locationList.item(0).getTextContent(); + StringReader reader = new StringReader(content); + ExpressionScanner scanner = new ExpressionScanner(reader); + Parser parser = new Parser(); + return ((Root) parser.parse(scanner)); + } + + } catch (ParserConfigurationException | SAXException | IOException | beaver.Parser.Exception e) { + logger.error(e.getMessage()); + } + } + + return new Root(); + } + public static String getLocationFromToolSpecifics(JastAddList<ToolInfo> toolInfos) { if (toolInfos.getNumChild() > 0) { diff --git a/src/main/java/de/tudresden/inf/st/postprocessing/PostProcessingUtils.java b/src/main/java/de/tudresden/inf/st/postprocessing/PostProcessingUtils.java index 016a642aff7558a69b9951c69b49d151a0bbaecb..9b86ebeb8856664cc77efc72e34fc78ad38873bb 100644 --- a/src/main/java/de/tudresden/inf/st/postprocessing/PostProcessingUtils.java +++ b/src/main/java/de/tudresden/inf/st/postprocessing/PostProcessingUtils.java @@ -2,6 +2,7 @@ package de.tudresden.inf.st.postprocessing; import de.tudresden.inf.st.constants.PnmlConstants; import de.tudresden.inf.st.copy.CopyPrimitiveElements; +import de.tudresden.inf.st.data.ClauseValuesDefinition; import de.tudresden.inf.st.data.Tuple3; import de.tudresden.inf.st.pnml.jastadd.model.*; import org.slf4j.Logger; @@ -222,6 +223,10 @@ public class PostProcessingUtils { logger.info("--- Transition: " + t.getId()); } + if(t.asInputSignalTransition().getInputSignalClause() != null && t.asInputSignalTransition().getInputSignalClause().getNumChild() > 0){ + logger.info("------ Clause: " + t.asInputSignalTransition().getInputSignalClause().printExp()); + } + for (Place p : t.asInputSignalTransition().incomingPlaces()) { logger.info("------ Inputplace: " + p.getName().getText() + " subnet: " + p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet() + " ---------"); diff --git a/src/main/nets/inputSignalNet.pnml b/src/main/nets/inputSignalNet.pnml new file mode 100644 index 0000000000000000000000000000000000000000..63f1f2df5e630bf7f0dec6a8c621b7a6b730f10d --- /dev/null +++ b/src/main/nets/inputSignalNet.pnml @@ -0,0 +1,94 @@ +<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> + <net id="n-E2D0-BCF46-0" type="http://www.pnml.org/version-2009/grammar/ptnet"> + <name> + <text>minimal</text> + </name> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + </toolspecific> + <page id="g-E2D0-BCF68-1"> + <place id="p1"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <location>node-1</location> + <subnet>subnet-1</subnet> + <type>discretePlaceType</type> + <outputsignalbindings> + <outputsignalbinding> + <placeID>p1</placeID> + <outputsignalID>os2</outputsignalID> + <initialvalue>1</initialvalue> <!-- -1 = undefined --> + <outputmappings> + <equal> + <value>1</value> + <result>3</result> + </equal> + <equal> + <value>0</value> + <result>2</result> + </equal> + <threshold> + <value>6</value> + <result>0</result> + </threshold> + <range> + <upperbound>5</upperbound> + <lowerbound>3</lowerbound> + <result>1</result> + </range> + </outputmappings> + </outputsignalbinding> + </outputsignalbindings> + </toolspecific> + <name> + <text>p1</text> + <graphics> + <offset x="0" y="-10"/> + </graphics> + </name> + <initialMarking> + <text>1</text> + </initialMarking> + <graphics> + <position x="30" y="50"/> + </graphics> + </place> + + <transition id="t1"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1"> + <!-- <location>channel</location> + <subnet>channel</subnet>--> + <location>node-1</location> + <subnet>subnet-1</subnet> + <type>discreteTransitionType</type> + <!-- <topic>sampleTopic</topic> + <inputlimit>10</inputlimit> + <outputlimit>10</outputlimit>--> + <inputsignalbindings> + <inputsignalbinding> + <transitionID>t1</transitionID> + <inputsignalID>is1</inputsignalID> + <initialvalue>1</initialvalue> + </inputsignalbinding> + <inputsignalbinding> + <transitionID>t1</transitionID> + <inputsignalID>is2</inputsignalID> + <initialvalue>1</initialvalue> + </inputsignalbinding> + </inputsignalbindings> + <inputsignalclause>is1 AND NOT is2</inputsignalclause> + </toolspecific> + <name> + <text>t1</text> + <graphics> + <offset x="0" y="0"/> + </graphics> + </name> + <graphics> + <position x="300" y="50"/> + </graphics> + </transition> + + <arc id="arc-p1-t1" source="p1" target="t1"> + </arc> + </page> + </net> +</pnml> \ No newline at end of file diff --git a/src/main/nets/minimal.pnml b/src/main/nets/minimal.pnml new file mode 100644 index 0000000000000000000000000000000000000000..f3907302420e8988aaf08b5b4ab29c25c502fe67 --- /dev/null +++ b/src/main/nets/minimal.pnml @@ -0,0 +1,243 @@ +<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml"> + <net id="n-E2D0-BCF46-0" type ="http://www.pnml.org/version-2009/grammar/ptnet"> + <name> + <text>minimal</text> + </name> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1"> + </toolspecific> + <page id="g-E2D0-BCF68-1"> + <place id="p1"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1"> + <location>node-1</location> + <type>discretePlaceType</type> + <outputsignalbindings> + <outputsignalbinding> + <placeID>p1</placeID> + <outputsignalID>os2</outputsignalID> + <initialvalue>1</initialvalue> <!-- -1 = undefined --> + <outputmappings> + <equal> + <value>1</value> + <result>3</result> + </equal> + <equal> + <value>0</value> + <result>2</result> + </equal> + <threshold> + <value>6</value> + <result>0</result> + </threshold> + <range> + <upperbound>5</upperbound> + <lowerbound>3</lowerbound> + <result>1</result> + </range> + </outputmappings> + </outputsignalbinding> + </outputsignalbindings> + </toolspecific> + <name> + <text>p1</text> + <graphics> + <offset x="0" y="-10" /> + </graphics> + </name> + <initialMarking> + <text>1</text> + </initialMarking> + <graphics> + <position x="30" y="50"/> + </graphics> + </place> + <place id="p2"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1"> + <location>node-1</location> + <type>discretePlaceType</type> + <outputsignalbindings> + <outputsignalbinding> + <placeID>p2</placeID> + <outputsignalID>os1</outputsignalID> + <initialvalue>4</initialvalue> <!-- -1 = undefined --> + <outputmappings> + <equal> + <value>1</value> + <result>1</result> + </equal> + <threshold> + <value>6</value> + <result>0</result> + </threshold> + <range> + <upperbound>5</upperbound> + <lowerbound>3</lowerbound> + <result>1</result> + </range> + </outputmappings> + </outputsignalbinding> + </outputsignalbindings> + </toolspecific> + <name> + <text>p1</text> + <graphics> + <offset x="0" y="-10" /> + </graphics> + </name> + <initialMarking> + <text>1</text> + </initialMarking> + <graphics> + <position x="635" y="90"/> + </graphics> + </place> + <place id="p3"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1"> + <location>node-1</location> + <type>discretePlaceType</type> + <outputsignalbindings> + <outputsignalbinding> + <placeID>p3</placeID> + <outputsignalID>os5</outputsignalID> + <initialvalue>4</initialvalue> <!-- -1 = undefined --> + <outputmappings> + <equal> + <value>1</value> + <result>1</result> + </equal> + <threshold> + <value>2</value> + <result>0</result> + </threshold> + </outputmappings> + </outputsignalbinding> + </outputsignalbindings> + </toolspecific> + <name> + <text>p3</text> + <graphics> + <offset x="0" y="-10" /> + </graphics> + </name> + <initialMarking> + <text>1</text> + </initialMarking> + <graphics> + <position x="635" y="90"/> + </graphics> + </place> + <transition id="t1"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1"> + <location>node-1</location> + <type>discreteTransitionType</type> + <inputsignalbindings> + <inputsignalbinding> + <transitionID>t1</transitionID> + <inputsignalID>is1</inputsignalID> + <initialvalue>1</initialvalue> + </inputsignalbinding> + <inputsignalbinding> + <transitionID>t1</transitionID> + <inputsignalID>is3</inputsignalID> + <initialvalue>1</initialvalue> + </inputsignalbinding> + </inputsignalbindings> + </toolspecific> + <name> + <text>t0</text> + <graphics> + <offset x="0" y="0" /> + </graphics> + </name> + <graphics> + <position x="300" y="50"/> + </graphics> + </transition> + <transition id="t2"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1"> + <location>node-1</location> + <type>discreteTransitionType</type> + <inputsignalbindings> + <inputsignalbinding> + <transitionID>t2</transitionID> + <inputsignalID>is2</inputsignalID> + <initialvalue>0</initialvalue> + </inputsignalbinding> + <inputsignalbinding> + <transitionID>t2</transitionID> + <inputsignalID>is5</inputsignalID> + <initialvalue>0</initialvalue> + </inputsignalbinding> + </inputsignalbindings> + <inputsignalclause>is2 AND NOT is5</inputsignalclause> + </toolspecific> + <name> + <text>t1</text> + <graphics> + <offset x="0" y="0" /> + </graphics> + </name> + <graphics> + <position x="285" y="205"/> + </graphics> + </transition> + <transition id="t3"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1"> + <location>node-1</location> + <type>unlimitedChannelOutType</type> + <topic>c1</topic> + <inputsignalbindings> + <inputsignalbinding> + <transitionID>t3</transitionID> + <inputsignalID>is3</inputsignalID> + <initialvalue>1</initialvalue> + </inputsignalbinding> + </inputsignalbindings> + </toolspecific> + <name> + <text>t3</text> + <graphics> + <offset x="0" y="0" /> + </graphics> + </name> + <graphics> + <position x="265" y="205"/> + </graphics> + </transition> + <transition id="t4"> + <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1"> + <location>node-1</location> + <type>unlimitedChannelInType</type> + <topic>c1</topic> + <inputsignalbindings> + <inputsignalbinding> + <transitionID>t4</transitionID> + <inputsignalID>is4</inputsignalID> + <initialvalue>1</initialvalue> + </inputsignalbinding> + </inputsignalbindings> + </toolspecific> + <name> + <text>t4</text> + <graphics> + <offset x="0" y="0" /> + </graphics> + </name> + <graphics> + <position x="205" y="205"/> + </graphics> + </transition> + <arc id="arc-t2-p1" source="t2" target="p1"> + </arc> + <arc id="arc-p2-t2" source="p2" target="t2"> + </arc> + <arc id="arc-t1-p2" source="t1" target="p2"> + </arc> + <arc id="arc-p1-t1" source="p1" target="t1"> + </arc> + <arc id="arc-p1-t3" source="p1" target="t3"> + </arc> + <arc id="arc-t4-p3" source="t4" target="p3"> + </arc> + </page> + </net> +</pnml>