|
@@ -8,7 +8,6 @@ include "mini_modify.alh"
|
|
|
include "utils.alh"
|
|
|
|
|
|
Boolean function main(model : Element):
|
|
|
- log("Start DTCBD simulation!")
|
|
|
String cmd
|
|
|
Boolean running
|
|
|
Element schedule_init
|
|
@@ -19,7 +18,6 @@ Boolean function main(model : Element):
|
|
|
String time
|
|
|
time = set_pop(allInstances(model, "FullRuntime/Time"))
|
|
|
current_time = read_attribute(model, time, "current_time")
|
|
|
- log("Fetching time now: " + cast_value(current_time))
|
|
|
|
|
|
schedule_init = create_schedule(model)
|
|
|
schedule_run = read_root()
|
|
@@ -43,7 +41,6 @@ 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!
|
|
|
|
|
@@ -59,7 +56,6 @@ Element function create_schedule(model : Element):
|
|
|
successors = set_create()
|
|
|
while (set_len(nodes) > 0):
|
|
|
element_name = set_pop(nodes)
|
|
|
- log("Block " + element_name + " : " + read_type(model, element_name))
|
|
|
|
|
|
if (is_nominal_instance(model, element_name, "FullRuntime/ICBlock")):
|
|
|
if (bool_not(is_physical_float(read_attribute(model, element_name, "last_in")))):
|
|
@@ -73,19 +69,9 @@ Element function create_schedule(model : Element):
|
|
|
String source
|
|
|
source = readAssociationSource(model, set_pop(incoming_links))
|
|
|
list_append(successors, create_tuple(source, element_name))
|
|
|
- log("Found edge: " + source + " --> " + element_name)
|
|
|
|
|
|
Element values
|
|
|
values = create_node()
|
|
|
- //dict_add(values, "model", model)
|
|
|
- //dict_add(values, "S", create_node())
|
|
|
- //dict_add(values, "index", 0)
|
|
|
- //dict_add(values, "indices", create_node())
|
|
|
- //dict_add(values, "lowlink", create_node())
|
|
|
- //dict_add(values, "onStack", create_node())
|
|
|
- //dict_add(values, "successors", successors)
|
|
|
- //dict_add(values, "predecessors", predecessors)
|
|
|
- //dict_add(values, "SCC", create_node())
|
|
|
|
|
|
dict_add(values, "edges", successors)
|
|
|
dict_add(values, "nodes", allInstances(model, "FullRuntime/Block"))
|
|
@@ -94,39 +80,21 @@ Element function create_schedule(model : Element):
|
|
|
dict_add(values, "visited_topSort", set_create())
|
|
|
dict_add(values, "unvisited_strongComp", set_create())
|
|
|
|
|
|
- log("Toposort")
|
|
|
- //nodes = get_topolist(values)
|
|
|
- //while (list_len(nodes) > 0):
|
|
|
- // log("Strong connect")
|
|
|
- // strongconnect(list_pop_final(nodes), values)
|
|
|
-
|
|
|
dict_overwrite(values, "SCC", strongComp(values))
|
|
|
|
|
|
- //nodes = allInstances(model, "FullRuntime/Block")
|
|
|
- //while (set_len(nodes) > 0):
|
|
|
- // strongconnect(set_pop(nodes), values)
|
|
|
-
|
|
|
- log("OK")
|
|
|
-
|
|
|
return values["SCC"]!
|
|
|
|
|
|
Void function topSort(values : Element):
|
|
|
Element nodes_copy
|
|
|
String node
|
|
|
|
|
|
- // for node in graph:
|
|
|
- // node.visited = False
|
|
|
dict_overwrite(values, "visited_topSort", set_create())
|
|
|
|
|
|
- // for node in graph:
|
|
|
- // if not node.visited:
|
|
|
- // dfsLabelling(node)
|
|
|
nodes_copy = set_copy(values["nodes"])
|
|
|
while (set_len(nodes_copy) > 0):
|
|
|
node = set_pop(nodes_copy)
|
|
|
if (bool_not(set_in(values["visited_topSort"], node))):
|
|
|
dfsLabelling(values, node)
|
|
|
- log("Order: " + dict_to_string(values["orderNumber"]))
|
|
|
|
|
|
return!
|
|
|
|
|
@@ -238,7 +206,6 @@ Element function strongComp(values : Element):
|
|
|
|
|
|
component = dfsCollect(values, start_node)
|
|
|
list_append(sccs, component)
|
|
|
- log("Got strong component: " + list_to_string(component))
|
|
|
|
|
|
return sccs!
|
|
|
|
|
@@ -329,7 +296,6 @@ Void function strongconnect(v : String, values : Element):
|
|
|
list_append(scc, w)
|
|
|
// output the current strongly connected component
|
|
|
list_insert(values["SCC"], scc, 0)
|
|
|
- log("Found new SCC: " + list_to_string(scc))
|
|
|
return!
|
|
|
|
|
|
Boolean function solve_scc(model : Element, scc : Element):
|
|
@@ -423,9 +389,6 @@ Boolean function solve_scc(model : Element, scc : Element):
|
|
|
|
|
|
i = i + 1
|
|
|
|
|
|
- // Constructed a complete matrix, so we can start!
|
|
|
- log(matrix2string(m))
|
|
|
-
|
|
|
// Solve matrix now
|
|
|
eliminateGaussJordan(m)
|
|
|
|
|
@@ -471,7 +434,6 @@ 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:
|
|
@@ -479,7 +441,6 @@ Float function step_simulation(model : Element, schedule : Element, time : Float
|
|
|
|
|
|
// Execute "block"
|
|
|
blocktype = read_type(model, block)
|
|
|
- //log("Execute block " + block + " : " + blocktype)
|
|
|
incoming = set_copy(inputs[block])
|
|
|
if (blocktype == "FullRuntime/ConstantBlock"):
|
|
|
signal = cast_float(read_attribute(model, block, "value"))
|