{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "92e0efa3-cda3-491c-99fc-650b2ce4cfa8",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"트랜스파일러 플러그인 설치 및 사용\"\n",
        "description: \"Qiskit에서 트랜스파일러 플러그인을 설치하고 사용하는 방법.\"\n",
        "---\n",
        "\n",
        "<span id=\"install-and-use-transpiler-plugins\" />\n",
        "\n",
        "# 트랜스파일러 플러그인 설치 및 사용\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5a4052f5-554d-4633-a588-eb0583f66871",
      "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",
        "    qiskit-ibm-runtime~=0.47.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "12018a80-a1ce-4508-9d04-23c4176028e6",
      "metadata": {},
      "source": [
        "더 많은 키스킷 사용자 커뮤니티가 사용자 정의 변환 코드를 개발하고 재사용할 수 있도록, 키스킷 SDK는 타사 Python 패키지가 키스킷을 통해 액세스 가능한 확장된 변환 기능을 제공한다고 선언할 수 있는 플러그인 인터페이스를 지원합니다.\n",
        "\n",
        "현재 타사 플러그인은 세 가지 방법으로 확장된 번역 기능을 제공할 수 있습니다:\n",
        "\n",
        "* [트랜스파일러 스테이지 플러그인은](/docs/api/qiskit/transpiler_plugins) 사전 설정된 스테이지 패스 매니저의 [6단계](transpiler-stages) 중 하나를 대신하여 사용할 수 있는 패스 매니저를 제공합니다: `init`, `layout`, `routing`, `translation`, `optimization`, `scheduling`.\n",
        "* 유니타리 [합성 플러그인은](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.UnitarySynthesisPlugin) 유니타리 게이트 합성을 위한 확장 기능을 제공합니다.\n",
        "* [고수준 합성 플러그인은](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.HighLevelSynthesisPlugin) 선형 함수나 클리포드 연산자 같은 '고수준 객체'를 합성하기 위한 확장 기능을 제공합니다. 상위 레벨 객체는 [Operation](/docs/api/qiskit/qiskit.circuit.Operation) 클래스의 서브클래스로 표현됩니다.\n",
        "\n",
        "이 페이지의 나머지 부분에서는 사용 가능한 플러그인을 나열하고, 새 플러그인을 설치하고, 사용하는 방법을 설명합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "934388b3-8efd-43b6-82f8-ace84d3bb0d4",
      "metadata": {},
      "source": [
        "<span id=\"list-available-plugins-and-install-new-ones\" />\n",
        "\n",
        "## 사용 가능한 플러그인을 나열하고 새 플러그인을 설치하세요\n",
        "\n",
        "키스킷에는 이미 번역을 위한 몇 가지 내장 플러그인이 포함되어 있습니다. 더 설치하려면 Python 패키지 관리자를 사용하세요. 예를 들어, `pip install qiskit-toqm` 을 실행하여 [키스킷 TOQM](https://github.com/qiskit-toqm/qiskit-toqm) 라우팅 스테이지 플러그인을 설치할 수 있습니다. 수많은 서드파티 플러그인이 [키스킷 생태계의](https://qiskit.github.io/ecosystem/#transpiler_plugin) 일부입니다.\n",
        "\n",
        "<span id=\"list-available-transpiler-stage-plugins\" />\n",
        "\n",
        "### 사용 가능한 트랜스파일러 스테이지 플러그인 목록\n",
        "\n",
        "[리스트\\_스테이지\\_플러그인](/docs/api/qiskit/transpiler_plugins#qiskit.transpiler.preset_passmanagers.plugin.list_stage_plugins) 함수를 사용하여 플러그인을 나열할 스테이지의 이름을 전달합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "817254a8-77d7-4eb4-8630-623e67bb2186",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['default', 'dense', 'sabre', 'trivial']"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.preset_passmanagers.plugin import list_stage_plugins\n",
        "\n",
        "list_stage_plugins(\"layout\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "354f9be8-3567-4449-ba60-4d1c3258bb50",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['basic', 'default', 'lookahead', 'none', 'sabre']"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "list_stage_plugins(\"routing\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ac57d3ce-afb3-4aba-8601-93513d4dd491",
      "metadata": {},
      "source": [
        "`qiskit-toqm` 이 설치되어 있다면 `toqm` 이 `routing` 플러그인 목록에 표시됩니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1397de7f-c447-463e-8aba-ed1f569be86c",
      "metadata": {},
      "source": [
        "<span id=\"list-available-unitary-synthesis-plugins\" />\n",
        "\n",
        "### 사용 가능한 단일 합성 플러그인 목록\n",
        "\n",
        "[유니타리\\_합성\\_플러그인\\_이름](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names) 함수를 사용합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "596cbb3d-2ece-4193-929c-79149f7e23bd",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['aqc', 'clifford', 'default', 'gridsynth', 'sk']"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.passes.synthesis import unitary_synthesis_plugin_names\n",
        "\n",
        "unitary_synthesis_plugin_names()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e33885d4-788f-4759-bd63-e26d7a45ff9e",
      "metadata": {},
      "source": [
        "<span id=\"list-available-high-level-synthesis-plugins\" />\n",
        "\n",
        "### 사용 가능한 고급 합성 플러그인 목록\n",
        "\n",
        "[높은\\_레벨\\_합성\\_플러그인\\_이름](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.high_level_synthesis_plugin_names) 함수를 사용하여 합성할 \"상위 레벨 객체\" 유형의 이름을 전달합니다. 이름은 합성 중인 객체의 유형을 나타내는 [`name`](/docs/api/qiskit/qiskit.circuit.Operation#name)[ 속성에](/docs/api/qiskit/qiskit.circuit.Operation) 해당하며, 합성되는 객체의 유형을 나타냅니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "3b2d72bb-d661-4432-acfe-970f0a2dcd53",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['rb_default', 'ag', 'bm', 'default', 'greedy', 'layers', 'lnn']"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.passes.synthesis import (\n",
        "    high_level_synthesis_plugin_names,\n",
        ")\n",
        "\n",
        "high_level_synthesis_plugin_names(\"clifford\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "583d7529-ab3e-449d-b7d0-e732801d7ae0",
      "metadata": {},
      "source": [
        "클래스를 사용하여 [HighLevelSynthesisPluginManager](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.HighLevelSynthesisPluginManager) 클래스를 사용하여 모든 상위 레벨 합성 플러그인의 이름을 나열할 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "b17192e5-ddac-4cf6-b2e2-597e8c505568",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['clifford.rb_default',\n",
              " 'FullAdder.default',\n",
              " 'FullAdder.ripple_c04',\n",
              " 'FullAdder.ripple_v95',\n",
              " 'HalfAdder.default',\n",
              " 'HalfAdder.qft_d00',\n",
              " 'HalfAdder.ripple_c04',\n",
              " 'HalfAdder.ripple_r25',\n",
              " 'HalfAdder.ripple_v95',\n",
              " 'IntComp.default',\n",
              " 'IntComp.noaux',\n",
              " 'IntComp.twos',\n",
              " 'ModularAdder.default',\n",
              " 'ModularAdder.modular_v17',\n",
              " 'ModularAdder.qft_d00',\n",
              " 'ModularAdder.ripple_c04',\n",
              " 'ModularAdder.ripple_v95',\n",
              " 'Multiplier.cumulative_h18',\n",
              " 'Multiplier.default',\n",
              " 'Multiplier.qft_r17',\n",
              " 'PauliEvolution.default',\n",
              " 'PauliEvolution.rustiq',\n",
              " 'WeightedSum.default',\n",
              " 'annotated.default',\n",
              " 'clifford.ag',\n",
              " 'clifford.bm',\n",
              " 'clifford.default',\n",
              " 'clifford.greedy',\n",
              " 'clifford.layers',\n",
              " 'clifford.lnn',\n",
              " 'linear_function.default',\n",
              " 'linear_function.kms',\n",
              " 'linear_function.pmh',\n",
              " 'mcmt.default',\n",
              " 'mcmt.noaux',\n",
              " 'mcmt.vchain',\n",
              " 'mcmt.xgate',\n",
              " 'mcx.1_clean_b95',\n",
              " 'mcx.1_clean_kg24',\n",
              " 'mcx.1_dirty_kg24',\n",
              " 'mcx.2_clean_kg24',\n",
              " 'mcx.2_dirty_kg24',\n",
              " 'mcx.default',\n",
              " 'mcx.gray_code',\n",
              " 'mcx.n_clean_m15',\n",
              " 'mcx.n_dirty_i15',\n",
              " 'mcx.noaux_hp24',\n",
              " 'mcx.noaux_v24',\n",
              " 'permutation.acg',\n",
              " 'permutation.basic',\n",
              " 'permutation.default',\n",
              " 'permutation.kms',\n",
              " 'permutation.token_swapper',\n",
              " 'qft.default',\n",
              " 'qft.full',\n",
              " 'qft.line']"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler.passes.synthesis.plugin import (\n",
        "    HighLevelSynthesisPluginManager,\n",
        ")\n",
        "\n",
        "HighLevelSynthesisPluginManager().plugins.names()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4eed49d1-4723-4366-9edc-1f5aa73907ba",
      "metadata": {},
      "source": [
        "<span id=\"use-a-plugin\" />\n",
        "\n",
        "## 플러그인을 사용하세요\n",
        "\n",
        "이 섹션에서는 트랜스파일러 플러그인을 사용하는 방법을 설명합니다. 코드 예제에서는 키스킷과 함께 제공되는 플러그인을 사용하지만 타사 패키지에서 설치한 플러그인도 동일한 방식으로 사용됩니다.\n",
        "\n",
        "<span id=\"use-a-transpiler-stage-plugin\" />\n",
        "\n",
        "### 트랜스파일러 단계 플러그인을 사용하십시오\n",
        "\n",
        "트랜스파일러 스테이지 플러그인을 사용하려면, 또는 [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) 에 적절한 인수를 사용하여 해당 [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile) 플러그인의 이름을 지정하십시오. 인수는 트랜스파일레이션 단계의 이름 뒤에 를 `_method` 추가하여 구성됩니다. 예를 들어, 라우팅 `lookahead` 플러그인을 사용하려면 ` `routing\\_method` argument`에 \\`\\`를 `lookahead` 지정하면 됩니다.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  이 예제에서는 의 모의 `FakeSherbrooke``qiskit_ibm_runtime` 백엔드를 사용하지만, Qiskit과 호환되는 실제 또는 모의 백엔드라면 어떤 것이든 사용해 볼 수 있습니다.  결과는 다를 수 있습니다.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "d5e598b3-9226-4fbc-ac76-8eca08ec4af3",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3, backend=backend, routing_method=\"lookahead\"\n",
        ")"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "657db73c-7064-4569-a212-87642f16216e",
      "metadata": {},
      "source": [
        "<span id=\"use-a-unitary-synthesis-plugin\" />\n",
        "\n",
        "### 단일 합성 플러그인을 사용하십시오\n",
        "\n",
        "단일 합성 플러그인을 사용하려면 이름을 `unitary_synthesis_method` 인자로 지정하여 [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) 또는 [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile):\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "28184c68-4b1e-46d2-a8a0-5480814bad9b",
      "metadata": {},
      "outputs": [],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3,\n",
        "    backend=backend,\n",
        "    unitary_synthesis_method=\"sk\",\n",
        "    unitary_synthesis_plugin_config=dict(\n",
        "        basis_gates=[\"cz\", \"id\", \"rz\", \"sx\", \"x\"]\n",
        "    ),\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c019cb3d-5069-4257-bfb6-e15600caa342",
      "metadata": {},
      "source": [
        "단일 합성은 `init`, `translation`, `optimization` 에서 반환된 스테이지드 패스 매니저에서 사용되거나 [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) 에서 반환되거나 [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). 이러한 단계에 대한 설명은 [트랜스파일러 단계를](transpiler-stages) 참조하세요.\n",
        "\n",
        "자유 형식 사전인 `unitary_synthesis_plugin_config` 인수를 사용하여 단일 합성 방법에 대한 옵션을 전달합니다. 합성 방법의 문서에는 지원되는 옵션이 설명되어 있어야 합니다. 기본 제공되는 단일 합성 플러그인의 문서 링크는 [이 목록을](/docs/api/qiskit/transpiler_synthesis_plugins#unitary-synthesis-plugins-2) 참조하세요.\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "d4ce7ad9-711f-4e43-9012-3f404b885ab1",
      "metadata": {},
      "source": [
        "<span id=\"use-a-high-level-synthesis-plugin\" />\n",
        "\n",
        "### 고수준 합성 플러그인을 사용하십시오\n",
        "\n",
        "먼저, 다양한 상위 수준 객체에 사용할 플러그인의 이름을 저장하기 위한 [HLSConfig를](/docs/api/qiskit/qiskit.transpiler.passes.HLSConfig) 만듭니다. 예를 들어,\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "d4672004-aead-4827-9c10-5c70c3c2289b",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler.passes import HLSConfig\n",
        "\n",
        "hls_config = HLSConfig(clifford=[\"layers\"], linear_function=[\"pmh\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4eab8d19-4b58-4f50-a205-039288e4a00d",
      "metadata": {},
      "source": [
        "이 코드 셀은 `layers` 플러그인을 사용하는 높은 수준의 합성 구성을 생성합니다 과 [Clifford](/docs/api/qiskit/qiskit.quantum_info.Clifford#clifford) 오브젝트 합성을 위한 `pmh` 플러그인을 사용하는 하이레벨 합성 구성을 생성합니다 [LinearFunction](/docs/api/qiskit/qiskit.circuit.library.LinearFunction#linearfunction) 오브젝트를 합성합니다. 키워드 인수의 이름은 다음과 같습니다 [`name`](/docs/api/qiskit/qiskit.circuit.Operation#name)[ 어트리뷰트에](/docs/api/qiskit/qiskit.circuit.Operation) 해당하며, 합성되는 객체의 유형을 나타냅니다.\n",
        "각 상위 수준 객체에 대해 주어진 플러그인 목록이 그 중 하나가 성공할 때까지 순차적으로 시도됩니다 성공할 때까지 순차적으로 시도됩니다(위의 예에서는 각 목록에 하나의 플러그인만 포함되어 있습니다).\n",
        "\n",
        "이름으로 플러그인을 지정하는 것 외에도 대신 `(name, options)` 튜플을 전달할 수 있으며, 이 튜플의 두 번째 요소는 플러그인 옵션이 포함된 딕셔너리입니다. 합성 방법의 문서에는 지원되는 옵션이 설명되어 있어야 합니다. 기본 제공되는 고급 합성 플러그인의 문서 링크는 [이 목록을](/docs/api/qiskit/transpiler_synthesis_plugins#high-level-synthesis-plugins-2) 참조하세요.\n",
        "\n",
        "`HLSConfig` 객체를 생성한 후, 이 객체를 `hls_config` 인자로 전달합니다 [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) 또는 [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile):\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "8784b881-2f37-4f75-b5c7-c84cdb8b8a60",
      "metadata": {},
      "outputs": [],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3, backend=backend, hls_config=hls_config\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ea63c611-c213-4736-83f7-c46e918eb862",
      "metadata": {},
      "source": [
        "하이 레벨 합성은 `init`, `translation`, `optimization` 에서 반환된 스테이지드 패스 매니저의,, 단계에서 사용되거나 [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) 에서 반환되거나 [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). 이러한 단계에 대한 설명은 [트랜스파일러 단계를](transpiler-stages) 참조하세요.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "aae87a98-f16d-4ac1-9b85-11a771e04224",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 다음 단계\n",
        "\n",
        "<Admonition type=\"tip\" title=\"권장사항\">\n",
        "  * [트랜스파일러 플러그인을 만듭니다](/docs/guides/create-transpiler-plugin).\n",
        "  * [튜토리얼에서](/docs/tutorials) 양자 회로 트랜스파일링 및 실행 예제를 확인하세요.\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
}