feat: improved triggered iogam
This commit is contained in:
+85
-65
@@ -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}\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(">", ">").replace("<", "<").replace("\n", "\n")
|
||||
if expression[-1] == "\n":
|
||||
expression = expression[:-1]
|
||||
|
||||
expression = (
|
||||
expression.replace("&", "&")
|
||||
.replace(">", ">")
|
||||
.replace("<", "<")
|
||||
.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}\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}\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"
|
||||
|
||||
Reference in New Issue
Block a user