{ "_comment": "Generated from pwr_hybrid_3.json by fret_to_synth.py. Boolean mode encoding with auto-discovered mode groups. Mutual exclusion constraints are synthesis artifacts \u2014 they enforce the single-valued semantics of control_* variables after decomposition into independent booleans. They are NOT needed in FRET itself, where control_mode = q_X is inherently single-valued.", "spec_name": "PWR_HYBRID_3_DRC", "source_file": "pwr_hybrid_3.json", "mode_groups": { "control_mode": { "values": [ "q_heatup", "q_operation", "q_scram", "q_shutdown" ], "booleans": [ "in_mode_heatup", "in_mode_operation", "in_mode_scram", "in_mode_shutdown" ] } }, "inputs": [ "inv1_holds", "inv2_holds", "manual_reset", "p_above_crit", "t_avg_above_min", "t_avg_in_range" ], "outputs": [ "in_mode_heatup", "in_mode_operation", "in_mode_scram", "in_mode_shutdown" ], "requirements": [ { "req_id": "DRC_S004_SCRAM_STAY", "fulltext": "Whenever control_mode = q_scram & !manual_reset DRC shall at the next timepoint satisfy control_mode = q_scram", "project": "PWR_HYBRID_3", "component": "DRC", "ltl": "(G ((in_mode_scram & (! manual_reset)) -> (X in_mode_scram)))", "ltl_original": "(G (((control_mode = q_scram) & (! manual_reset)) -> (X (control_mode = q_scram))))", "condition_type": "holding" }, { "req_id": "DRC_T001_SHUTDOWN_TO_HEATUP", "fulltext": "Upon control_mode = q_shutdown & t_avg_above_min DRC shall at the next timepoint satisfy control_mode = q_heatup", "project": "PWR_HYBRID_3", "component": "DRC", "ltl": "((G (((! (in_mode_shutdown & t_avg_above_min)) & (X (in_mode_shutdown & t_avg_above_min))) -> (X (X in_mode_heatup)))) & ((in_mode_shutdown & t_avg_above_min) -> (X in_mode_heatup)))", "ltl_original": "((G (((! ((control_mode = q_shutdown) & t_avg_above_min)) & (X ((control_mode = q_shutdown) & t_avg_above_min))) -> (X (X (control_mode = q_heatup))))) & (((control_mode = q_shutdown) & t_avg_above_min) -> (X (control_mode = q_heatup))))", "condition_type": "regular" }, { "req_id": "DRC_T002_HEATUP_TO_OPERATION", "fulltext": "Upon control_mode = q_heatup & t_avg_in_range & p_above_crit & inv1_holds DRC shall at the next timepoint satisfy control_mode = q_operation", "project": "PWR_HYBRID_3", "component": "DRC", "ltl": "((G (((! (((in_mode_heatup & t_avg_in_range) & p_above_crit) & inv1_holds)) & (X (((in_mode_heatup & t_avg_in_range) & p_above_crit) & inv1_holds))) -> (X (X in_mode_operation)))) & ((((in_mode_heatup & t_avg_in_range) & p_above_crit) & inv1_holds) -> (X in_mode_operation)))", "ltl_original": "((G (((! ((((control_mode = q_heatup) & t_avg_in_range) & p_above_crit) & inv1_holds)) & (X ((((control_mode = q_heatup) & t_avg_in_range) & p_above_crit) & inv1_holds))) -> (X (X (control_mode = q_operation))))) & (((((control_mode = q_heatup) & t_avg_in_range) & p_above_crit) & inv1_holds) -> (X (control_mode = q_operation))))", "condition_type": "regular" }, { "req_id": "DRC_A001_MODE_VALID", "fulltext": "DRC shall always satisfy control_mode = q_shutdown | control_mode = q_heatup | control_mode = q_operation | control_mode = q_scram", "project": "PWR_HYBRID_3", "component": "DRC", "ltl": "(G (((in_mode_shutdown | in_mode_heatup) | in_mode_operation) | in_mode_scram))", "ltl_original": "(G ((((control_mode = q_shutdown) | (control_mode = q_heatup)) | (control_mode = q_operation)) | (control_mode = q_scram)))", "condition_type": "null" }, { "req_id": "DRC_T003_HEATUP_TO_SCRAM", "fulltext": "Upon control_mode = q_heatup & !inv1_holds DRC shall at the next timepoint satisfy control_mode = q_scram", "project": "PWR_HYBRID_3", "component": "DRC", "ltl": "((G (((! (in_mode_heatup & (! inv1_holds))) & (X (in_mode_heatup & (! inv1_holds)))) -> (X (X in_mode_scram)))) & ((in_mode_heatup & (! inv1_holds)) -> (X in_mode_scram)))", "ltl_original": "((G (((! ((control_mode = q_heatup) & (! inv1_holds))) & (X ((control_mode = q_heatup) & (! inv1_holds)))) -> (X (X (control_mode = q_scram))))) & (((control_mode = q_heatup) & (! inv1_holds)) -> (X (control_mode = q_scram))))", "condition_type": "regular" }, { "req_id": "DRC_T004_OPERATION_TO_SCRAM", "fulltext": "Upon control_mode = q_operation & !inv2_holds DRC shall at the next timepoint satisfy control_mode = q_scram", "project": "PWR_HYBRID_3", "component": "DRC", "ltl": "((G (((! (in_mode_operation & (! inv2_holds))) & (X (in_mode_operation & (! inv2_holds)))) -> (X (X in_mode_scram)))) & ((in_mode_operation & (! inv2_holds)) -> (X in_mode_scram)))", "ltl_original": "((G (((! ((control_mode = q_operation) & (! inv2_holds))) & (X ((control_mode = q_operation) & (! inv2_holds)))) -> (X (X (control_mode = q_scram))))) & (((control_mode = q_operation) & (! inv2_holds)) -> (X (control_mode = q_scram))))", "condition_type": "regular" }, { "req_id": "DRC_T005_SCRAM_TO_SHUTDOWN", "fulltext": "Upon control_mode = q_scram & manual_reset DRC shall at the next timepoint satisfy control_mode = q_shutdown", "project": "PWR_HYBRID_3", "component": "DRC", "ltl": "((G (((! (in_mode_scram & manual_reset)) & (X (in_mode_scram & manual_reset))) -> (X (X in_mode_shutdown)))) & ((in_mode_scram & manual_reset) -> (X in_mode_shutdown)))", "ltl_original": "((G (((! ((control_mode = q_scram) & manual_reset)) & (X ((control_mode = q_scram) & manual_reset))) -> (X (X (control_mode = q_shutdown))))) & (((control_mode = q_scram) & manual_reset) -> (X (control_mode = q_shutdown))))", "condition_type": "regular" }, { "req_id": "DRC_S001_SHUTDOWN_STAY", "fulltext": "Whenever control_mode = q_shutdown & !t_avg_above_min DRC shall at the next timepoint satisfy control_mode = q_shutdown", "project": "PWR_HYBRID_3", "component": "DRC", "ltl": "(G ((in_mode_shutdown & (! t_avg_above_min)) -> (X in_mode_shutdown)))", "ltl_original": "(G (((control_mode = q_shutdown) & (! t_avg_above_min)) -> (X (control_mode = q_shutdown))))", "condition_type": "holding" }, { "req_id": "DRC_S002_HEATUP_STAY", "fulltext": "Whenever control_mode = q_heatup & inv1_holds & !(t_avg_in_range & p_above_crit) DRC shall at the next timepoint satisfy control_mode = q_heatup", "project": "PWR_HYBRID_3", "component": "DRC", "ltl": "(G (((in_mode_heatup & inv1_holds) & (! (t_avg_in_range & p_above_crit))) -> (X in_mode_heatup)))", "ltl_original": "(G ((((control_mode = q_heatup) & inv1_holds) & (! (t_avg_in_range & p_above_crit))) -> (X (control_mode = q_heatup))))", "condition_type": "holding" }, { "req_id": "DRC_S003_OPERATION_STAY", "fulltext": "Whenever control_mode = q_operation & inv2_holds DRC shall at the next timepoint satisfy control_mode = q_operation ", "project": "PWR_HYBRID_3", "component": "DRC", "ltl": "(G ((in_mode_operation & inv2_holds) -> (X in_mode_operation)))", "ltl_original": "(G (((control_mode = q_operation) & inv2_holds) -> (X (control_mode = q_operation))))", "condition_type": "holding" }, { "req_id": "DRC_I001_INIT_SHUTDOWN", "fulltext": "DRC shall immediately satisfy control_mode = q_shutdown", "project": "PWR_HYBRID_3", "component": "DRC", "ltl": "in_mode_shutdown", "ltl_original": "(control_mode = q_shutdown)", "condition_type": "null" } ], "structural_constraints": [ { "name": "mutex_control_mode", "description": "Exactly one control_mode value active at all times", "ltl": "G ((in_mode_heatup & (! in_mode_operation) & (! in_mode_scram) & (! in_mode_shutdown)) | ((! in_mode_heatup) & in_mode_operation & (! in_mode_scram) & (! in_mode_shutdown)) | ((! in_mode_heatup) & (! in_mode_operation) & in_mode_scram & (! in_mode_shutdown)) | ((! in_mode_heatup) & (! in_mode_operation) & (! in_mode_scram) & in_mode_shutdown))" } ], "conjoined_ltl": "((G ((in_mode_scram & (! manual_reset)) -> (X in_mode_scram)))) & (((G (((! (in_mode_shutdown & t_avg_above_min)) & (X (in_mode_shutdown & t_avg_above_min))) -> (X (X in_mode_heatup)))) & ((in_mode_shutdown & t_avg_above_min) -> (X in_mode_heatup)))) & (((G (((! (((in_mode_heatup & t_avg_in_range) & p_above_crit) & inv1_holds)) & (X (((in_mode_heatup & t_avg_in_range) & p_above_crit) & inv1_holds))) -> (X (X in_mode_operation)))) & ((((in_mode_heatup & t_avg_in_range) & p_above_crit) & inv1_holds) -> (X in_mode_operation)))) & ((G (((in_mode_shutdown | in_mode_heatup) | in_mode_operation) | in_mode_scram))) & (((G (((! (in_mode_heatup & (! inv1_holds))) & (X (in_mode_heatup & (! inv1_holds)))) -> (X (X in_mode_scram)))) & ((in_mode_heatup & (! inv1_holds)) -> (X in_mode_scram)))) & (((G (((! (in_mode_operation & (! inv2_holds))) & (X (in_mode_operation & (! inv2_holds)))) -> (X (X in_mode_scram)))) & ((in_mode_operation & (! inv2_holds)) -> (X in_mode_scram)))) & (((G (((! (in_mode_scram & manual_reset)) & (X (in_mode_scram & manual_reset))) -> (X (X in_mode_shutdown)))) & ((in_mode_scram & manual_reset) -> (X in_mode_shutdown)))) & ((G ((in_mode_shutdown & (! t_avg_above_min)) -> (X in_mode_shutdown)))) & ((G (((in_mode_heatup & inv1_holds) & (! (t_avg_in_range & p_above_crit))) -> (X in_mode_heatup)))) & ((G ((in_mode_operation & inv2_holds) -> (X in_mode_operation)))) & (in_mode_shutdown) & (G ((in_mode_heatup & (! in_mode_operation) & (! in_mode_scram) & (! in_mode_shutdown)) | ((! in_mode_heatup) & in_mode_operation & (! in_mode_scram) & (! in_mode_shutdown)) | ((! in_mode_heatup) & (! in_mode_operation) & in_mode_scram & (! in_mode_shutdown)) | ((! in_mode_heatup) & (! in_mode_operation) & (! in_mode_scram) & in_mode_shutdown)))" }