-- Short Transformation Sequences -- see http://www.cs.bme.hu/~gervarro/publication/TUB-TR-05-EE17.pdf -- $Id$ module STSWithTiming; metamodel TRACE : 'http://www.eclipse.org/m2m/atl/emftvm/2011/Trace'; metamodel Mutex : 'http://soft.vub.ac.be/simplegt/2011/MutexA'; metamodel "#native"; transform M : Mutex, T : TRACE; context Mutex!Process def : reqCount : Integer = 10; static def : processes : Sequence(Mutex!Process) = Mutex!Process.allInstancesFrom('M'); static def : currentTime() : String = "#native"!"java::lang::System"::currentTimeMillis().toString(); context OclAny def : timing : Sequence(String) = Sequence{}; unique rule endPhase0 { to s : TRACE!TraceLinkSet (timing =~ Env::currentTime()."debug"('endPhase0')) } ---------- PHASE 1 ---------- abstract rule phase1 { not t : TRACE!TraceLink in T (timing =~ t.timing) } rule newRule extends phase1 { from p : Mutex!Process in M (next =~ p2), p2 : Mutex!Process in M not p : Mutex!Process in M (reqCount =~ Env::processes->size()) to p : Mutex!Process (next =~ p1), p1 : Mutex!Process (next =~ p2), p2 : Mutex!Process } rule mountRule extends phase1 { from p : Mutex!Process in M not r : Mutex!Resource in M to p : Mutex!Process, r : Mutex!Resource (token =~ p) } rule endPhase1 extends mountRule { to t : TRACE!TraceLink (timing =~ Env::currentTime()."debug"('endPhase1')) } ---------- PHASE 2 ---------- abstract rule phase2 { from t : TRACE!TraceLink in T not s : TRACE!SourceElement in T to t : TRACE!TraceLink in T } unique rule requestRule extends phase2 { from p : Mutex!Process in M, r : Mutex!Resource in M not p : Mutex!Process in M (request =~ m), m : Mutex!Resource in M not r : Mutex!Resource in M (held_by =~ p) to p : Mutex!Process (request =~ r), r : Mutex!Resource } rule endPhase2 extends phase2 { to s : TRACE!SourceElement (timing =~ Env::currentTime()."debug"('endPhase2')) } ---------- PHASE 3 ---------- abstract rule phase3 { from s : TRACE!SourceElement in T, r : Mutex!Resource in M to s : TRACE!SourceElement, r : Mutex!Resource } rule takeRule extends phase3 { from r : Mutex!Resource in M (token =~ p), p : Mutex!Process in M (request =~ r) to r : Mutex!Resource (held_by =~ p), p : Mutex!Process } rule releaseRule extends phase3 { from r : Mutex!Resource in M (held_by =~ p), p : Mutex!Process in M not p : Mutex!Process in M (request =~ m), m : Mutex!Resource in M to r : Mutex!Resource (release =~ p), p : Mutex!Process } rule giveRule extends phase3 { from r : Mutex!Resource in M (release =~ p1), p1 : Mutex!Process in M (next =~ p2), p2 : Mutex!Process in M to r : Mutex!Resource (token =~ p2), p1 : Mutex!Process (next =~ p2), p2 : Mutex!Process } unique rule endPhase3 extends phase3 { to s : TRACE!SourceElement (timing =~ Env::currentTime()."debug"('endPhase3')) }