Преглед изворни кода

Nicer active schedule management

Yentl Van Tendeloo пре 8 година
родитељ
комит
c974caba4d
2 измењених фајлова са 64 додато и 24 уклоњено
  1. 13 10
      integration/code/cbd_runtime.mvc
  2. 51 14
      integration/code/cbd_semantics.alc

+ 13 - 10
integration/code/cbd_runtime.mvc

@@ -11,6 +11,15 @@ SCD CausalBlockDiagrams_Runtime{
         $
     }
 
+    Class Boolean {
+        $
+            if (bool_not(is_physical_boolean(self))):
+                return "Boolean has no bool value"!
+            else:
+                return "OK"!
+        $
+    }
+
     Class Block{}
 
     Class ConstantBlock{
@@ -31,13 +40,12 @@ SCD CausalBlockDiagrams_Runtime{
         }
     }
 
-    Class Pointers {
-        lower_cardinality = 1
-        upper_cardinality = 1
-    }
-
     Class Schedule {
         lower_cardinality = 1
+        active : Boolean {
+            target_lower_cardinality = 1
+            target_upper_cardinality = 1
+        }
     }
 
     Association LinkedBlock(Schedule, Block){
@@ -50,11 +58,6 @@ SCD CausalBlockDiagrams_Runtime{
         target_upper_cardinality = 1
     }
 
-    Association ActiveSchedule(Pointers, Schedule) {
-        target_lower_cardinality = 1
-        target_upper_cardinality = 1
-    }
-
     Association Link(Block, Block){
         signal : Float {
             target_lower_cardinality = 0

+ 51 - 14
integration/code/cbd_semantics.alc

@@ -97,7 +97,6 @@ Void function create_schedule(model : Element, is_time_zero : Boolean):
 	String new_schedule
 	Boolean ready
 
-	log("Fetching all blocks")
 	all_blocks = allInstances(model, "Block")
 	visited = create_node()
 	to_visit = create_node()
@@ -107,50 +106,86 @@ Void function create_schedule(model : Element, is_time_zero : Boolean):
 	else:
 		log("Make normal schedule!")
 		schedule = instantiate_node(model, "Schedule", "schedule_run")
+	instantiate_attribute(model, schedule, "active", True)
+	log("Instantiated attribute")
 
 	while (read_nr_out(all_blocks) > 0):
-		log("Loop 1")
 		element_name = set_pop(all_blocks)
 		if (bool_not(set_in(visited, element_name))):
 			list_append(to_visit, element_name)
 
 		while (list_len(to_visit) > 0):
-			log("Loop 2")
 			element_name = list_read(to_visit, list_len(to_visit) - 1)
 			if (reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], model["model"][element_name])) == "DelayBlock"):
 				if (is_time_zero):
-					log("Checking all incoming 0")
 					incoming_links = allIncomingAssociationInstances(model, element_name, "InitialCondition")
 				else:
 					incoming_links = create_node()
 			else:
-				log("Checking all incoming n")
 				incoming_links = allIncomingAssociationInstances(model, element_name, "Link")
 			ready = True
 
 			while (list_len(incoming_links) > 0):
-				log("Loop 3")
 				link = set_pop(incoming_links)
 				source = readAssociationSource(model, link)
-				log("Read association")
 				if (bool_not(set_in(visited, source))):
 					list_append(to_visit, source)
 					ready = False
 
-			log("Check ready!")
 			if (ready):
-				log("Ready!")
 				new_schedule = instantiate_node(model, "Schedule", "")
-				log("Instantiate 1")
-				instantiate_link(model, "ConnectedBlock", "", schedule, element_name)
-				log("Instantiate 2")
+				log("Instantiate active")
+				log(cast_e2s(new_schedule))
+				instantiate_attribute(model, new_schedule, "active", False)
+				log("ACTIVE OK")
+				instantiate_link(model, "LinkedBlock", "", schedule, element_name)
 				instantiate_link(model, "NextSchedule", "", schedule, new_schedule)
-				log("Instantiate 3")
 				schedule = new_schedule
 				list_delete(to_visit, list_len(to_visit) - 1)
 				set_add(visited, element_name)
 
-	log("Done!")
+	return !
+
+String function readType(model : Element, name : String):
+	return reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], model["model"][name]))!
+
+Void function list_CBD(model : Element):
+	Element all_elements
+	String elem
+	String block
+	
+	output("Blocks:")
+	all_elements = allInstances(model, "Block")
+	while (read_nr_out(all_elements) > 0):
+		elem = set_pop(all_elements)
+		output((("    " + elem) + ": ") + readType(model, elem))
+
+	output("Links:")
+	all_elements = allInstances(model, "Link")
+	while (read_nr_out(all_elements) > 0):
+		elem = set_pop(all_elements)
+		output((("    " + reverseKeyLookup(model["model"], read_edge_src(model["model"][elem]))) + " --> ") + reverseKeyLookup(model["model"], read_edge_dst(model["model"][elem])))
+
+	output("Initial conditions:")
+	all_elements = allInstances(model, "InitialCondition")
+	while (read_nr_out(all_elements) > 0):
+		elem = set_pop(all_elements)
+		output((("    " + reverseKeyLookup(model["model"], read_edge_src(model["model"][elem]))) + " --> ") + reverseKeyLookup(model["model"], read_edge_dst(model["model"][elem])))
+
+	output("Schedule @ 0:")
+	elem = "schedule_init"
+	while (allOutgoingAssociationInstances(model, elem, "LinkedBlock")):
+		block = set_pop(readAssociationSource(model, set_pop(allOutgoingAssociationInstances(model, elem, "LinkedBlock"))))
+		output("    " + block)
+		elem = set_pop(readAssociationSource(model, set_pop(allOutgoingAssociationInstances(model, elem, "LinkedBlock"))))
+
+	output("Schedule @ 0:")
+	elem = "schedule_run"
+	while (allOutgoingAssociationInstances(model, elem, "LinkedBlock")):
+		block = set_pop(readAssociationSource(model, set_pop(allOutgoingAssociationInstances(model, elem, "LinkedBlock"))))
+		output("    " + block)
+		elem = set_pop(readAssociationSource(model, set_pop(allOutgoingAssociationInstances(model, elem, "LinkedBlock"))))
+
 	return !
 
 Void function execute_cbd(model : Element):
@@ -169,6 +204,8 @@ Void function execute_cbd(model : Element):
 			output("  list    -- list blocks and connections")
 			output("  help    -- this information")
 			output("  exit    -- select another model")
+		elif (cmd == "list"):
+			list_CBD(model)
 		elif (cmd == "exit"):
 			return!
 		else: