{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "92e0efa3-cda3-491c-99fc-650b2ce4cfa8",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Instale e utilize plugins transpiler\"\n",
        "description: \"Como instalar e usar plugins transpiler no Qiskit.\"\n",
        "---\n",
        "\n",
        "<span id=\"install-and-use-transpiler-plugins\" />\n",
        "\n",
        "# Instale e utilize plugins transpiler\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=\"Versões do pacote\">\n",
        "    O código desta página foi desenvolvido usando os seguintes requisitos.\n",
        "    Recomendamos o uso dessas versões ou de versões mais recentes.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.0\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": [
        "Para facilitar o desenvolvimento e a reutilização do código de transpilação personalizado pela comunidade mais ampla de usuários do Qiskit, o Qiskit SDK oferece suporte a uma interface de plug-in que permite que pacotes Python de terceiros declarem que fornecem funcionalidade de transpilação estendida acessível via Qiskit.\n",
        "\n",
        "Atualmente, os plug-ins de terceiros podem fornecer a funcionalidade de transpilação estendida de três maneiras:\n",
        "\n",
        "* Um [plug-in de estágio de transpilador](/docs/api/qiskit/transpiler_plugins) fornece um gerenciador de passagem que pode ser usado no lugar de um dos [6 estágios](transpiler-stages) de um gerenciador de passagem em estágios predefinido: `init`, `layout`, `routing`, `translation`, `optimization`, e `scheduling`.\n",
        "* Um [plug-in de síntese unitária](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.UnitarySynthesisPlugin) oferece funcionalidade estendida para a síntese de porta unitária.\n",
        "* Um [plug-in de síntese de alto nível](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.HighLevelSynthesisPlugin) oferece funcionalidade estendida para sintetizar \"objetos de alto nível\", como funções lineares ou operadores Clifford. Os objetos de alto nível são representados por subclasses da classe [Operation](/docs/api/qiskit/qiskit.circuit.Operation).\n",
        "\n",
        "O restante da página descreve como listar os plug-ins disponíveis, instalar novos plug-ins e usá-los.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "934388b3-8efd-43b6-82f8-ace84d3bb0d4",
      "metadata": {},
      "source": [
        "<span id=\"list-available-plugins-and-install-new-ones\" />\n",
        "\n",
        "## Listar plugins disponíveis e instalar novos\n",
        "\n",
        "O Qiskit já inclui alguns plug-ins integrados para transpilação. Para instalar mais, você pode usar o gerenciador de pacotes Python. Por exemplo, você pode executar `pip install qiskit-toqm` para instalar o plug-in do estágio de roteamento do [Qiskit TOQM](https://github.com/qiskit-toqm/qiskit-toqm). Vários plug-ins de terceiros fazem parte do [ecossistema do Qiskit](https://qiskit.github.io/ecosystem/#transpiler_plugin).\n",
        "\n",
        "<span id=\"list-available-transpiler-stage-plugins\" />\n",
        "\n",
        "### Lista de plugins de estágio do transpiler disponíveis\n",
        "\n",
        "Use a função [list\\_stage\\_plugins](/docs/api/qiskit/transpiler_plugins#qiskit.transpiler.preset_passmanagers.plugin.list_stage_plugins), passando o nome do estágio cujos plug-ins você deseja listar.\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": [
        "Se `qiskit-toqm` estivesse instalado, então `toqm` apareceria na lista de plug-ins `routing` .\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1397de7f-c447-463e-8aba-ed1f569be86c",
      "metadata": {},
      "source": [
        "<span id=\"list-available-unitary-synthesis-plugins\" />\n",
        "\n",
        "### Lista de plugins de síntese unitária disponíveis\n",
        "\n",
        "Use a função [unitary\\_synthesis\\_plugin\\_names](/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",
        "### Lista de plug-ins de síntese de alto nível disponíveis\n",
        "\n",
        "Use a função [high\\_level\\_synthesis\\_plugin\\_names](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.high_level_synthesis_plugin_names), passando o nome do tipo de \"objeto de alto nível\" a ser sintetizado. O nome corresponde ao atributo [`name`](/docs/api/qiskit/qiskit.circuit.Operation#name) da classe [Operation](/docs/api/qiskit/qiskit.circuit.Operation) que representa o tipo de objeto que está sendo sintetizado.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "3b2d72bb-d661-4432-acfe-970f0a2dcd53",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['ag', 'bm', 'default', 'greedy', 'layers', 'lnn', 'rb_default']"
            ]
          },
          "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": [
        "Você pode usar a classe [HighLevelSynthesisPluginManager](/docs/api/qiskit/qiskit.transpiler.passes.synthesis.plugin.HighLevelSynthesisPluginManager) para listar os nomes de todos os plug-ins de síntese de alto nível:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "b17192e5-ddac-4cf6-b2e2-597e8c505568",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "['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',\n",
              " 'clifford.rb_default']"
            ]
          },
          "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",
        "## Use um plugin\n",
        "\n",
        "Nesta seção, mostraremos como usar os plug-ins do transpilador. Nos exemplos de código, usamos plug-ins que vêm com o Qiskit, mas os plug-ins instalados a partir de pacotes de terceiros são usados da mesma forma.\n",
        "\n",
        "<span id=\"use-a-transpiler-stage-plugin\" />\n",
        "\n",
        "### Use um plugin de etapa transpiler\n",
        "\n",
        "Para usar um plug-in de etapa de transpilador, especifique seu nome com o argumento apropriado para [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) ou [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). O argumento é formado acrescentando-se `_method` ao nome da etapa de transpilagem. Por exemplo, para usar o plugin `lookahead` de roteamento, especificaríamos `lookahead` para o `routing_method` argumento.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Nestes exemplos, é utilizado o backend `FakeSherbrooke``qiskit_ibm_runtime` simulado do, mas você pode testá-lo em qualquer backend real ou simulado compatível com o Qiskit.  Seus resultados podem ser diferentes.\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",
        "### Use um plugin de síntese unitária\n",
        "\n",
        "Para usar um plug-in de síntese unitária, especifique seu nome como o argumento `unitary_synthesis_method` para [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) ou [`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": [
        "A síntese unitária é usada nos estágios `init`, `translation` e `optimization` do gerenciador de passagem em estágios retornado por [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) ou usada em [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). Consulte [Estágios do transpiler](transpiler-stages) para obter uma descrição desses estágios.\n",
        "\n",
        "Use o argumento `unitary_synthesis_plugin_config` , um dicionário de forma livre, para passar opções para o método de síntese unitária. A documentação do método de síntese deve explicar as opções que ele suporta. Consulte [esta lista](/docs/api/qiskit/transpiler_synthesis_plugins#unitary-synthesis-plugins-2) para obter links para a documentação dos plug-ins de síntese unitária incorporados.\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "d4ce7ad9-711f-4e43-9012-3f404b885ab1",
      "metadata": {},
      "source": [
        "<span id=\"use-a-high-level-synthesis-plugin\" />\n",
        "\n",
        "### Use um plug-in de síntese de alto nível\n",
        "\n",
        "Primeiro, crie um [HLSConfig](/docs/api/qiskit/qiskit.transpiler.passes.HLSConfig) para armazenar os nomes dos plug-ins a serem usados para vários objetos de alto nível. Por exemplo:\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": [
        "Essa célula de código cria uma configuração de síntese de alto nível que usa o plug-in `layers` para sintetizar objetos [Clifford](/docs/api/qiskit/qiskit.quantum_info.Clifford#clifford) e o plug-in `pmh` para sintetizar [LinearFunction](/docs/api/qiskit/qiskit.circuit.library.LinearFunction#linearfunction) objetos. Os nomes dos argumentos da palavra-chave correspondem ao [`name`](/docs/api/qiskit/qiskit.circuit.Operation#name) da classe [Operation](/docs/api/qiskit/qiskit.circuit.Operation) que representa o tipo de objeto que está sendo sintetizado.\n",
        "Para cada objeto de alto nível, a lista de plug-ins fornecidos é tentada em sequência até que um deles seja bem-sucedido (no exemplo acima, cada lista contém apenas um único plug-in).\n",
        "\n",
        "Além de especificar um plug-in por seu nome, você pode passar uma tupla `(name, options)` , em que o segundo elemento da tupla é um dicionário que contém opções para o plug-in. A documentação do método de síntese deve explicar as opções que ele suporta. Consulte [esta lista](/docs/api/qiskit/transpiler_synthesis_plugins#high-level-synthesis-plugins-2) para obter links para a documentação dos plug-ins de síntese de alto nível incorporados.\n",
        "\n",
        "Depois de criar o objeto `HLSConfig` , passe-o como o argumento `hls_config` para o [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) ou [`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": [
        "A síntese de alto nível é usada nos estágios `init`, `translation` e `optimization` do gerenciador de passagem em estágios retornado por [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) ou usado em [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile). Consulte [Estágios do transpiler](transpiler-stages) para obter uma descrição desses estágios.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "aae87a98-f16d-4ac1-9b85-11a771e04224",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendação\">\n",
        "  * [Crie um plug-in de transpilação](/docs/guides/create-transpiler-plugin).\n",
        "  * Confira os [tutoriais](/docs/tutorials) para ver exemplos de transpilação e execução de circuitos quânticos.\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
}