|
@@ -7,6 +7,7 @@ include "metamodels.alh"
|
|
|
include "mini_modify.alh"
|
|
|
|
|
|
Boolean function main(model : Element):
|
|
|
+ log("Start DTCBD simulation!")
|
|
|
String cmd
|
|
|
Boolean running
|
|
|
Element schedule_init
|
|
@@ -15,16 +16,22 @@ Boolean function main(model : Element):
|
|
|
Float current_time
|
|
|
|
|
|
String time
|
|
|
+ log("Fetching time...")
|
|
|
time = set_pop(allInstances(model, "FullRuntime/Time"))
|
|
|
+ log("Time OK")
|
|
|
current_time = read_attribute(model, time, "current_time")
|
|
|
+ log("Fetching time now: " + cast_value(current_time))
|
|
|
|
|
|
schedule_init = create_schedule(model)
|
|
|
+ log("Schedule OK")
|
|
|
schedule_run = read_root()
|
|
|
|
|
|
Element nodes
|
|
|
Element inputs
|
|
|
String node
|
|
|
+ log("Compute all blocks")
|
|
|
nodes = allInstances(model, "FullRuntime/Block")
|
|
|
+ log("Blocks: " + cast_value(set_len(nodes)))
|
|
|
inputs = dict_create()
|
|
|
while (set_len(nodes) > 0):
|
|
|
node = set_pop(nodes)
|
|
@@ -40,6 +47,7 @@ Boolean function main(model : Element):
|
|
|
current_time = step_simulation(model, schedule, current_time, inputs)
|
|
|
|
|
|
instantiate_attribute(model, time, "current_time", current_time)
|
|
|
+ log("CLOSE")
|
|
|
output("CLOSE")
|
|
|
return True!
|
|
|
|
|
@@ -51,12 +59,15 @@ Element function create_schedule(model : Element):
|
|
|
String element_name
|
|
|
Element incoming_links
|
|
|
Element all_blocks
|
|
|
+ log("Create schedule...")
|
|
|
|
|
|
nodes = allInstances(model, "FullRuntime/Block")
|
|
|
successors = dict_create()
|
|
|
predecessors = dict_create()
|
|
|
+ log("Got all instances")
|
|
|
while (set_len(nodes) > 0):
|
|
|
element_name = set_pop(nodes)
|
|
|
+ log("Loop for " + cast_value(element_name))
|
|
|
if (bool_not(dict_in(successors, element_name))):
|
|
|
dict_add(successors, element_name, create_node())
|
|
|
if (bool_not(dict_in(predecessors, element_name))):
|
|
@@ -67,11 +78,6 @@ Element function create_schedule(model : Element):
|
|
|
incoming_links = allIncomingAssociationInstances(model, element_name, "FullRuntime/InitialCondition")
|
|
|
else:
|
|
|
incoming_links = create_node()
|
|
|
- if (is_nominal_instance(model, element_name, "FullRuntime/DerivatorBlock")):
|
|
|
- Element new_incoming_links
|
|
|
- new_incoming_links = allIncomingAssociationInstances(model, element_name, "FullRuntime/Link")
|
|
|
- while (read_nr_out(new_incoming_links) > 0):
|
|
|
- list_append(incoming_links, set_pop(new_incoming_links))
|
|
|
else:
|
|
|
incoming_links = allIncomingAssociationInstances(model, element_name, "FullRuntime/Link")
|
|
|
|
|
@@ -83,6 +89,7 @@ Element function create_schedule(model : Element):
|
|
|
set_add(successors[source], element_name)
|
|
|
set_add(predecessors[element_name], source)
|
|
|
|
|
|
+ log("Loop done")
|
|
|
Element values
|
|
|
values = create_node()
|
|
|
dict_add(values, "model", model)
|
|
@@ -95,9 +102,12 @@ Element function create_schedule(model : Element):
|
|
|
dict_add(values, "predecessors", predecessors)
|
|
|
dict_add(values, "SCC", create_node())
|
|
|
|
|
|
+ log("Toposort")
|
|
|
nodes = get_topolist(values)
|
|
|
while (list_len(nodes) > 0):
|
|
|
+ log("Strong connect")
|
|
|
strongconnect(list_pop_final(nodes), values)
|
|
|
+ log("OK")
|
|
|
|
|
|
return values["SCC"]!
|
|
|
|
|
@@ -308,6 +318,7 @@ Float function step_simulation(model : Element, schedule : Element, time : Float
|
|
|
|
|
|
if (list_len(scc) > 1):
|
|
|
if (bool_not(solve_scc(model, scc))):
|
|
|
+ log("ALGEBRAIC_LOOP")
|
|
|
output("ALGEBRAIC_LOOP")
|
|
|
return time!
|
|
|
else:
|
|
@@ -349,33 +360,11 @@ Float function step_simulation(model : Element, schedule : Element, time : Float
|
|
|
else:
|
|
|
signal = read_attribute(model, block, "last_in")
|
|
|
set_add(memory_blocks, block)
|
|
|
- elif (blocktype == "FullRuntime/IntegratorBlock"):
|
|
|
- if (bool_not(is_physical_float(read_attribute(model, block, "last_in")))):
|
|
|
- // No history yet, so use initial values
|
|
|
- incoming = allAssociationOrigins(model, block, "FullRuntime/InitialCondition")
|
|
|
- while (set_len(incoming) > 0):
|
|
|
- selected = set_pop(incoming)
|
|
|
- signal = cast_float(read_attribute(model, selected, "signal"))
|
|
|
- else:
|
|
|
- signal = cast_float(read_attribute(model, block, "last_out")) + (delta_t * cast_float(read_attribute(model, block, "last_in")))
|
|
|
- instantiate_attribute(model, block, "last_out", signal)
|
|
|
- set_add(memory_blocks, block)
|
|
|
- elif (blocktype == "FullRuntime/DerivatorBlock"):
|
|
|
- if (bool_not(is_physical_float(read_attribute(model, block, "last_in")))):
|
|
|
- // No history yet, so use initial values
|
|
|
- incoming = allAssociationOrigins(model, block, "FullRuntime/InitialCondition")
|
|
|
- while (set_len(incoming) > 0):
|
|
|
- selected = set_pop(incoming)
|
|
|
- signal = cast_float(read_attribute(model, selected, "signal"))
|
|
|
- else:
|
|
|
- while (set_len(incoming) > 0):
|
|
|
- selected = set_pop(incoming)
|
|
|
- signal = (cast_float(read_attribute(model, selected, "signal")) - cast_float(read_attribute(model, block, "last_in"))) / delta_t
|
|
|
- set_add(memory_blocks, block)
|
|
|
elif (blocktype == "FullRuntime/ProbeBlock"):
|
|
|
while (set_len(incoming) > 0):
|
|
|
signal = cast_float(read_attribute(model, set_pop(incoming), "signal"))
|
|
|
output(cast_string(time) + " " + cast_string(read_attribute(model, block, "name")) + " " + cast_string(signal))
|
|
|
+ log(cast_string(time) + " " + cast_string(read_attribute(model, block, "name")) + " " + cast_string(signal))
|
|
|
|
|
|
instantiate_attribute(model, block, "signal", signal)
|
|
|
|