// Starter SysML v2 model for the Syside ReqIF tooling. // // This file is unlocked: every @reqif tag is bare. Run the workflow // from this directory: // // syside reqif init (drops in SysideReqIF.sysml) // syside reqif lock (populates UUIDs and timestamps) // syside reqif export --title "..." out.reqif package BrakeSystem { private import SysideReqIF::*; // --------------------------------------------------------------- // Datatypes // // Enumerations carry @reqif on the def and @reqif_enum_value on // each member. The 'key' attribute is the ReqIF integer key for // the enum value. // --------------------------------------------------------------- enum def Priority_Enum { @reqif; enum Low { @reqif_enum_value { :>> reqif_enum_value::key = 0; } } enum Medium { @reqif_enum_value { :>> reqif_enum_value::key = 1; } } enum Critical { @reqif_enum_value { :>> reqif_enum_value::key = 2; } } } // --------------------------------------------------------------- // Type templates (ReqIF *Type elements) // // The four ReqIF type kinds map to abstract SysML defs carrying a // #reqif_*_type stereotype. Concrete SpecObjects, Specifications // and RelationGroups subclassify these. // // Refines is a connection def, not abstract, because its concrete // SpecRelation usages type by it directly. // --------------------------------------------------------------- abstract #reqif_specification_type requirement def Document { @reqif; } abstract #reqif_spec_object_type requirement def Requirement { @reqif; attribute priority : Priority_Enum default Priority_Enum::Medium { @reqif; } } #reqif_spec_relation_type connection def Refines { @reqif; end source_requirement; end target_requirement; } abstract #reqif_relation_group_type occurrence def Traceability { @reqif; } // --------------------------------------------------------------- // Spec objects (the requirement defs themselves) // // Each one specialises Requirement and overrides priority. // // The nested 'requirement 1 : X' usages are the SpecHierarchy // nodes — their indexed names ('1', '2', ...) become ReqIF // SpecHierarchy children. // --------------------------------------------------------------- requirement def BrakingSystem :> Requirement { @reqif; attribute :>> priority = Priority_Enum::Critical; requirement '1' : EmergencyBrake { @reqif; } requirement '2' : PedalForce { @reqif; } } requirement def EmergencyBrake :> Requirement { @reqif; attribute :>> priority = Priority_Enum::Critical; } requirement def PedalForce :> Requirement { @reqif; } requirement def HydraulicCircuit :> Requirement { @reqif; requirement '1' : ABSController { @reqif; } } requirement def ABSController :> Requirement { @reqif; attribute :>> priority = Priority_Enum::Critical; } // --------------------------------------------------------------- // Specifications and their hierarchies // // Each Specification specialises Document. The nested 'requirement // 1 : X' usages are the SpecHierarchy nodes — their indexed names // ('1', '2', ...) become ReqIF SpecHierarchy children. // --------------------------------------------------------------- requirement def SystemRequirements :> Document { @reqif; requirement '1' : BrakingSystem { @reqif; } } requirement def SubsystemRequirements :> Document { @reqif; requirement '1' : HydraulicCircuit { @reqif; } } // --------------------------------------------------------------- // Traceability between System and Subsystem requirements // // The RelationGroup names the two specifications as // source_specification / target_specification, and its connection // usages (typed by Refines) link individual SpecObjects across the // two documents. // --------------------------------------------------------------- occurrence def SystemTracesSubsystem :> Traceability { @reqif; source_specification : SystemRequirements; target_specification : SubsystemRequirements; connection HydraulicRefinesBraking : Refines { @reqif; end :>> Refines::source_requirement ::> source_specification.'1'; end :>> Refines::target_requirement ::> target_specification.'1'; } connection ABSRefinesEmergency : Refines { @reqif; end :>> Refines::source_requirement ::> source_specification.'1'.'1'; end :>> Refines::target_requirement ::> target_specification.'1'.'1'; } } } // package BrakeSystem