module AVT(RUNNING process running) { process = { int avt; /* actual virtual time */ int mcu_advance; /* 100 / weight */ } int min_avt = 0; bool inherit_avt = false; handler (event e) { On system.clocktick { /* compute the new avt */ running.avt += running.mcu_advance; next(); } On process.new { if (srcOnSched()) { e.target.mcu_advance = e.source.mcu_advance; inherit_avt = true; e.target.avt = e.source.avt; } else { e.target.mcu_advance = 100/10; /* 10 = default weight */ e.target.avt = 0; } next(); inherit_avt = false; } } interface = { void attach (requires process p, int weight) { p.mcu_advance = 100/weight; p.avt = 0; next(); } } transition (process p) = { After NOWHERE,BLOCKED => READY { if (!inherit_avt) { foreach(p in running, READY) { min_avt = p.avt; break; } foreach(p in running, READY) { if (p.avt < min_avt) { min_avt = p.avt; } } if (p.avt < min_avt) { p.avt = min_avt; } } } } }