Browse Source

Updated model to make it compilable

Yentl Van Tendeloo 7 years ago
parent
commit
eef98b85c4

+ 4 - 2
models/cbd_merge.alc

@@ -1,6 +1,7 @@
 include "primitives.alh"
 include "primitives.alh"
 include "modelling.alh"
 include "modelling.alh"
 include "object_operations.alh"
 include "object_operations.alh"
+include "conformance_scd.alh"
 
 
 String function map_P2F(model : Element, name : String):
 String function map_P2F(model : Element, name : String):
 	return readAssociationDestination(model, set_pop(allAssociationDestinations(model, name, "P2F_block")))!
 	return readAssociationDestination(model, set_pop(allAssociationDestinations(model, name, "P2F_block")))!
@@ -9,6 +10,7 @@ Boolean function main(model : Element):
 	Element all_blocks
 	Element all_blocks
 	String element_name
 	String element_name
 	Float current_time
 	Float current_time
+	String time_block
 
 
 	all_blocks = allInstances(model, "PartialRuntime/Block")
 	all_blocks = allInstances(model, "PartialRuntime/Block")
 	while (set_len(all_blocks) > 0):
 	while (set_len(all_blocks) > 0):
@@ -19,11 +21,11 @@ Boolean function main(model : Element):
                 instantiate_attribute(model, element_name, "last_in", read_attribute(model, map_P2F(model, element_name), "last_in"))
                 instantiate_attribute(model, element_name, "last_in", read_attribute(model, map_P2F(model, element_name), "last_in"))
             if (is_nominal_instance(model, element_name, "IntegratorBlock")):
             if (is_nominal_instance(model, element_name, "IntegratorBlock")):
                 instantiate_attribute(model, element_name, "last_out", read_attribute(model, map_P2F(model, element_name), "last_out"))
                 instantiate_attribute(model, element_name, "last_out", read_attribute(model, map_P2F(model, element_name), "last_out"))
-            instantiate_attribute(model, element_name, "signal", read_attribute(model, map_P2F(model, element_name)))
+            instantiate_attribute(model, element_name, "signal", read_attribute(model, map_P2F(model, element_name), "signal"))
 		else:
 		else:
 			// Element doesn't exist, so initialize with 0.0
 			// Element doesn't exist, so initialize with 0.0
             instantiate_attribute(model, element_name, "signal", 0.0)
             instantiate_attribute(model, element_name, "signal", 0.0)
-			instantiate_edge(model, "P2F_block", "", element_name, element_name)
+			instantiate_link(model, "P2F_block", "", element_name, element_name)
 
 
 	if (set_len(allInstances(model, "FullRuntime/Time")) > 0):
 	if (set_len(allInstances(model, "FullRuntime/Time")) > 0):
 		// Time already exists, so copy the value
 		// Time already exists, so copy the value

+ 5 - 0
models/cbd_restartSim.alc

@@ -0,0 +1,5 @@
+include "primitives.alh"
+
+Boolean function main(model : Element):
+	log("Restarting simulator (TODO")
+	return True!

+ 27 - 31
models/cbd_simulate.alc

@@ -92,7 +92,7 @@ Void function strongconnect(v : String, values : Element):
 
 
 	dict_overwrite(values["indices"], v, values["index"])
 	dict_overwrite(values["indices"], v, values["index"])
 	dict_overwrite(values["lowlink"], v, values["index"])
 	dict_overwrite(values["lowlink"], v, values["index"])
-	dict_overwrite(values, "index", cast_s2i(cast_v2s(values["index"])) + 1)
+	dict_overwrite(values, "index", cast_integer(values["index"]) + 1)
 
 
 	list_append(values["S"], v)
 	list_append(values["S"], v)
 	dict_overwrite(values["onStack"], v, True)
 	dict_overwrite(values["onStack"], v, True)
