Skip to main content
IBM Quantum Platform

Plug-ins de síntese

qiskit.transpiler.passes.synthesis.plugin

Esse módulo define as interfaces de plug-in para as passagens do transpilador de síntese no Qiskit. Eles fornecem um ponto de conexão para que os pacotes python externos implementem suas próprias técnicas de síntese e as exponham perfeitamente como opções opcionais aos usuários quando eles executam o transpile().

As interfaces de plug-in são criadas usando pontos de entrada de setuptools que permitem que pacotes externos ao qiskit anunciem que incluem um plug-in de síntese.

Consulte qiskit.transpiler.preset_passmanagers.plugin para obter detalhes sobre como escrever plug-ins para estágios do transpilador.


API do plug-in Synthesis

API do plug-in de síntese unitária

Coluna “ 1 ”
Coluna “ 2 ”
UnitarySynthesisPlugin()Classe abstrata de plug-in de síntese unitária
UnitarySynthesisPluginManager()Classe de gerenciador de plug-in de síntese unitária
unitary_synthesis_plugin_names()Retorna uma lista de nomes de plug-ins de síntese unitária instalados

API do plug-in de síntese de alto nível

Coluna “ 1 ”
Coluna “ 2 ”
HighLevelSynthesisPlugin()Classe abstrata de plug-in de síntese de alto nível.
HighLevelSynthesisPluginManager()Classe que rastreia os plug-ins de síntese de alto nível instalados.
high_level_synthesis_plugin_names(op_name)Retorna uma lista de nomes de plug-ins instalados para um determinado nome de objeto de alto nível

Escrevendo Plugins

Plug-ins de síntese unitária

Para escrever um plug-in de síntese unitária, há duas etapas principais. O primeiro passo é criar uma subclasse da classe abstrata do plugin: UnitarySynthesisPlugin. A classe do plug-in define a interface e o contrato para plug-ins de síntese unitária. O método principal é run() aquele que recebe um único argumento posicional — uma matriz unitária na forma de um array numpy — e deve retornar um DAGCircuit objeto que represente o circuito sintetizado a partir dessa matriz unitária. Em seguida, para informar ao transpiler do Qiskit quais informações são necessárias para essa etapa, há vários métodos de propriedade obrigatórios que precisam ser implementados, tais como supports_basis_gates e supports_coupling_map , dependendo se o plug-in suporta e/ou requer essa entrada para realizar a síntese. Para obter todos os detalhes, consulte a UnitarySynthesisPlugin documentação sobre todos os campos obrigatórios. Uma classe de plugin de exemplo seria algo como:

from qiskit.transpiler.passes.synthesis import plugin
from qiskit_plugin_pkg.synthesis import generate_dag_circuit_from_matrix


class SpecialUnitarySynthesis(plugin.UnitarySynthesisPlugin):
    @property
    def supports_basis_gates(self):
        return True

    @property
    def supports_coupling_map(self):
        return False

    @property
    def supports_natural_direction(self):
        return False

    @property
    def supports_pulse_optimize(self):
        return False

    @property
    def supports_gate_lengths(self):
        return False

    @property
    def supports_gate_errors(self):
        return False

    @property
    def supports_gate_lengths_by_qubit(self):
        return False

    @property
    def supports_gate_errors_by_qubit(self):
        return False

    @property
    def min_qubits(self):
        return None

    @property
    def max_qubits(self):
        return None

    @property
    def supported_bases(self):
        return None

    def run(self, unitary, **options):
        basis_gates = options['basis_gates']
        dag_circuit = generate_dag_circuit_from_matrix(unitary, basis_gates)
        return dag_circuit

Se, por algum motivo, os parâmetros disponíveis para o run() método forem insuficientes, por favor, abra uma solicitação para que possamos discutir a ampliação da interface do plug-in com novos parâmetros opcionais que possam ser adicionados de forma compatível com versões anteriores em lançamentos futuros. No entanto, é importante observar que a interface deste plug-in é considerada estável e há garantia de que não sofrerá alterações que causem incompatibilidade. Caso sejam necessárias alterações (por exemplo, para ampliar as opções de entrada disponíveis), elas serão feitas de forma a não exigir alterações nos plug-ins existentes.

Nota

Todos os métodos prefixados com supports_ são reservados em uma classe derivada de UnitarySynthesisPlugin para parte da interface. Você não deve definir nenhum método supports_* personalizado em uma subclasse que não esteja definido na classe abstrata.

O segundo passo é definir o UnitarySynthesisPlugin como ponto de entrada do setuptools nos metadados do pacote. Para isso, basta adicionar uma entry-points tabela no pyproject.toml pacote do plug-in com os pontos de entrada necessários no qiskit.unitary_synthesis namespace. Por exemplo:

[project.entry-points."qiskit.unitary_synthesis"]
"special" = "qiskit_plugin_pkg.module.plugin:SpecialUnitarySynthesis"

Não há um limite para o número de plug-ins que um único pacote pode incluir, desde que cada plug-in tenha um nome exclusivo. Portanto, um único pacote pode expor vários plug-ins, se necessário. O nome default é usado pelo próprio Qiskit e não pode ser usado em um plug-in.

Configuração do plugin de síntese unitária

Para alguns plug-ins de síntese unitária que expõem várias opções e ajustes, a interface do plug-in tem uma opção para que os usuários forneçam um dicionário de configuração de forma livre. Isso será passado para o método run() como o kwarg options . Se o seu plug-in tiver essas opções de configuração, você deverá documentar claramente como um usuário deve especificar essas opções de configuração e como elas são usadas, já que se trata de um campo de formulário livre.

Plug-ins de síntese de alto nível

Escrever um plug-in de síntese de alto nível é, conceitualmente, semelhante a escrever um plug-in de síntese unitária. O primeiro passo é criar uma subclasse da classe abstrata de plug-in: HighLevelSynthesisPlugin, que define a interface e o contrato para plug-ins de síntese de alto nível. O método principal é run(). O argumento high_level_object posicional especifica o “objeto de nível superior” a ser sintetizado, que é qualquer objeto do tipo Operation (incluindo, por exemplo, LinearFunction ou Clifford). O argumento target de palavra-chave especifica o backend de destino, permitindo que o plug-in acesse todas as informações específicas desse destino, como o mapa de acoplamento, o conjunto de portas suportadas e assim por diante. O argumento coupling_map de palavra-chave especifica apenas o mapa de acoplamento e só é usado quando target não for especificado. O argumento qubits de palavra-chave especifica a lista de qubits sobre os quais o objeto de nível superior é definido, caso a síntese seja realizada no circuito físico. O valor de None indica que o layout ainda não foi escolhido e que os qubits físicos no mapa-alvo ou no mapa de acoplamento sobre o qual esta operação está sendo realizada ainda não foram determinados. Além disso, opções e parâmetros de ajuste específicos do plug-in podem ser definidos por meio de options, que é um dicionário de configuração de formato livre. Se o seu plugin tiver essas opções de configuração, você deve documentar claramente como o usuário deve especificá-las e como elas são utilizadas, já que se trata de um campo de preenchimento livre. Espera-se que o método run() retorne um QuantumCircuit objeto que represente o circuito sintetizado a partir desse objeto de nível superior. Também é permitido retornar None indicando que o método de síntese não é capaz de sintetizar o objeto de nível superior especificado. A síntese propriamente dita dos objetos de nível superior é realizada pela HighLevelSynthesis etapa do transpiler. Para obter todos os detalhes, consulte a HighLevelSynthesisPlugin documentação sobre todos os campos obrigatórios. Uma classe de plugin de exemplo seria algo como:

from qiskit.transpiler.passes.synthesis.plugin import HighLevelSynthesisPlugin
from qiskit.synthesis.clifford import synth_clifford_bm


class SpecialSynthesisClifford(HighLevelSynthesisPlugin):

