| TCL | Condition | Qualification Needed? | Action |
|---|
| TCL1 | Tool output not used in safety item (TI1), OR tool failure immediately detectable | No | Document classification justification |
| TCL2 | TI2 + TD1 (failure has limited impact or detectable) | Yes — operational experience sufficient | Document usage history; no missed failures on similar projects |
| TCL3 | TI2 + TD2 or TD3 (failure could cause undetected safety violation) | Yes — full qualification with validation suite | Vendor TQK, or in-house validation, or increased confidence from use |
#!/usr/bin/env python3
# Tool Confidence Level determination per ISO 26262 Part 8.11
def determine_tcl(tool_name, ti_level, td_level) -> str:
"""
TI (Tool Impact): TI1=tool output not integrated in safety; TI2=tool output IS in safety item
TD (Tool Error Detection): TD1=immediately detectable; TD2=not easily detectable; TD3=not detectable
"""
if ti_level == 1:
tcl = "TCL1"
elif ti_level == 2 and td_level == 1:
tcl = "TCL2"
elif ti_level == 2 and td_level in [2, 3]:
tcl = "TCL3"
else:
tcl = "Invalid"
qualification_actions = {
"TCL1": "No qualification needed. Document TI1 classification.",
"TCL2": "Qualification by use: document tool usage history with zero safety failures.",
"TCL3": "Full qualification required: vendor TQK or in-house validation suite.",
}
return tcl, qualification_actions.get(tcl, "")
tools = [
("IAR Compiler v9.30", 2, 3), # TI2 (generates binary), TD3 (errors not detectable)
("Polyspace Bug Finder", 2, 2), # TI2 (missed bugs affect safety), TD2 (false negative hard to detect)
("TESSY Unit Tester", 2, 2), # TI2 (missed test = unverified req), TD2
("Git (version control)", 1, 1), # TI1 (no safety output), TD1
("Wireshark", 1, 1), # TI1 (analysis only), TD1
]
for tool, ti, td in tools:
tcl, action = determine_tcl(tool, ti, td)
print(f"{tool}: TI{ti}, TD{td} → {tcl}")
print(f" Action: {action}")
print()