@@ -207,10 +207,10 @@ Boolean function solve_scc(model : Element, scc : Element):
 			else:
 			else:
 				// A constant, which we can assume is already computed and thus usable
 				// A constant, which we can assume is already computed and thus usable
 				if (blocktype == "AdditionBlock"):
 				if (blocktype == "AdditionBlock"):
-					constant = constant + v2f(read_attribute(model, selected, "signal"))
+					constant = constant + cast_float(read_attribute(model, selected, "signal"))
 					dict_overwrite(m[i], read_nr_out(scc), constant)
 					dict_overwrite(m[i], read_nr_out(scc), constant)
 				elif (blocktype == "MultiplyBlock"):
 				elif (blocktype == "MultiplyBlock"):
-					constant = constant * v2f(read_attribute(model, selected, "signal"))
+					constant = constant * cast_float(read_attribute(model, selected, "signal"))
 					// Not written to constant part, as multiplies a variable
 					// Not written to constant part, as multiplies a variable
 
 
 				// Any other block is impossible:
 				// Any other block is impossible:
@@ -238,7 +238,7 @@ Boolean function solve_scc(model : Element, scc : Element):
 		block = scc[i]
 		block = scc[i]
 		unset_attribute(model, block, "signal")
 		unset_attribute(model, block, "signal")
 		instantiate_attribute(model, block, "signal", m[i][read_nr_out(scc)])
 		instantiate_attribute(model, block, "signal", m[i][read_nr_out(scc)])
-		log((("Solved " + block) + " to ") + cast_v2s(m[i][read_nr_out(scc)]))
+		log((("Solved " + block) + " to ") + cast_string(m[i][read_nr_out(scc)]))
 		i = i + 1
 		i = i + 1
 
 
 	return True!
 	return True!
@@ -270,7 +270,7 @@ Void function step_simulation(model : Element, schedule : Element):
 	delta_t = 0.1
 	delta_t = 0.1
 
 
 	memory_blocks = create_node()
 	memory_blocks = create_node()
-	output("SIM_TIME " + cast_v2s(read_attribute(model, time, "current_time")))
+	output("SIM_TIME " + cast_string(read_attribute(model, time, "current_time")))
 	i = 0
 	i = 0
 	while (i < read_nr_out(schedule)):
 	while (i < read_nr_out(schedule)):
 		scc = list_read(schedule, i)
 		scc = list_read(schedule, i)
@@ -293,25 +293,25 @@ Void function step_simulation(model : Element, schedule : Element):
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				while (read_nr_out(incoming) > 0):
 				while (read_nr_out(incoming) > 0):
 					selected = readAssociationSource(model, set_pop(incoming))
 					selected = readAssociationSource(model, set_pop(incoming))
-					signal = signal + cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+					signal = signal + cast_float(read_attribute(model, selected, "signal"))
 			elif (blocktype == "MultiplyBlock"):
 			elif (blocktype == "MultiplyBlock"):
 				signal = 1.0
 				signal = 1.0
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				while (read_nr_out(incoming) > 0):
 				while (read_nr_out(incoming) > 0):
 					selected = readAssociationSource(model, set_pop(incoming))
 					selected = readAssociationSource(model, set_pop(incoming))
-					signal = signal * cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+					signal = signal * cast_float(read_attribute(model, selected, "signal"))
 			elif (blocktype == "NegatorBlock"):
 			elif (blocktype == "NegatorBlock"):
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				signal = 0.0
 				signal = 0.0
 				while (read_nr_out(incoming) > 0):
 				while (read_nr_out(incoming) > 0):
 					selected = readAssociationSource(model, set_pop(incoming))
 					selected = readAssociationSource(model, set_pop(incoming))
-					signal = float_neg(cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))))
+					signal = float_neg(cast_float(read_attribute(model, selected, "signal")))
 			elif (blocktype == "InverseBlock"):
 			elif (blocktype == "InverseBlock"):
 				signal = 0.0
 				signal = 0.0
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				while (read_nr_out(incoming) > 0):
 				while (read_nr_out(incoming) > 0):
 					selected = readAssociationSource(model, set_pop(incoming))
 					selected = readAssociationSource(model, set_pop(incoming))