def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
    if higher_level_object.num_qubits <= 3:
        return synth_clifford_bm(high_level_object)
    else:
        return None

O exemplo acima cria um plug-in para sintetizar objetos do tipo Clifford que tenham no máximo 3 qubits, utilizando o método synth_clifford_bm.

O segundo passo é definir o HighLevelSynthesisPlugin como ponto de entrada do setuptools nos metadados do pacote. Isso é feito adicionando uma entry-points tabela no pyproject.toml pacote do plug-in com os pontos de entrada necessários no qiskit.synthesis namespace. Por exemplo:

[project.entry-points."qiskit.synthesis"]
"clifford.special" = "qiskit_plugin_pkg.module.plugin:SpecialSynthesisClifford"

O name é composto por duas partes separadas por um ponto “.”: o nome do tipo ao Operation qual o plug-in de síntese se aplica (clifford), e o nome do plug-in (special). Não há limite para o número de plug-ins que um único pacote pode incluir, desde que cada plug-in tenha um nome exclusivo.


Usando plugins

Plug-ins de síntese unitária

Para usar um plug-in, tudo o que você precisa fazer é instalar o pacote que inclui um plug-in de síntese. Em seguida, o Qiskit descobrirá automaticamente os plug-ins instalados e os exporá como opções válidas para os transpile() kwargs e construtores de passagem apropriados. Se houver algum plug-in instalado que não possa ser carregado/importado, isso será registrado em Python logging.

Para obter a lista dos plug-ins de síntese unitária instalados, você pode usar a qiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names() função.

Plug-ins de síntese de alto nível

Para usar um plug-in de síntese de alto nível, primeiro é preciso instanciar um HLSConfig para armazenar os nomes dos plug-ins a serem usados para diversos objetos de alto nível. Por exemplo:

HLSConfig(permutation=["acg"], clifford=["layers"], linear_function=["pmh"])

cria uma configuração de síntese de alto nível que utiliza o acg plug-in para sintetizar PermutationGate objetos, o layers plug-in para sintetizar Clifford objetos e o pmh plug-in para sintetizar LinearFunction objetos. Os argumentos de palavra-chave são os Operation.name campos dos objetos em questão. Por exemplo, todas Clifford as operações têm o nameclifford , portanto, isso é usado como argumento-chave. Aqui você pode especificar qualquer argumento-chave que os plug-ins instalados sejam capazes de processar, incluindo objetos de usuário personalizados, caso tenha plug-ins instalados para eles. Consulte HLSConfig para obter mais detalhes sobre os formatos alternativos para configurar os plug-ins dentro de cada argumento.

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). 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.

Depois de criado, você passa esse HLSConfig objeto como argumento hls_config para transpile() ou generate_preset_pass_manager() , que utilizará os plug-ins especificados como parte do fluxo de trabalho de compilação mais amplo.

Para obter uma lista dos plug-ins de síntese de alto nível instalados para qualquer Operation.name, você pode usar a high_level_synthesis_plugin_names() função, passando o desejado name como argumento:

high_level_synthesis_plugin_names("clifford")

retornará uma lista de todos os plug-ins de síntese Clifford instalados.


Plug-ins disponíveis

Abaixo estão as classes de plug-in de síntese disponíveis no Qiskit. Essas classes não devem ser usadas diretamente, mas, em vez disso, devem ser usadas por meio da interface de plug-in documentada acima. As classes estão listadas aqui para facilitar a localização da documentação de cada um dos plug-ins incluídos e para facilitar a comparação entre diferentes métodos de síntese de um determinado objeto.

Plug-ins de síntese unitária

Plugin de síntese AQC

Coluna “ 1 ”
Coluna “ 2 ”
AQCSynthesisPlugin()Um plug-in de síntese unitária Qiskit baseado em AQC.

Plugin de síntese Solovay-Kitaev

Coluna “ 1 ”
Coluna “ 2 ”
SolovayKitaevSynthesis()Um plug-in de síntese unitária Solovay-Kitaev Qiskit.

