@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,40 @@
|
|
|
1
|
+
# ROS mobile robot
|
|
2
|
+
|
|
3
|
+
A focused MEMO example that demonstrates **using an extension**. The subject is
|
|
4
|
+
a ROS 2 mobile logistics robot; the point is the mechanism.
|
|
5
|
+
|
|
6
|
+
Extensions are a way to model, so they live in [`extensions/`](../../extensions),
|
|
7
|
+
beside the ontology. This project is one of their consumers.
|
|
8
|
+
|
|
9
|
+
- `model/catalog/project.sysml` — the binding. It lists three extension modules
|
|
10
|
+
(`memo_extension_messaging`, `memo_extension_container`, `memo_extension_ros`)
|
|
11
|
+
in `includedModule`. That is how extensions compose: at the project binding,
|
|
12
|
+
never by chaining methodologies.
|
|
13
|
+
- `model/catalog/ros_mobile_robot.sysml` — the model.
|
|
14
|
+
- `model/catalog/viewpoints/` — diagram views over that catalog.
|
|
15
|
+
|
|
16
|
+
## What it shows
|
|
17
|
+
|
|
18
|
+
1. **Extension types are used exactly like base types.** `RosNode` specializes
|
|
19
|
+
`SoftwareComponent`, so it inherits period, WCET, priority, safety class and
|
|
20
|
+
fault containment, and every base rule still applies to it. The three nodes
|
|
21
|
+
set `runtimeKind` individually — two composed into one container process,
|
|
22
|
+
the safety monitor in its own — because that is a design decision the
|
|
23
|
+
extension type must not make for the modeller.
|
|
24
|
+
2. **Publish and subscribe use native SysML.** A ROS message is an item
|
|
25
|
+
definition, a named topic is its item usage, nodes own `out` publisher and
|
|
26
|
+
`in` subscriber ports, and native interfaces/flows connect those ports. The
|
|
27
|
+
extension declares no publish/subscribe relation.
|
|
28
|
+
3. **Deployment reuses the base relations unchanged.** `BuildsInto`,
|
|
29
|
+
`DeploysTo` and `ProvidesEnvironment` carry the whole chain from source
|
|
30
|
+
module to container image to compute unit to ROS runtime, with no
|
|
31
|
+
ROS-specific relation anywhere in it. That is the evidence the base is
|
|
32
|
+
factored correctly.
|
|
33
|
+
4. **QoS is a typed profile, not a property bag.** Publisher ports carry an
|
|
34
|
+
offered `RosQosProfile` and subscriber ports a requested one, so the incompatibility
|
|
35
|
+
that silently delivers nothing at runtime is two adjacent values in the
|
|
36
|
+
model. This is why the `PropertySet` stub was deleted rather than made real.
|
|
37
|
+
5. **Services and actions are different native interface contracts.** A service
|
|
38
|
+
has one request and one correlated response. An action has goal,
|
|
39
|
+
acceptance, feedback, cancellation, result, and status features plus a
|
|
40
|
+
native execution-state family.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// ROS Mobile Robot — project identity and method binding.
|
|
2
|
+
//
|
|
3
|
+
// The native entrypoint. The imports name what this project contains and the
|
|
4
|
+
// binding names the methodology it is governed by. No YAML file participates.
|
|
5
|
+
package memo_examples_ros_mobile_robot_project {
|
|
6
|
+
private import ScalarValues::*;
|
|
7
|
+
|
|
8
|
+
private import memo_core_enumerations::*;
|
|
9
|
+
private import memo_methodology_core::*;
|
|
10
|
+
private import memo_methodology_profiles::*;
|
|
11
|
+
|
|
12
|
+
// The project's own content, imported so the catalog is one reachable
|
|
13
|
+
// closure from a single entrypoint.
|
|
14
|
+
private import memo_examples_ros_mobile_robot_viewpoints_unassigned::*;
|
|
15
|
+
private import memo_examples_ros_mobile_robot_viewpoints_unassigned_views_ros_mobile_robot_overview::*;
|
|
16
|
+
|
|
17
|
+
part projectBinding : ProjectMethodBinding {
|
|
18
|
+
attribute :>> id = "PMB-ROS-MOBILE-ROBOT-001";
|
|
19
|
+
attribute :>> name = "RosMobileRobotProjectMethodBinding";
|
|
20
|
+
attribute :>> projectName = "ROS Mobile Robot";
|
|
21
|
+
ref :>> selectedMethodology = mdDefaultDefinition;
|
|
22
|
+
attribute :>> scopeMode = ScopeModeKind::explicit;
|
|
23
|
+
// This is the composition mechanism: three independent extensions,
|
|
24
|
+
// listed here. `includedModule` is [0..*] on both MethodologyDefinition
|
|
25
|
+
// and ProjectMethodBinding, while `baseMethodology` is [0..1] — so
|
|
26
|
+
// extensions combine at the binding and never by chaining.
|
|
27
|
+
attribute :>> includedModule = (
|
|
28
|
+
"memo_extension_messaging",
|
|
29
|
+
"memo_extension_container",
|
|
30
|
+
"memo_extension_ros"
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
// Focused example: a ROS 2 mobile logistics robot, modelled with the ROS
|
|
2
|
+
// extension. The point of the example is the MECHANISM, not the robot — it
|
|
3
|
+
// demonstrates how an extension is used, and it is deliberately the only place
|
|
4
|
+
// ROS vocabulary appears outside `extensions/ros`.
|
|
5
|
+
//
|
|
6
|
+
// Three things it shows:
|
|
7
|
+
// 1. Extension types are used exactly like base types. `RosNode` is a
|
|
8
|
+
// `SoftwareComponent`, so period, WCET, safety class and the rest are
|
|
9
|
+
// inherited and every base rule still applies to it.
|
|
10
|
+
// 2. ROS communication uses native item definitions/usages, directional
|
|
11
|
+
// ports, interfaces, and flows — no publish/subscribe relation is added.
|
|
12
|
+
// 3. Deployment reuses the BASE relations unchanged — `BuildsInto`,
|
|
13
|
+
// `DeploysTo`, `ProvidesEnvironment` — with no ROS-specific relation
|
|
14
|
+
// anywhere in the chain.
|
|
15
|
+
package memo_examples_ros_mobile_robot {
|
|
16
|
+
private import ScalarValues::*;
|
|
17
|
+
private import ModelingMetadata::*;
|
|
18
|
+
|
|
19
|
+
private import memo_core_enumerations::*;
|
|
20
|
+
private import memo_core_relationships::*;
|
|
21
|
+
private import memo_architecture_implementation_software_structure::*;
|
|
22
|
+
private import memo_architecture_implementation_software_runtime::*;
|
|
23
|
+
private import memo_architecture_functional_behavior::*;
|
|
24
|
+
private import memo_architecture_realization_deployment::*;
|
|
25
|
+
private import memo_architecture_realization_physical::*;
|
|
26
|
+
private import memo_extension_messaging::*;
|
|
27
|
+
private import memo_extension_container::*;
|
|
28
|
+
private import memo_extension_ros::*;
|
|
29
|
+
|
|
30
|
+
// ── Message definitions and named topic instances ──────────────────
|
|
31
|
+
// The definition is the ROS message contract. A named usage is the topic
|
|
32
|
+
// deployed in this system; publisher/subscriber ports reference that same
|
|
33
|
+
// usage and native flows carry its message type.
|
|
34
|
+
item def LaserScan specializes RosMessage {
|
|
35
|
+
attribute :>> rosTypeName = "sensor_msgs/msg/LaserScan";
|
|
36
|
+
attribute :>> messageSchema = "ranges[], intensities[], angle_min, angle_max, scan_time";
|
|
37
|
+
}
|
|
38
|
+
item def VelocityCommand specializes RosMessage {
|
|
39
|
+
attribute :>> rosTypeName = "geometry_msgs/msg/Twist";
|
|
40
|
+
attribute :>> messageSchema = "linear.x, angular.z";
|
|
41
|
+
}
|
|
42
|
+
item def EmergencyStop specializes RosMessage {
|
|
43
|
+
attribute :>> rosTypeName = "std_msgs/msg/Bool";
|
|
44
|
+
attribute :>> messageSchema = "data (true = stop asserted)";
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
item topicScan : LaserScan {
|
|
48
|
+
attribute :>> id = "RMR-TP-001"; attribute :>> name = "ScanTopic";
|
|
49
|
+
}
|
|
50
|
+
item topicCmdVel : VelocityCommand {
|
|
51
|
+
attribute :>> id = "RMR-TP-002"; attribute :>> name = "CmdVelTopic";
|
|
52
|
+
}
|
|
53
|
+
item topicEstop : EmergencyStop {
|
|
54
|
+
attribute :>> id = "RMR-TP-003"; attribute :>> name = "EmergencyStopTopic";
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ── Code ────────────────────────────────────────────────────────────
|
|
58
|
+
part swPerception : SoftwareModule {
|
|
59
|
+
attribute :>> moduleKind = ModuleKind::unit;
|
|
60
|
+
attribute :>> id = "RMR-SW-001"; attribute :>> name = "PerceptionStack";
|
|
61
|
+
attribute :>> responsibility = "Lidar driver and obstacle segmentation.";
|
|
62
|
+
attribute :>> safetyClass = SafetyClassKind::B;
|
|
63
|
+
}
|
|
64
|
+
part swNavigation : SoftwareModule {
|
|
65
|
+
attribute :>> moduleKind = ModuleKind::unit;
|
|
66
|
+
attribute :>> id = "RMR-SW-002"; attribute :>> name = "NavigationStack";
|
|
67
|
+
attribute :>> responsibility = "Global and local planning; velocity command generation.";
|
|
68
|
+
attribute :>> safetyClass = SafetyClassKind::B;
|
|
69
|
+
}
|
|
70
|
+
part swSafety : SoftwareModule {
|
|
71
|
+
attribute :>> moduleKind = ModuleKind::unit;
|
|
72
|
+
attribute :>> id = "RMR-SW-003"; attribute :>> name = "SafetyMonitor";
|
|
73
|
+
attribute :>> responsibility = "Independent watchdog: stops the base on obstacle proximity or missing heartbeat.";
|
|
74
|
+
attribute :>> safetyClass = SafetyClassKind::C;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ── Nodes ───────────────────────────────────────────────────────────
|
|
78
|
+
//
|
|
79
|
+
// `runtimeKind` is set per node rather than by the type: the first two are
|
|
80
|
+
// composed into one container process, the safety monitor runs as its own
|
|
81
|
+
// process so a fault in navigation cannot take it down. That distinction
|
|
82
|
+
// is exactly what an extension type must NOT decide for the modeller.
|
|
83
|
+
part nodeLidar : RosNode {
|
|
84
|
+
attribute :>> runtimeKind = RuntimeKind::thread;
|
|
85
|
+
attribute :>> id = "RMR-ND-001"; attribute :>> name = "LidarDriverNode";
|
|
86
|
+
attribute :>> nodeNamespace = "/robot/perception";
|
|
87
|
+
attribute :>> lifecycleManaged = true;
|
|
88
|
+
attribute :>> executorModel = "single-threaded executor, composed";
|
|
89
|
+
attribute :>> periodMs = 50.0;
|
|
90
|
+
attribute :>> wcetMs = 8.0;
|
|
91
|
+
attribute :>> safetyClass = SafetyClassKind::B;
|
|
92
|
+
out port scanPublisher : RosPublisher {
|
|
93
|
+
ref :>> topic = topicScan;
|
|
94
|
+
attribute :>> deliverySemantics = MessagingDeliveryKind::atMostOnce;
|
|
95
|
+
attribute :>> publishRateHz = 20.0;
|
|
96
|
+
attribute :>> offeredQos {
|
|
97
|
+
attribute :>> reliability = RosReliabilityKind::bestEffort;
|
|
98
|
+
attribute :>> durability = RosDurabilityKind::volatile;
|
|
99
|
+
attribute :>> deadlineMs = 60.0;
|
|
100
|
+
attribute :>> livelinessLeaseMs = 200.0;
|
|
101
|
+
attribute :>> historyDepth = 5;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
part nodeNavigation : RosNode {
|
|
106
|
+
attribute :>> runtimeKind = RuntimeKind::thread;
|
|
107
|
+
attribute :>> id = "RMR-ND-002"; attribute :>> name = "NavigationNode";
|
|
108
|
+
attribute :>> nodeNamespace = "/robot/navigation";
|
|
109
|
+
attribute :>> lifecycleManaged = true;
|
|
110
|
+
attribute :>> executorModel = "multi-threaded executor, composed";
|
|
111
|
+
attribute :>> periodMs = 100.0;
|
|
112
|
+
attribute :>> wcetMs = 35.0;
|
|
113
|
+
attribute :>> safetyClass = SafetyClassKind::B;
|
|
114
|
+
in port scanSubscriber : RosSubscriber {
|
|
115
|
+
ref :>> topic = topicScan;
|
|
116
|
+
attribute :>> deliverySemantics = MessagingDeliveryKind::atMostOnce;
|
|
117
|
+
attribute :>> lossBehaviour = "hold the last costmap for 200 ms, then command zero velocity";
|
|
118
|
+
attribute :>> requestedQos {
|
|
119
|
+
attribute :>> reliability = RosReliabilityKind::bestEffort;
|
|
120
|
+
attribute :>> durability = RosDurabilityKind::volatile;
|
|
121
|
+
attribute :>> deadlineMs = 60.0;
|
|
122
|
+
attribute :>> livelinessLeaseMs = 200.0;
|
|
123
|
+
attribute :>> historyDepth = 5;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
out port cmdVelPublisher : RosPublisher {
|
|
127
|
+
ref :>> topic = topicCmdVel;
|
|
128
|
+
attribute :>> deliverySemantics = MessagingDeliveryKind::atLeastOnce;
|
|
129
|
+
attribute :>> publishRateHz = 10.0;
|
|
130
|
+
attribute :>> offeredQos {
|
|
131
|
+
attribute :>> reliability = RosReliabilityKind::reliable;
|
|
132
|
+
attribute :>> durability = RosDurabilityKind::volatile;
|
|
133
|
+
attribute :>> deadlineMs = 150.0;
|
|
134
|
+
attribute :>> livelinessLeaseMs = 300.0;
|
|
135
|
+
attribute :>> historyDepth = 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
in port estopSubscriber : RosSubscriber {
|
|
139
|
+
ref :>> topic = topicEstop;
|
|
140
|
+
attribute :>> deliverySemantics = MessagingDeliveryKind::atLeastOnce;
|
|
141
|
+
attribute :>> lossBehaviour = "no publisher within the liveliness lease is treated as stop asserted";
|
|
142
|
+
attribute :>> requestedQos {
|
|
143
|
+
attribute :>> reliability = RosReliabilityKind::reliable;
|
|
144
|
+
attribute :>> durability = RosDurabilityKind::transientLocal;
|
|
145
|
+
attribute :>> deadlineMs = 100.0;
|
|
146
|
+
attribute :>> livelinessLeaseMs = 200.0;
|
|
147
|
+
attribute :>> historyDepth = 1;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
inout port setModeClient : RosServiceClient {
|
|
151
|
+
attribute :>> serviceName = "/robot/safety/set_mode";
|
|
152
|
+
attribute :>> timeoutMs = 500.0;
|
|
153
|
+
}
|
|
154
|
+
inout port navigateActionServer : RosActionServer {
|
|
155
|
+
attribute :>> actionName = "/robot/navigation/navigate_to_pose";
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
part nodeSafetyMonitor : RosNode {
|
|
159
|
+
attribute :>> runtimeKind = RuntimeKind::process;
|
|
160
|
+
attribute :>> id = "RMR-ND-003"; attribute :>> name = "SafetyMonitorNode";
|
|
161
|
+
attribute :>> nodeNamespace = "/robot/safety";
|
|
162
|
+
attribute :>> lifecycleManaged = false;
|
|
163
|
+
attribute :>> executorModel = "own process, real-time priority";
|
|
164
|
+
attribute :>> periodMs = 20.0;
|
|
165
|
+
attribute :>> deadlineMs = 20.0;
|
|
166
|
+
attribute :>> wcetMs = 3.0;
|
|
167
|
+
attribute :>> priority = 90;
|
|
168
|
+
attribute :>> safetyClass = SafetyClassKind::C;
|
|
169
|
+
attribute :>> faultContainment = "separate process; watchdog-fed; stops the base on its own timeout";
|
|
170
|
+
in port scanSubscriber : RosSubscriber {
|
|
171
|
+
ref :>> topic = topicScan;
|
|
172
|
+
attribute :>> deliverySemantics = MessagingDeliveryKind::atMostOnce;
|
|
173
|
+
attribute :>> lossBehaviour = "two consecutive misses assert the stop";
|
|
174
|
+
}
|
|
175
|
+
in port cmdVelSubscriber : RosSubscriber {
|
|
176
|
+
ref :>> topic = topicCmdVel;
|
|
177
|
+
attribute :>> deliverySemantics = MessagingDeliveryKind::atLeastOnce;
|
|
178
|
+
attribute :>> lossBehaviour = "missing velocity commands assert the stop";
|
|
179
|
+
}
|
|
180
|
+
out port estopPublisher : RosPublisher {
|
|
181
|
+
ref :>> topic = topicEstop;
|
|
182
|
+
attribute :>> deliverySemantics = MessagingDeliveryKind::atLeastOnce;
|
|
183
|
+
attribute :>> publishRateHz = 50.0;
|
|
184
|
+
attribute :>> offeredQos {
|
|
185
|
+
attribute :>> reliability = RosReliabilityKind::reliable;
|
|
186
|
+
attribute :>> durability = RosDurabilityKind::transientLocal;
|
|
187
|
+
attribute :>> deadlineMs = 100.0;
|
|
188
|
+
attribute :>> livelinessLeaseMs = 200.0;
|
|
189
|
+
attribute :>> historyDepth = 1;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
inout port setModeServer : RosServiceServer {
|
|
193
|
+
attribute :>> serviceName = "/robot/safety/set_mode";
|
|
194
|
+
}
|
|
195
|
+
inout port navigateActionClient : RosActionClient {
|
|
196
|
+
attribute :>> actionName = "/robot/navigation/navigate_to_pose";
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Cross-view mappings: SEI module-view implementation units are distinct
|
|
201
|
+
// from component-and-connector runtime elements. A runtime node realizes
|
|
202
|
+
// the module whose code it executes; it is not the same model element.
|
|
203
|
+
#refinement dependency nodeLidar to swPerception;
|
|
204
|
+
#refinement dependency nodeNavigation to swNavigation;
|
|
205
|
+
#refinement dependency nodeSafetyMonitor to swSafety;
|
|
206
|
+
|
|
207
|
+
// ── Native topic, service, and action interfaces ───────────────────
|
|
208
|
+
interface scanToNavigation : RosTopicInterface
|
|
209
|
+
connect nodeLidar.scanPublisher to nodeNavigation.scanSubscriber {
|
|
210
|
+
attribute :>> direction = DirectionKind::output;
|
|
211
|
+
}
|
|
212
|
+
interface scanToSafety : RosTopicInterface
|
|
213
|
+
connect nodeLidar.scanPublisher to nodeSafetyMonitor.scanSubscriber {
|
|
214
|
+
attribute :>> direction = DirectionKind::output;
|
|
215
|
+
}
|
|
216
|
+
interface cmdVelToSafety : RosTopicInterface
|
|
217
|
+
connect nodeNavigation.cmdVelPublisher to nodeSafetyMonitor.cmdVelSubscriber {
|
|
218
|
+
attribute :>> direction = DirectionKind::output;
|
|
219
|
+
}
|
|
220
|
+
interface estopToNavigation : RosTopicInterface
|
|
221
|
+
connect nodeSafetyMonitor.estopPublisher to nodeNavigation.estopSubscriber {
|
|
222
|
+
attribute :>> direction = DirectionKind::output;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
flow of LaserScan from nodeLidar.scanPublisher.payload to nodeNavigation.scanSubscriber.payload;
|
|
226
|
+
flow of LaserScan from nodeLidar.scanPublisher.payload to nodeSafetyMonitor.scanSubscriber.payload;
|
|
227
|
+
flow of VelocityCommand from nodeNavigation.cmdVelPublisher.payload to nodeSafetyMonitor.cmdVelSubscriber.payload;
|
|
228
|
+
flow of EmergencyStop from nodeSafetyMonitor.estopPublisher.payload to nodeNavigation.estopSubscriber.payload;
|
|
229
|
+
|
|
230
|
+
interface setModeService : RosServiceInterface
|
|
231
|
+
connect nodeNavigation.setModeClient to nodeSafetyMonitor.setModeServer {
|
|
232
|
+
attribute :>> direction = DirectionKind::inputOutput;
|
|
233
|
+
}
|
|
234
|
+
interface navigateAction : RosActionInterface
|
|
235
|
+
connect nodeSafetyMonitor.navigateActionClient to nodeNavigation.navigateActionServer {
|
|
236
|
+
attribute :>> direction = DirectionKind::inputOutput;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// ── Deployment: base relations, unchanged ───────────────────────────
|
|
240
|
+
part imageRuntime : RosContainerImage {
|
|
241
|
+
attribute :>> id = "RMR-DU-001"; attribute :>> name = "RobotRuntimeImage";
|
|
242
|
+
attribute :>> unitKind = "OCI container image";
|
|
243
|
+
attribute :>> imageReference = "registry.example.com/robot-runtime:2.3.0";
|
|
244
|
+
attribute :>> registry = "registry.example.com";
|
|
245
|
+
attribute :>> digest = "sha256:9f2c1ad4e0b7";
|
|
246
|
+
attribute :>> baseImage = "ros:jazzy-ros-base";
|
|
247
|
+
attribute :>> rosDistribution = "jazzy";
|
|
248
|
+
attribute :>> workspaceOverlay = "/opt/robot_ws";
|
|
249
|
+
attribute :>> integrityProtection = "image signature + SBOM attestation";
|
|
250
|
+
}
|
|
251
|
+
part imageSafety : RosContainerImage {
|
|
252
|
+
attribute :>> id = "RMR-DU-002"; attribute :>> name = "SafetyMonitorImage";
|
|
253
|
+
attribute :>> unitKind = "OCI container image";
|
|
254
|
+
attribute :>> imageReference = "registry.example.com/safety-monitor:2.3.0";
|
|
255
|
+
attribute :>> registry = "registry.example.com";
|
|
256
|
+
attribute :>> digest = "sha256:41bb7c0e5d92";
|
|
257
|
+
attribute :>> baseImage = "ros:jazzy-ros-core";
|
|
258
|
+
attribute :>> rosDistribution = "jazzy";
|
|
259
|
+
attribute :>> workspaceOverlay = "/opt/safety_ws";
|
|
260
|
+
attribute :>> integrityProtection = "image signature + SBOM attestation";
|
|
261
|
+
}
|
|
262
|
+
connection : BuildsInto connect module ::> swPerception to deploymentUnit ::> imageRuntime;
|
|
263
|
+
connection : BuildsInto connect module ::> swNavigation to deploymentUnit ::> imageRuntime;
|
|
264
|
+
connection : BuildsInto connect module ::> swSafety to deploymentUnit ::> imageSafety;
|
|
265
|
+
|
|
266
|
+
part nodeComputeUnit : ProcessingNode {
|
|
267
|
+
attribute :>> id = "RMR-HW-001"; attribute :>> name = "OnboardComputeUnit";
|
|
268
|
+
attribute :>> nodeKind = ProcessingNodeKind::SoC;
|
|
269
|
+
attribute :>> processorArchitecture = "arm64, 8 core";
|
|
270
|
+
attribute :>> memoryMB = "16384";
|
|
271
|
+
attribute :>> operatingSystem = "Linux with PREEMPT_RT";
|
|
272
|
+
attribute :>> supportsContainerization = true;
|
|
273
|
+
attribute :>> realTimeCapable = true;
|
|
274
|
+
}
|
|
275
|
+
allocation runtimeImageDeployment : DeploysTo allocate imageRuntime to nodeComputeUnit {
|
|
276
|
+
attribute :>> deploymentKind = DeploymentKind::containerized;
|
|
277
|
+
}
|
|
278
|
+
allocation safetyImageDeployment : DeploysTo allocate imageSafety to nodeComputeUnit {
|
|
279
|
+
attribute :>> deploymentKind = DeploymentKind::containerized;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
part rosRuntime : RosContainerRuntime {
|
|
283
|
+
attribute :>> id = "RMR-RT-001"; attribute :>> name = "OnboardRosRuntime";
|
|
284
|
+
attribute :>> environmentKind = "container runtime";
|
|
285
|
+
attribute :>> osOrRtos = "Linux with PREEMPT_RT";
|
|
286
|
+
attribute :>> orchestrationPlatform = "systemd-managed compose, no cluster orchestrator";
|
|
287
|
+
attribute :>> runtimeEngine = "containerd";
|
|
288
|
+
attribute :>> rosDistribution = "jazzy";
|
|
289
|
+
attribute :>> rmwImplementation = "rmw_cyclonedds_cpp";
|
|
290
|
+
// Fixed per robot. Two robots sharing a domain would see each other's
|
|
291
|
+
// topics, which is a hazard on a shared network and is visible in no
|
|
292
|
+
// single node.
|
|
293
|
+
attribute :>> rosDomainId = 42;
|
|
294
|
+
}
|
|
295
|
+
connection : ProvidesEnvironment connect node ::> nodeComputeUnit to environment ::> rosRuntime;
|
|
296
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// unassigned viewpoint.
|
|
2
|
+
//
|
|
3
|
+
// This project does not define its own viewpoint here; it binds the reusable
|
|
4
|
+
// MEMO viewpoint that frames these concerns. The views it governs sit beneath
|
|
5
|
+
// `views/`.
|
|
6
|
+
package memo_examples_ros_mobile_robot_viewpoints_unassigned {
|
|
7
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
package memo_examples_ros_mobile_robot_viewpoints_unassigned_views_ros_mobile_robot_overview {
|
|
2
|
+
private import memo_examples_ros_mobile_robot::*;
|
|
3
|
+
private import memo_viewpoints_definitions::*;
|
|
4
|
+
private import memo_core_enumerations::*;
|
|
5
|
+
|
|
6
|
+
view rosMobileRobotOverview : MemoDiagramView {
|
|
7
|
+
expose memo_examples_ros_mobile_robot::*;
|
|
8
|
+
attribute depth = 2;
|
|
9
|
+
attribute :>> title = "ROS Mobile Robot Overview";
|
|
10
|
+
attribute :>> viewKind = DiagramViewKind::general;
|
|
11
|
+
attribute :>> diagramType = "bdd";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -20,5 +20,9 @@ package memo_examples_software_only_medical_device_project {
|
|
|
20
20
|
attribute :>> projectName = "Software Only Medical Device";
|
|
21
21
|
ref :>> selectedMethodology = mdDefaultDefinition;
|
|
22
22
|
attribute :>> scopeMode = ScopeModeKind::explicit;
|
|
23
|
+
// Composition happens here, not by chaining methodologies. The cloud
|
|
24
|
+
// extension supplies CloudService, which is what the grading service
|
|
25
|
+
// is.
|
|
26
|
+
attribute :>> includedModule = "memo_extension_cloud";
|
|
23
27
|
}
|
|
24
28
|
}
|
package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// off-the-shelf infrastructure the manufacturer does not control.
|
|
5
5
|
package memo_examples_software_only_medical_device {
|
|
6
6
|
private import ScalarValues::*;
|
|
7
|
+
private import ModelingMetadata::*;
|
|
7
8
|
|
|
8
9
|
private import memo_core_enumerations::*;
|
|
9
10
|
private import memo_core_relationships::*;
|
|
@@ -11,6 +12,11 @@ package memo_examples_software_only_medical_device {
|
|
|
11
12
|
private import memo_architecture_implementation_software_runtime::*;
|
|
12
13
|
private import memo_architecture_realization_deployment::*;
|
|
13
14
|
private import memo_architecture_realization_physical::*;
|
|
15
|
+
// `serviceContract` was an optional attribute on SoftwareComponent, set
|
|
16
|
+
// only when runtimeKind = service. It moved to `CloudService` in the cloud
|
|
17
|
+
// extension, so the project that uses it includes the extension — which is
|
|
18
|
+
// the mechanism working as designed rather than a cost of the move.
|
|
19
|
+
private import memo_extension_cloud::*;
|
|
14
20
|
|
|
15
21
|
part swScreeningApp : SoftwareSystem {
|
|
16
22
|
attribute :>> id = "SMD-SW-001"; attribute :>> name = "ScreeningApplication";
|
|
@@ -33,16 +39,16 @@ package memo_examples_software_only_medical_device {
|
|
|
33
39
|
attribute :>> responsibility = "Wraps the grading model behind the service API; owns input validation and result structuring.";
|
|
34
40
|
attribute :>> safetyClass = SafetyClassKind::B;
|
|
35
41
|
}
|
|
36
|
-
|
|
42
|
+
dependency swGradingModule to soupInference;
|
|
37
43
|
|
|
38
|
-
part svcGrading :
|
|
39
|
-
attribute :>> runtimeKind = RuntimeKind::service;
|
|
44
|
+
part svcGrading : CloudService {
|
|
40
45
|
attribute :>> id = "SMD-RT-001"; attribute :>> name = "GradingService";
|
|
41
46
|
attribute :>> serviceContract = "REST /grade: image in, structured finding out";
|
|
47
|
+
attribute :>> discoveryMechanism = "DNS name behind the cluster ingress";
|
|
42
48
|
attribute :>> updatePolicy = "blue/green rollout";
|
|
43
49
|
attribute :>> rollbackPolicy = "previous validated version retained hot";
|
|
44
50
|
}
|
|
45
|
-
|
|
51
|
+
#refinement dependency svcGrading to swGradingModule;
|
|
46
52
|
|
|
47
53
|
part duContainerImage : DeploymentUnit {
|
|
48
54
|
attribute :>> id = "SMD-DU-001"; attribute :>> name = "ScreeningServiceImage";
|
|
@@ -55,7 +61,7 @@ package memo_examples_software_only_medical_device {
|
|
|
55
61
|
attribute :>> supportsContainerization = true;
|
|
56
62
|
attribute :>> realTimeCapable = false;
|
|
57
63
|
}
|
|
58
|
-
|
|
64
|
+
allocation duContainerImageDeployment : DeploysTo allocate duContainerImage to nodeCloud {
|
|
59
65
|
attribute :>> deploymentKind = DeploymentKind::containerized;
|
|
60
66
|
}
|
|
61
67
|
connection : HostedBy connect hostAssembly ::> nodeCloud to processingNode ::> svcGrading;
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// as context → use case → workflow → scenarios → scenario-owned activities.
|
|
4
4
|
package memo_examples_surgical_closure_workflow {
|
|
5
5
|
private import ScalarValues::*;
|
|
6
|
+
private import ModelingMetadata::*;
|
|
6
7
|
|
|
7
8
|
private import memo_core_enumerations::*;
|
|
8
9
|
private import memo_core_relationships::*;
|
|
@@ -39,7 +40,7 @@ package memo_examples_surgical_closure_workflow {
|
|
|
39
40
|
}
|
|
40
41
|
requirement needControlledGastricResection : Need {
|
|
41
42
|
attribute :>> needKind = NeedKind::clinicalUser;
|
|
42
|
-
attribute :>>
|
|
43
|
+
attribute :>> id = "LSG-N-001";
|
|
43
44
|
attribute :>> statement = "The surgical team needs to perform gastric resection with controlled anatomy, haemostasis, and a checked staple line.";
|
|
44
45
|
}
|
|
45
46
|
use case ucPerformSleeveGastrectomy : UseCase {
|
|
@@ -53,40 +54,39 @@ package memo_examples_surgical_closure_workflow {
|
|
|
53
54
|
ref :>> primaryUser = bariatricSurgeon;
|
|
54
55
|
ref :>> supportingActors = (scrubNurse, anesthetist);
|
|
55
56
|
ref :>> useContext = bariatricOr;
|
|
57
|
+
subject supportingSystem;
|
|
58
|
+
actor bariatricSurgeonInitiator = bariatricSurgeon;
|
|
56
59
|
}
|
|
57
60
|
connection : Motivates connect motivatingNeed ::> needControlledGastricResection to motivatedUseCase ::> ucPerformSleeveGastrectomy;
|
|
58
|
-
connection : Initiates connect initiatingUser ::> bariatricSurgeon to initiatedUseCase ::> ucPerformSleeveGastrectomy;
|
|
59
61
|
|
|
60
62
|
// ── Procedure workflow ──────────────────────────────────────
|
|
61
63
|
action actTimeOutAndPosition : OperationalActivity { attribute :>> id = "LSG-ACT-001"; attribute :>> name = "ConfirmTimeOutAndPosition"; }
|
|
62
64
|
action actEstablishAccess : OperationalActivity { attribute :>> id = "LSG-ACT-002"; attribute :>> name = "EstablishLaparoscopicAccess"; }
|
|
63
65
|
action actMobilizeStomach : OperationalActivity { attribute :>> id = "LSG-ACT-003"; attribute :>> name = "MobilizeStomach"; }
|
|
64
|
-
action actSizeAndCreateSleeve : OperationalActivity {
|
|
66
|
+
action actSizeAndCreateSleeve : OperationalActivity {
|
|
67
|
+
attribute :>> id = "LSG-ACT-004"; attribute :>> name = "SizeAndCreateSleeve"; attribute :>> criticality = CriticalityKind::high;
|
|
68
|
+
|
|
69
|
+
action taskCreateStapleLine : UserTask {
|
|
70
|
+
attribute :>> criticality = CriticalityKind::high;
|
|
71
|
+
attribute :>> id = "LSG-TASK-001";
|
|
72
|
+
attribute :>> name = "CreateAndInspectStapleLine";
|
|
73
|
+
attribute :>> taskGoal = "create the planned sleeve and identify bleeding or integrity concerns before completion";
|
|
74
|
+
attribute :>> potentialHarm = "bleeding or staple-line complication not recognized before handover";
|
|
75
|
+
attribute :>> severityIfFailed = SeverityKind::serious;
|
|
76
|
+
|
|
77
|
+
action stConfirmAnatomy : TaskStep { attribute :>> id = "LSG-ST-001"; attribute :>> name = "ConfirmAnatomy"; }
|
|
78
|
+
action stCreateStapleLine : TaskStep { attribute :>> id = "LSG-ST-002"; attribute :>> name = "CreateStapleLine"; }
|
|
79
|
+
action stInspectBleeding : TaskStep { attribute :>> id = "LSG-ST-003"; attribute :>> name = "InspectForBleeding"; }
|
|
80
|
+
action stAssessIntegrity : TaskStep { attribute :>> id = "LSG-ST-004"; attribute :>> name = "AssessStapleLineIntegrity"; }
|
|
81
|
+
first stConfirmAnatomy then stCreateStapleLine;
|
|
82
|
+
first stCreateStapleLine then stInspectBleeding;
|
|
83
|
+
first stInspectBleeding then stAssessIntegrity;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
65
86
|
action actAssessStapleLine : OperationalActivity { attribute :>> id = "LSG-ACT-005"; attribute :>> name = "AssessStapleLine"; attribute :>> criticality = CriticalityKind::high; }
|
|
66
87
|
action actExtractSpecimenAndClose : OperationalActivity { attribute :>> id = "LSG-ACT-006"; attribute :>> name = "ExtractSpecimenAndClosePorts"; }
|
|
67
88
|
action actHandover : OperationalActivity { attribute :>> id = "LSG-ACT-007"; attribute :>> name = "CompletePostoperativeHandover"; }
|
|
68
89
|
|
|
69
|
-
action taskCreateStapleLine : UserTask {
|
|
70
|
-
attribute :>> criticality = CriticalityKind::high;
|
|
71
|
-
attribute :>> id = "LSG-TASK-001";
|
|
72
|
-
attribute :>> name = "CreateAndInspectStapleLine";
|
|
73
|
-
attribute :>> taskGoal = "create the planned sleeve and identify bleeding or integrity concerns before completion";
|
|
74
|
-
attribute :>> potentialHarm = "bleeding or staple-line complication not recognized before handover";
|
|
75
|
-
attribute :>> severityIfFailed = SeverityKind::serious;
|
|
76
|
-
}
|
|
77
|
-
action stConfirmAnatomy : TaskStep { attribute :>> id = "LSG-ST-001"; attribute :>> name = "ConfirmAnatomy"; }
|
|
78
|
-
action stCreateStapleLine : TaskStep { attribute :>> id = "LSG-ST-002"; attribute :>> name = "CreateStapleLine"; }
|
|
79
|
-
action stInspectBleeding : TaskStep { attribute :>> id = "LSG-ST-003"; attribute :>> name = "InspectForBleeding"; }
|
|
80
|
-
action stAssessIntegrity : TaskStep { attribute :>> id = "LSG-ST-004"; attribute :>> name = "AssessStapleLineIntegrity"; }
|
|
81
|
-
first stConfirmAnatomy then stCreateStapleLine;
|
|
82
|
-
first stCreateStapleLine then stInspectBleeding;
|
|
83
|
-
first stInspectBleeding then stAssessIntegrity;
|
|
84
|
-
connection : Composes connect parent ::> actSizeAndCreateSleeve to child ::> taskCreateStapleLine;
|
|
85
|
-
connection : Composes connect parent ::> taskCreateStapleLine to child ::> stConfirmAnatomy;
|
|
86
|
-
connection : Composes connect parent ::> taskCreateStapleLine to child ::> stCreateStapleLine;
|
|
87
|
-
connection : Composes connect parent ::> taskCreateStapleLine to child ::> stInspectBleeding;
|
|
88
|
-
connection : Composes connect parent ::> taskCreateStapleLine to child ::> stAssessIntegrity;
|
|
89
|
-
|
|
90
90
|
action wfSleeveGastrectomy : ClinicalProcedureWorkflow {
|
|
91
91
|
attribute :>> id = "LSG-WF-001";
|
|
92
92
|
attribute :>> name = "LaparoscopicSleeveGastrectomyWorkflow";
|
|
@@ -94,51 +94,43 @@ package memo_examples_surgical_closure_workflow {
|
|
|
94
94
|
attribute :>> entryCondition = "patient prepared; time-out ready";
|
|
95
95
|
attribute :>> completionCondition = "staple line assessed; postoperative handover complete";
|
|
96
96
|
attribute :>> clinicalObjective = "create a gastric sleeve after controlled mobilisation and staple-line assessment";
|
|
97
|
+
|
|
98
|
+
action wsTimeOut : WorkflowStep { ref :>> performedActivity = actTimeOutAndPosition; }
|
|
99
|
+
action wsAccess : WorkflowStep { ref :>> performedActivity = actEstablishAccess; }
|
|
100
|
+
action wsMobilize : WorkflowStep { ref :>> performedActivity = actMobilizeStomach; }
|
|
101
|
+
action wsSleeve : WorkflowStep { ref :>> performedActivity = actSizeAndCreateSleeve; }
|
|
102
|
+
action wsAssess : WorkflowStep { ref :>> performedActivity = actAssessStapleLine; }
|
|
103
|
+
action wsClose : WorkflowStep { ref :>> performedActivity = actExtractSpecimenAndClose; }
|
|
104
|
+
action wsHandover : WorkflowStep { ref :>> performedActivity = actHandover; }
|
|
105
|
+
first wsTimeOut then wsAccess;
|
|
106
|
+
first wsAccess then wsMobilize;
|
|
107
|
+
first wsMobilize then wsSleeve;
|
|
108
|
+
first wsSleeve then wsAssess;
|
|
109
|
+
first wsAssess then wsClose;
|
|
110
|
+
first wsClose then wsHandover;
|
|
97
111
|
}
|
|
98
|
-
action wsTimeOut : WorkflowStep { ref :>> performedActivity = actTimeOutAndPosition; }
|
|
99
|
-
action wsAccess : WorkflowStep { ref :>> performedActivity = actEstablishAccess; }
|
|
100
|
-
action wsMobilize : WorkflowStep { ref :>> performedActivity = actMobilizeStomach; }
|
|
101
|
-
action wsSleeve : WorkflowStep { ref :>> performedActivity = actSizeAndCreateSleeve; }
|
|
102
|
-
action wsAssess : WorkflowStep { ref :>> performedActivity = actAssessStapleLine; }
|
|
103
|
-
action wsClose : WorkflowStep { ref :>> performedActivity = actExtractSpecimenAndClose; }
|
|
104
|
-
action wsHandover : WorkflowStep { ref :>> performedActivity = actHandover; }
|
|
105
|
-
connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsTimeOut;
|
|
106
|
-
connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsAccess;
|
|
107
|
-
connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsMobilize;
|
|
108
|
-
connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsSleeve;
|
|
109
|
-
connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsAssess;
|
|
110
|
-
connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsClose;
|
|
111
|
-
connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsHandover;
|
|
112
|
-
first wsTimeOut then wsAccess;
|
|
113
|
-
first wsAccess then wsMobilize;
|
|
114
|
-
first wsMobilize then wsSleeve;
|
|
115
|
-
first wsSleeve then wsAssess;
|
|
116
|
-
first wsAssess then wsClose;
|
|
117
|
-
first wsClose then wsHandover;
|
|
118
112
|
connection : Supports { attribute :>> supportKind = SupportKind::useCase; connect supporter ::> wfSleeveGastrectomy to supported ::> ucPerformSleeveGastrectomy; }
|
|
119
113
|
|
|
120
114
|
// ── Scenario paths, each with its own activity/action flow ──
|
|
121
|
-
action
|
|
122
|
-
attribute :>> name = "CompleteNominalSleeveProcedure";
|
|
123
|
-
action prepare; action createSleeve; action assess; action handover;
|
|
124
|
-
first start then prepare; first prepare then createSleeve; first createSleeve then assess; first assess then handover; first handover then done;
|
|
125
|
-
}
|
|
126
|
-
action oaControlStapleLineBleeding : OperationalActivity {
|
|
127
|
-
attribute :>> name = "ControlStapleLineBleeding";
|
|
128
|
-
action recognizeBleeding; action controlBleeding; action reassessStapleLine; action escalateIfNeeded;
|
|
129
|
-
first start then recognizeBleeding; first recognizeBleeding then controlBleeding; first controlBleeding then reassessStapleLine; first reassessStapleLine then escalateIfNeeded; first escalateIfNeeded then done;
|
|
130
|
-
}
|
|
131
|
-
action scNominalSleeveProcedure : OperativeScenario {
|
|
115
|
+
action scNominalSleeveProcedure : MemoScenario {
|
|
132
116
|
attribute :>> id = "LSG-SC-001"; attribute :>> name = "NominalSleeveGastrectomy";
|
|
117
|
+
attribute :>> scenarioKind = ScenarioKind::operative;
|
|
133
118
|
attribute :>> variantKind = ScenarioVariantKind::nominal;
|
|
134
119
|
attribute :>> operationalCondition = OperationalConditionKind::normal;
|
|
135
120
|
attribute :>> pathSummary = "Time-out, access, mobilisation, sleeve creation, staple-line assessment, closure, and handover complete without rework.";
|
|
136
121
|
ref :>> parentWorkflow = wfSleeveGastrectomy;
|
|
137
122
|
ref :>> parentUseCase = ucPerformSleeveGastrectomy;
|
|
138
123
|
ref :>> activities = oaCompleteSleeveProcedure;
|
|
124
|
+
|
|
125
|
+
action oaCompleteSleeveProcedure : OperationalActivity {
|
|
126
|
+
attribute :>> name = "CompleteNominalSleeveProcedure";
|
|
127
|
+
action prepare; action createSleeve; action assess; action handover;
|
|
128
|
+
first start then prepare; first prepare then createSleeve; first createSleeve then assess; first assess then handover; first handover then done;
|
|
129
|
+
}
|
|
139
130
|
}
|
|
140
|
-
action scStapleLineBleeding :
|
|
131
|
+
action scStapleLineBleeding : MemoScenario {
|
|
141
132
|
attribute :>> id = "LSG-SC-002"; attribute :>> name = "StapleLineBleedingRecovery";
|
|
133
|
+
attribute :>> scenarioKind = ScenarioKind::operative;
|
|
142
134
|
attribute :>> variantKind = ScenarioVariantKind::recovery;
|
|
143
135
|
attribute :>> operationalCondition = OperationalConditionKind::degraded;
|
|
144
136
|
attribute :>> variationPoint = "bleeding observed during staple-line assessment";
|
|
@@ -147,9 +139,13 @@ package memo_examples_surgical_closure_workflow {
|
|
|
147
139
|
ref :>> parentWorkflow = wfSleeveGastrectomy;
|
|
148
140
|
ref :>> parentUseCase = ucPerformSleeveGastrectomy;
|
|
149
141
|
ref :>> activities = oaControlStapleLineBleeding;
|
|
142
|
+
|
|
143
|
+
action oaControlStapleLineBleeding : OperationalActivity {
|
|
144
|
+
attribute :>> name = "ControlStapleLineBleeding";
|
|
145
|
+
action recognizeBleeding; action controlBleeding; action reassessStapleLine; action escalateIfNeeded;
|
|
146
|
+
first start then recognizeBleeding; first recognizeBleeding then controlBleeding; first controlBleeding then reassessStapleLine; first reassessStapleLine then escalateIfNeeded; first escalateIfNeeded then done;
|
|
147
|
+
}
|
|
150
148
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
connection : Composes connect parent ::> scNominalSleeveProcedure to child ::> oaCompleteSleeveProcedure;
|
|
154
|
-
connection : Composes connect parent ::> scStapleLineBleeding to child ::> oaControlStapleLineBleeding;
|
|
149
|
+
#refinement dependency scNominalSleeveProcedure to ucPerformSleeveGastrectomy;
|
|
150
|
+
#refinement dependency scStapleLineBleeding to ucPerformSleeveGastrectomy;
|
|
155
151
|
}
|
|
@@ -23,7 +23,7 @@ package memo_examples_surgical_robot {
|
|
|
23
23
|
connection : IndependentOf connect channel ::> chMotionMonitor to otherChannel ::> chMotionPrimary {
|
|
24
24
|
attribute :>> independenceBasis = "separate sensing, power, and processing; common-cause analysis SR-CCA-01";
|
|
25
25
|
}
|
|
26
|
-
|
|
26
|
+
dependency chMotionMonitor to chMotionPrimary;
|
|
27
27
|
|
|
28
28
|
// Interlock: instrument exchange blocked while arm is in motion.
|
|
29
29
|
part chExchangeInterlock : LogicalComponent {
|