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