Skip to content

Model Your Device

Model one engineering argument at a time:

flowchart LR
    Need[Need] --> Req[Requirement]
    Req --> Function[LogicalFunction]
    Function --> Component[LogicalComponent]
    Cause[HazardCause] --> Hazard[Hazard]
    Hazard --> Events[SequenceOfEvents]
    Events --> Situation[HazardousSituation]
    Situation --> Harm[Harm]
    Harm --> Risk[Risk]
    Control[RiskControlMeasure] --> Hazard
    Control --> Residual[ResidualRisk]
    Req --> Test[VerificationCase]
    Control --> Test
    Test --> Evidence[Evidence]

Define the elements

package infusion_pump {
    private import memo_medical_device_library::*;

    requirement safeDelivery : Need {
        attribute :>> id = "NEED-001";
        attribute :>> name = "SafeDelivery";
        attribute :>> needKind = NeedKind::stakeholder;
        attribute :>> statement =
            "The patient needs medication delivered without unintended over-infusion.";
    }

    requirement detectOverDelivery : Requirement {
        attribute :>> id = "REQ-001";
        attribute :>> requirementKind = RequirementKind::system;
        attribute :>> name = "DetectOverDelivery";
        attribute :>> statement =
            "The pump shall detect flow above the configured limit.";
    }

    part monitorFlow : LogicalFunction {
        attribute :>> id = "LF-001";
        attribute :>> name = "MonitorFlow";
    }

    part safetyMonitor : LogicalComponent {
        attribute :>> id = "LC-001";
        attribute :>> name = "SafetyMonitor";
    }

    item overInfusion : Hazard {
        attribute :>> id = "HAZ-001";
        attribute :>> name = "OverInfusion";
    }

    item independentMonitor : RiskControlMeasure {
        attribute :>> id = "RC-001";
        attribute :>> name = "IndependentFlowMonitor";
    }

    part shutoffTest : VerificationCase {
        attribute :>> id = "VER-001";
        attribute :>> name = "OverDeliveryShutoffTest";
    }
}

Connect the argument

connection : DerivesFrom
    connect sourceDriver ::> safeDelivery
    to targetRequirement ::> detectOverDelivery;

connection : AllocatedTo
    connect function ::> monitorFlow
    to allocatedElement ::> safetyMonitor;

connection : MitigatesHazard
    connect riskControl ::> independentMonitor
    to mitigatedHazard ::> overInfusion;

connection : VerifiedBy
    connect verificationTarget ::> detectOverDelivery
    to verificationCase ::> shutoffTest;

connection : VerifiedBy
    connect verificationTarget ::> independentMonitor
    to verificationCase ::> shutoffTest;

Review the slice

Ask:

  • Is the need written in stakeholder language?
  • Is the requirement measurable?
  • Is the function independent of implementation?
  • Is component responsibility explicit?
  • Does the control genuinely reduce the hazard?
  • Does the verification case test both the requirement and the control?

Use Choosing Elements and Connecting Elements when extending the slice.