Browse Source

Add reRAMify operation

Yentl Van Tendeloo 8 years ago
parent
commit
b000626852
1 changed files with 40 additions and 1 deletions
  1. 40 1
      core/core_algorithm.alc

+ 40 - 1
core/core_algorithm.alc

@@ -216,7 +216,7 @@ Void function user_function_skip_init(user_id : String):
 			output("")
 			output("Transformation-specific operations")
 			output("    transformation_add_MT_language	-- Create a RAMified metamodel")
-			output("    transformation_reRAMify			-- TODO")
+			output("    transformation_reRAMify			-- RAMify a merged metamodel again")
 			output("    transformation_add_MT			-- TODO")
 			output("    transformation_add_AL			-- TODO")
 			output("    transformation_source_add		-- TODO")
@@ -473,6 +473,45 @@ Void function user_function_skip_init(user_id : String):
 			else:
 				output("At least one source formalism is required")
 
+		elif (cmd == "transformation_reRAMify"):
+			String model_id
+			String source_id
+			Element trace_links
+			String trace_link
+			String merged_model_id
+			Element new_model
+			String location
+
+			output("Merged metamodel to RAMify again?")
+			model_id = get_model_id(input())
+
+			if (model_id != ""):
+				if (allow_write(user_id, model_id)):
+					// We must be able to write the RAMification model, as we will update it in-place
+					trace_links = allOutgoingAssociationInstances(core, model_id, "tracability")
+					merged_model_id = ""
+					while (read_nr_out(trace_links) > 0):
+						trace_link = set_pop(trace_links)
+						if (value_eq(read_attribute(core, trace_link, "type"), "RAMified")):
+							// Found a RAMification link, so redo it on the original model
+							merged_model_id = readAssociationDestination(core, trace_link)
+
+					if (merged_model_id != ""):
+						new_model = ramify(core["model"][merged_model_id])
+
+						location = "/models/" + cast_id2s(new_model)
+						export_node(new_model, location)
+
+						// Update meta-info
+						unset_attribute(core, model_id, "location")
+						instantiate_attribute(core, model_id, "location", location)
+					else:
+						output("Could not determine original model of RAMified metamodel!")
+				else:
+					output("Permission denied")
+			else:
+				output("No such model")
+
 		elif (cmd == "permission_modify"):
 			String permissions
 			Integer permission