{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "d518f5b4-a19b-4419-b615-59caae67c080",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"OpenQASM 3 그리고 Qiskit SDK\"\n",
        "description: \"OpenQASM 3과 Qiskit SDK 간 코드 변환 방법.\"\n",
        "---\n",
        "\n",
        "<span id=\"openqasm-3-and-the-qiskit-sdk\" />\n",
        "\n",
        "# OpenQASM 3 그리고 Qiskit SDK\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a86fc5a5-cc81-40e8-96ab-54841218f619",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"패키지 버전\">\n",
        "    이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다.\n",
        "    다음 버전 이상을 사용하는 것이 좋습니다.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.2\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "232070ea-8685-4638-ba9d-7b52a123fd2e",
      "metadata": {},
      "source": [
        "키스킷 SDK는 양자 프로그램의 OpenQASM 표현과 QuantumCircuit 클래스 간 변환을 위한 몇 가지 도구를 제공합니다. 이러한 도구는 아직 탐색적 개발 단계에 있으며, OpenQASM 3에서 표현한 동적 회로 기능에 대한 키스킷의 지원이 증가함에 따라 계속 발전할 것입니다.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  이 기능은 아직 탐색 단계에 있습니다.  따라서 구문과 기능이 진화할 가능성이 높습니다.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"import-an-openqasm-3-program-into-qiskit\" />\n",
        "\n",
        "## OpenQASM 3 프로그램을 Qiskit으로 가져오기\n",
        "\n",
        "이 기능을 사용하려면 `qiskit_qasm3_import ` 패키지를 설치해야 합니다. 다음 명령을 사용하여 설치합니다.\n",
        "\n",
        "```bash\n",
        "pip install qiskit-qasm3-import\n",
        "```\n",
        "\n",
        "현재 OpenQASM 3에서 키스킷으로 가져올 수 있는 두 가지 상위 수준 함수를 사용할 수 있습니다. 이러한 함수는 파일 이름을 받는 `load()` 과 프로그램 자체를 문자열로 받는 `loads()` 입니다:\n",
        "\n",
        "```python\n",
        "import qiskit.qasm3\n",
        "qiskit.qasm3.load(file_name)\n",
        "qiskit.qasm3.loads(program_string)\n",
        "```\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d3adad38-7523-427e-a358-b7068423f59c",
      "metadata": {},
      "source": [
        "이 예제에서는 OpenQASM 3을 사용하여 양자 프로그램을 정의하고 `loads()` 을 사용하여 직접 변환합니다 QuantumCircuit:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "e805197c-51fb-4216-8d24-ae26633d29bc",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/interoperate-qiskit-qasm3/extracted-outputs/e805197c-51fb-4216-8d24-ae26633d29bc-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "import qiskit.qasm3\n",
        "\n",
        "program = \"\"\"\n",
        "    OPENQASM 3.0;\n",
        "    include \"stdgates.inc\";\n",
        "\n",
        "    input float[64] a;\n",
        "    qubit[3] q;\n",
        "    bit[2] mid;\n",
        "    bit[3] out;\n",
        "\n",
        "    let aliased = q[0:1];\n",
        "\n",
        "    gate my_gate(a) c, t {\n",
        "      gphase(a / 2);\n",
        "      ry(a) c;\n",
        "      cx c, t;\n",
        "    }\n",
        "    gate my_phase(a) c {\n",
        "      ctrl @ inv @ gphase(a) c;\n",
        "    }\n",
        "\n",
        "    my_gate(a * 2) aliased[0], q[{1, 2}][0];\n",
        "    measure q[0] -> mid[0];\n",
        "    measure q[1] -> mid[1];\n",
        "\n",
        "    while (mid == \"00\") {\n",
        "      reset q[0];\n",
        "      reset q[1];\n",
        "      my_gate(a) q[0], q[1];\n",
        "      my_phase(a - pi/2) q[1];\n",
        "      mid[0] = measure q[0];\n",
        "      mid[1] = measure q[1];\n",
        "    }\n",
        "\n",
        "    if (mid[0]) {\n",
        "      let inner_alias = q[{0, 1}];\n",
        "      reset inner_alias;\n",
        "    }\n",
        "\n",
        "    out = measure q;\n",
        "\"\"\"\n",
        "circuit = qiskit.qasm3.loads(program)\n",
        "circuit.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a81fcee5-a89c-4e6d-8a9d-53c7da1e6c0d",
      "metadata": {},
      "source": [
        "<span id=\"export-to-openqasm-3\" />\n",
        "\n",
        "## OpenQASM 로 내보내기 3\n",
        "\n",
        "키스킷 코드를 OpenQASM 3으로 내보내려면 `dumps()` 을 사용하여 문자열로 내보내거나 `dump()` 을 사용하여 파일로 내보낼 수 있습니다.\n",
        "\n",
        "<span id=\"example-with-dumps\" />\n",
        "\n",
        "### 예시와 `dumps()`\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "68e8d8b2-468b-4a70-903a-679355f9b7ee",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "'OPENQASM 3.0;\\ninclude \"stdgates.inc\";\\nbit[2] meas;\\nqubit[2] q;\\nh q[0];\\ncx q[0], q[1];\\nbarrier q[0], q[1];\\nmeas[0] = measure q[0];\\nmeas[1] = measure q[1];\\n'"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "from qiskit.qasm3 import dumps\n",
        "\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "dumps(qc)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b7a54ec7-c08d-4390-8ce8-b5008c8312d3",
      "metadata": {},
      "source": [
        "<span id=\"example-with-dump\" />\n",
        "\n",
        "### 예시와 `dump()`\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "cc93cc6f-08e0-420f-8fb4-64620a53dc5a",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "from qiskit.qasm3 import dump\n",
        "\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "f = open(\"my_file.txt\", \"w\")\n",
        "dump(qc, f)\n",
        "f.close()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ef8e59ee-2889-4b73-9fe6-30d5e69f7164",
      "metadata": {},
      "source": [
        "자세한 내용은 API 참조의 [OpenQASM 3으로 내보내기](/docs/api/qiskit/qasm3#exporting-to-openqasm-3) 섹션을 참조하세요.\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 다음 단계\n",
        "\n",
        "<Admonition type=\"tip\" title=\"권장사항\">\n",
        "  * [IBM 퀀텀 컴포저](/docs/guides/composer) 가이드에서 OpenQASM 코드를 생성하는 방법을 알아보세요.\n",
        "  * [OpenQASM 3 키스킷 API](/docs/api/qiskit/qasm3) 참조를 검토하세요.\n",
        "  * [‘프로그램 확인’](/docs/guides/debugging-tools) 항목을 확인해 주세요.\n",
        "  * [OpenQASM 라이브 사양을](https://openqasm.com/) 검토하세요.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}