feat: improved triggered iogam

This commit is contained in:
Ferrari Martino Giordano
2024-03-29 16:45:56 +01:00
parent 47f7147e12
commit cbb37b4303
+85 -65
View File
@@ -1,5 +1,7 @@
import copy
import logging
import os
import re
import common as doc
@@ -10,9 +12,9 @@ def __doc_obj__(label, obj, id):
def __doc_common_gam__(name, obj, edges, thread):
inputs = ""
outputs = ""
if "InputSignals" in obj:
inputs = "<table cellborder='0' border='0'>"
outputs = "<table cellborder='0' border='0'>"
if "InputSignals" in obj and len(obj["InputSignals"]):
for i, (l, sig) in enumerate(obj["InputSignals"].items()):
alias = doc.signal_alias(l, sig)
mtype = doc.signal_type(sig)
@@ -25,9 +27,11 @@ def __doc_common_gam__(name, obj, edges, thread):
)
)
if i != 0:
inputs += " | "
inputs += f"<in_{doc.format_name(l)}> {l}"
if "OutputSignals" in obj:
inputs += "<hr/>"
inputs += f"<tr><td port='in_{doc.format_name(l)}'>{l}</td></tr>"
else:
inputs += "<tr><td></td></tr>"
if "OutputSignals" in obj and len(obj["OutputSignals"]):
for i, (l, sig) in enumerate(obj["OutputSignals"].items()):
alias = doc.signal_alias(l, sig)
mtype = doc.signal_type(sig)
@@ -40,51 +44,41 @@ def __doc_common_gam__(name, obj, edges, thread):
)
)
if i != 0:
outputs += " | "
outputs += f"<out_{doc.format_name(l)}> {l}"
return "{ {" + inputs + " } | { " + outputs + "} }", edges
outputs += "<hr/>"
outputs += f"<tr><td port='out_{doc.format_name(l)}'>{l}</td></tr>"
else:
outputs += "<tr><td></td></tr>"
return (
"<tr><td>" + inputs + "</table></td><vr/><td>" + outputs + "</table></td></tr>",
edges,
)
def __doc_triggered_iogam__(name, obj, edges, thread):
signals = ""
if "InputSignals" in obj:
for i, (l, sig) in enumerate(obj["InputSignals"].items()):
alias = doc.signal_alias(l, sig)
mtype = doc.signal_type(sig)
datasrc = sig["DataSource"]
edges.append(
doc.edge(
doc.signal(datasrc, alias, mtype),
doc.signal(name, l, mtype),
thread,
)
def __doc_triggered_iogam__(id, obj, edges, thread):
node = ""
if len(obj["InputSignals"]) > 0:
name = id[2:]
node = __gam__(id, name, "TriggeredIOGAM")
recl = copy.deepcopy(obj)
trg = list(obj["InputSignals"].keys())[0]
sig = obj["InputSignals"][trg]
alias = doc.signal_alias(trg, sig)
mtype = doc.signal_type(sig)
datasrc = sig["DataSource"]
edges.append(
doc.edge(
doc.signal(datasrc, alias, mtype),
doc.signal(id, trg, mtype),
thread,
)
if i > 1:
signals += " | "
signals += f"<in_{doc.format_name(l)}> "
if i == 0:
signals += "Trigger | { { "
else:
signals += f"{l}"
signals += " } | { "
if "OutputSignals" in obj:
for i, (l, sig) in enumerate(obj["OutputSignals"].items()):
alias = doc.signal_alias(l, sig)
mtype = doc.signal_type(sig)
datasrc = sig["DataSource"]
edges.append(
doc.edge(
doc.signal(name, l, mtype),
doc.signal(datasrc, alias, mtype),
thread,
)
)
if i != 0:
signals += " | "
signals += f"<out_{doc.format_name(l)}> {l} "
signals += " } }"
node = f'{name} [tooltip=" TriggeredIOGAM::{name} ", label="{name}&#92;nTriggeredIOGAM | {signals}", style=filled, fillcolor="#eee"];\n'
)
node += f"<tr><td port='in_{doc.format_name(trg)}' colspan='2'><b>Trigger</b></td></tr><hr/>"
del recl["InputSignals"][trg]
sigs, edges = __doc_common_gam__(id, recl, edges, thread)
node += sigs
node += "</table>>];"
return node, edges
@@ -170,22 +164,22 @@ def __doc_iogam__(id, obj, edges, thread):
inode = f"{id}_{counter} [shape=plaintext,"
inode += f'tooltip=" IOGAM::{id} ", label=<'
inode += "<table cellspacing='0' cellborder='1'"
inode += f" cellpadding='4' border='0' bgcolor='{fill}'>"
inode += "<table cellspacing='0' cellborder='0' style='rounded'"
inode += f" cellpadding='4' border='1' bgcolor='{fill}'>"
if bold:
for i in range(total):
inode += "<tr>"
if i < len(irows):
inode += f'<td port="in_{i}" bgcolor="{fill}"'
inode += f'<td port="in_{i}"'
if len(orows) > len(irows):
inode += f' rowspan="{len(orows)}"'
inode += ">"
inode += f'<font color="{fcolor}">'
inode += irows[i]
inode += "</font></td>"
inode += "</font></td><vr/>"
if i < len(orows):
inode += f'<td port="out_{i}" bgcolor="{fill}"'
inode += f'<td port="out_{i}"'
if len(orows) < len(irows):
inode += f' rowspan="{len(irows)}"'
inode += ">"
@@ -193,9 +187,9 @@ def __doc_iogam__(id, obj, edges, thread):
inode += orows[i]
inode += "</font></td>"
inode += "</tr>"
else:
inode += "<tr><td port='in_0'></td>"
inode += "<td port='out_0'></td></tr>"
if i < total - 1:
inode += "<hr/>"
inode += "</table>>"
inode += "];\n"
if not bold:
@@ -211,7 +205,7 @@ def __doc_iogam__(id, obj, edges, thread):
def __doc_constgam__(id, obj, edges, thread):
node = f" {id} [shape=plaintext, label=<<table cellspacing='0' cellborder='1' cellpadding='4' border='0'>"
node = f" {id} [shape=plaintext, label=<<table cellspacing='0' cellborder='0' cellpadding='4' border='1' style='rounded'>"
node += f"<tr><td colspan='2'><b>{id[2:]}</b><br/>{obj['Class']}</td></tr>"
if "OutputSignals" in obj:
@@ -226,8 +220,9 @@ def __doc_constgam__(id, obj, edges, thread):
thread,
)
)
node += f'<tr><td bgcolor="#eee">{doc.type_to_string(mtype)}<br/><font point-size="8">{l}</font></td>'
node += f'<td port="out_{doc.format_name(l)}">'
node += "<hr/>"
node += f'<tr><td>{doc.type_to_string(mtype)}<br/><font point-size="8">{l}</font></td>'
node += f'<vr/><td port="out_{doc.format_name(l)}">'
node += f'{sig["Default"]}</td></tr>'
node += "</table>>];\n"
return node, edges
@@ -297,18 +292,42 @@ def __doc_events__(id, obj, edges, thread):
def __sanitize__(expression):
expression = expression.strip()
expression = re.sub(" +", " ", expression)
if expression[0] == "\n":
expression = expression[1:]
return expression.replace(">", "&gt;").replace("<", "&lt;").replace("\n", "&#92;n")
if expression[-1] == "\n":
expression = expression[:-1]
expression = (
expression.replace("&", "&amp;")
.replace(">", "&gt;")
.replace("<", "&lt;")
.replace("\n", "<br/>")
)
return expression
def __gam__(id, label, cls):
node = f" {id} [shape=plaintext, label=<<table border='1' cellborder='0' cellpadding='0' style='rounded'>"
node += f"<tr><td colspan='2'><b>{label}</b><br/>{cls}</td></tr><hr/>"
return node
def __doc_mathgam__(id, obj, edges, thread):
label = id[2:]
node = f' {id} [label="{label}&#92;n{obj["Class"]} | '
node += __sanitize__(obj["Expression"]) + " | "
import sys
node = __gam__(id, label, obj["Class"])
node += (
"<tr><td colspan='2' align='left' balign='left' bgcolor='#fef'><font face='mono' point-size='9'>"
+ __sanitize__(obj["Expression"])
+ "</font></td></tr><hr/> "
)
sigs, edges = __doc_common_gam__(id, obj, edges, thread)
if sigs:
node += sigs + '"];'
node += sigs + "</table>>];"
else:
node = ""
return node, edges
@@ -328,10 +347,10 @@ def __doc_gam__(label, obj, edges, thread, classfilter=True):
cls = obj["Class"]
if classfilter and cls in __gams_fns__:
return __gams_fns__[cls](id, obj, edges, thread)
node = f' {id} [label="{label}&#92;n{obj["Class"]} | '
node = __gam__(id, label, cls)
sigs, edges = __doc_common_gam__(id, obj, edges, thread)
if sigs:
node += sigs + '"];'
node += sigs + "</table>>];"
else:
node = ""
return node, edges
@@ -494,6 +513,7 @@ def __state_full_graph__(label, state, app):
graph = f"digraph {label[1:]}" + "{\n"
graph += "ranksep = 2;\n"
graph += "nodesep = 0.05;\n"
graph += 'fontname="mono"\n'
graph += "rankdir = LR;\n"
graph += "node [shape=Mrecord];\n"
graph += f"label=<State: <B>{label[1:]}</B>>;\n"