A fully working version of the scheduling language with added examples

This commit is contained in:
robbe 2025-06-27 12:21:41 +02:00
parent ec42f74960
commit ebfd85a666
126 changed files with 7235 additions and 981 deletions

View file

@ -0,0 +1,60 @@
digraph G {
rankdir=LR;
compound=true;
node [shape=rect];
{% for node in nodes %}
{{ node }}
{% endfor %}
{% for edge in edges %}
{{ edge }}
{% endfor %}
}
{% macro Node(label, id, ports_exec=[], ports_data=[]) %}
subgraph cluster_{{ id }} {
label = "{{ id }}__{{ label }}";
style = rounded;
input_{{ id }} [
shape=rect;
label= {{ Gate_Table(ports_exec[0], ports_data[0]) }}
];
output_{{ id }} [
shape=rect;
label= {{ Gate_Table(ports_exec[1], ports_data[1]) }}
];
input_{{ id }}->output_{{ id }} [style=invis];
}
{%- endmacro %}
{%- macro Edge(from_id, to_id, from_gate, to_gate, prefix, color) %}
output_{{ from_id }}:{{ prefix }}_{{ from_gate }} -> input_{{ to_id }}:{{ prefix }}_{{ to_gate }} [color = {{ color }}]
{%- endmacro %}
{%- macro Gate_Table(ports_exec, ports_data) %}
<<TABLE BORDER="0" CELLBORDER="0" CELLSPACING="0">
{% if ports_exec or ports_data %}
{% if ports_exec %}
<TR><TD>
<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" COLOR="darkblue">
{% for port_e in ports_exec %}
<TR><TD PORT="e_{{ port_e }}">{{ port_e }}</TD></TR>
{% endfor %}
</TABLE>
</TD></TR>
{% endif %}
{% if ports_data %}
<TR><TD>
<TABLE BORDER="1" CELLBORDER="1" CELLSPACING="0" COLOR="green">
{% for port_d in ports_data %}
<TR><TD PORT="d_{{ port_d }}">{{ port_d }}</TD></TR>
{% endfor %}
</TABLE>
</TD></TR>
{% endif %}
{% else %}
<TR><TD>X</TD></TR>
{% endif %}
</TABLE>>
{%- endmacro %}

View file

@ -0,0 +1,28 @@
{% for id, param in nodes.items() -%}
{{ param[0] }}:{{ param[1].pop("type") }}
{%- if param[1] %}
{
{% for key, value in param[1].items() %}
{% if value %}
{% if key in ["file"] %}
{% set value = '"' ~ value ~ '"' %}
{% elif key in ["custom"] %}
{% set value = '`"' ~ value.replace('\n', '\\n') ~ '"`' %}
{% elif key in ["action", "init"] %}
{% set value = '\n```\n' ~ value ~ '\n```' %}
{% elif key in ["ports", "ports_exec_in", "ports_exec_out", "ports_data_in", "ports_data_out", "rename", "delete"] %}
{% set value = '`' ~ value.replace('\n', '\\n') ~ '`' %}
{% endif %}
{{ key }} = {{ value }};
{% endif %}
{% endfor %}
}
{% endif %}
{% endfor %}
{%- for edge in edges %}
{% set source = edge[0] %}
{% set target = edge[1] %}
:Conn_{{ source[2] }} ({{ source[0] }} -> {{ target[0] }}) {from="{{ source[1] }}"; to="{{ target[1] }}";}
{% endfor -%}

View file

@ -0,0 +1,51 @@
{% macro Start(name, ports_exec_out, ports_data_out) %}
{{ name }} = Start({{ ports_exec_out }}, {{ ports_data_out }})
{%- endmacro %}
{% macro End(name, ports_exec_in, ports_data_in) %}
{{ name }} = End({{ ports_exec_in }}, {{ ports_data_in }})
{%- endmacro %}
{% macro Match(name, file, n) %}
{{ name }} = Match("{{ file }}", {{ n }})
{%- endmacro %}
{% macro Rewrite(name, file) %}
{{ name }} = Rewrite("{{ file }}")
{%- endmacro %}
{% macro Action(name, ports_exec_in, ports_exec_out, ports_data_in, ports_data_out, action, init) %}
{{ name }} = Action({{ ports_exec_in }}, {{ ports_exec_out }}, {{ ports_data_in }}, {{ ports_data_out }}, {{ action }}, {{ init }})
{%- endmacro %}
{% macro Modify(name, rename, delete) %}
{{ name }} = Modify({{ rename }}, {{ delete }})
{%- endmacro %}
{% macro Merge(name, ports_data_in) %}
{{ name }} = Merge({{ ports_data_in }})
{%- endmacro %}
{% macro Store(name, ports) %}
{{ name }} = Store({{ ports }})
{%- endmacro %}
{% macro Schedule(name, file) %}
{{ name }} = SubSchedule(schedular, "{{ file }}")
{%- endmacro %}
{% macro Loop(name) %}
{{ name }} = Loop()
{%- endmacro %}
{% macro Print(name, label, custom) %}
{{ name }} = Print("{{ label }}", {{ custom }})
{%- endmacro %}
{% macro Conn_exec(name_from, name_to, from, to) %}
{{ name_from }}.connect({{ name_to }},"{{ from }}","{{ to }}")
{%- endmacro %}
{% macro Conn_data(name_from, name_to, from, to, event) %}
{{ name_from }}.connect_data({{ name_to }}, "{{ from }}", "{{ to }}", {{ event }})
{%- endmacro %}

View file

@ -0,0 +1,48 @@
#generated from somewhere i do not now but it here so live with it
from transformation.schedule.schedule_lib import *
class Schedule:
def __init__(self):
self.start: Start | None = None
self.end: End | None = None
self.nodes: list[DataNode] = []
@staticmethod
def get_matchers():
return [
{% for file in match_files %}
"{{ file }}",
{% endfor %}
]
def init_schedule(self, schedular, rule_executer, matchers):
{% for block in blocks_start_end%}
{{ block }}
{% endfor %}
self.start = {{ start }}
self.end = {{ end }}
{% for block in blocks%}
{{ block }}
{% endfor %}
{% for conn in exec_conn%}
{{ conn }}
{% endfor %}
{% for conn_d in data_conn%}
{{ conn_d }}
{% endfor %}
{% for match in matchers %}
{{ match["name"] }}.init_rule(matchers["{{ match["file"] }}"], rule_executer)
{% endfor %}
self.nodes = [
{% for name in blocks_name%}
{{ name }},
{% endfor %}
]
return None
def generate_dot(self, *args, **kwargs):
return self.start.generate_dot(*args, **kwargs)