@@ -175,6 +175,7 @@ namespace PetriEngine {
175175 places ();
176176 transitions ();
177177 arcs ();
178+ inhibitorArcs ();
178179 _out << decreaseTabs () << " </page>\n " ;
179180 }
180181
@@ -366,7 +367,6 @@ namespace PetriEngine {
366367
367368 void PnmlWriter::arcs () {
368369 _out << getTabs () << " <!-- List of arcs -->\n " ;
369- uint32_t index = 0 ;
370370 for (auto &arc: _arcs) {
371371 shared_const_string source;
372372 shared_const_string target;
@@ -377,10 +377,11 @@ namespace PetriEngine {
377377 source = _builder._transitions [arc.transition ].name ;
378378 target = _builder._places [arc.place ].name ;
379379 }
380- _out << getTabs () << " <arc id=\" arc" << index << " \" source=\" " << *source << " \" target=\" " << *target
381- << " \" >\n " ;
380+ std::string id = *source + " _to_" + *target;
381+ _out << getTabs () << " <arc id=\" " << id << " \" source=\" " << *source << " \" target=\" " << *target
382+ << " \" type=\" normal" << " \" >\n " ;
382383 _out << increaseTabs () << " <name>\n " ;
383- _out << increaseTabs () << " <text>" << index << " </text>\n " ;
384+ _out << increaseTabs () << " <text>" << id << " </text>\n " ;
384385 _out << decreaseTabs () << " </name>\n " ;
385386 _out << getTabs () << " <hlinscription>\n " ;
386387 _out << increaseTabs () << " <text>" << to_string (*arc.expr ) << " </text>\n " ;
@@ -389,10 +390,54 @@ namespace PetriEngine {
389390 _out << getTabs () << " </structure>\n " ;
390391 _out << decreaseTabs () << " </hlinscription>\n " ;
391392 _out << decreaseTabs () << " </arc>\n " ;
392- index++;
393393 }
394394 }
395395
396+ void PnmlWriter::inhibitorArcs () {
397+ _out << getTabs () << " <!-- List of inhibitor arcs -->\n " ;
398+ for (auto &inhibitor: _builder.inhibitors ()) {
399+ Place &place = _builder._places [inhibitor.place ];
400+ shared_const_string source = place.name ;
401+ shared_const_string target = _builder._transitions [inhibitor.transition ].name ;
402+ std::string id = *source + " _to_" + *target;
403+ _out << getTabs () << " <arc id=\" " << id << " \" source=\" " << *source << " \" target=\" " << *target
404+ << " \" type=\" inhibitor" << " \" >\n " ;
405+ _out << increaseTabs () << " <name>\n " ;
406+ _out << increaseTabs () << " <text>" << id << " </text>\n " ;
407+ _out << decreaseTabs () << " </name>\n " ;
408+ _out << getTabs () << " <hlinscription>\n " ;
409+
410+ _out << increaseTabs () << " <text>" << inhibitor.inhib_weight << " '" << place.type ->getName () << " .all"
411+ << " </text>\n " ;
412+ _out << getTabs () << " <structure>\n " ;
413+ writeInhibitorExpressionToPnml (inhibitor);
414+ _out << decreaseTabs () << " </structure>\n " ;
415+ _out << decreaseTabs () << " </hlinscription>\n " ;
416+ _out << decreaseTabs () << " </arc>\n " ;
417+ }
418+ }
419+
420+ void PnmlWriter::writeInhibitorExpressionToPnml (Colored::Arc inhibitor) {
421+ _out << increaseTabs () << " <numberof>\n " ;
422+
423+ // First subterm with the multiplicity
424+ _out << increaseTabs () << " <subterm>\n " ;
425+ _out << increaseTabs () << " <numberconstant value=\" " << inhibitor.inhib_weight << " \" >\n " ;
426+ _out << increaseTabs () << " <positive/>\n " ;
427+ _out << decreaseTabs () << " </numberconstant>\n " ;
428+ _out << decreaseTabs () << " </subterm>\n " ;
429+
430+ // Second subterm with the colortype
431+ _out << getTabs () << " <subterm>\n " ;
432+ _out << increaseTabs () << " <all>\n " ;
433+ Place &place = _builder._places [inhibitor.place ];
434+ _out << increaseTabs () << " <usersort declaration=\" " << place.type ->getName () << " \" />\n " ;
435+ _out << decreaseTabs () << " </all>\n " ;
436+ _out << decreaseTabs () << " </subterm>\n " ;
437+
438+ _out << decreaseTabs () << " </numberof>\n " ;
439+ }
440+
396441 void PnmlWriter::metaInfoClose () {
397442 _out << decreaseTabs () << " </net>\n "
398443 << decreaseTabs () << " </pnml>" ;
0 commit comments