-					signal = float_division(1.0, cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))))
+					signal = float_division(1.0, cast_float(read_attribute(model, selected, "signal")))
 			elif (blocktype == "DelayBlock"):
 			elif (blocktype == "DelayBlock"):
 				signal = 0.0
 				signal = 0.0
 				if (element_eq(read_attribute(model, block, "last_in"), read_root())):
 				if (element_eq(read_attribute(model, block, "last_in"), read_root())):
@@ -319,7 +319,7 @@ Void function step_simulation(model : Element, schedule : Element):
 					incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
 					incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
 					while (read_nr_out(incoming) > 0):
 					while (read_nr_out(incoming) > 0):
 						selected = readAssociationSource(model, set_pop(incoming))
 						selected = readAssociationSource(model, set_pop(incoming))
-						signal = cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+						signal = cast_float(read_attribute(model, selected, "signal"))
 				else:
 				else:
 					signal = read_attribute(model, block, "last_in")
 					signal = read_attribute(model, block, "last_in")
 					unset_attribute(model, block, "last_in")
 					unset_attribute(model, block, "last_in")
@@ -330,9 +330,9 @@ Void function step_simulation(model : Element, schedule : Element):
 					incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
 					incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
 					while (read_nr_out(incoming) > 0):
 					while (read_nr_out(incoming) > 0):
 						selected = readAssociationSource(model, set_pop(incoming))
 						selected = readAssociationSource(model, set_pop(incoming))
-						signal = cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+						signal = cast_float(read_attribute(model, selected, "signal"))
 				else:
 				else:
-					signal = cast_s2f(cast_v2s(read_attribute(model, block, "last_in"))) + (delta_t * cast_s2f(cast_v2s(read_attribute(model, block, "last_out"))))
+					signal = cast_float(read_attribute(model, block, "last_in")) + (delta_t * cast_float(read_attribute(model, block, "last_out")))
 					unset_attribute(model, block, "last_in")
 					unset_attribute(model, block, "last_in")
 					unset_attribute(model, block, "last_out")
 					unset_attribute(model, block, "last_out")
 				instantiate_attribute(model, block, "last_out", signal)
 				instantiate_attribute(model, block, "last_out", signal)
@@ -343,20 +343,20 @@ Void function step_simulation(model : Element, schedule : Element):
 					incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
 					incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
 					while (read_nr_out(incoming) > 0):
 					while (read_nr_out(incoming) > 0):
 						selected = readAssociationSource(model, set_pop(incoming))
 						selected = readAssociationSource(model, set_pop(incoming))
-						signal = cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+						signal = cast_float(read_attribute(model, selected, "signal"))
 				else:
 				else:
 					incoming = allIncomingAssociationInstances(model, block, "Link")
 					incoming = allIncomingAssociationInstances(model, block, "Link")
 					while (read_nr_out(incoming) > 0):
 					while (read_nr_out(incoming) > 0):
 						selected = readAssociationSource(model, set_pop(incoming))
 						selected = readAssociationSource(model, set_pop(incoming))
-						signal = (cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))) - cast_s2f(cast_v2s(read_attribute(model, block, "last_in")))) / delta_t
+						signal = (cast_float(read_attribute(model, selected, "signal")) - cast_float(read_attribute(model, block, "last_in"))) / delta_t
 					unset_attribute(model, block, "last_in")
 					unset_attribute(model, block, "last_in")
 				set_add(memory_blocks, block)
 				set_add(memory_blocks, block)
 			elif (blocktype == "ProbeBlock"):
 			elif (blocktype == "ProbeBlock"):
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				while (read_nr_out(incoming) > 0):
 				while (read_nr_out(incoming) > 0):
 					selected = readAssociationSource(model, set_pop(incoming))
 					selected = readAssociationSource(model, set_pop(incoming))
