@memoarchitect/ontology 0.7.0 → 0.8.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +1 -1
- package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +7 -5
- package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +5 -5
- package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +18 -8
- package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +341 -99
- package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +25 -11
- package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +328 -271
- package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +52 -11
- package/examples/gpca-pump/model/catalog/gpca_context.sysml +9 -0
- package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +9 -5
- package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +175 -259
- package/examples/gpca-pump/model/catalog/gpca_operational.sysml +82 -58
- package/examples/gpca-pump/model/catalog/gpca_physical.sysml +5 -10
- package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +101 -100
- package/examples/gpca-pump/model/catalog/gpca_standards.sysml +161 -0
- package/examples/gpca-pump/model/catalog/gpca_system.sysml +15 -2
- package/examples/gpca-pump/model/catalog/gpca_trace.sysml +274 -331
- package/examples/gpca-pump/model/catalog/gpca_verification.sysml +115 -35
- package/examples/gpca-pump/model/catalog/project.sysml +5 -0
- package/examples/gpca-pump/model/catalog/viewpoints/context/views/context_system_context_view.sysml +1 -1
- package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/cybersecurity_cybersecurity_view.sysml +1 -1
- package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_threat_model_view.sysml +1 -1
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/document_architecture_description_view.sysml +1 -1
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_device_interconnect_view.sysml +2 -2
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_mode_state_view.sysml +1 -1
- package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_scenario_sequence_view.sysml +1 -1
- package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_use_case_view.sysml +1 -1
- package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/document_dhf_index_view.sysml +2 -2
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_hazard_analysis_view.sysml +5 -2
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_rmf_view.sysml +4 -2
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_fmea_view.sysml +1 -1
- package/examples/gpca-pump/model/catalog/viewpoints/software/views/document_sdd_view.sysml +1 -1
- package/examples/gpca-pump/model/catalog/viewpoints/software/views/software_software_architecture_view.sysml +2 -2
- package/examples/gpca-pump/model/catalog/viewpoints/usability/views/document_usability_view.sysml +4 -2
- package/examples/gpca-pump/model/catalog/viewpoints/verification/views/document_vv_view.sysml +4 -2
- package/examples/gpca-pump/model/catalog/viewpoints/verification/views/verification_verification_coverage_view.sysml +1 -1
- package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +3 -2
- package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +6 -2
- package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +133 -128
- package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +139 -157
- package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +56 -33
- package/examples/nested-architecture-dsm/model/catalog/traces.sysml +25 -26
- package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +7 -5
- package/examples/ros-mobile-robot/README.md +40 -0
- package/examples/ros-mobile-robot/model/catalog/project.sysml +33 -0
- package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +296 -0
- package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/viewpoint.sysml +7 -0
- package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/views/ros_mobile_robot_overview.sysml +13 -0
- package/examples/software-only-medical-device/model/catalog/project.sysml +4 -0
- package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +11 -5
- package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +56 -60
- package/examples/surgical-robot/model/catalog/surgical_robot.sysml +1 -1
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +10 -15
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +7 -9
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +42 -66
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +56 -66
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +26 -55
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +3 -6
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +0 -18
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +51 -82
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +21 -31
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +12 -8
- package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +28 -21
- package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +57 -33
- package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +102 -79
- package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +5 -5
- package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +21 -6
- package/examples/ui-screen-regions/model/catalog/relationships.sysml +8 -0
- package/examples/ui-screen-regions/model/catalog/traces.sysml +28 -125
- package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +1 -1
- package/extensions/LICENSES/MIT.txt +19 -0
- package/extensions/README.md +94 -0
- package/extensions/aadl/memo.package.yaml +18 -0
- package/extensions/aadl/src/aadl_extension.sysml +6 -0
- package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +147 -0
- package/extensions/aadl/src/methodology/aadl_methodology.sysml +17 -0
- package/extensions/aadl/src/runtime/memo_aadl_runtime.sysml +56 -0
- package/extensions/cloud/memo.package.yaml +18 -0
- package/extensions/cloud/src/cloud_extension.sysml +44 -0
- package/extensions/cloud/src/methodology/cloud_methodology.sysml +17 -0
- package/extensions/container/memo.package.yaml +18 -0
- package/extensions/container/src/container_extension.sysml +37 -0
- package/extensions/container/src/methodology/container_methodology.sysml +17 -0
- package/extensions/messaging/memo.package.yaml +18 -0
- package/extensions/messaging/src/messaging_extension.sysml +64 -0
- package/extensions/messaging/src/methodology/messaging_methodology.sysml +17 -0
- package/extensions/ros/memo.package.yaml +18 -0
- package/extensions/ros/src/methodology/ros_methodology.sysml +25 -0
- package/extensions/ros/src/ros_extension.sysml +200 -0
- package/extensions/template/src/extension.sysml +37 -0
- package/memo.manifest.yaml +13 -2
- package/methodologies/default/memo.package.yaml +1 -1
- package/methodologies/gpca/memo.package.yaml +1 -1
- package/ontology/memo.package.yaml +1 -1
- package/package.json +5 -3
- package/profile/memo.package.yaml +1 -1
- package/src/architecture/decisions/memo_decisions.sysml +23 -2
- package/src/architecture/functional/behavior/memo_behavior.sysml +49 -21
- package/src/architecture/functional/constraints/memo_constraints.sysml +3 -2
- package/src/architecture/functional/functions/memo_functions.sysml +91 -34
- package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +46 -22
- package/src/architecture/implementation/software/structure/memo_software_structure.sysml +37 -10
- package/src/architecture/implementation/ui/memo_ui.sysml +78 -38
- package/src/architecture/logical/interfaces/memo_interfaces.sysml +63 -11
- package/src/architecture/logical/structure/memo_logical_structure.sysml +21 -20
- package/src/architecture/operational/activities/memo_activities.sysml +10 -3
- package/src/architecture/operational/context/actors/memo_actors.sysml +5 -8
- package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +13 -30
- package/src/architecture/operational/context/use_context/memo_use_context.sysml +42 -16
- package/src/architecture/operational/scenarios/memo_scenarios.sysml +57 -23
- package/src/architecture/operational/use_cases/memo_use_cases.sysml +35 -26
- package/src/architecture/operational/workflows/memo_workflows.sysml +29 -10
- package/src/architecture/realization/deployment/memo_deployment.sysml +111 -16
- package/src/architecture/realization/physical/memo_physical_architecture.sysml +27 -2
- package/src/artifacts/configuration_management/memo_configuration_management.sysml +16 -0
- package/src/artifacts/core/memo_controlled_artifacts.sysml +3 -1
- package/src/artifacts/standards/cfr_21_820.sysml +116 -0
- package/src/artifacts/standards/fda_cybersecurity_2023.sysml +80 -0
- package/src/artifacts/standards/iec_60601_1.sysml +149 -0
- package/src/artifacts/standards/iec_60601_1_2.sysml +56 -0
- package/src/artifacts/standards/iec_60812.sysml +51 -0
- package/src/artifacts/standards/iec_62304.sysml +210 -0
- package/src/artifacts/standards/iec_62366_1.sysml +113 -0
- package/src/artifacts/standards/iec_81001_5_1.sysml +84 -0
- package/src/artifacts/standards/iso_13485.sysml +113 -0
- package/src/artifacts/standards/iso_14971.sysml +94 -0
- package/src/artifacts/standards/iso_iec_ieee_42010.sysml +42 -0
- package/src/artifacts/standards/memo_artifacts_standards_traceability.sysml +132 -0
- package/src/artifacts/templates/dhf/21cfr820/design-input.md +1 -1
- package/src/artifacts/templates/dhf/21cfr820/design-output.md +5 -5
- package/src/artifacts/templates/dhf/21cfr820/design-review.md +1 -1
- package/src/artifacts/templates/dhf/21cfr820/design-validation.md +2 -2
- package/src/artifacts/templates/dhf/21cfr820/design-verification.md +2 -2
- package/src/artifacts/templates/dhf/21cfr820/dhf-index.md +2 -2
- package/src/artifacts/templates/dhf/21cfr820/transfer-plan.md +1 -1
- package/src/artifacts/templates/dhf/21cfr820/user-needs.md +1 -1
- package/src/artifacts/templates/dhf/21cfr820/vv-plan.md +3 -3
- package/src/artifacts/templates/dhf/21cfr820/vv-report.md +4 -4
- package/src/artifacts/templates/dhf/fda-cybersecurity/incident-response.md +1 -1
- package/src/artifacts/templates/dhf/fda-cybersecurity/postmarket-surveillance.md +3 -2
- package/src/artifacts/templates/dhf/fda-cybersecurity/security-arch.md +2 -2
- package/src/artifacts/templates/dhf/fda-cybersecurity/threat-model.md +4 -4
- package/src/artifacts/templates/dhf/fda-cybersecurity/vuln-assessment.md +4 -3
- package/src/artifacts/templates/dhf/iec-60601/hrs.md +170 -0
- package/src/artifacts/templates/dhf/iec-62304/detailed-design.md +1 -1
- package/src/artifacts/templates/dhf/iec-62304/integration-test.md +3 -3
- package/src/artifacts/templates/dhf/iec-62304/sad.md +6 -5
- package/src/artifacts/templates/dhf/iec-62304/sbom.md +3 -2
- package/src/artifacts/templates/dhf/iec-62304/sdp.md +5 -4
- package/src/artifacts/templates/dhf/iec-62304/soup.md +4 -2
- package/src/artifacts/templates/dhf/iec-62304/srs.md +54 -20
- package/src/artifacts/templates/dhf/iec-62304/sw-traceability.md +3 -3
- package/src/artifacts/templates/dhf/iec-62304/system-test.md +1 -1
- package/src/artifacts/templates/dhf/iec-62366/summative-eval.md +1 -1
- package/src/artifacts/templates/dhf/iec-62366/task-analysis.md +40 -4
- package/src/artifacts/templates/dhf/iec-62366/ue-plan.md +1 -1
- package/src/artifacts/templates/dhf/iec-62366/urra.md +3 -3
- package/src/artifacts/templates/dhf/iso-14971/fmea.md +42 -19
- package/src/artifacts/templates/dhf/iso-14971/har.md +3 -3
- package/src/artifacts/templates/dhf/iso-14971/rmp.md +2 -2
- package/src/artifacts/templates/dhf/system/sad.md +173 -0
- package/src/artifacts/templates/dhf/system/standards-checklist.md +87 -0
- package/src/artifacts/templates/dhf/system/standards-traceability.md +125 -0
- package/src/artifacts/templates/dhf/system/syrs.md +128 -0
- package/src/assurance/cybersecurity/memo_cybersecurity.sysml +39 -20
- package/src/assurance/human_factors/memo_human_factors.sysml +29 -22
- package/src/assurance/requirements/memo_requirements.sysml +5 -2
- package/src/assurance/requirements/needs/memo_needs.sysml +1 -1
- package/src/assurance/safety_risk/analysis/memo_fmea.sysml +118 -13
- package/src/assurance/safety_risk/memo_risk.sysml +78 -7
- package/src/assurance/safety_risk/postmarket_surveillance/memo_postmarket_surveillance.sysml +16 -0
- package/src/assurance/verification_validation/memo_assurance.sysml +17 -21
- package/src/core/annotations/memo_annotations.sysml +25 -6
- package/src/core/common/memo_common.sysml +121 -16
- package/src/core/consistency_rules/consistency_rules.sysml +1 -1
- package/src/core/dimensions/dimensions.sysml +12 -0
- package/src/core/enumerations/memo_enumerations.sysml +60 -14
- package/src/core/relationships/memo_relationships.sysml +199 -196
- package/src/memo_namespaces.sysml +30 -0
- package/src/methodology/core/memo_core.sysml +24 -0
- package/src/methodology/profiles/memo_profiles.sysml +1 -1
- package/src/rules/ontology/ontology_invariants.sysml +213 -1
- package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +3 -3
- package/src/viewpoints/clinical/clinical_viewpoint.sysml +1 -1
- package/src/viewpoints/context/context_viewpoint.sysml +1 -1
- package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +1 -1
- package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +1 -0
- package/src/viewpoints/functional/functional_viewpoint.sysml +1 -1
- package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +1 -1
- package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +1 -1
- package/src/viewpoints/operational/operational_viewpoint.sysml +1 -1
- package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +1 -1
- package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +1 -1
- package/src/viewpoints/verification/verification_viewpoint.sysml +1 -1
- package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +1 -1
- package/examples/extensions/README.md +0 -16
- package/examples/extensions/template/src/extension.sysml +0 -15
- package/examples/gpca-pump/gpca-pump.kpar +0 -0
- /package/{examples/extensions → extensions}/clinical/memo.package.yaml +0 -0
- /package/{examples/extensions → extensions}/clinical/src/clinical_extension.sysml +0 -0
- /package/{examples/extensions → extensions}/clinical/src/methodology/clinical_methodology.sysml +0 -0
- /package/{examples/extensions → extensions}/clinical/src/procedures/memo_clinical_procedures.sysml +0 -0
- /package/{examples/extensions → extensions}/template/memo.package.yaml +0 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
// ROS 2 (Robot Operating System 2).
|
|
2
|
+
//
|
|
3
|
+
// The acceptance test for MEMO's extension point (plan §10.3): a whole
|
|
4
|
+
// technology stack — nodes, messages, topics, quality of service, services,
|
|
5
|
+
// actions, and
|
|
6
|
+
// containerized deployment — landing without a single change to a base
|
|
7
|
+
// relation. `BuildsInto`, `DeploysTo`, and `ProvidesEnvironment` are reused
|
|
8
|
+
// exactly as the base declares them.
|
|
9
|
+
//
|
|
10
|
+
// Composition is by MODULE LIST, not by chaining. `baseMethodology` is [0..1],
|
|
11
|
+
// but `includedModule` is [0..*], so this extension's methodology names
|
|
12
|
+
// `memo_extension_messaging` and `memo_extension_container` alongside its own
|
|
13
|
+
// module. ROS communication specializes native MEMO item, port, and interface
|
|
14
|
+
// families; it does not invent publish/subscribe relations.
|
|
15
|
+
package memo_extension_ros {
|
|
16
|
+
private import ScalarValues::*;
|
|
17
|
+
|
|
18
|
+
private import memo_core_common::*;
|
|
19
|
+
private import memo_architecture_functional_behavior::*;
|
|
20
|
+
private import memo_architecture_logical_interfaces::*;
|
|
21
|
+
private import memo_architecture_implementation_software_structure::*;
|
|
22
|
+
private import memo_architecture_implementation_software_runtime::*;
|
|
23
|
+
private import memo_extension_messaging::*;
|
|
24
|
+
private import memo_extension_container::*;
|
|
25
|
+
|
|
26
|
+
// ── Quality of service ──────────────────────────────────────────────
|
|
27
|
+
//
|
|
28
|
+
// QoS is the first real customer for "where do per-technology properties
|
|
29
|
+
// live" (plan C3, open question §14.6). The answer is a typed
|
|
30
|
+
// `attribute def` on the extension's own types — NOT the base's
|
|
31
|
+
// `PropertySet` stub, which was one String field and could not say what a
|
|
32
|
+
// reliability setting is. A typed profile can be validated, compared
|
|
33
|
+
// between a publisher and a subscriber, and read by a tool; a property bag
|
|
34
|
+
// cannot. `PropertySet` is deleted in this session for that reason.
|
|
35
|
+
|
|
36
|
+
// ROS 2 RELIABLE resends until delivery; BEST_EFFORT does not. This is
|
|
37
|
+
// the delivery guarantee, so it maps onto MessagingDeliveryKind:
|
|
38
|
+
// bestEffort is atMostOnce, reliable is atLeastOnce.
|
|
39
|
+
enum def RosReliabilityKind {
|
|
40
|
+
enum bestEffort;
|
|
41
|
+
enum reliable;
|
|
42
|
+
}
|
|
43
|
+
// TRANSIENT_LOCAL replays the last samples to a late-joining subscriber;
|
|
44
|
+
// VOLATILE does not. The difference decides whether a node that restarts
|
|
45
|
+
// sees the current state or waits for the next publication — which is a
|
|
46
|
+
// safety-relevant fact when the topic carries a latched mode or setpoint.
|
|
47
|
+
enum def RosDurabilityKind {
|
|
48
|
+
enum volatile;
|
|
49
|
+
enum transientLocal;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
attribute def RosQosProfile {
|
|
53
|
+
attribute reliability : RosReliabilityKind;
|
|
54
|
+
attribute durability : RosDurabilityKind;
|
|
55
|
+
// The QoS contract: a sample is expected at least this often.
|
|
56
|
+
attribute deadlineMs : Real;
|
|
57
|
+
// How long a publisher may be silent before subscribers treat it as
|
|
58
|
+
// lost — ROS 2 liveliness lease duration.
|
|
59
|
+
attribute livelinessLeaseMs : Real;
|
|
60
|
+
// Depth of the history buffer, KEEP_LAST(n) / KEEP_ALL.
|
|
61
|
+
attribute historyDepth : Integer;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// ── Nodes, messages, topics, and endpoint roles ────────────────────
|
|
65
|
+
|
|
66
|
+
// A ROS node. `runtimeKind` is deliberately NOT bound: a node may run as
|
|
67
|
+
// its own process or be composed with others into a single container
|
|
68
|
+
// process, and which one it is is a design decision the model should
|
|
69
|
+
// record rather than a fact the type can assert.
|
|
70
|
+
part def RosNode specializes SoftwareComponent {
|
|
71
|
+
attribute nodeNamespace : String;
|
|
72
|
+
// Whether the node implements the managed-node lifecycle
|
|
73
|
+
// (unconfigured / inactive / active / finalized). A lifecycle-managed
|
|
74
|
+
// node can be brought up in a defined order and held inactive until
|
|
75
|
+
// its preconditions hold, which is how a robot reaches a safe state.
|
|
76
|
+
attribute lifecycleManaged : Boolean;
|
|
77
|
+
attribute executorModel : String;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// A definition is the ROS message contract (`LaserScan`, `Twist`, ...).
|
|
81
|
+
// A named item usage of that definition is a deployed topic (`/scan`).
|
|
82
|
+
// Individual deliveries are native flows/messages between ports that
|
|
83
|
+
// reference the same topic usage.
|
|
84
|
+
abstract item def RosMessage specializes MessagingMessage {
|
|
85
|
+
attribute rosTypeName : String;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
port def RosPublisher specializes MessagingPublisher {
|
|
89
|
+
attribute offeredQos : RosQosProfile;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
port def RosSubscriber specializes MessagingSubscriber {
|
|
93
|
+
attribute requestedQos : RosQosProfile;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
interface def RosTopicInterface specializes MessagingTopicInterface {
|
|
97
|
+
end rosPublisher : RosPublisher :>> publisher;
|
|
98
|
+
end rosSubscriber : RosSubscriber :>> subscriber;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ── Services: one correlated request/reply contract ────────────────
|
|
102
|
+
abstract item def RosServiceRequest specializes RosMessage;
|
|
103
|
+
abstract item def RosServiceResponse specializes RosMessage;
|
|
104
|
+
|
|
105
|
+
port def RosServiceClient specializes SoftwarePort {
|
|
106
|
+
out item request : RosServiceRequest;
|
|
107
|
+
in item response : RosServiceResponse;
|
|
108
|
+
attribute serviceName : String;
|
|
109
|
+
attribute timeoutMs : Real;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
port def RosServiceServer specializes SoftwarePort {
|
|
113
|
+
in item request : RosServiceRequest;
|
|
114
|
+
out item response : RosServiceResponse;
|
|
115
|
+
attribute serviceName : String;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
interface def RosServiceInterface specializes SoftwareInterface {
|
|
119
|
+
end client : RosServiceClient :>> source;
|
|
120
|
+
end server : RosServiceServer :>> target;
|
|
121
|
+
flow of RosServiceRequest from client.request to server.request;
|
|
122
|
+
flow of RosServiceResponse from server.response to client.response;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ── Actions: long-running goal protocol ─────────────────────────────
|
|
126
|
+
// ROS 2 realizes an action through goal/result/cancel services plus
|
|
127
|
+
// feedback/status topics. The port exposes those distinct native message
|
|
128
|
+
// features, so an action cannot be mistaken for a two-message service.
|
|
129
|
+
abstract item def RosActionGoal specializes RosMessage;
|
|
130
|
+
abstract item def RosActionAcceptance specializes RosMessage;
|
|
131
|
+
abstract item def RosActionFeedback specializes RosMessage;
|
|
132
|
+
abstract item def RosActionResult specializes RosMessage;
|
|
133
|
+
abstract item def RosActionCancel specializes RosMessage;
|
|
134
|
+
abstract item def RosActionStatus specializes RosMessage;
|
|
135
|
+
|
|
136
|
+
port def RosActionClient specializes SoftwarePort {
|
|
137
|
+
out item goal : RosActionGoal;
|
|
138
|
+
in item acceptance : RosActionAcceptance;
|
|
139
|
+
in item feedback : RosActionFeedback;
|
|
140
|
+
in item result : RosActionResult;
|
|
141
|
+
out item cancel : RosActionCancel;
|
|
142
|
+
in item actionStatus : RosActionStatus;
|
|
143
|
+
attribute actionName : String;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
port def RosActionServer specializes SoftwarePort {
|
|
147
|
+
in item goal : RosActionGoal;
|
|
148
|
+
out item acceptance : RosActionAcceptance;
|
|
149
|
+
out item feedback : RosActionFeedback;
|
|
150
|
+
out item result : RosActionResult;
|
|
151
|
+
in item cancel : RosActionCancel;
|
|
152
|
+
out item actionStatus : RosActionStatus;
|
|
153
|
+
attribute actionName : String;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
interface def RosActionInterface specializes SoftwareInterface {
|
|
157
|
+
end client : RosActionClient :>> source;
|
|
158
|
+
end server : RosActionServer :>> target;
|
|
159
|
+
flow of RosActionGoal from client.goal to server.goal;
|
|
160
|
+
flow of RosActionAcceptance from server.acceptance to client.acceptance;
|
|
161
|
+
flow of RosActionFeedback from server.feedback to client.feedback;
|
|
162
|
+
flow of RosActionCancel from client.cancel to server.cancel;
|
|
163
|
+
flow of RosActionResult from server.result to client.result;
|
|
164
|
+
flow of RosActionStatus from server.actionStatus to client.actionStatus;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
abstract state def RosActionExecution specializes MemoState;
|
|
168
|
+
state def RosActionAccepted specializes RosActionExecution;
|
|
169
|
+
state def RosActionExecuting specializes RosActionExecution;
|
|
170
|
+
state def RosActionCanceling specializes RosActionExecution;
|
|
171
|
+
state def RosActionSucceeded specializes RosActionExecution;
|
|
172
|
+
state def RosActionCanceled specializes RosActionExecution;
|
|
173
|
+
state def RosActionAborted specializes RosActionExecution;
|
|
174
|
+
|
|
175
|
+
// ── Deployment ──────────────────────────────────────────────────────
|
|
176
|
+
//
|
|
177
|
+
// Nothing below declares a relation. The base's three deployment
|
|
178
|
+
// relations already say everything a ROS deployment needs:
|
|
179
|
+
// BuildsInto SoftwareModule -> RosContainerImage
|
|
180
|
+
// DeploysTo RosContainerImage -> ProcessingNode
|
|
181
|
+
// ProvidesEnvironment ProcessingNode -> RosContainerRuntime
|
|
182
|
+
// That is the proof the base is factored correctly.
|
|
183
|
+
part def RosContainerImage specializes ContainerImage {
|
|
184
|
+
// humble, iron, jazzy, rolling.
|
|
185
|
+
attribute rosDistribution : String;
|
|
186
|
+
// The workspace overlay the image was built from.
|
|
187
|
+
attribute workspaceOverlay : String;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
part def RosContainerRuntime specializes ContainerRuntime {
|
|
191
|
+
attribute rosDistribution : String;
|
|
192
|
+
// The RMW implementation below ROS 2 — rmw_fastrtps_cpp,
|
|
193
|
+
// rmw_cyclonedds_cpp. QoS is enforced here, so it is part of any
|
|
194
|
+
// argument that a QoS profile is actually honoured.
|
|
195
|
+
attribute rmwImplementation : String;
|
|
196
|
+
// ROS_DOMAIN_ID. Two robots sharing a domain see each other's topics,
|
|
197
|
+
// which is a hazard on a shared network and not visible in any node.
|
|
198
|
+
attribute rosDomainId : Integer;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Skeleton for a new MEMO extension. Copy the directory, rename the packages,
|
|
2
|
+
// and replace the prefix.
|
|
3
|
+
//
|
|
4
|
+
// Two conventions this file follows and every extension must (extensions/README.md):
|
|
5
|
+
//
|
|
6
|
+
// 1. Every definition an extension declares is prefixed with the PascalCase
|
|
7
|
+
// form of the extension's directory name — `template/` gives `Template`.
|
|
8
|
+
// Extension names share one flat namespace with the base and with each
|
|
9
|
+
// other, so the prefix is what keeps two independent extensions from both
|
|
10
|
+
// declaring `Node`.
|
|
11
|
+
// 2. A relation an extension declares specializes a base relation. It never
|
|
12
|
+
// roots independently.
|
|
13
|
+
//
|
|
14
|
+
// This package used to bind `baseMethodName = "MedicalDeviceLightDefault"` — a
|
|
15
|
+
// pre-flip spelling that resolves to nothing. It went unnoticed for as long as
|
|
16
|
+
// extensions lived under `examples/`, where the build did not check them; the
|
|
17
|
+
// build checks `extensions/` now, and reported it on the first run.
|
|
18
|
+
package memo_extension_template {
|
|
19
|
+
private import ScalarValues::*;
|
|
20
|
+
private import memo_core_enumerations::*;
|
|
21
|
+
private import memo_methodology_core::*;
|
|
22
|
+
private import memo_methodology_profiles::*;
|
|
23
|
+
|
|
24
|
+
part extensionMethod : MethodologyDefinition {
|
|
25
|
+
attribute :>> id = "EXT-METH-001";
|
|
26
|
+
attribute :>> name = "ExtensionMethod";
|
|
27
|
+
attribute :>> version = "0.1.0";
|
|
28
|
+
attribute :>> domain = "project extension";
|
|
29
|
+
attribute :>> description = "Adds a project or domain package to the selected MEMO methodology.";
|
|
30
|
+
// The base is a typed SysML reference, not a name held in sync by hand.
|
|
31
|
+
ref :>> baseMethodology = mdDefaultDefinition;
|
|
32
|
+
// An extension adds its own module to whatever its base selected;
|
|
33
|
+
// saying so explicitly is required now that an empty list means empty.
|
|
34
|
+
attribute :>> scopeMode = ScopeModeKind::explicit;
|
|
35
|
+
attribute :>> includedModule = "replace_with_extension_package";
|
|
36
|
+
}
|
|
37
|
+
}
|
package/memo.manifest.yaml
CHANGED
|
@@ -19,5 +19,16 @@ examples:
|
|
|
19
19
|
standard-sysml-diagrams: ./examples/sysml-diagram-samples
|
|
20
20
|
ui-screen-regions: ./examples/ui-screen-regions
|
|
21
21
|
nested-architecture-dsm: ./examples/nested-architecture-dsm
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
ros-mobile-robot: ./examples/ros-mobile-robot
|
|
23
|
+
# Extensions are a way to MODEL, not a thing to copy. They are reusable
|
|
24
|
+
# ontology packages that specialize the base, selected by a methodology or a
|
|
25
|
+
# project binding — so they sit beside the ontology, not under examples/.
|
|
26
|
+
# `examples/ros-mobile-robot` demonstrates using one; it is not the extension.
|
|
27
|
+
extensions:
|
|
28
|
+
template: ./extensions/template
|
|
29
|
+
clinical: ./extensions/clinical
|
|
30
|
+
aadl: ./extensions/aadl
|
|
31
|
+
cloud: ./extensions/cloud
|
|
32
|
+
container: ./extensions/container
|
|
33
|
+
messaging: ./extensions/messaging
|
|
34
|
+
ros: ./extensions/ros
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/methodology-default'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.8.22
|
|
11
11
|
description: "MEMO default medical-device methodology \u2014 selects viewpoints/views/DHF documents from @memoarchitect/ontology and adds rules, gates, patterns, profiles, and workflow."
|
|
12
12
|
license: MIT
|
|
13
13
|
tags:
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/methodology-gpca'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.8.22
|
|
11
11
|
description: "GPCA infusion pump methodology \u2014 subtraction-based tailoring of @memoarchitect/methodology-default for the non-networked prototype variant. Excludes cybersecurity and SOUP."
|
|
12
12
|
license: MIT
|
|
13
13
|
tags:
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/ontology'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.8.22
|
|
11
11
|
description: "MEMO \u2014 the single canonical medical-device ontology: core semantics, the Arcadia-inspired architecture layers (context, requirements, behavior, structure, interfaces, risk, cybersecurity,\
|
|
12
12
|
\ assurance, \u2026), compliance, viewpoints, views, and invariant rules. One namespace (memo::), one src/ tree."
|
|
13
13
|
license: MIT
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memoarchitect/ontology",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.22",
|
|
4
4
|
"packageManager": "pnpm@9.15.0",
|
|
5
5
|
"description": "MEMO \u2014 Medical Engineering Modelling Ontology. Pure SysML v2 medical-device ontology with native constraints, portable to any conformant SysML v2 tool (SysIDE, SysON, sysand).",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"build": "bash scripts/build-kpar.sh",
|
|
8
|
-
"check": "bash scripts/build-kpar.sh",
|
|
8
|
+
"check": "bash scripts/build-kpar.sh && npm run lint",
|
|
9
|
+
"lint": "node ../memo-tools/packages/tools/lib/bin/memo.js dhf lint",
|
|
9
10
|
"test": "node --test test/package.test.mjs",
|
|
10
11
|
"docs:api": "node scripts/generate-sysml-api.mjs",
|
|
11
12
|
"docs:diagrams": "node scripts/generate-reference-diagrams.mjs",
|
|
@@ -69,6 +70,7 @@
|
|
|
69
70
|
"src/viewpoints/",
|
|
70
71
|
"src/memo_namespaces.sysml",
|
|
71
72
|
"templates/",
|
|
72
|
-
"examples/"
|
|
73
|
+
"examples/",
|
|
74
|
+
"extensions/"
|
|
73
75
|
]
|
|
74
76
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/medical-modeling-profile'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.8.22
|
|
11
11
|
description: Closure rules and viewpoints for medical device modeling
|
|
12
12
|
license: MIT
|
|
13
13
|
tags:
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
package memo_architecture_decisions {
|
|
2
|
+
private import Metaobjects::SemanticMetadata;
|
|
2
3
|
private import ScalarValues::*;
|
|
3
4
|
|
|
4
5
|
private import memo_core_common::*;
|
|
@@ -13,7 +14,27 @@ package memo_architecture_decisions {
|
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
connection def DecisionRecordedInADR :> MemoRelationship {
|
|
16
|
-
end decision : DesignDecision;
|
|
17
|
-
end adr : ADRArtifact;
|
|
17
|
+
end decision : DesignDecision :>> source;
|
|
18
|
+
end adr : ADRArtifact :>> target;
|
|
19
|
+
}
|
|
20
|
+
abstract connection decisionRecordedInADRLinks : DecisionRecordedInADR[*];
|
|
21
|
+
metadata def <decisionRecordedInADR> DecisionRecordedInADRMetadata :> SemanticMetadata {
|
|
22
|
+
:> annotatedElement : SysML::ConnectionDefinition;
|
|
23
|
+
:> annotatedElement : SysML::ConnectionUsage;
|
|
24
|
+
:>> baseType = decisionRecordedInADRLinks meta SysML::Usage;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// ── Relations owned by this package ─────────────────────────────
|
|
28
|
+
// Moved out of memo_core_relationships: their ends are typed against
|
|
29
|
+
// types declared here, and core must not depend on a domain package.
|
|
30
|
+
connection def Decides :> MemoRelationship {
|
|
31
|
+
end decision : DesignDecision :>> source;
|
|
32
|
+
end affectedElement : MemoPart :>> target;
|
|
33
|
+
}
|
|
34
|
+
abstract connection decidesLinks : Decides[*];
|
|
35
|
+
metadata def <decides> DecidesMetadata :> SemanticMetadata {
|
|
36
|
+
:> annotatedElement : SysML::ConnectionDefinition;
|
|
37
|
+
:> annotatedElement : SysML::ConnectionUsage;
|
|
38
|
+
:>> baseType = decidesLinks meta SysML::Usage;
|
|
18
39
|
}
|
|
19
40
|
}
|
|
@@ -3,29 +3,50 @@ package memo_architecture_functional_behavior {
|
|
|
3
3
|
|
|
4
4
|
private import memo_core_common::*;
|
|
5
5
|
private import memo_core_enumerations::*;
|
|
6
|
+
|
|
7
|
+
// Typed functional execution step. Project-specific action definitions
|
|
8
|
+
// specialize this rather than bypassing MemoAction; ActivityFlow remains
|
|
9
|
+
// the composite route that sequences such steps.
|
|
10
|
+
abstract action def FunctionalAction specializes MemoAction;
|
|
6
11
|
// State machines and their mode states are SysML v2 states (behaviours), so
|
|
7
12
|
// they derive from the MemoState foundation, not the part-based
|
|
8
13
|
// ArchitectureElement. Transitions stay part-based (below) to keep their
|
|
9
14
|
// traceable safety attributes.
|
|
10
|
-
// State
|
|
15
|
+
// State machines retain their own execution semantics; individual modes
|
|
16
|
+
// are MemoState usages selected by stateKind.
|
|
11
17
|
state def StateMachine :> MemoState {
|
|
12
18
|
attribute machineKind : String;
|
|
13
19
|
attribute executionSemantics : String;
|
|
14
20
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
21
|
+
// A configuration is the concrete selection made at a `variation` choice
|
|
22
|
+
// point. It remains separate from a mode state: it says which mode and
|
|
23
|
+
// elements are active in one selectable arrangement.
|
|
24
|
+
// The reference is typed to the shared native state family so a consumer
|
|
25
|
+
// can navigate from the selected configuration to its governing mode.
|
|
26
|
+
part def ModeConfiguration specializes ArchitectureElement {
|
|
27
|
+
ref activeMode : MemoState[1];
|
|
28
|
+
ref activeElement : MemoPart[0..*];
|
|
19
29
|
}
|
|
20
|
-
|
|
30
|
+
// Transitions are native SysML v2 `transition` usages inside the owning
|
|
31
|
+
// state — there is no `part def Transition`, and its `transition` keyword
|
|
32
|
+
// collision is why. A transition usage's definition is always implicit, so
|
|
33
|
+
// it has no MEMO supertype to carry the identification core; this record
|
|
34
|
+
// carries it instead, applied with `@TransitionRecord`.
|
|
35
|
+
//
|
|
36
|
+
// `trigger`, `guardSummary`, and `effectSummary` are prose summaries, not
|
|
37
|
+
// executable semantics: a guard reading "none in source (MEMO extension
|
|
38
|
+
// REQ-X-02 additionally gates therapy on POST)" is a citation. Formal
|
|
39
|
+
// triggers and guards belong in native `accept` and `if`; these stay
|
|
40
|
+
// records so the two are not confused.
|
|
41
|
+
metadata def TransitionRecord {
|
|
42
|
+
attribute id : String;
|
|
43
|
+
attribute name : String;
|
|
21
44
|
attribute trigger : String;
|
|
22
45
|
attribute guardSummary : String;
|
|
23
46
|
attribute effectSummary : String;
|
|
24
|
-
attribute
|
|
25
|
-
attribute sameStepCritical : Boolean;
|
|
26
|
-
attribute sourceState : String;
|
|
27
|
-
attribute targetState : String;
|
|
47
|
+
attribute sourceReference : String;
|
|
28
48
|
}
|
|
49
|
+
|
|
29
50
|
// A verifiable behavioural constraint, such as an invariant, transition
|
|
30
51
|
// rule, temporal claim, assumption, or guarantee.
|
|
31
52
|
part def BehaviorProperty specializes VerifiableElement {
|
|
@@ -34,7 +55,21 @@ package memo_architecture_functional_behavior {
|
|
|
34
55
|
attribute formalExpression : String;
|
|
35
56
|
}
|
|
36
57
|
part def Contract specializes VerifiableElement { attribute contractScope : String; }
|
|
37
|
-
part def PropertySet specializes VerifiableElement { attribute
|
|
58
|
+
// `part def PropertySet specializes VerifiableElement { attribute
|
|
59
|
+
// propertySetScope : String; }` stood here and is DELETED (plan C3,
|
|
60
|
+
// open question §14.6). It was AADL's property-set idea imported as a
|
|
61
|
+
// name: one String field, no typed content, no binding to whatever it
|
|
62
|
+
// annotated, and zero usages anywhere in the tree.
|
|
63
|
+
//
|
|
64
|
+
// Per-technology properties belong on the extension type that owns them,
|
|
65
|
+
// typed. ROS QoS was the first real customer and settled it:
|
|
66
|
+
// `attribute def RosQosProfile` has reliability, durability, deadline,
|
|
67
|
+
// liveliness and history depth as typed fields, so a publisher's offer and
|
|
68
|
+
// a subscriber's request can be compared. A `propertySetScope` String
|
|
69
|
+
// could not have expressed one of them. Where an extension needs to
|
|
70
|
+
// annotate a BASE element rather than declare its own type, the SysML-
|
|
71
|
+
// native answer is `metadata def` + `Metaobjects::SemanticMetadata`, which
|
|
72
|
+
// is what every MEMO relation already carries since A4.
|
|
38
73
|
part def ActivityAction specializes ArchitectureElement {
|
|
39
74
|
attribute actionKind : ActionKind;
|
|
40
75
|
attribute inputSummary : String;
|
|
@@ -47,20 +82,13 @@ package memo_architecture_functional_behavior {
|
|
|
47
82
|
attribute guardCondition : String;
|
|
48
83
|
attribute weight : String;
|
|
49
84
|
}
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
attribute messageKind : MessageKind;
|
|
53
|
-
attribute sequenceOrder : Integer;
|
|
54
|
-
attribute senderComponent : String;
|
|
55
|
-
attribute receiverComponent : String;
|
|
56
|
-
attribute exchangeItem : String;
|
|
57
|
-
attribute timingConstraintMs : String;
|
|
58
|
-
}
|
|
85
|
+
// UI scenarios are MemoScenario usages with scenarioKind `ui`.
|
|
86
|
+
|
|
59
87
|
part def TimingConstraint specializes VerifiableElement {
|
|
60
88
|
attribute constraintKind : TimingConstraintKind;
|
|
61
89
|
attribute minMs : String;
|
|
62
90
|
attribute maxMs : String;
|
|
63
|
-
|
|
91
|
+
ref referenceElement : MemoPart[1];
|
|
64
92
|
attribute verificationMethod : VerificationMethodKind;
|
|
65
93
|
}
|
|
66
94
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
package memo_architecture_functional_constraints {
|
|
2
2
|
private import ScalarValues::*;
|
|
3
|
+
private import memo_core_common::*;
|
|
3
4
|
|
|
4
5
|
doc /* Reusable quantitative constraint definitions. */
|
|
5
6
|
|
|
6
|
-
constraint def MaxResponseTimeConstraint {
|
|
7
|
+
constraint def MaxResponseTimeConstraint :> MemoConstraint {
|
|
7
8
|
attribute responseTimeMs : Real;
|
|
8
9
|
attribute maxAllowedMs : Real;
|
|
9
10
|
}
|
|
10
|
-
constraint def LockoutIntervalConstraint {
|
|
11
|
+
constraint def LockoutIntervalConstraint :> MemoConstraint {
|
|
11
12
|
attribute elapsedMs : Real;
|
|
12
13
|
attribute lockoutMs : Real;
|
|
13
14
|
}
|
|
@@ -1,10 +1,56 @@
|
|
|
1
|
-
// Functional architecture (§9). A
|
|
2
|
-
//
|
|
3
|
-
// a
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
// assumes software.
|
|
1
|
+
// Functional architecture (§9). A function is a responsibility: what the
|
|
2
|
+
// system, or one of its components, is answerable for. A FunctionalExchange is
|
|
3
|
+
// a typed transfer between functions. A function may be realized by human
|
|
4
|
+
// action, mechanical design, electrical hardware, software, or a combination —
|
|
5
|
+
// allocation to the system's own parts is what ComponentFunction records, and
|
|
6
|
+
// it never assumes software.
|
|
7
|
+
//
|
|
8
|
+
// ─── A function is a behaviour ───────────────────────────────────────────
|
|
9
|
+
//
|
|
10
|
+
// `MemoFunction` and both its specializations are `action def`s. They were
|
|
11
|
+
// `part def SystemFunction specializes ArchitectureElement` until Track A0
|
|
12
|
+
// removed the reason: relation ends were typed on MemoPart/ArchitectureElement,
|
|
13
|
+
// KerML forbids a behaviour from specializing a part-based type, and a function
|
|
14
|
+
// has to be satisfiable, verifiable, and allocatable. So a function was declared
|
|
15
|
+
// a part, and a separate `action def SystemAction` carried the behaviour with a
|
|
16
|
+
// `ref performedFunction` stapling the two back together — a reference used in
|
|
17
|
+
// ZERO example files. The ends are metaclass-neutral now (CR-ONT-060..073), so
|
|
18
|
+
// the split has no cause and is gone: SystemAction is merged into the function
|
|
19
|
+
// family, and its `actionKind` moved onto MemoFunction where it was always
|
|
20
|
+
// describing the function anyway.
|
|
21
|
+
//
|
|
22
|
+
// `functionCategory` and `actionKind` are NOT two spellings of one axis, and
|
|
23
|
+
// merging them would lose information. `actionKind` is the verb — sense,
|
|
24
|
+
// compute, actuate, route. `functionCategory` is the domain grouping the
|
|
25
|
+
// project argues in — therapy, alarm, platform, protection. A function can be
|
|
26
|
+
// `sense` in the `protection` category, and a safety case reasons about both.
|
|
27
|
+
//
|
|
28
|
+
// ─── System function vs. component function ──────────────────────────────
|
|
29
|
+
//
|
|
30
|
+
// ARCADIA's functional chain does not stop at the system boundary: system
|
|
31
|
+
// functions decompose until each piece is the responsibility of exactly one
|
|
32
|
+
// component. MEMO names the two ends of that chain because they obey different
|
|
33
|
+
// rules, not because they carry different attributes:
|
|
34
|
+
//
|
|
35
|
+
// SystemFunction — a responsibility of the system as a whole.
|
|
36
|
+
// Technology-independent. Allocation is OPTIONAL, and a
|
|
37
|
+
// system function may be realized by several components,
|
|
38
|
+
// by a human, or by mechanism.
|
|
39
|
+
// ComponentFunction — a responsibility of ONE component: a flowmeter's
|
|
40
|
+
// "measure flow rate", a subsystem's "arbitrate alarms".
|
|
41
|
+
// Allocation is MANDATORY and single-valued (CR-ONT-074).
|
|
42
|
+
//
|
|
43
|
+
// That difference is structural, which is why these are two definitions rather
|
|
44
|
+
// than one definition carrying a `functionLevel` enum. An enum member cannot
|
|
45
|
+
// change a multiplicity, and "is answerable to exactly one component" is the
|
|
46
|
+
// whole content of the concept.
|
|
47
|
+
//
|
|
48
|
+
// Decomposition and allocation reuse the existing relations and need no new
|
|
49
|
+
// ones — `Composes` for the function tree, `AllocatedTo` for the component.
|
|
50
|
+
// Both had part-typed ends until A0; both are metaclass-neutral now, which is
|
|
51
|
+
// precisely what makes an action-def function usable at all.
|
|
7
52
|
package memo_architecture_functional_functions {
|
|
53
|
+
private import Metaobjects::SemanticMetadata;
|
|
8
54
|
private import ScalarValues::*;
|
|
9
55
|
|
|
10
56
|
private import memo_core_common::*;
|
|
@@ -13,31 +59,53 @@ package memo_architecture_functional_functions {
|
|
|
13
59
|
private import memo_architecture_operational_activities::*;
|
|
14
60
|
private import memo_architecture_operational_scenarios::*;
|
|
15
61
|
|
|
16
|
-
|
|
62
|
+
abstract action def MemoFunction specializes MemoAction {
|
|
17
63
|
attribute functionCategory : String;
|
|
64
|
+
attribute actionKind : ActionKind;
|
|
18
65
|
attribute trigger : String;
|
|
19
66
|
attribute outputSummary : String;
|
|
20
67
|
attribute concernKind : ConcernKind;
|
|
21
68
|
attribute criticality : CriticalityKind;
|
|
22
69
|
}
|
|
23
70
|
|
|
24
|
-
//
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
71
|
+
// A responsibility of the system as a whole. Allocation is optional: a
|
|
72
|
+
// system function that no single component owns is a normal intermediate
|
|
73
|
+
// state of the functional chain, not a defect.
|
|
74
|
+
action def SystemFunction specializes MemoFunction;
|
|
75
|
+
|
|
76
|
+
// A responsibility of exactly one component. `AllocatedTo` names that
|
|
77
|
+
// component; CR-ONT-074 requires it. A component function that reaches no
|
|
78
|
+
// component is a responsibility nobody has accepted.
|
|
79
|
+
action def ComponentFunction specializes MemoFunction;
|
|
30
80
|
|
|
31
81
|
// Named traceable route between functions. Native `flow of` usages carry
|
|
32
|
-
// the transported item; this element exists for budgets and assurance
|
|
33
|
-
// attributes
|
|
82
|
+
// the transported item; this element exists for the budgets and assurance
|
|
83
|
+
// attributes below.
|
|
84
|
+
//
|
|
85
|
+
// The reason is MEMO's grammar, NOT the language — the earlier wording here
|
|
86
|
+
// said "attributes that a flow usage cannot own", and that was a false
|
|
87
|
+
// claim about SysML v2. The standard's `FlowUsage` is
|
|
88
|
+
// `OccurrenceUsagePrefix 'flow' FlowDeclaration DefinitionBody`
|
|
89
|
+
// (SysML-textual-bnf.kebnf:829), so a conforming flow usage takes a name
|
|
90
|
+
// from its `UsageDeclaration` and owns attributes in its body like any
|
|
91
|
+
// other usage. MEMO's own production is
|
|
92
|
+
// `'flow' 'of' itemType 'from' … 'to' … ';'` — no name, no body — so a
|
|
93
|
+
// MEMO flow can carry neither an `id` nor a latency budget, and nothing
|
|
94
|
+
// can refer to it. Every MEMO element rests on the identification core in
|
|
95
|
+
// memo_core_common, and an anonymous attribute-less edge cannot join it.
|
|
96
|
+
//
|
|
97
|
+
// So this part def is a workaround for a MEMO gap, not a design MEMO is
|
|
98
|
+
// entitled to. Restoring the two dropped clauses is what would let it
|
|
99
|
+
// collapse into the flow it stands in for.
|
|
34
100
|
part def FunctionalExchange specializes ArchitectureElement {
|
|
35
101
|
attribute flowKind : FlowKind;
|
|
36
102
|
attribute latencyBudgetMs : Real;
|
|
37
103
|
attribute staleAfterMs : Real;
|
|
38
104
|
attribute integrityLevel : String;
|
|
39
|
-
|
|
40
|
-
|
|
105
|
+
// MemoFunction, not SystemFunction: an exchange between two component
|
|
106
|
+
// functions is the ordinary case once the chain is decomposed.
|
|
107
|
+
ref sourceFunction : MemoFunction[0..1];
|
|
108
|
+
ref targetFunction : MemoFunction[0..1];
|
|
41
109
|
}
|
|
42
110
|
|
|
43
111
|
// A system function enables operational work; it does not perform it.
|
|
@@ -51,24 +119,13 @@ package memo_architecture_functional_functions {
|
|
|
51
119
|
attribute securityRelevant : Boolean;
|
|
52
120
|
}
|
|
53
121
|
action def FunctionalFlowStep specializes MemoAction {
|
|
54
|
-
ref function :
|
|
122
|
+
ref function : MemoFunction[0..1];
|
|
55
123
|
ref exchange : FunctionalExchange[0..1];
|
|
56
|
-
ref item exchangedItem :
|
|
124
|
+
ref item exchangedItem : MemoItem[0..1];
|
|
57
125
|
}
|
|
58
126
|
|
|
59
|
-
//
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
ref selectedFlow : FunctionalFlow[0..1];
|
|
64
|
-
}
|
|
65
|
-
connection def IncludesStep :> MemoRelationship {
|
|
66
|
-
end functionalFlow : FunctionalFlow;
|
|
67
|
-
end step : FunctionalFlowStep;
|
|
68
|
-
}
|
|
69
|
-
connection def InvolvesFunction :> MemoRelationship {
|
|
70
|
-
end functionalFlow : FunctionalFlow;
|
|
71
|
-
end function : SystemFunction;
|
|
72
|
-
}
|
|
73
|
-
// Compatibility spelling used by existing models.
|
|
127
|
+
// `InvolvesFunction` is native `perform` (R10-S6): a `FunctionalFlow`
|
|
128
|
+
// already names its functions via its step chain
|
|
129
|
+
// (`perform <step>;` + the step's own `ref function`), and a flow with no
|
|
130
|
+
// step chain performs its functions directly.
|
|
74
131
|
}
|