From 432e3d75499db8978a8726f7a74ecbf56b50725f Mon Sep 17 00:00:00 2001 From: Martino Ferrari Date: Tue, 12 Mar 2024 07:12:16 +0100 Subject: [PATCH] feat: better iogam --- autodoc/__main__.py | 3 +- autodoc/__pycache__/__main__.cpython-311.pyc | Bin 4293 -> 4238 bytes autodoc/__pycache__/autodoc.cpython-311.pyc | Bin 21864 -> 23871 bytes autodoc/autodoc.py | 182 ++++++++++++------- 4 files changed, 117 insertions(+), 68 deletions(-) diff --git a/autodoc/__main__.py b/autodoc/__main__.py index 24bbe14..dbc9de4 100644 --- a/autodoc/__main__.py +++ b/autodoc/__main__.py @@ -7,7 +7,6 @@ Email: martinogiordano.ferrari@iter.org import json import logging import os -import pprint import sys from argparse import ArgumentParser @@ -62,7 +61,7 @@ def main(): f"Impossible to parse file `{args.filename}` at position ({e.line},{e.col}): {e.msg}`" ) sys.exit(1) - except Exception as e: + except Exception: logging.error(f"Sometihng went wrong with file `{args.filename}`") sys.exit(1) else: diff --git a/autodoc/__pycache__/__main__.cpython-311.pyc b/autodoc/__pycache__/__main__.cpython-311.pyc index 34b8f58d4d0684ae31e174e9df0235e0d42c4651..f6a05d4efd57a433bb53f7584ea2e156c4eeabc3 100644 GIT binary patch delta 307 zcmX@A*r&+5oR^o20SL-C-={vB$ScX%G*Mm0kvWGomo18oks*aKg(ZhQmm`WJmothJ z%xB8sisDLPjp9yWYhj4uNnr<)ys3OC9NA1DgNk^V7*csR&dFk7OqtBis>&#`S(jCu zk+EU3D_Z~~^RW`y$v$k7lQ*(kFy5W~ihaFwYYI;-a~*RzV~GYxKLn^S6qztGO#a6% zKKV3W;Q*bY;n@&-8==1lTG=)MH&M6hs>m$1sM(ta=B_TAC`9HbkSr! zqG<=@9Mxn5lE;`t-ISS+DYLk#vmeu91d_Kn;^T7@GxOr(HTiF`$H%ASC&$MZ@dAx1 fQU?**Kw|PF{!A`6AcGNzi`P$P6)>D^FVF@6CV@!2 delta 344 zcmeBEJgUgMoR^o20SK%)UZ;MY$ScX%HBnv1lPQNaiZz8Xg*k^UmpzJ|kpakN$>GT5 zjN;7YisAzEnR2+JxKmi8cv9F}7@~Mn*nuQpDt`(`HWSFeA|57&RKAT4X3kh9c`)=E(~< z#U~%;@Rfon$@7FMEoZ1;j${C8(ViT@CAQg!Gnbi7AE>i9XY*2?0>;Uwc)2Ev@_lnR z2Z|jslX4bhI4sEJYRG(8+L6;mllh1yFOYM@%+OVb`KS&nkbR6()J==|m==qh9{Vvv zMj&~MBR)PiF*7edUQ=MQ55EM*Ew+M!qRhOK$tnDqT<$=F89^5An0%ezke#;y3@5V* GbN~Pcp;Xua diff --git a/autodoc/__pycache__/autodoc.cpython-311.pyc b/autodoc/__pycache__/autodoc.cpython-311.pyc index e92540ae56903a3939d113985f3ab74b0a0c2d30..4c4cf9a75b9f5c89190c2fab764748bd7eb7155b 100644 GIT binary patch delta 7122 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 diff --git a/autodoc/autodoc.py b/autodoc/autodoc.py index 0d141b3..12c6edc 100644 --- a/autodoc/autodoc.py +++ b/autodoc/autodoc.py @@ -3,7 +3,6 @@ Autodoc functions """ import logging import os -import sys __PATH__ = "." @@ -41,8 +40,16 @@ def __num_bytes__(sig): noe = 1 if "NumberOfElements" not in sig else int(sig["NumberOfElements"]) nod = 1 if "NumberOfDimensions" not in sig else int(sig["NumberOfDimensions"]) nod = nod if nod > 0 else 1 + noe = noe if noe > 0 else 1 bytes = __type_bytes__(sig["Type"]) - return noe * nod * bytes + tot = noe * nod + + if "Ranges" in sig: + tot = 0 + for i0, ie in sig["Ranges"]: + tot += int(ie) - int(i0) + 1 + + return tot * bytes def __doc_app_state__(state, tab=" │ "): @@ -66,7 +73,8 @@ def __sig_type__(sig): nod = int(sig["NumberOfDimensions"]) if "NumberOfDimensions" in sig else 1 nod = nod if nod > 0 else 1 dim = noe * nod - return (type_name, dim) + range = sig["Ranges"] if "Ranges" in sig else [] + return (type_name, dim, range) def __sig_alias__(name, signal): @@ -158,59 +166,71 @@ def __doc_iogam__(id, obj, edges, thread): output_names = list(outputs.keys()) input_names = list(inputs.keys()) j = 0 - isize = 0 - osize = 0 + input_size = 0 + output_size = 0 i = 0 irow = "" orow = "" - - while i < len(inputs): - in_label = input_names[i] - input = inputs[in_label] - if irow: - irow += " | " - irow += f" {in_label}" - isize += __num_bytes__(input) - i += 1 - alias = __sig_alias__(in_label, input) - mtype = __sig_type__(input) - datasrc = input["DataSource"] - edges.append( - __edge__( - __sig__(datasrc, alias, mtype), - __sig__(id, in_label, mtype), - thread, + counter = 0 + while i < len(inputs) and j < len(outputs): + irelcount = 0 + orelcount = 0 + bold = False + while input_size <= output_size and i < len(inputs): + in_label = input_names[i] + input = inputs[in_label] + if irow: + irow += " | " + input_size += __num_bytes__(input) + i += 1 + alias = __sig_alias__(in_label, input) + mtype = __sig_type__(input) + if mtype[2]: + bold = True + irow += f" {__type_to_str__(mtype)}" + datasrc = input["DataSource"] + edges.append( + __edge__( + __sig__(datasrc, alias, mtype), + __sig__(f"{id}_{counter}", f"{irelcount}", mtype), + thread, + ) ) - ) - while osize < isize and j < len(outputs): + irelcount += 1 + while output_size < input_size and j < len(outputs): out_label = output_names[j] output = outputs[out_label] - osize += __num_bytes__(output) + output_size += __num_bytes__(output) if orow: orow += " | " - orow += f" {out_label}" j += 1 - alias = __sig_alias__(out_label, output) mtype = __sig_type__(output) + if mtype[2]: + bold = True + orow += f" {__type_to_str__(mtype)}" datasrc = output["DataSource"] edges.append( __edge__( - __sig__(id, out_label, mtype), + __sig__(f"{id}_{counter}", f"{orelcount}", mtype), __sig__(datasrc, alias, mtype), thread, ) ) - if isize == osize and irow and orow: - if node: - node += " | " - node += "{ {" + irow + "} | {" + orow + "} }" - irow = "" - orow = "" - if irow or orow: - if node: - node += " | " + orelcount += 1 + fill = "#999" + fsize = 14.0 + if bold or irelcount > 1 or orelcount > 1: + fill = "#333" + else: + fsize = 8.0 + node += f'{id}_{counter} [tooltip=" IOGAM::{id} " label="' node += "{ {" + irow + "} | {" + orow + "} }" + node += f'", fillcolor="{fill}", color="#666", style=filled,' + node += f' fontcolor="#fff", fontsize={fsize}, height=0];\n' + irow = "" + orow = "" + counter += 1 return node, edges @@ -222,7 +242,11 @@ def __doc_constgam__(id, obj, edges, thread): alias = __sig_alias__(l, sig) mtype = __sig_type__(sig) edges.append( - __edge__(__sig__(id, l, mtype), __sig__(datasrc, alias, mtype), thread) + __edge__( + __sig__(id, l, mtype), + __sig__(datasrc, alias, mtype), + thread, + ) ) if i != 0: node += " | " @@ -241,7 +265,7 @@ def __doc_gam__(label, obj, edges, thread): if cls == "ConstantGAM": sigs, datasources = __doc_constgam__(id, obj, edges, thread) elif cls == "IOGAM": - sigs, datasources = __doc_iogam__(id, obj, edges, thread) + return __doc_iogam__(id, obj, edges, thread) elif cls == "TriggeredIOGAM": sigs, datasources = __doc_triggered_iogam__(id, obj, edges, thread) else: @@ -255,37 +279,48 @@ def __doc_gam__(label, obj, edges, thread): def __process_gamds__(name, signals, edges): node = "" - ok = False outputs = {} inputs = {} - for sig_name in signals: + done = False + while not done: + signals = {} for edge in edges: - if edge[0][0] == name and edge[0][1] == sig_name: + if edge[0][0] == name: + sig_name = edge[0][1] + signals[sig_name] = edge[0][2] 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: + elif edge[1][0] == name: + sig_name = edge[1][1] + signals[sig_name] = edge[1][2] 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) + to_reduce = [] + to_keep = [] + done = True + 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: + if edge in edges: + done = False + edges.remove(edge) + for edge in outs: + if edge in edges: + done = False + 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: @@ -346,14 +381,26 @@ def __process_ds__(name, obj, edges): node += f"<{__sig_name__(sig_name)}> {sig_name} ({__type_to_str__(sig_type)})" node += '", color=blue];\n' if not multi_thread and node: - node = f"subgraph cluster_{thread}" + "{" + node + "};" + node = f"subgraph cluster_{thread}" + "{\n" + node + "};\n" return node, edges def __type_to_str__(mtype): + range = "" + if mtype[2]: + range = ( + "(" + + ", ".join( + [ + str(i0) if i0 == i1 else (str(i0) + ":" + str(int(i1) + 1)) + for i0, i1 in mtype[2] + ] + ) + + ")" + ) if mtype[1] != 1: - return f"{mtype[0]}[{mtype[1]}]" - return mtype[0] + return f"{mtype[0]}[{mtype[1]}]{range}" + return mtype[0] + range def __process_edges__(edges, datasources): @@ -387,7 +434,7 @@ def __doc_state__(label, state, app): graph += "graph [ranksep=2];\n" graph += "rankdir = LR;\n" graph += "beautify = true;\n" - graph += "node [shape=record];\n" + graph += "node [shape=Mrecord];\n" graph += "\n" arrows = "" ext = "" @@ -403,7 +450,10 @@ def __doc_state__(label, state, app): obj = app["+Functions"][f"+{fn}"] node, edges = __doc_gam__(fn, obj, edges, tname[1:]) graph += f"{node}\n" - graph += f' label = "{tname[1:]}";\n' + graph += f"\n label = < {tname[1:]} >;\n" + graph += " fontsize = 24.0;\n" + graph += " penwidth = 3;\n" + graph += ' color = "#0A0";\n' graph += "}\n" if "+Data" in app: for key, obj in app["+Data"].items():