-					signal = cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
-					output((("SIM_PROBE " + cast_v2s(read_attribute(model, block, "name"))) + " ") + cast_v2s(signal))
+					signal = cast_float(read_attribute(model, selected, "signal"))
+					output((("SIM_PROBE " + cast_string(read_attribute(model, block, "name"))) + " ") + cast_string(signal))
 
 
 			unset_attribute(model, block, "signal")
 			unset_attribute(model, block, "signal")
 			instantiate_attribute(model, block, "signal", signal)
 			instantiate_attribute(model, block, "signal", signal)
@@ -368,19 +368,16 @@ Void function step_simulation(model : Element, schedule : Element):
 		incoming = allIncomingAssociationInstances(model, block, "Link")
 		incoming = allIncomingAssociationInstances(model, block, "Link")
 		while (read_nr_out(incoming) > 0):
 		while (read_nr_out(incoming) > 0):
 			selected = readAssociationSource(model, set_pop(incoming))
 			selected = readAssociationSource(model, set_pop(incoming))
-			instantiate_attribute(model, block, "last_in", cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))))
+			instantiate_attribute(model, block, "last_in", cast_float(read_attribute(model, selected, "signal")))
 
 
 	// Increase simulation time
 	// Increase simulation time
 	Float new_time
 	Float new_time
-	new_time = cast_s2f(cast_v2s(read_attribute(model, time, "current_time"))) + delta_t
+	new_time = cast_float(read_attribute(model, time, "current_time")) + delta_t
 	unset_attribute(model, time, "current_time")
 	unset_attribute(model, time, "current_time")
 	instantiate_attribute(model, time, "current_time", new_time)
 	instantiate_attribute(model, time, "current_time", new_time)
 
 
 	return !
 	return !
 
 
-Float function v2f(i : Element):
-	return cast_s2f(cast_v2s(i))!
-
 Void function eliminateGaussJordan(m : Element):
 Void function eliminateGaussJordan(m : Element):
 	Integer i
 	Integer i
 	Integer j
 	Integer j
@@ -395,7 +392,7 @@ Void function eliminateGaussJordan(m : Element):
 
 
 	while (i < read_nr_out(m)):
 	while (i < read_nr_out(m)):
 		// Make sure pivot m[i][j] != 0, swapping if necessary
 		// Make sure pivot m[i][j] != 0, swapping if necessary
-		while (v2f(m[i][j]) == 0.0):
+		while (cast_float(m[i][j]) == 0.0):
 			// Is zero, so find row which is not zero
 			// Is zero, so find row which is not zero
 			f = i + 1
 			f = i + 1
 			searching = True
 			searching = True
@@ -405,13 +402,13 @@ Void function eliminateGaussJordan(m : Element):
 					searching = False
 					searching = False
 					j = j + 1
 					j = j + 1
 				else:
 				else:
-					if (v2f(m[f][j]) == 0.0):
+					if (cast_float(m[f][j]) == 0.0):
 						// Also zero, so continue
 						// Also zero, so continue
 						f = f + 1
 						f = f + 1
 					else:
 					else:
 						// Found non-zero, so swap row
 						// Found non-zero, so swap row
-						t = v2f(m[f])
-						dict_overwrite(m, f, v2f(m[i]))
+						t = cast_float(m[f])
+						dict_overwrite(m, f, cast_float(m[i]))
 						dict_overwrite(m, i, t)
 						dict_overwrite(m, i, t)
 						searching = False
 						searching = False
 			// If we have increased j, we will just start the loop again (possibly), as m[i][j] might be zero again
 			// If we have increased j, we will just start the loop again (possibly), as m[i][j] might be zero again
