158 lines
4.6 KiB
Plaintext
158 lines
4.6 KiB
Plaintext
|
module SimplePDL2PetriNet;
|
||
|
create OUT: petrinet from IN: simplepdl;
|
||
|
|
||
|
|
||
|
-- Obtenir la place correspondant au predecesseur d'une WorkSequence
|
||
|
helper context simplepdl!WorkSequence
|
||
|
def: getPlaceOfPredecessor(): petrinet!Place =
|
||
|
if self.linkType = #startToStart or self.linkType = #startToFinish then
|
||
|
petrinet!Place.allInstances()
|
||
|
->select(p | p.name = self.predecessor.name + '_started')
|
||
|
->asSequence()->first()
|
||
|
else
|
||
|
petrinet!Place.allInstances()
|
||
|
->select(p | p.name = self.predecessor.name + '_finished')
|
||
|
->asSequence()->first()
|
||
|
endif;
|
||
|
|
||
|
-- Obtenir la transition correspondant au successeur d'une WorkSequence
|
||
|
helper context simplepdl!WorkSequence
|
||
|
def: getTransitionOfSuccessor(): petrinet!Transition =
|
||
|
if self.linkType = #startToStart or self.linkType = #finishToStart then
|
||
|
petrinet!Transition.allInstances()
|
||
|
->select(t | t.name = self.successor.name + '_start')
|
||
|
->asSequence()->first()
|
||
|
else
|
||
|
petrinet!Transition.allInstances()
|
||
|
->select(t | t.name = self.successor.name + '_finish')
|
||
|
->asSequence()->first()
|
||
|
endif;
|
||
|
|
||
|
-- Obtenir la place correspondant a la Resource d'une Request
|
||
|
helper context simplepdl!Request
|
||
|
def: getPlaceOfTarget(): petrinet!Place =
|
||
|
petrinet!Place.allInstances()
|
||
|
->select(p | p.name = self.target.name + '_resource')
|
||
|
->asSequence()->first();
|
||
|
|
||
|
-- Obtenir la transition start correspondant au Requester d'une Request
|
||
|
helper context simplepdl!Request
|
||
|
def: getStartTransitionOfRequester(): petrinet!Transition =
|
||
|
petrinet!Transition.allInstances()
|
||
|
->select(t | t.name = self.requester.name + '_start')
|
||
|
->asSequence()->first();
|
||
|
|
||
|
-- Obtenir la transition finish correspondant au Requester d'une Request
|
||
|
helper context simplepdl!Request
|
||
|
def: getFinishTransitionOfRequester(): petrinet!Transition =
|
||
|
petrinet!Transition.allInstances()
|
||
|
->select(t | t.name = self.requester.name + '_finish')
|
||
|
->asSequence()->first();
|
||
|
|
||
|
|
||
|
-- Traduire un Process en un PetriNet de même nom
|
||
|
rule Process2PetriNet {
|
||
|
from p: simplepdl!Process
|
||
|
to pn: petrinet!Network (name <- p.name)
|
||
|
}
|
||
|
|
||
|
-- Traduire une WorkDefinition en un motif sur le réseau de Petri
|
||
|
rule WorkDefinition2PetriNet {
|
||
|
from wd: simplepdl!WorkDefinition
|
||
|
to
|
||
|
-- PLACES d'une WorkDefinition
|
||
|
p_idle: petrinet!Place(
|
||
|
name <- wd.name + '_idle',
|
||
|
tokens <- 1,
|
||
|
network <- wd.process),
|
||
|
p_running: petrinet!Place(
|
||
|
name <- wd.name + '_running',
|
||
|
tokens <- 0,
|
||
|
network <- wd.process),
|
||
|
p_started: petrinet!Place(
|
||
|
name <- wd.name + '_started',
|
||
|
tokens <- 0,
|
||
|
network <- wd.process),
|
||
|
p_finished: petrinet!Place(
|
||
|
name <- wd.name + '_finished',
|
||
|
tokens <- 0,
|
||
|
network <- wd.process),
|
||
|
-- TRANSITIONS d'une WorkDefinition
|
||
|
t_start: petrinet!Transition(
|
||
|
name <- wd.name + '_start',
|
||
|
network <- wd.process),
|
||
|
t_finish: petrinet!Transition(
|
||
|
name <- wd.name + '_finish',
|
||
|
network <- wd.process),
|
||
|
-- ARCS d'un WorkDefinition
|
||
|
a_idle2start: petrinet!Arc(
|
||
|
place <- p_idle,
|
||
|
transition <- t_start,
|
||
|
outgoing <- false,
|
||
|
weight <- 1),
|
||
|
a_start2running: petrinet!Arc(
|
||
|
place <- p_running,
|
||
|
transition <- t_start,
|
||
|
outgoing <- true,
|
||
|
weight <- 1),
|
||
|
a_start2started: petrinet!Arc(
|
||
|
place <- p_started,
|
||
|
transition <- t_start,
|
||
|
outgoing <- true,
|
||
|
weight <- 1),
|
||
|
a_running2finish: petrinet!Arc(
|
||
|
place <- p_running,
|
||
|
transition <- t_finish,
|
||
|
outgoing <- false,
|
||
|
weight <- 1),
|
||
|
a_finish2finished: petrinet!Arc(
|
||
|
place <- p_finished,
|
||
|
transition <- t_finish,
|
||
|
outgoing <- true,
|
||
|
weight <- 1)
|
||
|
}
|
||
|
|
||
|
-- Traduire une WorkDefinition en un motif sur le réseau de Petri
|
||
|
rule WorkSequence2PetriNet {
|
||
|
from ws: simplepdl!WorkSequence
|
||
|
to
|
||
|
-- ARCS d'une WorkSequence
|
||
|
arc1: petrinet!Arc(
|
||
|
place <- ws.getPlaceOfPredecessor(),
|
||
|
transition <- ws.getTransitionOfSuccessor(),
|
||
|
outgoing <- false,
|
||
|
weight <- 1),
|
||
|
arc2: petrinet!Arc(
|
||
|
place <- ws.getPlaceOfPredecessor(),
|
||
|
transition <- ws.getTransitionOfSuccessor(),
|
||
|
outgoing <- true,
|
||
|
weight <- 1)
|
||
|
}
|
||
|
|
||
|
-- Traduire une Resource en un motif sur le réseau de Petri
|
||
|
rule Resource2PetriNet {
|
||
|
from res: simplepdl!Resource
|
||
|
to
|
||
|
-- PLACE d'une Resource
|
||
|
place: petrinet!Place(
|
||
|
name <- res.name + '_resource',
|
||
|
tokens <- res.quantity,
|
||
|
network <- res.process)
|
||
|
}
|
||
|
|
||
|
-- Traduire une Request en un motif sur le réseau de Petri
|
||
|
rule Request2PetriNet {
|
||
|
from req: simplepdl!Request
|
||
|
to
|
||
|
-- ARCS d'une Request
|
||
|
arcs1: petrinet!Arc(
|
||
|
place <- req.getPlaceOfTarget(),
|
||
|
transition <- req.getStartTransitionOfRequester(),
|
||
|
outgoing <- false,
|
||
|
weight <- req.quantity),
|
||
|
arcs2: petrinet!Arc(
|
||
|
place <- req.getPlaceOfTarget(),
|
||
|
transition <- req.getFinishTransitionOfRequester(),
|
||
|
outgoing <- true,
|
||
|
weight <- req.quantity)
|
||
|
}
|