@xfsp< executable , 1.0 >:

// timed system< moc: and % system > ThermostatSystem {
@header:
	@ufi = sys::ThermostatSystem;
	@description = "the result of the system compilation";
	@count = 16;

@instance:
	// The Parameters Machine Instance
	timed instance< id:0, multiplicity: [ 0, 1 ] > inst::#PARAMETERS#;

	// The System Machine Instance
	timed #prototype instance< id:0, multiplicity: [ 1 ] > prot::ThermostatSystem		@start{ |;|
			{ |§|
				inst::ThermostatSystem.$time := 0;
				inst::ThermostatSystem.$delta := 0;
			}
			{ |and|
				init prot::ThermostatSystem.Thermostat;
				init prot::ThermostatSystem.Equipment;
			}
		}
;

@executable:
	timed executable< moc: and % system , id:0, instanciation: [ + ] > exec::#PARAMETERS# {
	@moe:
	}

	#prototype executable< moc: start % state , id:0, instanciation: [ * ] > exec::ThermostatSystem.Thermostat.q0 {
	@transition:
		transition< id:0 > t1 --> q0 {
		@moe:
			@run{ |;|
				input inst:Thermostat.error(inst:Thermostat.z);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q0;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#internal{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.error
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.error
			}
		}
		transition< id:1 > t2 --> q0 {
		@moe:
			@run{ |;|
				input inst:Thermostat.equip(inst:Thermostat.y);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q0;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.equip(inst:Thermostat.y);
			}
			@com#internal{
				input inst:Thermostat.equip(inst:Thermostat.y);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.equip
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.equip
			}
		}
		transition< id:2 > t3 --> q1 {
		@moe:
			@run{ |;|
				input inst:Thermostat.sens(inst:Thermostat.t);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q1;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.sens(inst:Thermostat.t);
			}
			@com#internal{
				input inst:Thermostat.sens(inst:Thermostat.t);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.sens
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.sens
			}
		}
	@moe:
		@run{ |/\|
			invoke#transition &transition:q0.t1;
			invoke#transition &transition:q0.t2;
			invoke#transition &transition:q0.t3;
		}
	}

	#prototype executable< moc: simple % state , id:1, instanciation: [ * ] > exec::ThermostatSystem.Thermostat.q1 {
	@transition:
		transition< id:0 > t11 --> q2 {
		@moe:
			@run{ |;|
				{ |§|
					guard (inst:Thermostat.t < 20);
					output inst:Thermostat.screen(0);
				}
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q2;
				}
			}
			@opcode#family = guard | output;
			@communication<final>{
				output inst:Thermostat.screen(const:mode.HEATING);
			}
			@com#internal{
				output inst:Thermostat.screen(const:mode.HEATING);
			}
			@com#output{
				inst::ThermostatSystem.Thermostat.screen
			}
		}
		transition< id:1 > t12 --> q5 {
		@moe:
			@run{ |;|
				{ |§|
					guard (inst:Thermostat.t > 25);
					output inst:Thermostat.screen(1);
				}
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q5;
				}
			}
			@opcode#family = guard | output;
			@communication<final>{
				output inst:Thermostat.screen(const:mode.COOLING);
			}
			@com#internal{
				output inst:Thermostat.screen(const:mode.COOLING);
			}
			@com#output{
				inst::ThermostatSystem.Thermostat.screen
			}
		}
		transition< id:2 > t13 --> q0 {
		@moe:
			@run{ |;|
				{ |§|
					guard ((inst:Thermostat.t >= 20) && (inst:Thermostat.t <= 25));
					output inst:Thermostat.screen(OFF);
				}
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q0;
				}
			}
			@opcode#family = guard | output;
			@communication<final>{
				output inst:Thermostat.screen(OFF);
			}
			@com#internal{
				output inst:Thermostat.screen(OFF);
			}
			@com#output{
				inst::ThermostatSystem.Thermostat.screen
			}
		}
	@moe:
		@run{ |/\|
			invoke#transition &transition:q1.t11;
			invoke#transition &transition:q1.t12;
			invoke#transition &transition:q1.t13;
		}
	}

	#prototype executable< moc: simple % state , id:2, instanciation: [ * ] > exec::ThermostatSystem.Thermostat.q2 {
	@transition:
		transition< id:0 > t21 --> q2 {
		@moe:
			@run{ |;|
				input inst:Thermostat.error(inst:Thermostat.z);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q2;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#internal{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.error
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.error
			}
		}
		transition< id:1 > t22 --> q3 {
		@moe:
			@run{ |;|
				output inst:Thermostat.dt((20 - inst:Thermostat.t));
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q3;
				}
			}
			@opcode#family = output;
			@communication<final>{
				output inst:Thermostat.dt((20 - inst:Thermostat.t));
			}
			@com#internal{
				output inst:Thermostat.dt((20 - inst:Thermostat.t));
			}
			@com#output{
				inst::ThermostatSystem.Thermostat.dt
			}
		}
	@moe:
		@run{ |/\|
			invoke#transition &transition:q2.t21;
			invoke#transition &transition:q2.t22;
		}
	}

	#prototype executable< moc: simple % state , id:3, instanciation: [ * ] > exec::ThermostatSystem.Thermostat.q3 {
	@transition:
		transition< id:0 > t31 --> q3 {
		@moe:
			@run{ |;|
				input inst:Thermostat.equip(inst:Thermostat.y);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q3;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.equip(inst:Thermostat.y);
			}
			@com#internal{
				input inst:Thermostat.equip(inst:Thermostat.y);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.equip
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.equip
			}
		}
		transition< id:1 > t32 --> q3 {
		@moe:
			@run{ |;|
				input inst:Thermostat.error(inst:Thermostat.z);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q3;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#internal{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.error
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.error
			}
		}
		transition< id:2 > t33 --> q4 {
		@moe:
			@run{ |;|
				input inst:Thermostat.sens(inst:Thermostat.t);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q4;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.sens(inst:Thermostat.t);
			}
			@com#internal{
				input inst:Thermostat.sens(inst:Thermostat.t);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.sens
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.sens
			}
		}
	@moe:
		@run{ |/\|
			invoke#transition &transition:q3.t31;
			invoke#transition &transition:q3.t32;
			invoke#transition &transition:q3.t33;
		}
	}

	#prototype executable< moc: simple % state , id:4, instanciation: [ * ] > exec::ThermostatSystem.Thermostat.q4 {
	@transition:
		transition< id:0 > t41 --> q4 {
		@moe:
			@run{ |;|
				input inst:Thermostat.equip(inst:Thermostat.y);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q4;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.equip(inst:Thermostat.y);
			}
			@com#internal{
				input inst:Thermostat.equip(inst:Thermostat.y);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.equip
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.equip
			}
		}
		transition< id:1 > t42 --> q4 {
		@moe:
			@run{ |;|
				input inst:Thermostat.error(inst:Thermostat.z);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q4;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#internal{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.error
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.error
			}
		}
		transition< id:2 > t43 --> q0 {
		@moe:
			@run{ |;|
				{ |§|
					guard (inst:Thermostat.t >= 20);
					output inst:Thermostat.dt(0);
				}
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q0;
				}
			}
			@opcode#family = guard | output;
			@communication<final>{
				output inst:Thermostat.dt(0);
			}
			@com#internal{
				output inst:Thermostat.dt(0);
			}
			@com#output{
				inst::ThermostatSystem.Thermostat.dt
			}
		}
		transition< id:3 > t44 --> q2 {
		@moe:
			@run{ |§|
				guard (inst:Thermostat.t < 20);
				disable#self;
				enable#set prot:Thermostat.q2;
			}
			@opcode#family = guard;
		}
	@moe:
		@run{ |/\|
			invoke#transition &transition:q4.t41;
			invoke#transition &transition:q4.t42;
			invoke#transition &transition:q4.t43;
			invoke#transition &transition:q4.t44;
		}
	}

	#prototype executable< moc: simple % state , id:5, instanciation: [ * ] > exec::ThermostatSystem.Thermostat.q5 {
	@transition:
		transition< id:0 > t51 --> q5 {
		@moe:
			@run{ |;|
				input inst:Thermostat.error(inst:Thermostat.z);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q5;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#internal{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.error
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.error
			}
		}
		transition< id:1 > t52 --> q6 {
		@moe:
			@run{ |;|
				output inst:Thermostat.dt((25 - inst:Thermostat.t));
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q6;
				}
			}
			@opcode#family = output;
			@communication<final>{
				output inst:Thermostat.dt((25 - inst:Thermostat.t));
			}
			@com#internal{
				output inst:Thermostat.dt((25 - inst:Thermostat.t));
			}
			@com#output{
				inst::ThermostatSystem.Thermostat.dt
			}
		}
	@moe:
		@run{ |/\|
			invoke#transition &transition:q5.t51;
			invoke#transition &transition:q5.t52;
		}
	}

	#prototype executable< moc: simple % state , id:6, instanciation: [ * ] > exec::ThermostatSystem.Thermostat.q6 {
	@transition:
		transition< id:0 > t61 --> q6 {
		@moe:
			@run{ |;|
				input inst:Thermostat.equip(inst:Thermostat.y);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q6;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.equip(inst:Thermostat.y);
			}
			@com#internal{
				input inst:Thermostat.equip(inst:Thermostat.y);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.equip
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.equip
			}
		}
		transition< id:1 > t62 --> q6 {
		@moe:
			@run{ |;|
				input inst:Thermostat.error(inst:Thermostat.z);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q6;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#internal{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.error
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.error
			}
		}
		transition< id:2 > t63 --> q7 {
		@moe:
			@run{ |;|
				input inst:Thermostat.sens(inst:Thermostat.t);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q7;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.sens(inst:Thermostat.t);
			}
			@com#internal{
				input inst:Thermostat.sens(inst:Thermostat.t);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.sens
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.sens
			}
		}
	@moe:
		@run{ |/\|
			invoke#transition &transition:q6.t61;
			invoke#transition &transition:q6.t62;
			invoke#transition &transition:q6.t63;
		}
	}

	#prototype executable< moc: simple % state , id:7, instanciation: [ * ] > exec::ThermostatSystem.Thermostat.q7 {
	@transition:
		transition< id:0 > t71 --> q7 {
		@moe:
			@run{ |;|
				input inst:Thermostat.equip(inst:Thermostat.y);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q7;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.equip(inst:Thermostat.y);
			}
			@com#internal{
				input inst:Thermostat.equip(inst:Thermostat.y);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.equip
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.equip
			}
		}
		transition< id:1 > t72 --> q7 {
		@moe:
			@run{ |;|
				input inst:Thermostat.error(inst:Thermostat.z);
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q7;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#internal{
				input inst:Thermostat.error(inst:Thermostat.z);
			}
			@com#input{
				inst::ThermostatSystem.Thermostat.error
			}
			@com#input_enabled{
				inst::ThermostatSystem.Thermostat.error
			}
		}
		transition< id:2 > t73 --> q0 {
		@moe:
			@run{ |;|
				{ |§|
					guard (inst:Thermostat.t <= 25);
					output inst:Thermostat.dt(0);
				}
				{ |§|
					disable#self;
					enable#set prot:Thermostat.q0;
				}
			}
			@opcode#family = guard | output;
			@communication<final>{
				output inst:Thermostat.dt(0);
			}
			@com#internal{
				output inst:Thermostat.dt(0);
			}
			@com#output{
				inst::ThermostatSystem.Thermostat.dt
			}
		}
		transition< id:3 > t74 --> q5 {
		@moe:
			@run{ |§|
				guard (inst:Thermostat.t > 25);
				disable#self;
				enable#set prot:Thermostat.q5;
			}
			@opcode#family = guard;
		}
	@moe:
		@run{ |/\|
			invoke#transition &transition:q7.t71;
			invoke#transition &transition:q7.t72;
			invoke#transition &transition:q7.t73;
			invoke#transition &transition:q7.t74;
		}
	}

	#prototype executable< moc: #STS % statemachine , id:8, instanciation: [ + ] > exec::ThermostatSystem.Thermostat {
	@type:
		type type::ThermostatSystem.Thermostat.mode enum {
			public static const< id:0, ptr:enum > mode const::ThermostatSystem.Thermostat.mode.HEATING 'HEATING' {
				@value = HEATING;
			}
			public static const< id:1, ptr:enum > mode const::ThermostatSystem.Thermostat.mode.COOLING 'COOLING' {
				@value = COOLING;
			}
		}
	@variable:
		const< id:0, ptr:std > integer inst::ThermostatSystem.Thermostat.TMIN 'TMIN' {
			@value = 20;
		}
		const< id:0, ptr:std > integer inst::ThermostatSystem.Thermostat.TMAX 'TMAX' {
			@value = 25;
		}

		var< id:0, ptr:std > integer inst::ThermostatSystem.Thermostat.t 't';
		var< id:1, ptr:std > integer inst::ThermostatSystem.Thermostat.y 'y';
		var< id:2, ptr:std > integer inst::ThermostatSystem.Thermostat.z 'z';
	@port:
		public port< id:0 , route:0 > input inst::ThermostatSystem.Thermostat.sens {
		@parameter:
			parameter var< id:0, ptr:std > integer $0;
		}
		public port< id:1 , route:1 > input inst::ThermostatSystem.Thermostat.equip {
		@parameter:
			parameter var< id:0, ptr:std > integer $0;
		}
		public port< id:2 , route:2 > input inst::ThermostatSystem.Thermostat.error {
		@parameter:
			parameter var< id:0, ptr:std > integer $0;
		}
		public port< id:0 , route:0 > output inst::ThermostatSystem.Thermostat.screen {
		@parameter:
			parameter var< id:0, ptr:std > integer $0;
		}
		public port< id:1 , route:1 > output inst::ThermostatSystem.Thermostat.dt {
		@parameter:
			parameter var< id:0, ptr:std > integer $0;
		}
		public port< id:2 , route:2 > output inst::ThermostatSystem.Thermostat.test {
		@parameter:
			parameter var< id:0, ptr:std > integer $0;
		}
	@router:
		router model::ThermostatSystem.Thermostat {
		@input:
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.sens {
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.equip {
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.error {
			}
		@output:
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.screen {
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.dt {
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.test {
			}
		}

	@router#model:
		router model::ThermostatSystem.Thermostat {
		@input:
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.sens {
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.equip {
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.error {
			}
		@output:
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.screen {
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.dt {
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.test {
			}
		}

	@model:
		#model instance< id:0, multiplicity: [ 1 ], this > model::ThermostatSystem.Thermostat.$this;
	@instance:
		#static instance< id:0, multiplicity: [ 1 ], this > &exec::ThermostatSystem.Thermostat prot::ThermostatSystem.Thermostat.$this {
			//@model = model::ThermostatSystem.Thermostat.$this;
		}
		#prototype instance< id:1, multiplicity: [ + ] > prot::ThermostatSystem.Thermostat.q0;
		#prototype instance< id:2, multiplicity: [ + ] > prot::ThermostatSystem.Thermostat.q1;
		#prototype instance< id:3, multiplicity: [ + ] > prot::ThermostatSystem.Thermostat.q2;
		#prototype instance< id:4, multiplicity: [ + ] > prot::ThermostatSystem.Thermostat.q3;
		#prototype instance< id:5, multiplicity: [ + ] > prot::ThermostatSystem.Thermostat.q4;
		#prototype instance< id:6, multiplicity: [ + ] > prot::ThermostatSystem.Thermostat.q5;
		#prototype instance< id:7, multiplicity: [ + ] > prot::ThermostatSystem.Thermostat.q6;
		#prototype instance< id:8, multiplicity: [ + ] > prot::ThermostatSystem.Thermostat.q7;
	@moe:
		@init{
			init prot:Thermostat.q0;
		}
		@enable{
			comment "nop<enable> exec::ThermostatSystem.Thermostat.q0";
		}
		@disable{ |§|
			disable#child;
			disable#self;
		}
		@run{
			schedule const::self;
		}
		@schedule{
			run prot:Thermostat.q0;
		}
	}

	#prototype executable< moc: start % state , id:9, instanciation: [ * ] > exec::ThermostatSystem.Equipment.s0 {
	@transition:
		transition< id:0 > e1 --> s1 {
		@moe:
			@run{ |;|
				input inst:Equipment.dt(inst:Equipment.x);
				{ |§|
					inst:Equipment.c := 0;
					disable#self;
					enable#set prot:Equipment.s1;
				}
			}
			@opcode#family = basic | input;
			@communication<final>{
				input inst:Equipment.dt(inst:Equipment.x);
			}
			@com#internal{
				input inst:Equipment.dt(inst:Equipment.x);
			}
			@com#input{
				inst::ThermostatSystem.Equipment.dt
			}
			@com#input_enabled{
				inst::ThermostatSystem.Equipment.dt
			}
		}
	@moe:
		@run{
			invoke#transition &transition:s0.e1;
		}
	}

	#prototype executable< moc: simple % state , id:10, instanciation: [ * ] > exec::ThermostatSystem.Equipment.s1 {
	@transition:
		transition< id:0 > e11 --> s0 {
		@moe:
			@run{ |;|
				{ |§|
					guard (inst:Equipment.x == 0);
					inst:Equipment.x := 0;
					tguard (inst:Equipment.c <= 2);
					inst:Equipment.c := 0;
					output inst:Equipment.equip(0);
				}
				{ |§|
					inst:Equipment.isOn := false;
					disable#self;
					enable#set prot:Equipment.s0;
				}
			}
			@opcode#family = basic | guard | output;
			@communication<final>{
				output inst:Equipment.equip(0);
			}
			@com#internal{
				output inst:Equipment.equip(0);
			}
			@com#output{
				inst::ThermostatSystem.Equipment.equip
			}
		}
		transition< id:1 > e12 --> s2 {
		@moe:
			@run{ |§|
				guard (inst:Equipment.x > 0);
				tguard (inst:Equipment.c <= 2);
				inst:Equipment.c := 0;
				inst:Equipment.isOn := true;
				disable#self;
				enable#set prot:Equipment.s2;
			}
			@opcode#family = basic | guard;
		}
		transition< id:2 > e13 --> s4 {
		@moe:
			@run{ |;|
				{ |§|
					tguard (inst:Equipment.c > 2);
					output inst:Equipment.error(0);
				}
				{ |§|
					disable#self;
					enable#set prot:Equipment.s4;
				}
			}
			@opcode#family = guard | output;
			@communication<final>{
				output inst:Equipment.error(0);
			}
			@com#internal{
				output inst:Equipment.error(0);
			}
			@com#output{
				inst::ThermostatSystem.Equipment.error
			}
		}
		transition< id:3 > e14 --> s3 {
		@moe:
			@run{ |§|
				guard (inst:Equipment.x < 0);
				tguard (inst:Equipment.c <= 2);
				inst:Equipment.c := 0;
				inst:Equipment.isOn := true;
				disable#self;
				enable#set prot:Equipment.s3;
			}
			@opcode#family = basic | guard;
		}
	@moe:
		@run{ |/\|
			invoke#transition &transition:s1.e11;
			invoke#transition &transition:s1.e12;
			invoke#transition &transition:s1.e13;
			invoke#transition &transition:s1.e14;
		}
	}

	#prototype executable< moc: simple % state , id:11, instanciation: [ * ] > exec::ThermostatSystem.Equipment.s2 {
	@transition:
		transition< id:0 > e21 --> s0 {
		@moe:
			@run{ |§|
				disable#self;
				enable#set prot:Equipment.s0;
			}
		}
		transition< id:1 > e22 --> s2 {
		@moe:
			@run{ |;|
				{ |§|
					guard (inst:Equipment.x > 0);
					tguard (inst:Equipment.c <= 1);
					inst:Equipment.c := 0;
					output inst:Equipment.equip(4);
				}
				{ |§|
					inst:Equipment.x := (inst:Equipment.x - 4);
					disable#self;
					enable#set prot:Equipment.s2;
				}
			}
			@opcode#family = basic | guard | output;
			@communication<final>{
				output inst:Equipment.equip(4);
			}
			@com#internal{
				output inst:Equipment.equip(4);
			}
			@com#output{
				inst::ThermostatSystem.Equipment.equip
			}
		}
		transition< id:2 > e23 --> s4 {
		@moe:
			@run{ |;|
				{ |§|
					tguard (inst:Equipment.c > 1);
					output inst:Equipment.error(0);
				}
				{ |§|
					disable#self;
					enable#set prot:Equipment.s4;
				}
			}
			@opcode#family = guard | output;
			@communication<final>{
				output inst:Equipment.error(0);
			}
			@com#internal{
				output inst:Equipment.error(0);
			}
			@com#output{
				inst::ThermostatSystem.Equipment.error
			}
		}
	@moe:
		@run{ |/\|
			invoke#transition &transition:s2.e21;
			invoke#transition &transition:s2.e22;
			invoke#transition &transition:s2.e23;
		}
	}

	#prototype executable< moc: simple % state , id:12, instanciation: [ * ] > exec::ThermostatSystem.Equipment.s3 {
	@transition:
		transition< id:0 > e31 --> s0 {
		@moe:
			@run{ |§|
				disable#self;
				enable#set prot:Equipment.s0;
			}
		}
		transition< id:1 > e32 --> s3 {
		@moe:
			@run{ |;|
				{ |§|
					guard (inst:Equipment.x < 0);
					tguard (inst:Equipment.c <= 1);
					inst:Equipment.c := 0;
					output inst:Equipment.equip(-4);
				}
				{ |§|
					inst:Equipment.x := (inst:Equipment.x + 4);
					disable#self;
					enable#set prot:Equipment.s3;
				}
			}
			@opcode#family = basic | guard | output;
			@communication<final>{
				output inst:Equipment.equip(-4);
			}
			@com#internal{
				output inst:Equipment.equip(-4);
			}
			@com#output{
				inst::ThermostatSystem.Equipment.equip
			}
		}
		transition< id:2 > e33 --> s4 {
		@moe:
			@run{ |;|
				{ |§|
					tguard (inst:Equipment.c > 1);
					output inst:Equipment.error(0);
				}
				{ |§|
					disable#self;
					enable#set prot:Equipment.s4;
				}
			}
			@opcode#family = guard | output;
			@communication<final>{
				output inst:Equipment.error(0);
			}
			@com#internal{
				output inst:Equipment.error(0);
			}
			@com#output{
				inst::ThermostatSystem.Equipment.error
			}
		}
	@moe:
		@run{ |/\|
			invoke#transition &transition:s3.e31;
			invoke#transition &transition:s3.e32;
			invoke#transition &transition:s3.e33;
		}
	}

	#prototype executable< moc: simple % state , id:13, instanciation: [ * ] > exec::ThermostatSystem.Equipment.s4 {
	@transition:
		transition< id:0 > e41 --> s4 {
		@moe:
			@run{ |;|
				input inst:Equipment.dt(inst:Equipment.x);
				{ |§|
					disable#self;
					enable#set prot:Equipment.s4;
				}
			}
			@opcode#family = input;
			@communication<final>{
				input inst:Equipment.dt(inst:Equipment.x);
			}
			@com#internal{
				input inst:Equipment.dt(inst:Equipment.x);
			}
			@com#input{
				inst::ThermostatSystem.Equipment.dt
			}
			@com#input_enabled{
				inst::ThermostatSystem.Equipment.dt
			}
		}
	@moe:
		@run{
			invoke#transition &transition:s4.e41;
		}
	}

	#prototype executable< moc: #STS % statemachine , id:14, instanciation: [ + ] > exec::ThermostatSystem.Equipment {
	@variable:
		public const< id:3, ptr:std > integer inst::ThermostatSystem.Equipment.TIMEOUT 'TIMEOUT' {
			@value = 0;
		}

		var< id:0, ptr:std > integer inst::ThermostatSystem.Equipment.x 'x';
		var< id:1, ptr:std > boolean inst::ThermostatSystem.Equipment.isOn 'isOn';
		public volatile var< id:2, ptr:std > clock< integer > inst::ThermostatSystem.Equipment.c 'c' {
			@value = 0;
		}
	@port:
		public port< id:0 , route:0 > input inst::ThermostatSystem.Equipment.dt {
		@parameter:
			parameter var< id:0, ptr:std > integer $0;
		}
		public port< id:0 , route:0 > output inst::ThermostatSystem.Equipment.equip {
		@parameter:
			parameter var< id:0, ptr:std > integer $0;
		}
		public port< id:1 , route:1 > output inst::ThermostatSystem.Equipment.error {
		@parameter:
			parameter var< id:0, ptr:std > integer $0;
		}
	@router:
		router model::ThermostatSystem.Equipment {
		@input:
			routing< env , mid:0 > model::ThermostatSystem.Equipment->inst::ThermostatSystem.Equipment.dt {
			}
		@output:
			routing< env , mid:0 > model::ThermostatSystem.Equipment->inst::ThermostatSystem.Equipment.equip {
			}
			routing< env , mid:0 > model::ThermostatSystem.Equipment->inst::ThermostatSystem.Equipment.error {
			}
		}

	@router#model:
		router model::ThermostatSystem.Equipment {
		@input:
			routing< env , mid:0 > model::ThermostatSystem.Equipment->inst::ThermostatSystem.Equipment.dt {
			}
		@output:
			routing< env , mid:0 > model::ThermostatSystem.Equipment->inst::ThermostatSystem.Equipment.equip {
			}
			routing< env , mid:0 > model::ThermostatSystem.Equipment->inst::ThermostatSystem.Equipment.error {
			}
		}

	@model:
		#model instance< id:0, multiplicity: [ 1 ], this > model::ThermostatSystem.Equipment.$this;
	@instance:
		#static instance< id:0, multiplicity: [ 1 ], this > &exec::ThermostatSystem.Equipment prot::ThermostatSystem.Equipment.$this {
			//@model = model::ThermostatSystem.Equipment.$this;
		}
		#prototype instance< id:1, multiplicity: [ + ] > prot::ThermostatSystem.Equipment.s0;
		#prototype instance< id:2, multiplicity: [ + ] > prot::ThermostatSystem.Equipment.s1;
		#prototype instance< id:3, multiplicity: [ + ] > prot::ThermostatSystem.Equipment.s2;
		#prototype instance< id:4, multiplicity: [ + ] > prot::ThermostatSystem.Equipment.s3;
		#prototype instance< id:5, multiplicity: [ + ] > prot::ThermostatSystem.Equipment.s4;
	@moe:
		@create{
			inst:Equipment.c := 0;
		}
		@init{
			init prot:Equipment.s0;
		}
		@enable{
			comment "nop<enable> exec::ThermostatSystem.Equipment.s0";
		}
		@disable{ |§|
			disable#child;
			disable#self;
		}
		@run{
			schedule const::self;
		}
		@schedule{
			run prot:Equipment.s0;
		}
	}

	timed executable< moc: and % system , id:15, instanciation: [ + ] > exec::ThermostatSystem {
	@variable:
		var< id:0, ptr:std > time< uinteger > inst::ThermostatSystem.$time '$time';
		unsafe var< id:1, ptr:std > time< uinteger > inst::ThermostatSystem.$delta '$delta';
	@alias:
		public volatile var< id:2, ptr:std > clock< integer > alias::ThermostatSystem.Equipment.c 'c' {
			@target = public volatile var< id:2, ptr:std > clock< integer > inst::ThermostatSystem.Equipment.c;
			@value = 0;
		@path#machine:
			prot::ThermostatSystem.Equipment
		}
	@connection:/* < exec::ThermostatSystem > */
		connector< id:0 , mid:1 , env > inst::ThermostatSystem._#connector#0 {
			output Thermostat->screen;
			input Thermostat->sens;
		}
		connector< id:1 , mid:2 , rdv , unicast > inst::ThermostatSystem._#connector#1 {
			output Thermostat->dt;
			input Equipment->dt;
		}
		connector< id:2 , mid:3 , rdv , unicast > inst::ThermostatSystem._#connector#2 {
			output Equipment->error;
			input Thermostat->error;
		}
		connector< id:3 , mid:4 , rdv , unicast > inst::ThermostatSystem._#connector#3 {
			output Equipment->equip;
			input Thermostat->equip;
		}

		@rdv_communication = true;

	@router:
		router inst::ThermostatSystem.$this< exec::ThermostatSystem > {
		}

		router prot::ThermostatSystem.Thermostat {
		@input:
			routing< env , mid:1 > prot::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.sens {
				@connector = inst::ThermostatSystem._#connector#0;
			}
			routing< rdv , mid:4 > prot::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.equip {
				@connector = inst::ThermostatSystem._#connector#3;
			}
			routing< rdv , mid:3 > prot::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.error {
				@connector = inst::ThermostatSystem._#connector#2;
			}
		@output:
			routing< env , mid:1 > prot::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.screen {
				@connector = inst::ThermostatSystem._#connector#0;
			}
			routing< rdv , mid:2 > prot::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.dt {
				@connector = inst::ThermostatSystem._#connector#1;
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.test {
			}
		}

		router prot::ThermostatSystem.Equipment {
		@input:
			routing< rdv , mid:2 > prot::ThermostatSystem.Equipment->inst::ThermostatSystem.Equipment.dt {
				@connector = inst::ThermostatSystem._#connector#1;
			}
		@output:
			routing< rdv , mid:4 > prot::ThermostatSystem.Equipment->inst::ThermostatSystem.Equipment.equip {
				@connector = inst::ThermostatSystem._#connector#3;
			}
			routing< rdv , mid:3 > prot::ThermostatSystem.Equipment->inst::ThermostatSystem.Equipment.error {
				@connector = inst::ThermostatSystem._#connector#2;
			}
		}

	@router#model:
		router inst::ThermostatSystem.$this< exec::ThermostatSystem > {
		}

		router model::ThermostatSystem.Thermostat {
		@input:
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.sens {
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.equip {
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.error {
			}
		@output:
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.screen {
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.dt {
			}
			routing< env , mid:0 > model::ThermostatSystem.Thermostat->inst::ThermostatSystem.Thermostat.test {
			}
		}

		router model::ThermostatSystem.Equipment {
		@input:
			routing< env , mid:0 > model::ThermostatSystem.Equipment->inst::ThermostatSystem.Equipment.dt {
			}
		@output:
			routing< env , mid:0 > model::ThermostatSystem.Equipment->inst::ThermostatSystem.Equipment.equip {
			}
			routing< env , mid:0 > model::ThermostatSystem.Equipment->inst::ThermostatSystem.Equipment.error {
			}
		}

	@model:
		timed #model instance< id:0, multiplicity: [ 1 ], this > model::ThermostatSystem.$this;
		#model instance< id:1, multiplicity: [ + ] > model::ThermostatSystem.Thermostat;
		#model instance< id:2, multiplicity: [ + ] > model::ThermostatSystem.Equipment;
	@instance:
		timed #static instance< id:0, multiplicity: [ 1 ], this > &exec::ThermostatSystem inst::ThermostatSystem.$this {
			//@model = model::ThermostatSystem.$this;
		}
		#prototype instance< id:1, multiplicity: [ + ] > prot::ThermostatSystem.Thermostat {
			//@model = model::ThermostatSystem.Thermostat;
		}
		#prototype instance< id:2, multiplicity: [ + ] > prot::ThermostatSystem.Equipment {
			//@model = model::ThermostatSystem.Equipment;
			@create{
				inst:Equipment.c := 0;
			}
		}
	@program:
		macro routine< id:0 > routine::ThermostatSystem.clock#reset {
		@parameter:
			transient parameter var< id:0, ptr:std > clock< uinteger > inst::ThermostatSystem.clock#reset._c_ '_c_';
		@moe:
			@run{
				inst:clock#reset._c_ := 0;
			 }
		@opcode#family = basic;
		}

		macro routine< id:1 > routine::ThermostatSystem.clock#update {
		@parameter:
			transient parameter var< id:0, ptr:std > clock< uinteger > inst::ThermostatSystem.clock#update._c_ '_c_';
		@moe:
			@run{
				inst:clock#update._c_ := (inst:clock#update._c_ + inst::ThermostatSystem.$delta);
			 }
		@opcode#family = basic;
		}

	@moe:
		@init{ |;|
			{ |§|
				inst::ThermostatSystem.$time := 0;
				inst::ThermostatSystem.$delta := 0;
			}
			{ |and|
				init prot::ThermostatSystem.Thermostat;
				init prot::ThermostatSystem.Equipment;
			}
		}
		@start{ |;|
			{ |§|
				inst::ThermostatSystem.$time := 0;
				inst::ThermostatSystem.$delta := 0;
			}
			{ |and|
				init prot::ThermostatSystem.Thermostat;
				init prot::ThermostatSystem.Equipment;
			}
		}
		@enable{ |and|
			enable prot::ThermostatSystem.Thermostat;
			enable prot::ThermostatSystem.Equipment;
		}
		@disable{ |and|
			disable prot::ThermostatSystem.Thermostat;
			disable prot::ThermostatSystem.Equipment;
		}
		@abort{ |and|
			abort#set prot::ThermostatSystem.Thermostat;
			abort#set prot::ThermostatSystem.Equipment;
		}
		@irun{ |§|
			newfresh(inst::ThermostatSystem.$delta)
			tguard (inst::ThermostatSystem.$delta > 0);
			inst::ThermostatSystem.$time := (inst::ThermostatSystem.$time + inst::ThermostatSystem.$delta);
			alias:Equipment.c := (alias:Equipment.c + inst::ThermostatSystem.$delta);
		}
		@run{ |/;|
			{ |§|
				newfresh(inst::ThermostatSystem.$delta)
				tguard (inst::ThermostatSystem.$delta > 0);
				inst::ThermostatSystem.$time := (inst::ThermostatSystem.$time + inst::ThermostatSystem.$delta);
				alias:Equipment.c := (alias:Equipment.c + inst::ThermostatSystem.$delta);
			}
			schedule const::self;
		}
		@schedule<final>{ ||i||
			run prot::ThermostatSystem.Thermostat;
			run prot::ThermostatSystem.Equipment;
		}
		@concurrency{ |i| }
	}

// }