@@ -419,9 +416,9 @@ Void function eliminateGaussJordan(m : Element):
 		// Pivot in m[i][j] guaranteed to not be 0
 		// Pivot in m[i][j] guaranteed to not be 0
 		// Now divide complete row by value of m[i][j] to make it equal 1
 		// Now divide complete row by value of m[i][j] to make it equal 1
 		f = j
 		f = j
-		divisor = v2f(m[i][j])
+		divisor = cast_float(m[i][j])
 		while (f < read_nr_out(m[i])):
 		while (f < read_nr_out(m[i])):
-			dict_overwrite(m[i], f, float_division(v2f(m[i][f]), divisor))
+			dict_overwrite(m[i], f, float_division(cast_float(m[i][f]), divisor))
 			f = f + 1
 			f = f + 1
 
 
 		// Eliminate all rows in the j-th column, except the i-th row
 		// Eliminate all rows in the j-th column, except the i-th row
@@ -429,9 +426,9 @@ Void function eliminateGaussJordan(m : Element):
 		while (f < read_nr_out(m)):
 		while (f < read_nr_out(m)):
 			if (bool_not(f == i)):
 			if (bool_not(f == i)):
 				g = j
 				g = j
-				divisor = v2f(m[f][j])
+				divisor = cast_float(m[f][j])
 				while (g < read_nr_out(m[f])):
 				while (g < read_nr_out(m[f])):
-					dict_overwrite(m[f], g, v2f(m[f][g]) - (divisor * v2f(m[i][g])))
+					dict_overwrite(m[f], g, cast_float(m[f][g]) - (divisor * cast_float(m[i][g])))
 					g = g + 1
 					g = g + 1
 			f = f + 1
 			f = f + 1
 
 
@@ -451,8 +448,7 @@ String function matrix2string(m : Element):
 	while (i < read_nr_out(m)):
 	while (i < read_nr_out(m)):
 		j = 0
 		j = 0
 		while (j < read_nr_out(m[i])):
 		while (j < read_nr_out(m[i])):
-			result = result + cast_v2s(m[i][j])
-			result = result + ", "
+			result = result + cast_string(m[i][j]) + ", "
 			j = j + 1
 			j = j + 1
 		i = i + 1
 		i = i + 1
 		result = result + "\n"
 		result = result + "\n"

+ 3 - 2
models/cbd_toRuntime.alc

@@ -10,6 +10,7 @@ Boolean function main(model : Element):
 	String element_name
 	String element_name
 	String new_element_name
 	String new_element_name
 	String mm_type_name
 	String mm_type_name
+	Element all_links
 
 
 	all_blocks = allInstances(model, "Design/Block")
 	all_blocks = allInstances(model, "Design/Block")
 	while (set_len(all_blocks) > 0):
 	while (set_len(all_blocks) > 0):
@@ -19,7 +20,7 @@ Boolean function main(model : Element):
 		if (set_len(allOutgoingAssociationInstances(model, element_name, "D2P_block")) == 0):
 		if (set_len(allOutgoingAssociationInstances(model, element_name, "D2P_block")) == 0):
 			// New design element, so create in partial runtime model as well
 			// New design element, so create in partial runtime model as well
 			new_element_name = instantiate_node(model, mm_type_name, "")
 			new_element_name = instantiate_node(model, mm_type_name, "")
-			instantiate_edge(model, "D2P_block", element_name, new_element_name)
+			instantiate_link(model, "D2P_block", "", element_name, new_element_name)
 
 
 		// Always update the value of attributes of PartialRuntime
 		// Always update the value of attributes of PartialRuntime
 		new_element_name = set_pop(readAssociationDestination(model, set_pop(allOutgoingAssociationInstances(model, element_name, "D2P_block"))))
 		new_element_name = set_pop(readAssociationDestination(model, set_pop(allOutgoingAssociationInstances(model, element_name, "D2P_block"))))
