code: def if_then(self, classical_reg, if_program, else_program=None):
          
          else_program = else_program if else_program is not None else Program()
  
          label_then = LabelPlaceholder("THEN")
          label_end = LabelPlaceholder("END")
          self.inst(JumpWhen(target=label_then, condition=unpack_classical_reg(classical_reg)))
          self.inst(else_program)
          self.inst(Jump(label_end))
          self.inst(JumpTarget(label_then))
          self.inst(if_program)
          self.inst(JumpTarget(label_end))
          return self
docs: If the classical register at index classical reg is 1, run if_program, else run
          else_program.
  
          Equivalent to the following construction:
  
          .. code::
  
              IF [c]:
                 instrA...
              ELSE:
                 instrB...
              =>
                JUMP-WHEN @THEN [c]
                instrB...
                JUMP @END
                LABEL @THEN
                instrA...
                LABEL @END
  
          :param int classical_reg: The classical register to check as the condition
          :param Program if_program: A Quil program to execute if classical_reg is 1
          :param Program else_program: A Quil program to execute if classical_reg is 0. This
              argument is optional and defaults to an empty Program.
          :returns: The Quil Program with the branching instructions added.
          :rtype: Program