Plugin de síntese Ross-Selinger

Coluna “ 1 ”
Coluna “ 2 ”
RossSelingerSynthesis()Um plugin de síntese unitária Ross-Selinger Qiskit.

Plugin Clifford Unitary Synthesis

Coluna “ 1 ”
Coluna “ 2 ”
CliffordUnitarySynthesis()Um plugin de síntese unitária Clifford.

Plugin de síntese unitária padrão

O plug-in padrão de síntese unitária define o algoritmo padrão utilizado pela UnitarySynthesis etapa do transpiler para sintetizar portas unitárias no circuito. Seu comportamento depende do número de qubits na operação unitária alvo e da base alvo.

Conjuntos de bases contínuas

Quando a base alvo é contínua (ou seja, não é Clifford+T), o plug-in usa as seguintes decomposições:

Para portas de 1 e 2 qubits, o plug-in usa as informações de erro básico do alvo para selecionar a decomposição que maximiza a fidelidade esperada.

Conjuntos de bases Clifford+T

Quando a base-alvo é Clifford+T, o plug-in utiliza o algoritmo de Solovay-Kitaev (ver SolovayKitaevDecomposition) para aproximar operadores unitários de 1 qubit. Os parâmetros utilizados para criar aproximações básicas são basis_gates=["h", "t", "tdg"], depth=12 e recursion_degree=5, e foram escolhidos empiricamente para equilibrar a qualidade da aproximação com o custo computacional. Para usar o Solovay-Kitaev com parâmetros personalizados ou para evitar recalcular aproximações para vários circuitos, você pode utilizar SolovayKitaevSynthesis o plug-in de síntese unitária em vez deste plug-in padrão.

Atualmente, o Qiskit não inclui algoritmos para aproximar unidades de 2+ qubits diretamente no conjunto de bases Clifford+T. Portanto, o gerenciador de passagem predefinido primeiro decompõe esses portões em ["cx", "u"] base e, em seguida, aplica Solovay-Kitaev aos portões unitários de 1 qubit resultantes.

Coluna “ 1 ”
Coluna “ 2 ”
DefaultUnitarySynthesis()O plugin de síntese unitária padrão.

Síntese de alto nível

Os plug-ins de síntese de alto nível disponíveis diretamente no Qiskit incluem plug-ins para sintetizar Clifford objetos, LinearFunction objetos e PermutationGate objetos. Alguns desses plug-ins visam implicitamente a conectividade “todos com todos”. Essa não é uma limitação prática, já que HighLevelSynthesis normalmente é executada antes do layout e do roteamento, o que garantirá que o circuito final esteja em conformidade com a conectividade do dispositivo por meio da inserção de portas SWAP adicionais. Um bom exemplo é o plug-in ACGSynthesisPermutation de síntese por permutação, que pode sintetizar qualquer permutação com, no máximo, duas camadas de portas SWAP. Por outro lado, alguns plug-ins têm como objetivo implícito a conectividade linear. Normalmente, os circuitos de síntese apresentam maior profundidade e maior número de portas; no entanto, nenhuma porta SWAP adicional seria inserida se a etapa de layout seguinte escolhesse uma linha consecutiva de qubits dentro da topologia do dispositivo. nUm bom exemplo disso é o plug-in KMSSynthesisPermutation de síntese por permutação, que é capaz de sintetizar qualquer permutação de n qubits em profundidade. Normalmente, é difícil saber com antecedência qual das duas abordagens — sintetizar circuitos para conectividade “todos com todos” e inserir portas SWAP, ou sintetizar circuitos para conectividade linear e inserir menos ou nenhuma porta SWAP — resulta em um circuito final melhor; portanto, provavelmente faz sentido testar ambas e verificar qual delas oferece melhores resultados. Por fim, alguns plug-ins podem ser direcionados a um tipo específico de conectividade e, portanto, devem ser executados após a definição do layout. Nesse caso, o circuito sintetizado se adapta automaticamente à topologia do dispositivo. Um bom exemplo disso é o plug-in TokenSwapperSynthesisPermutation de síntese por permutação, que é capaz de sintetizar permutações arbitrárias em relação a mapas de acoplamento arbitrários. Para mais detalhes, consulte a descrição de cada plugin individualmente.

