Просмотр исходного кода

Added semantics for all blocks

Yentl Van Tendeloo 8 лет назад
Родитель
Сommit
83b8aa16c0
2 измененных файлов с 45 добавлено и 9 удалено
  1. 7 3
      integration/code/cbd_design.mvc
  2. 38 6
      integration/code/cbd_semantics.alc

+ 7 - 3
integration/code/cbd_design.mvc

@@ -1,5 +1,6 @@
 import models/SimpleClassDiagrams as SCD
 include "primitives.alh"
+include "object_operations.alh"
 
 SCD CausalBlockDiagrams_Design{
     Class Float {
@@ -21,10 +22,13 @@ SCD CausalBlockDiagrams_Design{
     }
 
     Class AdditionBlock{}
-    Class NegatorBlock{}
+    Class NegatorBlock{
+    }
     Class MultiplyBlock{}
-    Class InverseBlock{}
-    Class DelayBlock{}
+    Class InverseBlock{
+    }
+    Class DelayBlock{
+    }
 
     Association Link(Block, Block){}
     Association InitialCondition(Block, DelayBlock){

+ 38 - 6
integration/code/cbd_semantics.alc

@@ -195,6 +195,7 @@ Void function step_simulation(model : Element):
 	String block
 	String elem
 	String blocktype
+	String output_string
 
 	time = "time"
 	if (cast_s2i(cast_v2s(read_attribute(model, time, "current_time"))) == 0):
@@ -202,33 +203,64 @@ Void function step_simulation(model : Element):
 	else:
 		schedule = "schedule_run"
 
-	output("==== START ====")
+	output_string = "("
 	while (read_nr_out(allOutgoingAssociationInstances(model, schedule, "LinkedBlock")) > 0):
 		block = readAssociationDestination(model, set_pop(allOutgoingAssociationInstances(model, schedule, "LinkedBlock")))
 		schedule = readAssociationDestination(model, set_pop(allOutgoingAssociationInstances(model, schedule, "NextSchedule")))
 
 		// Execute "block"
 		blocktype = readType(model, block)
-		unset_attribute(model, block, "signal")
 		if (blocktype == "ConstantBlock"):
 			signal = read_attribute(model, block, "value")
-			log("Value: " + cast_v2s(read_attribute(model, block, "value")))
 		elif (blocktype == "AdditionBlock"):
 			signal = 0.0
 			incoming = allIncomingAssociationInstances(model, block, "Link")
 			while (read_nr_out(incoming) > 0):
 				selected = readAssociationSource(model, set_pop(incoming))
-				log("V += " + cast_v2s(read_attribute(model, selected, "signal")))
 				signal = signal + cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+		elif (blocktype == "MultiplyBlock"):
+			signal = 0.0
+			incoming = allIncomingAssociationInstances(model, block, "Link")
+			while (read_nr_out(incoming) > 0):
+				selected = readAssociationSource(model, set_pop(incoming))
+				signal = signal * cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+		elif (blocktype == "NegatorBlock"):
+			incoming = allIncomingAssociationInstances(model, block, "Link")
+			while (read_nr_out(incoming) > 0):
+				selected = readAssociationSource(model, set_pop(incoming))
+				signal = float_neg(cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))))
+		elif (blocktype == "InverseBlock"):
+			incoming = allIncomingAssociationInstances(model, block, "Link")
+			while (read_nr_out(incoming) > 0):
+				selected = readAssociationSource(model, set_pop(incoming))
+				signal = float_division(1.0, cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))))
+		elif (blocktype == "DelayBlock"):
+			if (schedule == "schedule_init"):
+				incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
+				while (read_nr_out(incoming) > 0):
+					selected = readAssociationSource(model, set_pop(incoming))
+					signal = cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+			else:
+				signal = read_attribute(model, block, "memory")
+
+			// Update memory
+			incoming = allIncomingAssociationInstances(model, block, "Link")
+			while (read_nr_out(incoming) > 0):
+				selected = readAssociationSource(model, set_pop(incoming))
+				unset_attribute(model, block, "memory")
+				instantiate_attribute(model, block, "memory", cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))))
+
+		unset_attribute(model, block, "signal")
 		instantiate_attribute(model, block, "signal", signal)
-		output((("    " + block) + " = ") + cast_v2s(read_attribute(model, block, "signal")))
+		output_string = output_string + (((block + " = ") + cast_v2s(signal)) + "; ")
+	output_string = output_string + ")"
 
 	// Increase simulation time
 	Integer new_time
 	new_time = cast_s2i(cast_v2s(read_attribute(model, time, "current_time"))) + 1
 	unset_attribute(model, time, "current_time")
 	instantiate_attribute(model, time, "current_time", new_time)
-	output("====  END  ====")
+	output(output_string)
 
 	return !