Skip to content

memo_architecture_functional_functions

SysML API

Public namespace memo::architecture::functional::functions
Declared package memo_architecture_functional_functions
Source src/architecture/functional/functions/memo_functions.sysml

Namespace hierarchy

memomemo::architecturememo::architecture::functionalmemo::architecture::functional::functions

Packages

Package
memo_architecture_functional_functions

Imports

Visibility Target
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 part def Named traceable route between functions. Native flow of usages carry the transported item; this element exists for the budgets and assurance attributes below.… MemoPart
FunctionalFlow part def A reusable functional route through system responsibilities. Functional flows are part of functional architecture, never logical structure. MemoPart
FunctionalFlowStep action def Functional flow step definition specializing MemoAction. MemoAction

MemoFunction

abstract action def MemoFunction specializes MemoAction
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

part def FunctionalExchange specializes MemoPart
Property Value
Description Named traceable route between functions. Native flow of usages carry the transported item; this element exists for the budgets and assurance attributes below.…
Kind part def
Abstract No
Specializes MemoPart
Owning package memo_architecture_functional_functions

FunctionalFlow

part def FunctionalFlow specializes MemoPart
Property Value
Description A reusable functional route through system responsibilities. Functional flows are part of functional architecture, never logical structure.
Kind part def
Abstract No
Specializes MemoPart
Owning package memo_architecture_functional_functions

FunctionalFlowStep

action def FunctionalFlowStep specializes MemoAction
Property Value
Description Functional flow step 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.
//
// `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.
//
// ─── 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 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 {
        attribute functionCategory : String;
        attribute actionKind : ActionKind;
        attribute trigger : String;
        attribute outputSummary : 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;

    // Named traceable route between functions. Native `flow of` usages carry
    // the transported item; this element exists for the budgets and assurance
    // attributes below.
    //
    // The reason is MEMO's grammar, NOT the language — the earlier wording here
    // said "attributes that a flow usage cannot own", and that was a false
    // claim about SysML v2. The standard's `FlowUsage` is
    // `OccurrenceUsagePrefix 'flow' FlowDeclaration DefinitionBody`
    // (SysML-textual-bnf.kebnf:829), so a conforming flow usage takes a name
    // from its `UsageDeclaration` and owns attributes in its body like any
    // other usage. MEMO's own production is
    // `'flow' 'of' itemType 'from' … 'to' … ';'` — no name, no body — so a
    // MEMO flow can carry neither an `id` nor a latency budget, and nothing
    // can refer to it. Every MEMO element rests on the identification core in
    // memo_core_common, and an anonymous attribute-less edge cannot join it.
    //
    // So this part def is a workaround for a MEMO gap, not a design MEMO is
    // entitled to. Restoring the two dropped clauses is what would let it
    // collapse into the flow it stands in for.
    part def FunctionalExchange specializes MemoPart {
        attribute flowKind : FlowKind;
        attribute latencyBudgetMs : Real;
        attribute staleAfterMs : Real;
        attribute integrityLevel : String;
        // MemoFunction, not SystemFunction: an exchange between two component
        // functions is the ordinary case once the chain is decomposed.
        ref sourceFunction : MemoFunction[0..1];
        ref targetFunction : MemoFunction[0..1];
    }

    // 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.
    part def FunctionalFlow specializes MemoPart {
        attribute flowCategory : FunctionalFlowKind;
        attribute endToEndLatencyBudgetMs : String;
        attribute safetyRelevant : Boolean;
        attribute securityRelevant : Boolean;
    }
    action def FunctionalFlowStep specializes MemoAction {
        ref function : MemoFunction[0..1];
        ref exchange : FunctionalExchange[0..1];
        ref item exchangedItem : MemoItem[0..1];
    }

    // `InvolvesFunction` is native `perform` (R10-S6): a `FunctionalFlow`
    // already names its functions via its step chain
    // (`perform <step>;` + the step's own `ref function`), and a flow with no
    // step chain performs its functions directly.
}