memo_architecture_functional_functions¶
| Public namespace | memo::architecture::functional::functions |
| Declared package | memo_architecture_functional_functions |
| Source | src/architecture/functional/functions/memo_functions.sysml |
Namespace hierarchy¶
memo → memo::architecture → memo::architecture::functional → memo::architecture::functional::functions
Packages¶
| Package |
|---|
memo_architecture_functional_functions |
Imports¶
| Visibility | Target |
|---|---|
| private | memo_core_stdlib_quantities::* |
| private | Metaobjects::SemanticMetadata |
| private | ScalarValues::* |
| private | memo_core_common::* |
| private | memo_core_enumerations::* |
| private | memo_core_relationships::* |
| private | memo_architecture_operational_activities::* |
| private | memo_architecture_operational_scenarios::* |
Declarations¶
| Name | SysML kind | Description | Specializes |
|---|---|---|---|
MemoFunction |
action def |
Memo function definition specializing MemoAction. |
MemoAction |
SystemFunction |
action def |
A responsibility of the system as a whole. Allocation is optional: a system function that no single component owns is a normal intermediate state of the functional chain, not a defect. | MemoFunction |
ComponentFunction |
action def |
A responsibility of exactly one component. AllocatedTo names that component; CR-ONT-074 requires it. A component function that reaches no component is a responsibility nobody has accepted. |
MemoFunction |
FunctionalExchange |
flow def |
Typed relationship for functional exchange. | — |
FunctionalTransfer |
flow def |
The concrete exchange. A concrete flow def must declare its two ends, so this is the member of the family a model types its flows by; the ends are left untyped, as an exchange runs from an out parameter of one function to an in parameter of another (or between ports). |
FunctionalExchange |
FunctionalFlow |
action def |
Functional flow definition specializing MemoAction. |
MemoAction |
MemoFunction¶
abstract action def MemoFunction specializes MemoAction, MemoConstrainedOccurrence| Property | Value |
|---|---|
| Description | Memo function definition specializing MemoAction. |
| Kind | action def |
| Abstract | Yes |
| Specializes | MemoAction |
| Owning package | memo_architecture_functional_functions |
SystemFunction¶
action def SystemFunction specializes MemoFunction| Property | Value |
|---|---|
| Description | A responsibility of the system as a whole. Allocation is optional: a system function that no single component owns is a normal intermediate state of the functional chain, not a defect. |
| Kind | action def |
| Abstract | No |
| Specializes | MemoFunction |
| Owning package | memo_architecture_functional_functions |
ComponentFunction¶
action def ComponentFunction specializes MemoFunction| Property | Value |
|---|---|
| Description | A responsibility of exactly one component. AllocatedTo names that component; CR-ONT-074 requires it. A component function that reaches no component is a responsibility nobody has accepted. |
| Kind | action def |
| Abstract | No |
| Specializes | MemoFunction |
| Owning package | memo_architecture_functional_functions |
FunctionalExchange¶
abstract flow def FunctionalExchange| Property | Value |
|---|---|
| Description | Typed relationship for functional exchange. |
| Kind | flow def |
| Abstract | Yes |
| Specializes | — |
| Owning package | memo_architecture_functional_functions |
FunctionalTransfer¶
flow def FunctionalTransfer specializes FunctionalExchange| Property | Value |
|---|---|
| Description | The concrete exchange. A concrete flow def must declare its two ends, so this is the member of the family a model types its flows by; the ends are left untyped, as an exchange runs from an out parameter of one function to an in parameter of another (or between ports). |
| Kind | flow def |
| Abstract | No |
| Specializes | FunctionalExchange |
| Owning package | memo_architecture_functional_functions |
FunctionalFlow¶
action def FunctionalFlow specializes MemoAction| Property | Value |
|---|---|
| Description | Functional flow definition specializing MemoAction. |
| Kind | action def |
| Abstract | No |
| Specializes | MemoAction |
| Owning package | memo_architecture_functional_functions |
Source¶
architecture/functional/functions/memo_functions.sysml
// Functional architecture (§9). A function is a responsibility: what the
// system, or one of its components, is answerable for. A FunctionalExchange is
// a typed transfer between functions. A function may be realized by human
// action, mechanical design, electrical hardware, software, or a combination —
// allocation to the system's own parts is what ComponentFunction records, and
// it never assumes software.
//
// ─── A function is a behaviour ───────────────────────────────────────────
//
// `MemoFunction` and both its specializations are `action def`s. They were
// `part def SystemFunction specializes MemoPart` until Track A0
// removed the reason: relation ends were typed on part-based types,
// KerML forbids a behaviour from specializing a part-based type, and a function
// has to be satisfiable, verifiable, and allocatable. So a function was declared
// a part, and a separate `action def OperativeAction` carried the behaviour with a
// `ref performedFunction` stapling the two back together — a reference used in
// ZERO example files. The ends are metaclass-neutral now (CR-ONT-060..073), so
// the split has no cause and is gone: OperativeAction is merged into the function
// family, and its `actionKind` moved onto MemoFunction where it was always
// describing the function anyway. `FunctionalFlow` was the one element A0 left
// behind on the part side; it is an `action def` now, for the same reason and
// on the same evidence.
//
// `functionCategory` and `actionKind` are NOT two spellings of one axis, and
// merging them would lose information. `actionKind` is the verb — sense,
// compute, actuate, route. `functionCategory` is the domain grouping the
// project argues in — therapy, alarm, platform, protection. A function can be
// `sense` in the `protection` category, and a safety case reasons about both.
//
// ─── A functional exchange is a flow ─────────────────────────────────────
//
// `FunctionalExchange` is an `abstract flow def`, and an exchange is a typed
// named `flow` between function parameters: the edge IS the exchange. It was
// a `part def` beside a separate `flow`, with its ends stored as
// `sourceFunction`/`targetFunction` refs, because a flow could not be the
// target of an allocation or a trace. A named flow now carries a qualified id
// that `allocate`, `satisfy` and the rest resolve, so the part reached no
// rule, query or diagram and existed only to be kept in step with its edge.
//
// It is `abstract` because a flow definition specializes the association
// `Flows::MessageAction`, and a concrete association must declare its two
// ends (`association-related-types`); here the ends are the usage's
// parameters. A usage says what it carries through the item type of those
// parameters, not with `of`: `of` and `: FunctionalExchange` together declare
// a second `payload`, and a SysML v2 compiler rejects the pair.
//
// ─── System function vs. component function ──────────────────────────────
//
// ARCADIA's functional chain does not stop at the system boundary: system
// functions decompose until each piece is the responsibility of exactly one
// component. MEMO names the two ends of that chain because they obey different
// rules, not because they carry different attributes:
//
// SystemFunction — a responsibility of the system as a whole.
// Technology-independent. Allocation is OPTIONAL, and a
// system function may be realized by several components,
// by a human, or by mechanism.
// ComponentFunction — a responsibility of ONE component: a flowmeter's
// "measure flow rate", a subsystem's "arbitrate alarms".
// Allocation is MANDATORY and single-valued (CR-ONT-074).
//
// That difference is structural, which is why these are two definitions rather
// than one definition carrying a `functionLevel` enum. An enum member cannot
// change a multiplicity, and "is answerable to exactly one component" is the
// whole content of the concept.
//
// Decomposition and allocation reuse the existing relations and need no new
// ones — `Composes` for the function tree, `AllocatedTo` for the component.
// Both had part-typed ends until A0; both are metaclass-neutral now, which is
// precisely what makes an action-def function usable at all.
package memo_architecture_functional_functions {
private import memo_core_stdlib_quantities::*;
private import Metaobjects::SemanticMetadata;
private import ScalarValues::*;
private import memo_core_common::*;
private import memo_core_enumerations::*;
private import memo_core_relationships::*;
private import memo_architecture_operational_activities::*;
private import memo_architecture_operational_scenarios::*;
abstract action def MemoFunction specializes MemoAction, MemoConstrainedOccurrence {
attribute functionCategory : String;
attribute actionKind : ActionKind;
attribute trigger : String;
// What the function produces, in words: the part the typed `out` parameters cannot say (their type
// names the item, not that it is debounced, range-checked or timestamped). It does not restate the
// parameters, and what goes in is the `in` parameters alone (decided 2026-10-25, user).
attribute outputDescription : String;
attribute concernKind : ConcernKind;
attribute criticality : CriticalityKind;
}
// A responsibility of the system as a whole. Allocation is optional: a
// system function that no single component owns is a normal intermediate
// state of the functional chain, not a defect.
action def SystemFunction specializes MemoFunction;
// A responsibility of exactly one component. `AllocatedTo` names that
// component; CR-ONT-074 requires it. A component function that reaches no
// component is a responsibility nobody has accepted.
action def ComponentFunction specializes MemoFunction;
// A transfer between two functions, carrying the budgets and assurance
// attributes a reader needs on the transfer itself. Authored as a typed
// named flow from an `out` parameter of one function to an `in` parameter
// of another:
//
// flow lfFlowCommand : FunctionalTransfer
// from fnManageInfusion.flowCommandOut to fnCommandPump.flowCommandIn {
// attribute :>> latencyBudgetMs = 20.0;
// }
abstract flow def FunctionalExchange {
attribute flowKind : FlowKind;
attribute latencyBudgetMs : DurationValue;
attribute staleAfterMs : DurationValue;
attribute integrityLevel : String;
}
// The concrete exchange. A concrete `flow def` must declare its two ends, so this is the member
// of the family a model types its flows by; the ends are left untyped, as an exchange runs from
// an `out` parameter of one function to an `in` parameter of another (or between ports).
flow def FunctionalTransfer specializes FunctionalExchange {
end source;
end target;
}
// A system function enables operational work; it does not perform it.
// A reusable functional route through system responsibilities. Functional
// flows are part of functional architecture, never logical structure.
//
// An `action def`, like every other behaviour in MEMO. It was
// `part def ... specializes MemoPart` for the Track A0 reason described at
// the top of this file — relation ends typed on part-based types, and
// KerML forbids a behaviour from specializing one — and it was the single
// element A0 did not carry across when that reason went away. A route
// through responsibilities is the same shape as the `OperationalWorkflow`
// and `OperativeScenario` it sits beside: the scenarios package calls a
// scenario "a selected path through a workflow (or functional flow)",
// naming the two as one kind of thing, and its steps are `action def`s
// already. A structure whose whole body is `perform` is a behaviour that
// has not been allowed to say so.
action def FunctionalFlow specializes MemoAction {
attribute flowCategory : FunctionalFlowKind;
attribute endToEndLatencyBudgetMs : DurationValue;
attribute safetyRelevant : Boolean;
attribute securityRelevant : Boolean;
}
// A step is not a definition. `action def FunctionalFlowStep` stood here
// with `ref function`, `ref exchange` and `ref item exchangedItem`: a
// wrapper that pointed at the function it stood for. A step is that
// function performed at one position in the flow, which SysML says
// directly as an action usage nested in the flow that subsets it:
//
// action fcPatientBolus : FunctionalFlow {
// action fcsBolusCommand :> fnManageInfusion { out item flowCommand :> cdFlowCommand; }
// action fcsBolusActuate :> fnCommandPump { in item flowCommand :> cdFlowCommand; }
// first fcsBolusCommand then fcsBolusActuate;
// flow from fcsBolusCommand.flowCommand to fcsBolusActuate.flowCommand;
// }
//
// Each position keeps its own identity and evidence scope. The exchanged
// item is a directed parameter of the step, and the exchange a `flow`
// between two steps' parameters. A step's parameters redefine its
// function's by position.
// `InvolvesFunction` is native `perform` (R10-S6): a `FunctionalFlow`
// performs the function each of its steps subsets, and a flow with no
// steps performs its functions directly.
}