@@ -29,12 +29,14 @@ load(
2929 "//bazel/rules/rules_score:providers.bzl" ,
3030 "ArchitecturalDesignInfo" ,
3131 "AssumedSystemRequirementsInfo" ,
32+ "AssumptionsOfUseInfo" ,
3233 "CertifiedScope" ,
3334 "ComponentInfo" ,
3435 "DependabilityAnalysisInfo" ,
3536 "DependableElementInfo" ,
3637 "DependableElementLobsterInfo" ,
3738 "FeatureRequirementsInfo" ,
39+ "ForwardedAoUInfo" ,
3840 "SphinxIndexFileInfo" ,
3941 "SphinxModuleInfo" ,
4042 "SphinxNeedsInfo" ,
@@ -1011,19 +1013,72 @@ def _dependable_element_index_impl(ctx):
10111013 cm_list = [sa_lobster_files ["controlmeasures.lobster" ]] if "controlmeasures.lobster" in sa_lobster_files else []
10121014 rc_list = [sa_lobster_files ["root_causes.lobster" ]] if "root_causes.lobster" in sa_lobster_files else []
10131015
1016+ # =========================================================================
1017+ # AoU Forwarding: collect own AoUs and received AoUs from deps
1018+ # =========================================================================
1019+
1020+ # Collect own AoU lobster files from assumptions_of_use targets
1021+ own_aou_lobster_files = []
1022+ for aou_target in ctx .attr .assumptions_of_use :
1023+ if AssumptionsOfUseInfo in aou_target :
1024+ own_aou_lobster_files .append (aou_target [AssumptionsOfUseInfo ].aou_lobster )
1025+
1026+ own_aou_lobster_depset = depset (transitive = own_aou_lobster_files )
1027+
1028+ # Collect forwarded AoU lobster files from deps (received AoUs)
1029+ received_aou_lobster_files = []
1030+ for dep in ctx .attr .processed_deps :
1031+ if ForwardedAoUInfo in dep :
1032+ fwd_info = dep [ForwardedAoUInfo ]
1033+ received_aou_lobster_files .append (fwd_info .own_aou_lobster )
1034+ received_aou_lobster_files .append (fwd_info .chain_forwarded_lobster )
1035+
1036+ received_aou_lobster_depset = depset (transitive = received_aou_lobster_files )
1037+ received_aou_list = received_aou_lobster_depset .to_list ()
1038+
1039+ # Chain-forwarding: if aou_forwarding YAML is provided, filter received AoUs
1040+ chain_forwarded_lobster_depset = depset ()
1041+ if ctx .file .aou_forwarding and received_aou_list :
1042+ chain_forwarded_lobster_file = ctx .actions .declare_file (
1043+ ctx .label .name + "/chain_forwarded_aous.lobster" ,
1044+ )
1045+ fwd_args = ctx .actions .args ()
1046+ fwd_args .add ("--yaml" , ctx .file .aou_forwarding )
1047+ fwd_args .add ("--output" , chain_forwarded_lobster_file )
1048+ fwd_args .add ("--input-lobster" )
1049+ fwd_args .add_all (received_aou_list )
1050+ ctx .actions .run (
1051+ inputs = [ctx .file .aou_forwarding ] + received_aou_list ,
1052+ outputs = [chain_forwarded_lobster_file ],
1053+ executable = ctx .executable ._aou_forwarding_tool ,
1054+ arguments = [fwd_args ],
1055+ progress_message = "Filtering chain-forwarded AoUs for %s" % ctx .label .name ,
1056+ mnemonic = "AoUForwarding" ,
1057+ )
1058+ chain_forwarded_lobster_depset = depset ([chain_forwarded_lobster_file ])
1059+ output_files .append (chain_forwarded_lobster_file )
1060+
10141061 lobster_report_file = None
10151062 lobster_html_report = None
10161063 lobster_rst_dir = None
10171064 lobster_files = []
10181065 if feat_req_list :
1066+ # Build comp_req trace-to lines (Feature Requirements + optionally Forwarded AoUs)
1067+ comp_req_trace_lines = ""
1068+ if comp_req_list :
1069+ comp_req_trace_lines = " trace to: \" Feature Requirements\" ;\n "
1070+ if received_aou_list :
1071+ comp_req_trace_lines += " trace to: \" Forwarded AoUs\" ;\n "
1072+
10191073 lobster_config = ctx .actions .declare_file (ctx .label .name + "/de_traceability_config" )
10201074 ctx .actions .expand_template (
10211075 template = ctx .file ._lobster_de_template ,
10221076 output = lobster_config ,
10231077 substitutions = {
10241078 "{FEAT_REQ_SOURCES}" : format_lobster_sources (feat_req_list ),
1079+ "{FORWARDED_AOU_SOURCES}" : format_lobster_sources (received_aou_list ),
10251080 "{COMP_REQ_SOURCES}" : format_lobster_sources (comp_req_list ),
1026- "{COMP_REQ_TRACE}" : ( " trace to: \" Feature Requirements \" ; \n " ) if comp_req_list else "" ,
1081+ "{COMP_REQ_TRACE}" : comp_req_trace_lines ,
10271082 "{ARCH_SOURCES}" : format_lobster_sources (comp_arch_list ),
10281083 "{UNIT_TEST_SOURCES}" : format_lobster_sources (comp_test_list ),
10291084 "{PUBLIC_API_SOURCES}" : format_lobster_sources (interface_req_list ),
@@ -1033,7 +1088,7 @@ def _dependable_element_index_impl(ctx):
10331088 },
10341089 )
10351090
1036- all_lobster_inputs = feat_req_list + comp_req_list + comp_arch_list + comp_test_list + interface_req_list + fm_list + cm_list + rc_list
1091+ all_lobster_inputs = feat_req_list + comp_req_list + comp_arch_list + comp_test_list + interface_req_list + fm_list + cm_list + rc_list + received_aou_list
10371092 lobster_report_file = subrule_lobster_report (all_lobster_inputs , lobster_config )
10381093 lobster_html_report = subrule_lobster_html_report (lobster_report_file )
10391094
@@ -1077,6 +1132,10 @@ def _dependable_element_index_impl(ctx):
10771132 lobster_html_report = lobster_html_report ,
10781133 lobster_rst_dir = lobster_rst_dir ,
10791134 ),
1135+ ForwardedAoUInfo (
1136+ own_aou_lobster = own_aou_lobster_depset ,
1137+ chain_forwarded_lobster = chain_forwarded_lobster_depset ,
1138+ ),
10801139 OutputGroupInfo (debug = depset ([validation_log ])),
10811140 ]
10821141
@@ -1132,6 +1191,11 @@ _dependable_element_index = rule(
11321191 default = [],
11331192 doc = "Dependencies on other dependable element modules (submodules)." ,
11341193 ),
1194+ "aou_forwarding" : attr .label (
1195+ allow_single_file = [".yaml" , ".yml" ],
1196+ default = None ,
1197+ doc = "Optional YAML file listing received AoU IDs to further-forward to this element's own dependees. Only needed for chain-forwarding." ,
1198+ ),
11351199 "integrity_level" : attr .string (
11361200 mandatory = True ,
11371201 values = _INTEGRITY_LEVELS ,
@@ -1159,6 +1223,12 @@ _dependable_element_index = rule(
11591223 cfg = "exec" ,
11601224 doc = "Lobster RST report tool for generating the multi-page Sphinx traceability report." ,
11611225 ),
1226+ "_aou_forwarding_tool" : attr .label (
1227+ default = Label ("//bazel/rules/rules_score:aou_forwarding_to_lobster" ),
1228+ executable = True ,
1229+ cfg = "exec" ,
1230+ doc = "Tool for filtering received AoU lobster entries based on chain-forwarding YAML." ,
1231+ ),
11621232 },
11631233 ** VERBOSITY_ATTR
11641234 ),
@@ -1272,6 +1342,7 @@ def dependable_element(
12721342 integrity_level ,
12731343 checklists = [],
12741344 deps = [],
1345+ aou_forwarding = None ,
12751346 maturity = "release" ,
12761347 sphinx = Label ("//bazel/rules/rules_score:score_build" ),
12771348 testonly = True ,
@@ -1308,6 +1379,9 @@ def dependable_element(
13081379 safety checklists and verification documents.
13091380 deps: Optional list of other module targets this element depends on.
13101381 Cross-references will work automatically.
1382+ aou_forwarding: Optional label to a YAML file listing received AoU IDs
1383+ to further-forward to this element's own dependees. Only needed for
1384+ chain-forwarding received AoUs that this element cannot handle.
13111385 sphinx: Label to sphinx build binary. Default: //bazel/rules/rules_score:score_build
13121386 testonly: If True, only testonly targets can depend on this target.
13131387
@@ -1337,6 +1411,7 @@ def dependable_element(
13371411 tests = tests ,
13381412 deps = deps ,
13391413 processed_deps = processed_deps ,
1414+ aou_forwarding = aou_forwarding ,
13401415 integrity_level = integrity_level ,
13411416 maturity = maturity ,
13421417 testonly = testonly ,
0 commit comments