Para cada objeto de alto nível, apresentamos uma tabela que lista todos os seus plug-ins disponíveis diretamente no Qiskit. Incluímos o nome do plug-in, a classe do plug-in, o mapa de conectividade de destino e, opcionalmente, informações adicionais. HLSConfigLembre-se de que os plug-ins devem ser utilizados por meio do método descrito anteriormente, por exemplo:

HLSConfig(permutation=["kms"])

cria uma configuração de síntese de alto nível que utiliza o kms plugin para sintetizar PermutationGate objetos – ou seja, aqueles com name = "permutation". Nesse caso, o nome do plug-in é “kms”, e a classe do plug-in é KMSSynthesisPermutation. Esse algoritmo de síntese específico criou um circuito que segue a conectividade linear do vizinho mais próximo.

Plug-ins de síntese de alto nível

Síntese de Clifford
Nome do plug-in
Classe do plug-in
Conectividade direcionada
Descrição
"ag"AGSynthesisCliffordtodos para todosotimiza avidamente a contagem de CX
"bm"BMSynthesisCliffordtodos para todoscontagem ideal para n∈{2,3}n \in \{2,3\}; utilizada em "default" n∈{2,3}n \in \{2,3\}
"greedy"GreedySynthesisCliffordtodos para todosotimiza de forma agressiva o número de CX; usado em "default" n≥4n\geq 4
"layers"LayerSynthesisCliffordtodos para todos
"lnn"LayerLnnSynthesisCliffordlinearesmuitos portões CX, mas garante que a profundidade CX seja de, no máximo, 7n+27n+2
"default"DefaultSynthesisCliffordtodos para todosgeralmente é a melhor opção para otimizar o número de CX (e o número ideal de CX para n∈{2,3}n \in \{2,3\} )
Coluna “ 1 ”
Coluna “ 2 ”
AGSynthesisClifford()Plug-in de síntese de Clifford com base no método Aaronson-Gottesman.
BMSynthesisClifford()Plug-in de síntese de Clifford baseado no método Bravyi-Maslov.
GreedySynthesisClifford()Plug-in de síntese de Clifford com base no método de síntese de Bravyi-Hu-Maslov-Shaydulin.
LayerSynthesisClifford()Plug-in de síntese de Clifford baseado no método Bravyi-Maslov para sintetizar Cliffords em camadas.
LayerLnnSynthesisClifford()Plug-in de síntese de Clifford baseado no método Bravyi-Maslov para sintetizar Cliffords em camadas, com cada camada sintetizada aderindo à conectividade LNN.
DefaultSynthesisClifford()O plug-in padrão de síntese de clifford.
Síntese de Função Linear
Nome do plug-in
Classe do plug-in
Conectividade direcionada
Descrição
"kms"KMSSynthesisLinearFunctionlinearesmuitos portões CX, mas garante que a profundidade CX seja de, no máximo, 5n5n
"pmh"PMHSynthesisLinearFunctiontodos para todosotimiza avidamente o CX-count; usado em "default"
"default"DefaultSynthesisLinearFunctiontodos para todosmelhor para otimizar o CX-count
Coluna “ 1 ”
Coluna “ 2 ”
KMSSynthesisLinearFunction()Plug-in de síntese de função linear baseado no método Kutin-Moulton-Smithline.
PMHSynthesisLinearFunction()Plug-in de síntese de função linear baseado no método Patel-Markov-Hayes.
DefaultSynthesisLinearFunction()O plug-in padrão de síntese de função linear.
Síntese de Permutações
Nome do plug-in
Classe do plug-in
Conectividade direcionada
Descrição
"basic"BasicSynthesisPermutationtodos para todoscontagem ideal de SWAP; usado em "default"
"acg"ACGSynthesisPermutationtodos para todosgarante que a profundidade do SWAP seja, no máximo, de 22
"kms"KMSSynthesisPermutationlinearesmuitos portões SWAP, mas garante uma profundidade de SWAP de, no máximo, nn
"token_swapper"TokenSwapperSynthesisPermutationqualquerotimiza avidamente a contagem de SWAP para conectividade arbitrária
"default"BasicSynthesisPermutationtodos para todosmelhor para otimizar a contagem de SWAP
Coluna “ 1 ”
Coluna “ 2 ”
BasicSynthesisPermutation()O plug-in de síntese de permutação é baseado na classificação.
ACGSynthesisPermutation()O plug-in de síntese de permutação é baseado no método de Alon, Chung e Graham.
KMSSynthesisPermutation()O plug-in de síntese de permutação é baseado no método Kutin, Moulton e Smithline.
TokenSwapperSynthesisPermutation()O plug-in de síntese de permutação é baseado no algoritmo de troca de tokens.
Síntese QFT
Nome do plug-in
Classe do plug-in
Conectividade direcionada
"full"QFTSynthesisFulltodos para todos
"line"QFTSynthesisLinelineares
"default"QFTSynthesisFulltodos para todos
Coluna “ 1 ”
Coluna “ 2 ”
QFTSynthesisFull()Plug-in de síntese para portas QFT usando conectividade tudo-para-todos.
QFTSynthesisLine()Plug-in de síntese para portas QFT usando conectividade linear.
Síntese MCX

