From c44d484fe93a972515057a967cfb0169e7fe30fe Mon Sep 17 00:00:00 2001 From: Ferrari Martino Giordano Date: Mon, 11 Mar 2024 11:04:38 +0100 Subject: [PATCH] feat: reduced GAMDataSources --- autodoc/__pycache__/autodoc.cpython-311.pyc | Bin 18803 -> 21682 bytes autodoc/autodoc.py | 141 ++++++++++++++------ 2 files changed, 103 insertions(+), 38 deletions(-) diff --git a/autodoc/__pycache__/autodoc.cpython-311.pyc b/autodoc/__pycache__/autodoc.cpython-311.pyc index a12babdc8a9048672e422adf577af4b77e6424a9..2f6d3adf1f8f2b5262263d459fef93a597601950 100644 GIT binary patch delta 9235 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 Iz4veVKfefNZU6uP delta 6494 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 1: @@ -136,6 +139,7 @@ def __doc_triggered_iogam__(name, obj, edges): __edge__( __sig__(name, l, mtype), __sig__(datasrc, alias, mtype), + thread, ) ) if i != 0: @@ -145,7 +149,7 @@ def __doc_triggered_iogam__(name, obj, edges): return node, edges -def __doc_iogam__(id, obj, edges): +def __doc_iogam__(id, obj, edges, thread): node = "" if "InputSignals" in obj and "OutputSignals" in obj: inputs, outputs = obj["InputSignals"], obj["OutputSignals"] @@ -173,6 +177,7 @@ def __doc_iogam__(id, obj, edges): __edge__( __sig__(datasrc, alias, mtype), __sig__(id, in_label, mtype), + thread, ) ) while osize < isize and j < len(outputs): @@ -191,6 +196,7 @@ def __doc_iogam__(id, obj, edges): __edge__( __sig__(id, out_label, mtype), __sig__(datasrc, alias, mtype), + thread, ) ) if isize == osize and irow and orow: @@ -206,7 +212,7 @@ def __doc_iogam__(id, obj, edges): return node, edges -def __doc_constgam__(id, obj, edges): +def __doc_constgam__(id, obj, edges, thread): node = "" if "OutputSignals" in obj: for i, (l, sig) in enumerate(obj["OutputSignals"].items()): @@ -214,28 +220,30 @@ def __doc_constgam__(id, obj, edges): alias = __sig_alias__(l, sig) mtype = __sig_type__(sig) edges.append( - __edge__(__sig__(id, l, mtype), __sig__(datasrc, alias, mtype)) + __edge__(__sig__(id, l, mtype), __sig__(datasrc, alias, mtype), thread) ) if i != 0: node += " | " - node += f' {sig["Default"]} ' + node += ( + f' {__type_to_str__(mtype)}: {sig["Default"]}' + ) node += "" return node, edges -def __doc_gam__(label, obj, edges): +def __doc_gam__(label, obj, edges, thread): id = f"fn{label}" cls = obj["Class"] node = f' {id} [label="{label}\n{obj["Class"]} | ' if cls == "ConstantGAM": - sigs, datasources = __doc_constgam__(id, obj, edges) + sigs, datasources = __doc_constgam__(id, obj, edges, thread) elif cls == "IOGAM": - sigs, datasources = __doc_iogam__(id, obj, edges) + sigs, datasources = __doc_iogam__(id, obj, edges, thread) elif cls == "TriggeredIOGAM": - sigs, datasources = __doc_triggered_iogam__(id, obj, edges) + sigs, datasources = __doc_triggered_iogam__(id, obj, edges, thread) else: - sigs, datasources = __doc_common_gam__(id, obj, edges) + sigs, datasources = __doc_common_gam__(id, obj, edges, thread) if sigs: node += sigs + '"];' else: @@ -243,48 +251,107 @@ def __doc_gam__(label, obj, edges): return node, datasources -def __process_gamds__(name, signals): +def __process_gamds__(name, signals, edges): node = "" - for i, sig_name in enumerate(signals): + ok = False + outputs = {} + inputs = {} + for sig_name in signals: + for edge in edges: + if edge[0][0] == name and edge[0][1] == sig_name: + if sig_name not in outputs: + outputs[sig_name] = [] + outputs[sig_name].append(edge) + elif edge[1][0] == name and edge[1][1] == sig_name: + if sig_name not in inputs: + inputs[sig_name] = [] + inputs[sig_name].append(edge) + to_reduce = [] + to_keep = [] + for sig_name in signals: + if sig_name in inputs and sig_name in outputs: + to_reduce.append(sig_name) + else: + to_keep.append(sig_name) + for sig_name in to_reduce: + ins = inputs[sig_name] + outs = outputs[sig_name] + for edge in ins: + edges.remove(edge) + for edge in outs: + edges.remove(edge) + for in_edge in ins: + for out_edge in outs: + edge = (in_edge[0], out_edge[1], in_edge[-1]) + edges.append(edge) + + for i, sig_name in enumerate(to_keep): + if i > 0: + node += " | " sig_type = signals[sig_name] - node += f'{name}_{__sig_name__(sig_name)}[ label=" {name}::{sig_name} ({sig_type[0]}[{sig_type[1]}])", color=blue];\n' - return node + node += f"<{__sig_name__(sig_name)}> {sig_name} ({__type_to_str__(sig_type)})" + if node: + node = f'{name} [label="{name}\nGAMDataSource | {node}", color=blue];\n' + return node, edges def __process_ds__(name, obj, edges): cls = obj["Class"] sigs = {} node = "" + thread = "" for edge in edges: if edge[0][0] == name: sigs[edge[0][1]] = edge[0][2] + if not thread: + thread = edge[-1] if edge[1][0] == name: sigs[edge[1][1]] = edge[1][2] + if not thread: + thread = edge[-1] if sigs: if cls == "GAMDataSource": - node = __process_gamds__(name, sigs) + node, edges = __process_gamds__(name, sigs, edges) else: order = [] + lost = [] if "Signals" in obj: for sig in obj["Signals"]: if sig in sigs: order.append(sig) else: order = list(sigs.keys()) - + for sig in sigs: + if sig not in order: + lost.append(sig) node = f'{name} [label="{name}\n{cls} | ' for i, sig_name in enumerate(order): - sig_type = sigs[sig_name] if i > 0: node += " | " - node += f"<{__sig_name__(sig_name)}> {sig_name} ({sig_type[0]}[{sig_type[1]}])" + sig_type = sigs[sig_name] + node += f"<{__sig_name__(sig_name)}> {sig_name} ({__type_to_str__(sig_type)})" + + for sig_name in lost: + logging.warning(f"Lost signal {name}:{sig_name}") + if node: + node += " | " + sig_type = sigs[sig_name] + node += f"<{__sig_name__(sig_name)}> {sig_name} ({__type_to_str__(sig_type)})" node += '", color=blue];\n' - return node + if cls != "RealTimeThreadAsyncBridge" and node: + node = f"subgraph cluster_{thread}" + "{" + node + "};" + return node, edges + + +def __type_to_str__(mtype): + if mtype[1] != 1: + return f"{mtype[0]}[{mtype[1]}]" + return mtype[0] def __process_edges__(edges, datasources): arrows = "" - for source, target in edges: + for source, target, _ in edges: src_obj = source[0] src_sig = __sig_name__(source[1]) trg_obj = target[0] @@ -292,27 +359,25 @@ def __process_edges__(edges, datasources): a = f"{src_obj}" b = f"{trg_obj}" if src_obj in datasources: - if datasources[src_obj] == "GAMDataSource": - a += f"_{src_sig}" - else: - a += f":{src_sig}" + a += f":{src_sig}" else: a += f":out_{src_sig}" if trg_obj in datasources: - if datasources[trg_obj] == "GAMDataSource": - b += f"_{trg_sig}" - else: - b += f":{trg_sig}" + b += f":{trg_sig}" else: b += f":in_{trg_sig}" - arrows += f"{a} -> {b};\n" + + in_type = __type_to_str__(source[2]) + out_type = __type_to_str__(target[2]) + mtype = in_type if in_type == out_type else f"{in_type} -> {out_type}" + arrows += f'{a} -> {b} [tooltip="{mtype}", labelfloat=false];\n' return arrows def __doc_state__(label, state, app): mdstate = "" graph = f"digraph {label[1:]}" + "{\n" - graph += "grapn [ranksep=4];\n" + graph += "graph [ranksep=2];\n" graph += "rankdir = LR;\n" graph += "beautify = true;\n" graph += "node [shape=record];\n" @@ -324,20 +389,20 @@ def __doc_state__(label, state, app): if "+Threads" in state: for tname, obj in state["+Threads"].items(): if tname[0] == "+": - # graph += f"subgraph cluster_{tname[1:]}" + "{\n" + graph += f"subgraph cluster_{tname[1:]}" + "{\n" if "Functions" in obj: fns = obj["Functions"] for fn in fns: obj = app["+Functions"][f"+{fn}"] - node, edges = __doc_gam__(fn, obj, edges) + node, edges = __doc_gam__(fn, obj, edges, tname[1:]) graph += f"{node}\n" - # graph += f' label = "{tname[1:]}";\n' - # graph += "}\n" + graph += f' label = "{tname[1:]}";\n' + graph += "}\n" if "+Data" in app: for key, obj in app["+Data"].items(): if key[0] == "+": datasources[key[1:]] = obj["Class"] - node = __process_ds__(key[1:], obj, edges) + node, edges = __process_ds__(key[1:], obj, edges) graph += node arrows = __process_edges__(edges, datasources) graph += "\n" + ext + "\n" + arrows