@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,94 @@
|
|
|
1
|
+
# Extensions
|
|
2
|
+
|
|
3
|
+
An extension is a **way to model**, not a sample. It is a reusable ontology
|
|
4
|
+
package that specializes the base and is selected by a methodology or a project
|
|
5
|
+
binding — so extensions live here, beside `src/`, and not under `examples/`.
|
|
6
|
+
Examples *use* extensions; `examples/ros-mobile-robot` demonstrates one.
|
|
7
|
+
|
|
8
|
+
MEMO defines no extension metaclass. An extension is a plain SysML package:
|
|
9
|
+
|
|
10
|
+
- outside `src/` and outside the `memo::` namespace;
|
|
11
|
+
- with a `memo.package.yaml` carrying identity and `sysmlDir` only (the semantic
|
|
12
|
+
fields `type` / `extends` / `usage` / `ontologies` / `methodology` / `modules`
|
|
13
|
+
are rejected);
|
|
14
|
+
- whose SysML **specializes** base types;
|
|
15
|
+
- plus a `MethodologyDefinition` naming `baseMethodology`, `scopeMode`, and its
|
|
16
|
+
own `includedModule`.
|
|
17
|
+
|
|
18
|
+
`template/` is the skeleton. The build round-trips every extension into its own
|
|
19
|
+
KPAR and resolves it with `syside check`, exactly as it does the base.
|
|
20
|
+
|
|
21
|
+
## Composition happens at the project binding
|
|
22
|
+
|
|
23
|
+
`MethodologyDefinition.baseMethodology` is `[0..1]` — single inheritance, and
|
|
24
|
+
deliberate. Extensions therefore **do not chain**. Both
|
|
25
|
+
`MethodologyDefinition.includedModule` and `ProjectMethodBinding.includedModule`
|
|
26
|
+
are `String[0..*]`, so a project combines any number of independent extensions
|
|
27
|
+
by listing their modules in its own binding. That is *the* composition
|
|
28
|
+
mechanism; nothing else is supported.
|
|
29
|
+
|
|
30
|
+
## Rule 1 — use native mechanisms first; extension relations specialize base ones
|
|
31
|
+
|
|
32
|
+
An extension **may** declare `connection def`s and `allocation def`s when the
|
|
33
|
+
domain adds a relationship SysML does not already express. It must first use
|
|
34
|
+
native ports, interfaces, flows, messages, allocations, and dependencies. ROS
|
|
35
|
+
is the worked example: publisher/subscriber roles are directional ports, the
|
|
36
|
+
message is an item definition, the named topic is an item usage, and native
|
|
37
|
+
interfaces/flows connect them. No ROS publish/subscribe relation exists.
|
|
38
|
+
The OMG's own `Domain Libraries/Requirement Derivation` ships a `connection def`
|
|
39
|
+
next to a `metadata def :> SemanticMetadata` — domain relations are the
|
|
40
|
+
sanctioned extension mechanism in SysML v2 too.
|
|
41
|
+
|
|
42
|
+
The constraint is on where they root:
|
|
43
|
+
|
|
44
|
+
> **A relation declared by an extension specializes a base MEMO relation. It
|
|
45
|
+
> never roots independently.**
|
|
46
|
+
|
|
47
|
+
For a genuinely new relation, `connection def DomainRelation :> MemoLink` is
|
|
48
|
+
correct; `connection def DomainRelation { … }` is not. Rooting independently would give
|
|
49
|
+
the relation no identification core, no place in the relationship registry, and
|
|
50
|
+
no ends the base can reason about — a conforming tool would read it as opaque,
|
|
51
|
+
which is the same defect §2 of the plan names in the base itself. Give each one
|
|
52
|
+
a `metadata def <keyword> … :> SemanticMetadata` as well, for the same reason
|
|
53
|
+
every base relation has one.
|
|
54
|
+
|
|
55
|
+
The previous guard here was `assert.doesNotMatch(clinical, /connection def/)` —
|
|
56
|
+
a regression check on one example that had grown into an apparent rule. The
|
|
57
|
+
test now enforces the rule written above instead of the accident it was
|
|
58
|
+
guarding.
|
|
59
|
+
|
|
60
|
+
## Rule 2 — every definition carries the extension's prefix
|
|
61
|
+
|
|
62
|
+
> **An extension's definition names all begin with the PascalCase form of its
|
|
63
|
+
> directory name.**
|
|
64
|
+
|
|
65
|
+
`clinical/` gives `ClinicalProcedureWorkflow`, `ros/` gives `RosNode`, `aadl/`
|
|
66
|
+
gives `AadlThread`. Definition names share one flat namespace with the base and
|
|
67
|
+
with every other extension, so without a prefix two independent extensions could
|
|
68
|
+
both declare `Node` and a project could not include both. The uniqueness check
|
|
69
|
+
compares each extension against the base *and* against every other extension;
|
|
70
|
+
the prefix is what makes that check something an author can satisfy by
|
|
71
|
+
construction rather than by luck.
|
|
72
|
+
|
|
73
|
+
Enumeration literals are not definitions and are not prefixed —
|
|
74
|
+
`RosReliabilityKind::reliable`, not `RosReliabilityKind::rosReliable`.
|
|
75
|
+
|
|
76
|
+
## What an extension must not do
|
|
77
|
+
|
|
78
|
+
- Redefine or restate what the base already expresses — specialize it.
|
|
79
|
+
- Declare a definition name the base or another extension declares.
|
|
80
|
+
- Carry semantic YAML. Identity and `sysmlDir` are the whole descriptor.
|
|
81
|
+
|
|
82
|
+
## The extensions that ship
|
|
83
|
+
|
|
84
|
+
| Directory | Prefix | What it adds |
|
|
85
|
+
| --- | --- | --- |
|
|
86
|
+
| `template/` | `Template` | The skeleton to copy. |
|
|
87
|
+
| `clinical/` | `Clinical` | Clinical-procedure data on the base operational workflow. |
|
|
88
|
+
| `aadl/` | `Aadl` | The AADL (SAE AS5506) correspondence profile: MEMO names mapped to AADL categories, plus the process / thread / virtual-processor component families. |
|
|
89
|
+
| `cloud/` | `Cloud` | Networked services and managed data stores. |
|
|
90
|
+
| `ros/` | `Ros` | ROS 2: nodes, messages, directional ports, topic/service/action interfaces, QoS, and containerized deployment. |
|
|
91
|
+
|
|
92
|
+
`aadl`, `cloud`, and `ros` between them are where the twelve runtime-technology
|
|
93
|
+
attributes that used to sit on `SoftwareComponent` now live — see
|
|
94
|
+
`plans/reference/memo-r1-arcadia-residue.md`.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Application/distribution descriptor for this MEMO package.
|
|
2
|
+
#
|
|
3
|
+
# Identity and location only. It records what this package is called, what
|
|
4
|
+
# version it is, and where its SysML source sits so a resolver can find it.
|
|
5
|
+
# It does not select model content: the project's native SysML imports and its
|
|
6
|
+
# ProjectMethodBinding decide what is in the model. Semantic fields
|
|
7
|
+
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
|
+
# removed at the native semantic flip and are now rejected if present.
|
|
9
|
+
name: '@memoarchitect/extension-aadl'
|
|
10
|
+
version: 0.8.22
|
|
11
|
+
description: AADL (SAE AS5506) correspondence profile and runtime component families
|
|
12
|
+
license: MIT
|
|
13
|
+
tags:
|
|
14
|
+
- memo
|
|
15
|
+
- methodology
|
|
16
|
+
- extension
|
|
17
|
+
- aadl
|
|
18
|
+
sysmlDir: ./src
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// The AADL extension's public facade. A project includes the module
|
|
2
|
+
// `memo_extension_aadl` in its binding and imports this package.
|
|
3
|
+
package memo_extension_aadl {
|
|
4
|
+
public import memo_extension_aadl_runtime::*;
|
|
5
|
+
public import memo_extension_aadl_correspondence::*;
|
|
6
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// The AADL correspondence profile (plan §C5).
|
|
2
|
+
//
|
|
3
|
+
// `memo_software_runtime.sysml` pointed at `examples/aadl-mapping` for a long
|
|
4
|
+
// time, and that directory never existed. A dangling pointer to a profile is
|
|
5
|
+
// worse than no profile, so this is the profile.
|
|
6
|
+
//
|
|
7
|
+
// It is written as model content, not prose: each correspondence is a
|
|
8
|
+
// `CorrespondenceRule` — MEMO's own ISO/IEC/IEEE 42010 element for relating
|
|
9
|
+
// elements across architecture descriptions — carrying the MEMO name, the AADL
|
|
10
|
+
// name, and the direction. That makes the mapping greppable, exportable, and
|
|
11
|
+
// checkable, which a comment block is not.
|
|
12
|
+
//
|
|
13
|
+
// Scope: the correspondence records what MEMO already means in AADL terms. It
|
|
14
|
+
// does not claim MEMO is AADL. Where AADL has no MEMO counterpart (subprogram,
|
|
15
|
+
// device, abstract) or MEMO has no AADL counterpart (every assurance
|
|
16
|
+
// discipline), there is simply no rule.
|
|
17
|
+
package memo_extension_aadl_correspondence {
|
|
18
|
+
private import ScalarValues::*;
|
|
19
|
+
|
|
20
|
+
private import memo_architecture_operational_context_stakeholders::*;
|
|
21
|
+
|
|
22
|
+
// ── Component categories ────────────────────────────────────────────
|
|
23
|
+
part aadlCorrProcess : CorrespondenceRule {
|
|
24
|
+
attribute :>> id = "EXT-AADL-C-001";
|
|
25
|
+
attribute :>> name = "ProcessCorrespondence";
|
|
26
|
+
attribute :>> ruleExpression = "memo_extension_aadl_runtime::AadlProcess <-> AADL component category `process`";
|
|
27
|
+
attribute :>> description = "A MEMO SoftwareComponent with runtimeKind = process, carrying addressSpaceIsolated.";
|
|
28
|
+
}
|
|
29
|
+
part aadlCorrThread : CorrespondenceRule {
|
|
30
|
+
attribute :>> id = "EXT-AADL-C-002";
|
|
31
|
+
attribute :>> name = "ThreadCorrespondence";
|
|
32
|
+
attribute :>> ruleExpression = "memo_extension_aadl_runtime::AadlThread <-> AADL component category `thread`";
|
|
33
|
+
attribute :>> description = "Schedulable unit inside one process; owningProcessName names the containing process.";
|
|
34
|
+
}
|
|
35
|
+
part aadlCorrVirtualProcessor : CorrespondenceRule {
|
|
36
|
+
attribute :>> id = "EXT-AADL-C-003";
|
|
37
|
+
attribute :>> name = "VirtualProcessorCorrespondence";
|
|
38
|
+
attribute :>> ruleExpression = "memo_extension_aadl_runtime::AadlVirtualProcessor <-> AADL component category `virtual processor`";
|
|
39
|
+
attribute :>> description = "An ARINC 653 partition. partitionBudget is the guaranteed time and memory; isolationMechanism is what enforces it.";
|
|
40
|
+
}
|
|
41
|
+
part aadlCorrProcessor : CorrespondenceRule {
|
|
42
|
+
attribute :>> id = "EXT-AADL-C-004";
|
|
43
|
+
attribute :>> name = "ProcessorCorrespondence";
|
|
44
|
+
attribute :>> ruleExpression = "memo_architecture_realization_physical::ProcessingNode <-> AADL component category `processor`";
|
|
45
|
+
}
|
|
46
|
+
part aadlCorrMemory : CorrespondenceRule {
|
|
47
|
+
attribute :>> id = "EXT-AADL-C-005";
|
|
48
|
+
attribute :>> name = "MemoryCorrespondence";
|
|
49
|
+
attribute :>> ruleExpression = "memo_architecture_realization_physical::MemoryDevice <-> AADL component category `memory`";
|
|
50
|
+
}
|
|
51
|
+
part aadlCorrBus : CorrespondenceRule {
|
|
52
|
+
attribute :>> id = "EXT-AADL-C-006";
|
|
53
|
+
attribute :>> name = "BusCorrespondence";
|
|
54
|
+
attribute :>> ruleExpression = "memo_architecture_implementation_hardware_electrical::NetworkMedium <-> AADL component category `bus`";
|
|
55
|
+
}
|
|
56
|
+
part aadlCorrSystem : CorrespondenceRule {
|
|
57
|
+
attribute :>> id = "EXT-AADL-C-007";
|
|
58
|
+
attribute :>> name = "SystemCorrespondence";
|
|
59
|
+
attribute :>> ruleExpression = "memo_architecture_logical_structure::System <-> AADL component category `system`";
|
|
60
|
+
attribute :>> description = "AADL's system is the composition unit, which is MEMO's logical System rather than any runtime element.";
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ── Bindings. AADL's analytic power is that everything is bound to
|
|
64
|
+
// something, and the binding is where latency, bandwidth, and fault
|
|
65
|
+
// propagation accrue. MEMO has all three (plan C1). ────────────────────
|
|
66
|
+
part aadlCorrProcessorBinding : CorrespondenceRule {
|
|
67
|
+
attribute :>> id = "EXT-AADL-C-010";
|
|
68
|
+
attribute :>> name = "ActualProcessorBindingCorrespondence";
|
|
69
|
+
attribute :>> ruleExpression = "memo_architecture_realization_deployment::DeploysTo <-> AADL property `Actual_Processor_Binding`";
|
|
70
|
+
}
|
|
71
|
+
part aadlCorrMemoryBinding : CorrespondenceRule {
|
|
72
|
+
attribute :>> id = "EXT-AADL-C-011";
|
|
73
|
+
attribute :>> name = "ActualMemoryBindingCorrespondence";
|
|
74
|
+
attribute :>> ruleExpression = "memo_architecture_realization_deployment::MemoryBinding <-> AADL property `Actual_Memory_Binding`";
|
|
75
|
+
}
|
|
76
|
+
part aadlCorrConnectionBinding : CorrespondenceRule {
|
|
77
|
+
attribute :>> id = "EXT-AADL-C-012";
|
|
78
|
+
attribute :>> name = "ActualConnectionBindingCorrespondence";
|
|
79
|
+
attribute :>> ruleExpression = "memo_architecture_realization_deployment::ConnectionBinding <-> AADL property `Actual_Connection_Binding`";
|
|
80
|
+
attribute :>> description = "The bound element is the ComponentExchange, because the exchange is what owns the budget the medium spends.";
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ── Ports and flows ─────────────────────────────────────────────────
|
|
84
|
+
part aadlCorrPortCategory : CorrespondenceRule {
|
|
85
|
+
attribute :>> id = "EXT-AADL-C-020";
|
|
86
|
+
attribute :>> name = "PortCategoryCorrespondence";
|
|
87
|
+
attribute :>> ruleExpression = "memo_core_enumerations::PortCategoryKind (data | 'event' | eventData) <-> AADL `data port` | `event port` | `event data port`";
|
|
88
|
+
attribute :>> description = "Determines whether a missed deadline loses a sample or grows a queue — two failure modes with two mitigations.";
|
|
89
|
+
}
|
|
90
|
+
part aadlCorrFlowSpec : CorrespondenceRule {
|
|
91
|
+
attribute :>> id = "EXT-AADL-C-021";
|
|
92
|
+
attribute :>> name = "FlowSpecificationCorrespondence";
|
|
93
|
+
attribute :>> ruleExpression = "memo_architecture_realization_deployment::FlowSpecification (FlowSpecKind source | sink | path) <-> AADL `flow source` | `flow sink` | `flow path`";
|
|
94
|
+
}
|
|
95
|
+
part aadlCorrEndToEndFlow : CorrespondenceRule {
|
|
96
|
+
attribute :>> id = "EXT-AADL-C-022";
|
|
97
|
+
attribute :>> name = "EndToEndFlowCorrespondence";
|
|
98
|
+
attribute :>> ruleExpression = "memo_architecture_realization_deployment::EndToEndFlow <-> AADL `end to end flow`";
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ── Properties. AADL's property sets are the technology-specific half of
|
|
102
|
+
// the language; these are the ones MEMO already carries by another name.
|
|
103
|
+
part aadlCorrPeriod : CorrespondenceRule {
|
|
104
|
+
attribute :>> id = "EXT-AADL-C-030";
|
|
105
|
+
attribute :>> name = "PeriodCorrespondence";
|
|
106
|
+
attribute :>> ruleExpression = "SoftwareComponent.periodMs <-> AADL `Timing_Properties::Period` (ms)";
|
|
107
|
+
}
|
|
108
|
+
part aadlCorrDeadline : CorrespondenceRule {
|
|
109
|
+
attribute :>> id = "EXT-AADL-C-031";
|
|
110
|
+
attribute :>> name = "DeadlineCorrespondence";
|
|
111
|
+
attribute :>> ruleExpression = "SoftwareComponent.deadlineMs <-> AADL `Timing_Properties::Deadline` (ms)";
|
|
112
|
+
}
|
|
113
|
+
part aadlCorrComputeExecutionTime : CorrespondenceRule {
|
|
114
|
+
attribute :>> id = "EXT-AADL-C-032";
|
|
115
|
+
attribute :>> name = "ComputeExecutionTimeCorrespondence";
|
|
116
|
+
attribute :>> ruleExpression = "SoftwareComponent.wcetMs <-> upper bound of AADL `Timing_Properties::Compute_Execution_Time` (ms)";
|
|
117
|
+
attribute :>> description = "AADL records a range; MEMO records the worst case, which is the bound a schedulability argument uses.";
|
|
118
|
+
}
|
|
119
|
+
part aadlCorrPriority : CorrespondenceRule {
|
|
120
|
+
attribute :>> id = "EXT-AADL-C-033";
|
|
121
|
+
attribute :>> name = "PriorityCorrespondence";
|
|
122
|
+
attribute :>> ruleExpression = "SoftwareComponent.priority <-> AADL `Thread_Properties::Priority`";
|
|
123
|
+
}
|
|
124
|
+
part aadlCorrSchedulingProtocol : CorrespondenceRule {
|
|
125
|
+
attribute :>> id = "EXT-AADL-C-034";
|
|
126
|
+
attribute :>> name = "SchedulingProtocolCorrespondence";
|
|
127
|
+
attribute :>> ruleExpression = "SoftwareComponent.schedulingPolicy <-> AADL `Deployment_Properties::Scheduling_Protocol`";
|
|
128
|
+
}
|
|
129
|
+
part aadlCorrLatency : CorrespondenceRule {
|
|
130
|
+
attribute :>> id = "EXT-AADL-C-035";
|
|
131
|
+
attribute :>> name = "LatencyCorrespondence";
|
|
132
|
+
attribute :>> ruleExpression = "EndToEndFlow.latencyBudgetMs <-> AADL `Communication_Properties::Latency` upper bound (ms)";
|
|
133
|
+
}
|
|
134
|
+
part aadlCorrBandwidth : CorrespondenceRule {
|
|
135
|
+
attribute :>> id = "EXT-AADL-C-036";
|
|
136
|
+
attribute :>> name = "BandwidthCorrespondence";
|
|
137
|
+
attribute :>> ruleExpression = "ConnectionBinding.allocatedBandwidth <-> AADL `Communication_Properties::Bandwidth_Budget`";
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ── Where the correspondence stops ──────────────────────────────────
|
|
141
|
+
part aadlCorrNoCounterpart : CorrespondenceRule {
|
|
142
|
+
attribute :>> id = "EXT-AADL-C-090";
|
|
143
|
+
attribute :>> name = "NoCounterpartNote";
|
|
144
|
+
attribute :>> ruleExpression = "no correspondence: AADL `subprogram`, `device`, `abstract`; MEMO's five assurance disciplines";
|
|
145
|
+
attribute :>> description = "Recorded so the gap is a stated boundary of the profile rather than an omission a reader has to discover.";
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package memo_extension_aadl_methodology {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
private import memo_methodology_core::*;
|
|
4
|
+
private import memo_methodology_profiles::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
|
|
7
|
+
part aadlExtensionMethod : MethodologyDefinition {
|
|
8
|
+
attribute :>> id = "EXT-AADL-001";
|
|
9
|
+
attribute :>> name = "AadlCorrespondenceExtension";
|
|
10
|
+
attribute :>> version = "0.7.0";
|
|
11
|
+
attribute :>> domain = "AADL (SAE AS5506) software runtime";
|
|
12
|
+
attribute :>> description = "Adds the AADL correspondence profile and the process / thread / virtual-processor runtime families.";
|
|
13
|
+
ref :>> baseMethodology = mdDefaultDefinition;
|
|
14
|
+
attribute :>> scopeMode = ScopeModeKind::explicit;
|
|
15
|
+
attribute :>> includedModule = "memo_extension_aadl";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// AADL (SAE AS5506) runtime component families.
|
|
2
|
+
//
|
|
3
|
+
// `SoftwareComponent.runtimeKind` says WHICH family a component belongs to and
|
|
4
|
+
// the base stops there, deliberately: the timing and assurance properties
|
|
5
|
+
// (period, deadline, WCET, scheduling policy, priority, health monitoring,
|
|
6
|
+
// restart policy, fault containment) are true of every runtime component in
|
|
7
|
+
// every regulated project, so they stay on the base.
|
|
8
|
+
//
|
|
9
|
+
// What the base used to carry as well was a set of attributes documented "set
|
|
10
|
+
// only for the relevant runtimeKind" — a subtype family in disguise, and one
|
|
11
|
+
// with a specific technology behind it. `addressSpaceIsolated` and
|
|
12
|
+
// `owningProcessName` are AADL's process/thread distinction; `partitionBudget`
|
|
13
|
+
// and `isolationMechanism` are AADL's virtual processor, which is what an
|
|
14
|
+
// ARINC 653 partition is modelled as. Each is unconditional on the type that
|
|
15
|
+
// owns it here, which is the whole point: an optional attribute that is only
|
|
16
|
+
// meaningful for one enum value cannot be checked, and a required attribute on
|
|
17
|
+
// a type can.
|
|
18
|
+
package memo_extension_aadl_runtime {
|
|
19
|
+
private import ScalarValues::*;
|
|
20
|
+
|
|
21
|
+
private import memo_core_enumerations::*;
|
|
22
|
+
private import memo_architecture_implementation_software_runtime::*;
|
|
23
|
+
|
|
24
|
+
// AADL `process`: a protected address space. Threads execute inside it;
|
|
25
|
+
// the process itself is the fault-containment and memory-protection
|
|
26
|
+
// boundary, which is why safety arguments quote it.
|
|
27
|
+
part def AadlProcess specializes SoftwareComponent {
|
|
28
|
+
attribute :>> runtimeKind = RuntimeKind::process;
|
|
29
|
+
// Whether the runtime enforces memory protection at this boundary.
|
|
30
|
+
// A process without address-space isolation is a scheduling unit, not
|
|
31
|
+
// a containment boundary, and no partitioning claim may rest on it.
|
|
32
|
+
attribute addressSpaceIsolated : Boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// AADL `thread`: a schedulable unit of concurrency, always executing
|
|
36
|
+
// within exactly one process. The base's period / deadline / WCET /
|
|
37
|
+
// priority are AADL thread properties already; what was missing was the
|
|
38
|
+
// containing process.
|
|
39
|
+
part def AadlThread specializes SoftwareComponent {
|
|
40
|
+
attribute :>> runtimeKind = RuntimeKind::thread;
|
|
41
|
+
attribute owningProcessName : String;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// AADL `virtual processor`: a partition scheduled on a processor with a
|
|
45
|
+
// guaranteed budget. This is how an ARINC 653 partition is modelled, and
|
|
46
|
+
// the budget is what a temporal-partitioning argument is made of.
|
|
47
|
+
part def AadlVirtualProcessor specializes SoftwareComponent {
|
|
48
|
+
attribute :>> runtimeKind = RuntimeKind::partition;
|
|
49
|
+
// Time and memory guaranteed to the partition, e.g. "2 ms window per
|
|
50
|
+
// 10 ms major frame; 4 MB".
|
|
51
|
+
attribute partitionBudget : String;
|
|
52
|
+
// What enforces the partition — MMU, MPU, hypervisor, ARINC 653 module
|
|
53
|
+
// OS. A budget nothing enforces is a plan, not a control.
|
|
54
|
+
attribute isolationMechanism : String;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Application/distribution descriptor for this MEMO package.
|
|
2
|
+
#
|
|
3
|
+
# Identity and location only. It records what this package is called, what
|
|
4
|
+
# version it is, and where its SysML source sits so a resolver can find it.
|
|
5
|
+
# It does not select model content: the project's native SysML imports and its
|
|
6
|
+
# ProjectMethodBinding decide what is in the model. Semantic fields
|
|
7
|
+
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
|
+
# removed at the native semantic flip and are now rejected if present.
|
|
9
|
+
name: '@memoarchitect/extension-cloud'
|
|
10
|
+
version: 0.8.22
|
|
11
|
+
description: Networked services and managed data stores
|
|
12
|
+
license: MIT
|
|
13
|
+
tags:
|
|
14
|
+
- memo
|
|
15
|
+
- methodology
|
|
16
|
+
- extension
|
|
17
|
+
- cloud
|
|
18
|
+
sysmlDir: ./src
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Networked services and managed data stores — the runtime families a
|
|
2
|
+
// software-only medical device (SaMD) deploys onto infrastructure the
|
|
3
|
+
// manufacturer does not control.
|
|
4
|
+
//
|
|
5
|
+
// This is where `serviceContract`, `discoveryMechanism`, `storageKind`, and
|
|
6
|
+
// `retentionPolicy` live now. All four were optional attributes on
|
|
7
|
+
// `SoftwareComponent` documented "set only for the relevant runtimeKind";
|
|
8
|
+
// here each is unconditional on the type that owns it.
|
|
9
|
+
package memo_extension_cloud {
|
|
10
|
+
private import ScalarValues::*;
|
|
11
|
+
|
|
12
|
+
private import memo_core_enumerations::*;
|
|
13
|
+
private import memo_architecture_implementation_software_runtime::*;
|
|
14
|
+
|
|
15
|
+
// How a store keeps what it is given. A String said nothing a query could
|
|
16
|
+
// group by, and the retention argument in a records-retention assessment
|
|
17
|
+
// turns on which of these it is.
|
|
18
|
+
enum def CloudStorageKind {
|
|
19
|
+
enum relational;
|
|
20
|
+
enum document;
|
|
21
|
+
enum keyValue;
|
|
22
|
+
enum objectStore;
|
|
23
|
+
enum timeSeries;
|
|
24
|
+
enum blockVolume;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
part def CloudService specializes SoftwareComponent {
|
|
28
|
+
attribute :>> runtimeKind = RuntimeKind::service;
|
|
29
|
+
// The externally visible contract: protocol, endpoint, request and
|
|
30
|
+
// response. This is the boundary a verification case exercises.
|
|
31
|
+
attribute serviceContract : String;
|
|
32
|
+
// How callers find it — DNS, service registry, mesh, static endpoint.
|
|
33
|
+
attribute discoveryMechanism : String;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
part def CloudDataStore specializes SoftwareComponent {
|
|
37
|
+
attribute :>> runtimeKind = RuntimeKind::dataStore;
|
|
38
|
+
attribute storageKind : CloudStorageKind;
|
|
39
|
+
// How long records are kept and what ends them. Regulated content:
|
|
40
|
+
// a device record has a retention obligation, and the store is where
|
|
41
|
+
// that obligation is either met or not.
|
|
42
|
+
attribute retentionPolicy : String;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package memo_extension_cloud_methodology {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
private import memo_methodology_core::*;
|
|
4
|
+
private import memo_methodology_profiles::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
|
|
7
|
+
part cloudExtensionMethod : MethodologyDefinition {
|
|
8
|
+
attribute :>> id = "EXT-CLOUD-001";
|
|
9
|
+
attribute :>> name = "CloudRuntimeExtension";
|
|
10
|
+
attribute :>> version = "0.7.0";
|
|
11
|
+
attribute :>> domain = "networked services and managed data stores";
|
|
12
|
+
attribute :>> description = "Adds service and data-store runtime families with their contracts, discovery, and retention.";
|
|
13
|
+
ref :>> baseMethodology = mdDefaultDefinition;
|
|
14
|
+
attribute :>> scopeMode = ScopeModeKind::explicit;
|
|
15
|
+
attribute :>> includedModule = "memo_extension_cloud";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Application/distribution descriptor for this MEMO package.
|
|
2
|
+
#
|
|
3
|
+
# Identity and location only. It records what this package is called, what
|
|
4
|
+
# version it is, and where its SysML source sits so a resolver can find it.
|
|
5
|
+
# It does not select model content: the project's native SysML imports and its
|
|
6
|
+
# ProjectMethodBinding decide what is in the model. Semantic fields
|
|
7
|
+
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
|
+
# removed at the native semantic flip and are now rejected if present.
|
|
9
|
+
name: '@memoarchitect/extension-container'
|
|
10
|
+
version: 0.8.22
|
|
11
|
+
description: OCI container images and container runtimes as deployment content
|
|
12
|
+
license: MIT
|
|
13
|
+
tags:
|
|
14
|
+
- memo
|
|
15
|
+
- methodology
|
|
16
|
+
- extension
|
|
17
|
+
- container
|
|
18
|
+
sysmlDir: ./src
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Containerized deployment (OCI). Technology-neutral across orchestrators, so
|
|
2
|
+
// a project that containerizes anything can include this module on its own;
|
|
3
|
+
// `memo_extension_ros` specializes both types rather than restating them.
|
|
4
|
+
//
|
|
5
|
+
// This is where `imageReference` and `orchestrationPlatform` live now. They
|
|
6
|
+
// were optional attributes on `SoftwareComponent` documented "set only when
|
|
7
|
+
// runtimeKind = container" — a subtype family in disguise, and a technology
|
|
8
|
+
// choice the base ontology had no business asserting. On the types below they
|
|
9
|
+
// are unconditional, which is what makes them checkable.
|
|
10
|
+
package memo_extension_container {
|
|
11
|
+
private import ScalarValues::*;
|
|
12
|
+
|
|
13
|
+
private import memo_architecture_realization_deployment::*;
|
|
14
|
+
|
|
15
|
+
// The built artifact. `BuildsInto` (SoftwareModule -> DeploymentUnit)
|
|
16
|
+
// reaches it unchanged, which is the test that the base is factored
|
|
17
|
+
// correctly: a whole packaging technology lands without touching a base
|
|
18
|
+
// relation.
|
|
19
|
+
part def ContainerImage specializes DeploymentUnit {
|
|
20
|
+
// The pullable reference, e.g. "registry.example.com/screening:1.4.0".
|
|
21
|
+
attribute imageReference : String;
|
|
22
|
+
attribute registry : String;
|
|
23
|
+
// The content digest. A tag can be re-pointed; a digest is what a
|
|
24
|
+
// design history file can argue reproducibility from.
|
|
25
|
+
attribute digest : String;
|
|
26
|
+
attribute baseImage : String;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// The environment a node provides. `ProvidesEnvironment` (ProcessingNode
|
|
30
|
+
// -> RuntimeEnvironment) reaches it unchanged.
|
|
31
|
+
part def ContainerRuntime specializes RuntimeEnvironment {
|
|
32
|
+
// Kubernetes, Nomad, Docker Compose, systemd-nspawn, none.
|
|
33
|
+
attribute orchestrationPlatform : String;
|
|
34
|
+
// The engine below the orchestrator — containerd, CRI-O, Docker.
|
|
35
|
+
attribute runtimeEngine : String;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package memo_extension_container_methodology {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
private import memo_methodology_core::*;
|
|
4
|
+
private import memo_methodology_profiles::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
|
|
7
|
+
part containerExtensionMethod : MethodologyDefinition {
|
|
8
|
+
attribute :>> id = "EXT-CONTAINER-001";
|
|
9
|
+
attribute :>> name = "ContainerDeploymentExtension";
|
|
10
|
+
attribute :>> version = "0.7.0";
|
|
11
|
+
attribute :>> domain = "containerized deployment";
|
|
12
|
+
attribute :>> description = "Adds OCI container images and container runtimes as deployment content.";
|
|
13
|
+
ref :>> baseMethodology = mdDefaultDefinition;
|
|
14
|
+
attribute :>> scopeMode = ScopeModeKind::explicit;
|
|
15
|
+
attribute :>> includedModule = "memo_extension_container";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Application/distribution descriptor for this MEMO package.
|
|
2
|
+
#
|
|
3
|
+
# Identity and location only. It records what this package is called, what
|
|
4
|
+
# version it is, and where its SysML source sits so a resolver can find it.
|
|
5
|
+
# It does not select model content: the project's native SysML imports and its
|
|
6
|
+
# ProjectMethodBinding decide what is in the model. Semantic fields
|
|
7
|
+
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
|
+
# removed at the native semantic flip and are now rejected if present.
|
|
9
|
+
name: '@memoarchitect/extension-messaging'
|
|
10
|
+
version: 0.8.22
|
|
11
|
+
description: Publish/subscribe messaging — topics, brokers, and delivery semantics
|
|
12
|
+
license: MIT
|
|
13
|
+
tags:
|
|
14
|
+
- memo
|
|
15
|
+
- methodology
|
|
16
|
+
- extension
|
|
17
|
+
- messaging
|
|
18
|
+
sysmlDir: ./src
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Messaging vocabulary, technology-neutral across DDS, MQTT, AMQP and Kafka.
|
|
2
|
+
// It specializes native item, port, and interface families; publication and
|
|
3
|
+
// subscription are expressed by port direction plus native flows/messages.
|
|
4
|
+
//
|
|
5
|
+
// This is where `deliverySemantics` and `topicStructure` live now, and moving
|
|
6
|
+
// them fixed a metaclass error as well as a layering one. Both were attributes
|
|
7
|
+
// on `SoftwareComponent`, and neither is a property of a component: a
|
|
8
|
+
// component does not have a topic, a publication does; a component does not
|
|
9
|
+
// have delivery semantics, the channel it publishes over does.
|
|
10
|
+
package memo_extension_messaging {
|
|
11
|
+
private import ScalarValues::*;
|
|
12
|
+
|
|
13
|
+
private import memo_core_common::*;
|
|
14
|
+
private import memo_core_enumerations::*;
|
|
15
|
+
private import memo_architecture_logical_interfaces::*;
|
|
16
|
+
private import memo_architecture_implementation_software_structure::*;
|
|
17
|
+
private import memo_architecture_implementation_software_runtime::*;
|
|
18
|
+
|
|
19
|
+
// What a broker guarantees about each message. Safety-relevant: an alarm
|
|
20
|
+
// published at-most-once can be silently dropped, and an at-least-once
|
|
21
|
+
// command can be applied twice.
|
|
22
|
+
enum def MessagingDeliveryKind {
|
|
23
|
+
enum atMostOnce;
|
|
24
|
+
enum atLeastOnce;
|
|
25
|
+
enum exactlyOnce;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Message/payload definition. A named topic is an item usage of a concrete
|
|
29
|
+
// message definition; the definition states the schema, while the usage
|
|
30
|
+
// supplies the deployed topic identity.
|
|
31
|
+
item def MessagingMessage specializes SoftwareItem {
|
|
32
|
+
attribute messageSchema : String;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Endpoint roles. Direction is native on both the port's payload feature
|
|
36
|
+
// and the port usage placed on a component. The shared `topic` reference
|
|
37
|
+
// points every endpoint at the same named item usage.
|
|
38
|
+
port def MessagingPublisher specializes SoftwarePort {
|
|
39
|
+
out item payload : MessagingMessage;
|
|
40
|
+
ref item topic : MessagingMessage;
|
|
41
|
+
attribute deliverySemantics : MessagingDeliveryKind;
|
|
42
|
+
attribute publishRateHz : Real;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
port def MessagingSubscriber specializes SoftwarePort {
|
|
46
|
+
in item payload : MessagingMessage;
|
|
47
|
+
ref item topic : MessagingMessage;
|
|
48
|
+
attribute deliverySemantics : MessagingDeliveryKind;
|
|
49
|
+
attribute lossBehaviour : String;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface def MessagingTopicInterface specializes SoftwareInterface {
|
|
53
|
+
end publisher : MessagingPublisher :>> source;
|
|
54
|
+
end subscriber : MessagingSubscriber :>> target;
|
|
55
|
+
flow of MessagingMessage from publisher.payload to subscriber.payload;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
part def MessagingBroker specializes SoftwareComponent {
|
|
59
|
+
attribute :>> runtimeKind = RuntimeKind::messageBroker;
|
|
60
|
+
attribute brokerProduct : String;
|
|
61
|
+
attribute persistenceEnabled : Boolean;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package memo_extension_messaging_methodology {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
private import memo_methodology_core::*;
|
|
4
|
+
private import memo_methodology_profiles::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
|
|
7
|
+
part messagingExtensionMethod : MethodologyDefinition {
|
|
8
|
+
attribute :>> id = "EXT-MESSAGING-001";
|
|
9
|
+
attribute :>> name = "MessagingExtension";
|
|
10
|
+
attribute :>> version = "0.7.0";
|
|
11
|
+
attribute :>> domain = "publish/subscribe messaging";
|
|
12
|
+
attribute :>> description = "Adds message items, publisher/subscriber ports, topic interfaces, brokers, and delivery semantics.";
|
|
13
|
+
ref :>> baseMethodology = mdDefaultDefinition;
|
|
14
|
+
attribute :>> scopeMode = ScopeModeKind::explicit;
|
|
15
|
+
attribute :>> includedModule = "memo_extension_messaging";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Application/distribution descriptor for this MEMO package.
|
|
2
|
+
#
|
|
3
|
+
# Identity and location only. It records what this package is called, what
|
|
4
|
+
# version it is, and where its SysML source sits so a resolver can find it.
|
|
5
|
+
# It does not select model content: the project's native SysML imports and its
|
|
6
|
+
# ProjectMethodBinding decide what is in the model. Semantic fields
|
|
7
|
+
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
|
+
# removed at the native semantic flip and are now rejected if present.
|
|
9
|
+
name: '@memoarchitect/extension-ros'
|
|
10
|
+
version: 0.8.22
|
|
11
|
+
description: ROS 2 nodes, messages, topic/service/action interfaces, QoS, and containerized deployment
|
|
12
|
+
license: MIT
|
|
13
|
+
tags:
|
|
14
|
+
- memo
|
|
15
|
+
- methodology
|
|
16
|
+
- extension
|
|
17
|
+
- ros
|
|
18
|
+
sysmlDir: ./src
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
package memo_extension_ros_methodology {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
private import memo_methodology_core::*;
|
|
4
|
+
private import memo_methodology_profiles::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
|
|
7
|
+
// An extension that builds on other extensions names them all here.
|
|
8
|
+
// `baseMethodology` is [0..1] — single inheritance, deliberate — but
|
|
9
|
+
// `includedModule` is [0..*], so this is how a dependency between
|
|
10
|
+
// extensions is expressed. There is no chaining and no second base.
|
|
11
|
+
part rosExtensionMethod : MethodologyDefinition {
|
|
12
|
+
attribute :>> id = "EXT-ROS-001";
|
|
13
|
+
attribute :>> name = "Ros2Extension";
|
|
14
|
+
attribute :>> version = "0.7.0";
|
|
15
|
+
attribute :>> domain = "ROS 2 robotics middleware";
|
|
16
|
+
attribute :>> description = "Adds ROS 2 nodes, messages, directional ports, topic/service/action interfaces, QoS, and containerized deployment.";
|
|
17
|
+
ref :>> baseMethodology = mdDefaultDefinition;
|
|
18
|
+
attribute :>> scopeMode = ScopeModeKind::explicit;
|
|
19
|
+
attribute :>> includedModule = (
|
|
20
|
+
"memo_extension_messaging",
|
|
21
|
+
"memo_extension_container",
|
|
22
|
+
"memo_extension_ros"
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
}
|