|
@@ -138,22 +138,6 @@ Element function create_schedule(model : Element):
|
|
while (read_nr_out(nodes) > 0):
|
|
while (read_nr_out(nodes) > 0):
|
|
strongconnect(set_pop(nodes), values)
|
|
strongconnect(set_pop(nodes), values)
|
|
|
|
|
|
- log("Computed SCC!")
|
|
|
|
- log("Print list:")
|
|
|
|
- Integer i
|
|
|
|
- Integer j
|
|
|
|
- Element lst
|
|
|
|
- i = 0
|
|
|
|
- while (i < read_nr_out(values["SCC"])):
|
|
|
|
- log("[")
|
|
|
|
- lst = list_read(values["SCC"], i)
|
|
|
|
- j = 0
|
|
|
|
- while (j < read_nr_out(lst)):
|
|
|
|
- log(" " + cast_v2s(list_read(lst, j)))
|
|
|
|
- j = j + 1
|
|
|
|
- log("]")
|
|
|
|
- i = i + 1
|
|
|
|
- log("=== END")
|
|
|
|
return values["SCC"]!
|
|
return values["SCC"]!
|
|
|
|
|
|
Void function dict_overwrite(d : Element, key : Element, value : Element):
|
|
Void function dict_overwrite(d : Element, key : Element, value : Element):
|
|
@@ -174,8 +158,6 @@ Integer function min(a : Integer, b : Integer):
|
|
Void function strongconnect(v : String, values : Element):
|
|
Void function strongconnect(v : String, values : Element):
|
|
if (dict_in(values["indices"], v)):
|
|
if (dict_in(values["indices"], v)):
|
|
return!
|
|
return!
|
|
- log("Compute strong connected components")
|
|
|
|
- log("Source: " + v)
|
|
|
|
|
|
|
|
dict_overwrite(values["indices"], v, values["index"])
|
|
dict_overwrite(values["indices"], v, values["index"])
|
|
dict_overwrite(values["lowlink"], v, values["index"])
|
|
dict_overwrite(values["lowlink"], v, values["index"])
|
|
@@ -189,32 +171,24 @@ Void function strongconnect(v : String, values : Element):
|
|
successors = values["successors"][v]
|
|
successors = values["successors"][v]
|
|
while (read_nr_out(successors) > 0):
|
|
while (read_nr_out(successors) > 0):
|
|
w = set_pop(successors)
|
|
w = set_pop(successors)
|
|
- log("Found successor " + w)
|
|
|
|
if (bool_not(dict_in(values["indices"], w))):
|
|
if (bool_not(dict_in(values["indices"], w))):
|
|
- log("Recurse!")
|
|
|
|
strongconnect(w, values)
|
|
strongconnect(w, values)
|
|
dict_overwrite(values["lowlink"], v, min(values["lowlink"][v], values["lowlink"][w]))
|
|
dict_overwrite(values["lowlink"], v, min(values["lowlink"][v], values["lowlink"][w]))
|
|
elif (dict_in(values["onStack"], w)):
|
|
elif (dict_in(values["onStack"], w)):
|
|
- log("Check on stack")
|
|
|
|
if (values["onStack"][w]):
|
|
if (values["onStack"][w]):
|
|
- log("Is on stack, so update")
|
|
|
|
dict_overwrite(values["lowlink"], v, min(values["lowlink"][v], values["indices"][w]))
|
|
dict_overwrite(values["lowlink"], v, min(values["lowlink"][v], values["indices"][w]))
|
|
- log("Done")
|
|
|
|
|
|
|
|
if (value_eq(values["lowlink"][v], values["indices"][v])):
|
|
if (value_eq(values["lowlink"][v], values["indices"][v])):
|
|
- log("Start new SCC block")
|
|
|
|
Element scc
|
|
Element scc
|
|
scc = create_node()
|
|
scc = create_node()
|
|
// It will always differ now
|
|
// It will always differ now
|
|
w = list_pop(values["S"])
|
|
w = list_pop(values["S"])
|
|
list_append(scc, w)
|
|
list_append(scc, w)
|
|
dict_overwrite(values["onStack"], w, False)
|
|
dict_overwrite(values["onStack"], w, False)
|
|
- log("REMOVE from stack: " + w)
|
|
|
|
while (w != v):
|
|
while (w != v):
|
|
w = list_pop(values["S"])
|
|
w = list_pop(values["S"])
|
|
list_append(scc, w)
|
|
list_append(scc, w)
|
|
dict_overwrite(values["onStack"], w, False)
|
|
dict_overwrite(values["onStack"], w, False)
|
|
- log("REMOVE from stack: " + w)
|
|
|
|
list_insert(values["SCC"], scc, 0)
|
|
list_insert(values["SCC"], scc, 0)
|
|
|
|
|
|
return!
|
|
return!
|
|
@@ -241,6 +215,7 @@ Void function step_simulation(model : Element, schedule : Element):
|
|
Element memory_blocks
|
|
Element memory_blocks
|
|
Integer i
|
|
Integer i
|
|
Float delta_t
|
|
Float delta_t
|
|
|
|
+ Element scc
|
|
|
|
|
|
time = "time"
|
|
time = "time"
|
|
delta_t = 0.1
|
|
delta_t = 0.1
|
|
@@ -249,9 +224,15 @@ Void function step_simulation(model : Element, schedule : Element):
|
|
output("SIM_TIME " + cast_v2s(read_attribute(model, time, "current_time")))
|
|
output("SIM_TIME " + cast_v2s(read_attribute(model, time, "current_time")))
|
|
i = 0
|
|
i = 0
|
|
while (i < read_nr_out(schedule)):
|
|
while (i < read_nr_out(schedule)):
|
|
- block = list_read(schedule, i)
|
|
|
|
|
|
+ scc = list_read(schedule, i)
|
|
i = i + 1
|
|
i = i + 1
|
|
|
|
|
|
|
|
+ if (list_len(scc) > 1):
|
|
|
|
+ output("ALGEBRAIC_LOOP")
|
|
|
|
+ return !
|
|
|
|
+ else:
|
|
|
|
+ block = set_pop(scc)
|
|
|
|
+
|
|
// Execute "block"
|
|
// Execute "block"
|
|
blocktype = readType(model, block)
|
|
blocktype = readType(model, block)
|
|
if (blocktype == "ConstantBlock"):
|
|
if (blocktype == "ConstantBlock"):
|
|
@@ -451,9 +432,7 @@ Void function execute_cbd(design_model : Element):
|
|
// Conforming, so do the retyping and sanitization step
|
|
// Conforming, so do the retyping and sanitization step
|
|
runtime_model = retype_to_runtime(design_model)
|
|
runtime_model = retype_to_runtime(design_model)
|
|
runtime_model = sanitize(runtime_model, old_runtime_model)
|
|
runtime_model = sanitize(runtime_model, old_runtime_model)
|
|
- log("Create schedule")
|
|
|
|
schedule_init = create_schedule(runtime_model)
|
|
schedule_init = create_schedule(runtime_model)
|
|
- log("Remove schedule")
|
|
|
|
schedule_run = read_root()
|
|
schedule_run = read_root()
|
|
old_runtime_model = runtime_model
|
|
old_runtime_model = runtime_model
|
|
output("CONFORMANCE_OK")
|
|
output("CONFORMANCE_OK")
|