@@ -33,7 +34,7 @@ Boolean function main(model : Element):
 		element_name = set_pop(all_blocks)
 		element_name = set_pop(all_blocks)
 		if (set_len(allIncomingAssociationInstances(model, element_name, "D2P_block")) == 0):
 		if (set_len(allIncomingAssociationInstances(model, element_name, "D2P_block")) == 0):
 			// Old partial runtime element, so remove
 			// Old partial runtime element, so remove
-			model_delete(model, element_name)
+			model_delete_element(model, element_name)
 
 
 	// Delete all existing links
 	// Delete all existing links
 	all_links = allInstances(model, "PartialRuntime/Link")
 	all_links = allInstances(model, "PartialRuntime/Link")

+ 33 - 8
models/pm_live_CBD.mvc

@@ -23,6 +23,16 @@ Exec merge {
 Fork fork1 {}
 Fork fork1 {}
 Fork fork2 {}
 Fork fork2 {}
 
 
+Data trace_Design2Partial {
+    name = "trace_D2P"
+    type = "formalisms/Tracability"
+}
+
+Data trace_Partial2Runtime {
+    name = "trace_P2R"
+    type = "formalisms/Tracability"
+}
+
 Data design_model {
 Data design_model {
     name = "design_model"
     name = "design_model"
     type = "formalisms/CBD/Design_MM"
     type = "formalisms/CBD/Design_MM"
@@ -49,29 +59,44 @@ Next (simulate, merge) {}
 Next (merge, simulate) {}
 Next (merge, simulate) {}
 
 
 Consumes (edit, design_model) {
 Consumes (edit, design_model) {
-    name = "DesignModel"
+    name = "Design"
 }
 }
 Produces (edit, design_model) {
 Produces (edit, design_model) {
-    name = "DesignModel"
+    name = "Design"
 }
 }
 
 
 Consumes (toRuntime, design_model) {
 Consumes (toRuntime, design_model) {
-    name = "DesignModel"
+    name = "Design"
+}
+Consumes (toRuntime, trace_Design2Partial) {
+    name = "__traceability"
 }
 }
 Produces (toRuntime, partial_runtime_model) {
 Produces (toRuntime, partial_runtime_model) {
-    name = "PartialRuntimeModel"
+    name = "PartialRuntime"
+}
+Produces (toRuntime, trace_Design2Partial) {
+    name = "__traceability"
 }
 }
 
 
 Consumes (merge, partial_runtime_model) {
 Consumes (merge, partial_runtime_model) {
-    name = "PartialRuntimeModel"
+    name = "PartialRuntime"
+}
+Consumes (merge, full_runtime_model) {
+    name = "FullRuntime"
+}
+Consumes (merge, trace_Partial2Runtime) {
+    name = "__traceability"
 }
 }
 Produces (merge, full_runtime_model) {
 Produces (merge, full_runtime_model) {
-    name = "FullRuntimeModel"
+    name = "PartialRuntime"
+}
+Produces (merge, trace_Partial2Runtime) {
+    name = "__traceability"
 }
 }
 
 
 Consumes (simulate, full_runtime_model) {
 Consumes (simulate, full_runtime_model) {
-    name = "FullRuntimeModel"
+    name = "FullRuntime"
 }
 }
 Produces (simulate, full_runtime_model) {
 Produces (simulate, full_runtime_model) {
-    name = "FullRuntimeModel"
+    name = "FullRuntime"
 }
 }

+ 28 - 0
models/upload_models.py

@@ -4,7 +4,34 @@ from modelverse import *
 
 
 init()
 init()
 login("admin", "admin")
 login("admin", "admin")
+folder_create("formalisms/CBD")
+folder_create("models/CBD")
 
 
+print("Add design")
+model_add("formalisms/CBD/Design_MM", "formalisms/SimpleClassDiagrams", open("models/cbd_design.mvc", 'r').read())
+print("Add partial")
+model_add("formalisms/CBD/PartialRuntime_MM", "formalisms/SimpleClassDiagrams", open("models/cbd_partial_runtime.mvc", 'r').read())
+print("Add full")
+model_add("formalisms/CBD/FullRuntime_MM", "formalisms/SimpleClassDiagrams", open("models/cbd_runtime.mvc", 'r').read())
+
+print("Add model")
+model_add("models/CBD_spring", "formalisms/CBD/Design_MM", open("models/cbd_spring.mvc", 'r').read())
+
+print("Add transformation edit")
+transformation_add_MANUAL({"Design": "formalisms/CBD/Design_MM"}, {"Design": "formalisms/CBD/Design_MM"}, "models/CBD/edit")
+print("Add transformation toRuntime")
+transformation_add_AL({"Design": "formalisms/CBD/Design_MM"}, {"PartialRuntime": "formalisms/CBD/PartialRuntime_MM"}, "models/CBD/toRuntime", open("models/cbd_toRuntime.alc", 'r').read())
+print("Add transformation merge")
+transformation_add_AL({"PartialRuntime": "formalisms/CBD/PartialRuntime_MM", "FullRuntime": "formalisms/CBD/FullRuntime_MM"}, {"FullRuntime": "formalisms/CBD/FullRuntime_MM"}, "models/CBD/merge", open("models/cbd_merge.alc", 'r').read())
+print("Add transformation simulate")
+transformation_add_AL({"FullRuntime": "formalisms/CBD/FullRuntime_MM"}, {"FullRuntime": "formalisms/CBD/FullRuntime_MM"}, "models/CBD/simulate", open("models/cbd_simulate.alc", 'r').read())
+print("Add transformation restart")
+transformation_add_AL({}, {}, "models/CBD/restartSim", open("models/cbd_restartSim.alc", 'r').read())
+
+print("Add process model")
+model_add("models/live_modelling_CBD", "formalisms/ProcessModel", open("models/pm_live_CBD.mvc", 'r').read())
+
+"""
 model_add("formalisms/PW_Plant", "formalisms/SimpleClassDiagrams", open("models/plant_PW.mvc", 'r').read())
 model_add("formalisms/PW_Plant", "formalisms/SimpleClassDiagrams", open("models/plant_PW.mvc", 'r').read())
 model_add("models/plant", "formalisms/PW_Plant", open("models/plant_model.mvc", 'r').read().replace("PW_Plant/", ""))
 model_add("models/plant", "formalisms/PW_Plant", open("models/plant_model.mvc", 'r').read().replace("PW_Plant/", ""))
 model_add("formalisms/Requirements", "formalisms/SimpleClassDiagrams", open("models/requirements.mvc", 'r').read())
 model_add("formalisms/Requirements", "formalisms/SimpleClassDiagrams", open("models/requirements.mvc", 'r').read())
@@ -65,3 +92,4 @@ transformation_add_AL({"EPN_Plant": "formalisms/Encapsulated_PetriNet", "EPN_Con
 
 
 transformation_add_AL({"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet"}, {}, "epn_print", open("models/epn_print.alc").read())
 transformation_add_AL({"Encapsulated_PetriNet": "formalisms/Encapsulated_PetriNet"}, {}, "epn_print", open("models/epn_print.alc").read())
 transformation_add_AL({"PetriNet": "formalisms/PetriNet"}, {}, "pn_print", open("models/pn_print.alc").read())
 transformation_add_AL({"PetriNet": "formalisms/PetriNet"}, {}, "pn_print", open("models/pn_print.alc").read())
+"""

+ 9 - 0
wrappers/classes/modelverse.xml

@@ -611,6 +611,15 @@
                                         <parameter expr="model"/>
                                         <parameter expr="model"/>
                                     </raise>
                                     </raise>
                                 </transition>
                                 </transition>
+
+                                <transition cond="self.expect_response('Waiting for code constructors...')" target="../upload_changes">
+                                    <raise event="result">
+                                        <parameter expr="None"/>
+                                    </raise>
+                                    <raise event="request">
+                                        <parameter expr="self.parameters[3]"/>
+                                    </raise>
+                                </transition>
                             </state>
                             </state>
 
 
                             <state id="wait_for_user">
                             <state id="wait_for_user">

+ 5 - 6
wrappers/modelverse.py

@@ -252,13 +252,12 @@ def transformation_add_AL(source_metamodels, target_metamodels, operation_name,
     INPUT("transformation_add_AL", None, [source_metamodels, target_metamodels, operation_name, code, True])
     INPUT("transformation_add_AL", None, [source_metamodels, target_metamodels, operation_name, code, True])
     model = OUTPUT()
     model = OUTPUT()
 
 
-    if model is None:
-        # In case the source and target metamodels are empty, the context will be None, indicating that we are finished already (no callbacks allowed)
-        return
+    if model is not None:
+        # In case the source and target metamodels are empty, the model will be None, indicating that we are finished already (no callbacks allowed)
 
 
-    if callback is not None:
-        __invoke(callback, model)
-    controller.addInput(Event("data_input", "action_in", [None, None]))
+        if callback is not None:
+            __invoke(callback, model)
+        controller.addInput(Event("data_input", "action_in", [None, None]))
 
 
     return OUTPUT()
     return OUTPUT()
 
 

+ 13 - 1
wrappers/modelverse_SCCD.py

@@ -1,7 +1,7 @@
 """
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
 
-Date:   Wed Nov 15 13:36:26 2017
+Date:   Wed Nov 15 16:03:44 2017
 
 
 Model author: Yentl Van Tendeloo
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
 Model name:   MvK Server
@@ -958,6 +958,11 @@ class Modelverse(RuntimeClassBase):
         _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0.setTrigger(None)
         _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0.setTrigger(None)
         _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0.setGuard(self._initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0_guard)
         _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0.setGuard(self._initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0_guard)
         self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/send_metadata"].addTransition(_initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0)
         self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/send_metadata"].addTransition(_initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0)
+        _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1 = Transition(self, self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/send_metadata"], [self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/upload_changes"]])
+        _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1.setAction(self._initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1_exec)
+        _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1.setTrigger(None)
+        _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1.setGuard(self._initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1_guard)
+        self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/send_metadata"].addTransition(_initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1)
         
         
         # transition /initialized/behaviour/operations/store_on_scripted/transformation_add/wait_for_user
         # transition /initialized/behaviour/operations/store_on_scripted/transformation_add/wait_for_user
         _initialized_behaviour_operations_store_on_scripted_transformation_add_wait_for_user_0 = Transition(self, self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/wait_for_user"], [self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/upload_changes"]])
         _initialized_behaviour_operations_store_on_scripted_transformation_add_wait_for_user_0 = Transition(self, self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/wait_for_user"], [self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add/upload_changes"]])
@@ -2517,6 +2522,13 @@ class Modelverse(RuntimeClassBase):
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0_guard(self, parameters):
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_0_guard(self, parameters):
         return self.expect_response_partial('Please edit this model before sending next input: ', pop=False)
         return self.expect_response_partial('Please edit this model before sending next input: ', pop=False)
     
     
+    def _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1_exec(self, parameters):
+        self.raiseInternalEvent(Event("result", None, [None]))
+        self.raiseInternalEvent(Event("request", None, [self.parameters[3]]))
+    
+    def _initialized_behaviour_operations_store_on_scripted_transformation_add_send_metadata_1_guard(self, parameters):
+        return self.expect_response('Waiting for code constructors...')
+    
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_wait_for_user_0_exec(self, parameters):
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_wait_for_user_0_exec(self, parameters):
         self.inputs[None].pop(0)
         self.inputs[None].pop(0)
         self.raiseInternalEvent(Event("request", None, [True]))
         self.raiseInternalEvent(Event("request", None, [True]))