muMLE/examples/cbd/models/mm_design.od

129 lines
2.9 KiB
Text

Block:Class {
abstract = True;
}
InPort:Class {
# abstract = True;
}
OutPort:Class {
# abstract = True;
}
hasInPort:Association (Block -> InPort) {
# Every Port contained by exactly one Block:
source_lower_cardinality = 1;
source_upper_cardinality = 1;
}
hasOutPort:Association (Block -> OutPort) {
# Every Port contained by exactly one Block:
source_lower_cardinality = 1;
source_upper_cardinality = 1;
}
link:Association (OutPort -> InPort) {
#abstract = True;
# Every InPort connected to exactly one OutPort
source_lower_cardinality = 1;
source_upper_cardinality = 1;
}
# In- and Out-Ports are labeled:
# hasInPort_label:AttributeLink (hasInPort -> String) {
# name = "label";
# optional = False;
# }
# hasOutPort_label:AttributeLink (hasOutPort -> String) {
# name = "label";
# optional = False;
# }
# Function Block: pure function that computes outputs based on inputs
Function:Class
:Inheritance (Function -> Block)
Function_func:AttributeLink (Function -> ActionCode) {
name = "func";
optional = False;
}
DetailedFunction:Class
:Inheritance (DetailedFunction -> Function)
VeryDetailedFunction:Class
:Inheritance (VeryDetailedFunction -> DetailedFunction)
# Delay Block
Delay:Class {
constraint = ```
errors = []
num_inports = len(get_outgoing(this, "hasInPort"))
num_outports = len(get_outgoing(this, "hasOutPort"))
if num_inports != 1:
errors.append(f"Delay block must have one inport, instead got {num_inports}")
in_type = None
else:
in_type = get_type_name(get_target(get_outgoing(this, "hasInPort")[0]))
if num_outports != 1:
errors.append(f"Delay block must have one inport, instead got {num_outports}")
out_type = None
else:
out_type = get_type_name(get_target(get_outgoing(this, "hasOutPort")[0]))
# if in_type != None and out_type != None and in_type[0:3] != out_type[0:3]:
# errors.append(f"Inport type ({in_type}) differs from outport type ({out_type})")
errors
```;
}
:Inheritance (Delay -> Block)
# Object Diagrams are statically typed, so we must create in/out-ports, and MemorySlots for all primitive types:
# # Port types
# BoolInPort:Class
# IntInPort:Class
# StrInPort:Class
# BoolOutPort:Class
# IntOutPort:Class
# StrOutPort:Class
# :Inheritance (BoolInPort -> InPort)
# :Inheritance (IntInPort -> InPort)
# :Inheritance (StrInPort -> InPort)
# :Inheritance (BoolOutPort -> OutPort)
# :Inheritance (IntOutPort -> OutPort)
# :Inheritance (StrOutPort -> OutPort)
# # Link types
# boolLink:Association (BoolOutPort -> BoolInPort)
# intLink:Association (IntOutPort -> IntInPort)
# strLink:Association (StrOutPort -> StrInPort)
# :Inheritance (boolLink -> link)
# :Inheritance (intLink -> link)
# :Inheritance (strLink -> link)
# # Delay block types
# BoolDelay:Class
# IntDelay:Class
# StrDelay:Class
# :Inheritance (BoolDelay -> Delay)
# :Inheritance (IntDelay -> Delay)
# :Inheritance (StrDelay -> Delay)