A tabela a seguir lista os plug-ins de síntese disponíveis para um MCXGate portão com k qubits de controle. Se o número disponível de qubits auxiliares limpos/sujos não for suficiente, o método de síntese correspondente retornará None.

Nome do plug-in
Classe do plug-in
Número de acessórios limpos
Número de auxiliares sujos
Descrição
"gray_code"MCXSynthesisGrayCode00um número exponencial de portas CX; use apenas para valores pequenos de kk
"noaux_v24"MCXSynthesisNoAuxV240000número quadrático de portas CX
"noaux_hp24"MCXSynthesisNoAuxHP240000número linear de portas CX; use em vez de ou "noaux_v24" "gray_code" para k>5k>5
"n_clean_m15"MCXSynthesisNCleanM15k−2k-200no máximo 6k−66k-6 portas CX
"n_dirty_i15"MCXSynthesisNDirtyI1500k−2k-2no máximo 8k−68k-6 portas CX
"2_clean_kg24"MCXSynthesis2CleanKG242200no máximo 6k−66k-6 portas CX
"2_dirty_kg24"MCXSynthesis2DirtyKG2402no máximo 12k−1812k-18 portas CX
"1_clean_kg24"MCXSynthesis1CleanKG2410no máximo 6k−66k-6 portas CX
"1_dirty_kg24"MCXSynthesis1DirtyKG240011no máximo 12k−1812k-18 portas CX
"1_clean_b95"MCXSynthesis1CleanB951100no máximo 16k−816k-8 portas CX
"default"MCXSynthesisDefaultqualquerqualquerescolhe o melhor algoritmo com base nos recursos disponíveis
Coluna “ 1 ”
Coluna “ 2 ”
MCXSynthesisGrayCode()Plug-in de síntese para uma porta X multicontrolada com base no código Gray.
MCXSynthesisNoAuxV24()Plug-in de síntese para uma porta X multicontrolada com base na implementação para MCPhaseGate, que, por sua vez, é baseada no artigo de Vale et al. (2024).
MCXSynthesisNoAuxHP24()Plug-in de síntese para uma porta X multicontrolada com base no artigo de Huang e Palsberg.
MCXSynthesisNCleanM15()Plug-in de síntese para uma porta X multicontrolada com base no artigo de Maslov (2016).
MCXSynthesisNDirtyI15()Plug-in de síntese para uma porta X multicontrolada com base no artigo de Iten et al. (2016).
MCXSynthesis2CleanKG24()Plug-in de síntese para uma porta X multicontrolada com base no artigo de Khattar e Gidney (2024).
MCXSynthesis2DirtyKG24()Plug-in de síntese para uma porta X multicontrolada com base no artigo de Khattar e Gidney (2024).
MCXSynthesis1CleanKG24()Plug-in de síntese para uma porta X multicontrolada com base no artigo de Khattar e Gidney (2024).
MCXSynthesis1DirtyKG24()Plug-in de síntese para uma porta X multicontrolada com base no artigo de Khattar e Gidney (2024).
MCXSynthesis1CleanB95()Plugin de síntese para uma porta X multicontrolada com base no artigo de Barenco et al. (1995).
MCXSynthesisDefault()O plug-in de síntese padrão para uma porta X multicontrolada.
Síntese MCMT
Nome do plug-in
Classe do plug-in
Número de acessórios limpos
Número de auxiliares sujos
Descrição
"vchain"MCMTSynthesisVChaink−1k-100usa um número linear de portas de Toffoli
"noaux"MCMTSynthesisNoAux0000usa o mecanismo de controle padrão do Qiskit
"xgate"MCMTSynthesisXGate0000usa um número linear de portas de Toffoli
"default"MCMTSynthesisDefaultqualquerqualquerescolhe o melhor algoritmo com base nos recursos disponíveis
Coluna “ 1 ”
Coluna “ 2 ”
MCMTSynthesisVChain()Uma síntese baseada na cadeia V para MCMTGate.
MCMTSynthesisNoAux()Uma síntese baseada na cadeia V para MCMTGate.
MCMTSynthesisXGate()Uma síntese para MCMTGate com a porta X como porta base.
MCMTSynthesisDefault()Uma decomposição padrão para portas MCMT.
Comparadores de inteiros
Nome do plug-in
Classe do plug-in
Descrição
Qubits auxiliares
"twos"IntComparatorSynthesis2susar adição com complemento de doisn−1n - 1 limpo
"noaux"IntComparatorSynthesisNoAuxinverter o alvo controlado em todos os O(2l)O(2^l) valores inteiros permitidosNenhum
"default"IntComparatorSynthesisDefaultusar o melhor algoritmo, dependendo dos qubits auxiliares disponíveisqualquer
Coluna “ 1 ”
Coluna “ 2 ”
IntComparatorSynthesis2s()Uma comparação de números inteiros baseada no complemento 2s.
IntComparatorSynthesisNoAux()Uma comparação potencialmente exponencialmente cara sem qubits auxiliares.
IntComparatorSynthesisDefault()A síntese padrão para IntegerComparatorGate.
Somas
Nome do plug-in
Classe do plug-in
Descrição
Qubits auxiliares
"default"WeightedSumSynthesisDefaultusar uma síntese baseada em cadeia Vdado um número de qubits de som ss, foram utilizados s−1s≤2s - 1_{s \leq 2} qubits auxiliares limpos
Coluna “ 1 ”
Coluna “ 2 ”
WeightedSumSynthesisDefault()Sintetize um WeightedSumGate usando o algoritmo de síntese padrão.
Síntese da evolução de Pauli
Nome do plug-in
Classe do plug-in
Descrição
Conectividade direcionada
"rustiq"PauliEvolutionSynthesisRustiqusar o método de síntese da biblioteca de síntese de circuitos Rustiqtodos para todos
"default"PauliEvolutionSynthesisDefaultusam um termo de Clifford por Pauli diagonalizadotodos para todos
Coluna “ 1 ”
Coluna “ 2 ”
PauliEvolutionSynthesisDefault()Sintetize um PauliEvolutionGate usando o algoritmo de síntese padrão.
PauliEvolutionSynthesisRustiq()Sintetize um PauliEvolutionGate usando o Rustiq.
Síntese modular de somadores
Nome do plug-in
Classe do plug-in
Número de acessórios limpos
Descrição
"modular_v17"ModularAdderSynthesisV1700um somador modular sem nenhum qubits auxiliar
"ripple_cdkm"ModularAdderSynthesisC0411um somador de transporte de ondulação
"ripple_vbe"ModularAdderSynthesisV95n−1n-1, para nn -bit numbersum somador de transporte de ondulação
"qft"ModularAdderSynthesisD0000um somador baseado em QFT
"default"ModularAdderSynthesisDefaultqualquerescolhe o melhor algoritmo com base nos recursos disponíveis
Coluna “ 1 ”
Coluna “ 2 ”
ModularAdderSynthesisV17()Um somador modular (módulo 2n2^n ) sem nenhum qubits auxiliar.
ModularAdderSynthesisC04()Um somador de transporte de ondulação, módulo 2n2^n.
ModularAdderSynthesisD00()Um somador baseado em QFT, módulo 2n2^n.
ModularAdderSynthesisV95()Um somador de transporte de ondulação, módulo 2n2^n.
ModularAdderSynthesisDefault()A síntese padrão do somador modular (nenhum carry in, nenhum carry out qubit).
Síntese do somador parcial
Nome do plug-in
Classe do plug-in
Número de acessórios limpos
Descrição
"ripple_cdkm"HalfAdderSynthesisC0411um somador de transporte de ondulação
"ripple_r25"HalfAdderSynthesisR2500um somador de ripple-carry sem auxiliares
"ripple_vbe"HalfAdderSynthesisV95n−1n-1, para nn -bit numbersum somador de transporte de ondulação
"qft"HalfAdderSynthesisD0000um somador baseado em QFT
"default"HalfAdderSynthesisDefaultqualquerescolhe o melhor algoritmo com base nos recursos disponíveis
Coluna “ 1 ”
Coluna “ 2 ”
HalfAdderSynthesisC04()Um somador ripple-carry com um bit de carry-out.
HalfAdderSynthesisD00()Um somador baseado em QFT com um bit de carry-in e um bit de carry-out.
HalfAdderSynthesisV95()Um somador ripple-carry com um bit de carry-out.
HalfAdderSynthesisR25()Um somador ripple-carry com um bit de transporte sem qubits auxiliares.
HalfAdderSynthesisDefault()A síntese padrão de meio-somador (sem carry in, mas com um qubit de carry out).
Síntese do somador completo
Nome do plug-in
Classe do plug-in
Número de acessórios limpos
Descrição
"ripple_cdkm"FullAdderSynthesisC0400um somador de transporte de ondulação
"ripple_vbe"FullAdderSynthesisV95n−1n-1, para nn -bit numbersum somador de transporte de ondulação
"default"FullAdderSynthesisDefaultqualquerescolhe o melhor algoritmo com base nos recursos disponíveis
Coluna “ 1 ”
Coluna “ 2 ”
FullAdderSynthesisC04()Um somador ripple-carry com um bit de carry-in e um bit de carry-out.
FullAdderSynthesisV95()Um somador ripple-carry com um bit de carry-in e um bit de carry-out.
FullAdderSynthesisDefault()Um somador ripple-carry com um bit de carry-in e um bit de carry-out.
Síntese multiplicadora
Nome do plug-in
Classe do plug-in
Número de acessórios limpos
Descrição
"cumulative"MultiplierSynthesisH18dependendo do site AdderGate usadoum somador cumulativo baseado em somadores controlados
"qft"MultiplierSynthesisR1700um multiplicador baseado em QFT
"default"MultiplierSynthesisDefaultqualquerescolhe o melhor algoritmo com base nos recursos disponíveis
Coluna “ 1 ”
Coluna “ 2 ”
MultiplierSynthesisH18()Um multiplicador cumulativo baseado em somadores controlados.
MultiplierSynthesisR17()Um multiplicador baseado em QFT.
MultiplierSynthesisDefault()O plug-in multiplicador padrão.
Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.