Преглед на файлове

Working algebraic loop solver (for simple cases)

Yentl Van Tendeloo преди 8 години
родител
ревизия
559f233e4a
променени са 1 файла, в които са добавени 63 реда и са изтрити 63 реда
  1. 63 63
      integration/code/cbd_semantics.alc

+ 63 - 63
integration/code/cbd_semantics.alc

@@ -278,7 +278,7 @@ Boolean function solve_scc(model : Element, scc : Element):
 				// A constant, which we can assume is already computed and thus usable
 				if (blocktype == "AdditionBlock"):
 					constant = constant + v2f(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"):
 					constant = constant * v2f(read_attribute(model, selected, "signal"))
 					// Not written to constant part, as multiplies a variable
@@ -355,77 +355,77 @@ Void function step_simulation(model : Element, schedule : Element):
 		else:
 			block = set_pop(scc)
 
-		// Execute "block"
-		blocktype = readType(model, block)
-		if (blocktype == "ConstantBlock"):
-			signal = 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))
-				signal = signal + cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
-		elif (blocktype == "MultiplyBlock"):
-			signal = 1.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")
-			signal = 0.0
-			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"):
-			signal = 0.0
-			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"):
-			signal = 0.0
-			if (element_eq(read_attribute(model, block, "last_in"), read_root())):
-				// No memory yet, so use initial condition
-				incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
+			// Execute "block"
+			blocktype = readType(model, block)
+			if (blocktype == "ConstantBlock"):
+				signal = 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))
-					signal = cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
-			else:
-				signal = read_attribute(model, block, "last_in")
-				unset_attribute(model, block, "last_in")
-			set_add(memory_blocks, block)
-		elif (blocktype == "IntegratorBlock"):
-			if (element_eq(read_attribute(model, block, "last_in"), read_root())):
-				// No history yet, so use initial values
-				incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
+					signal = signal + cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+			elif (blocktype == "MultiplyBlock"):
+				signal = 1.0
+				incoming = allIncomingAssociationInstances(model, block, "Link")
 				while (read_nr_out(incoming) > 0):
 					selected = readAssociationSource(model, set_pop(incoming))
-					signal = cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
-			else:
-				signal = cast_s2f(cast_v2s(read_attribute(model, block, "last_in"))) + (delta_t * cast_s2f(cast_v2s(read_attribute(model, block, "last_out"))))
-				unset_attribute(model, block, "last_in")
-				unset_attribute(model, block, "last_out")
-			instantiate_attribute(model, block, "last_out", signal)
-			set_add(memory_blocks, block)
-		elif (blocktype == "DerivatorBlock"):
-			if (element_eq(read_attribute(model, block, "last_in"), read_root())):
-				// No history yet, so use initial values
-				incoming = allIncomingAssociationInstances(model, block, "InitialCondition")
+					signal = signal * cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
+			elif (blocktype == "NegatorBlock"):
+				incoming = allIncomingAssociationInstances(model, block, "Link")
+				signal = 0.0
 				while (read_nr_out(incoming) > 0):
 					selected = readAssociationSource(model, set_pop(incoming))
-					signal = cast_s2f(cast_v2s(read_attribute(model, selected, "signal")))
-			else:
+					signal = float_neg(cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))))
+			elif (blocktype == "InverseBlock"):
+				signal = 0.0
 				incoming = allIncomingAssociationInstances(model, block, "Link")
 				while (read_nr_out(incoming) > 0):
 					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
-				unset_attribute(model, block, "last_in")
-			set_add(memory_blocks, block)
-
-		unset_attribute(model, block, "signal")
-		instantiate_attribute(model, block, "signal", signal)
-		output((("SIM_PROBE " + cast_v2s(block)) + " ") + cast_v2s(signal))
+					signal = float_division(1.0, cast_s2f(cast_v2s(read_attribute(model, selected, "signal"))))
+			elif (blocktype == "DelayBlock"):
+				signal = 0.0
+				if (element_eq(read_attribute(model, block, "last_in"), read_root())):
+					// No memory yet, so use initial condition
+					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, "last_in")
+					unset_attribute(model, block, "last_in")
+				set_add(memory_blocks, block)
+			elif (blocktype == "IntegratorBlock"):
+				if (element_eq(read_attribute(model, block, "last_in"), read_root())):
+					// No history yet, so use initial values
+					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 = cast_s2f(cast_v2s(read_attribute(model, block, "last_in"))) + (delta_t * cast_s2f(cast_v2s(read_attribute(model, block, "last_out"))))
+					unset_attribute(model, block, "last_in")
+					unset_attribute(model, block, "last_out")
+				instantiate_attribute(model, block, "last_out", signal)
+				set_add(memory_blocks, block)
+			elif (blocktype == "DerivatorBlock"):
+				if (element_eq(read_attribute(model, block, "last_in"), read_root())):
+					// No history yet, so use initial values
+					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:
+					incoming = allIncomingAssociationInstances(model, block, "Link")
+					while (read_nr_out(incoming) > 0):
+						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
+					unset_attribute(model, block, "last_in")
+				set_add(memory_blocks, block)
+
+			unset_attribute(model, block, "signal")
+			instantiate_attribute(model, block, "signal", signal)
+			output((("SIM_PROBE " + cast_v2s(block)) + " ") + cast_v2s(signal))
 	output("SIM_END")
 	
 	while (read_nr_out(memory_blocks) > 0):