{
  "_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)))"
}