OpenQASM
Open Quantum Assembly Language (OpenQASM) é uma linguagem de programação projetada para descrever circuitos e algoritmos quânticos para execução em computadores quânticos. Ela é projetada para ser uma representação intermediária que pode ser usada por compiladores de nível superior para se comunicar com hardware quântico, e permite a descrição de uma ampla gama de operações quânticas, bem como controle de fluxo clássico baseado em resultados de medição.
A linguagem inclui um mecanismo para descrever explicitamente o tempo de instruções e permite a vinculação de definições de baixo nível aos portões para tarefas como calibração. OpenQASM não é destinado à computação clássica de propósito geral, e implementações de hardware da linguagem podem não suportar a gama completa de manipulação de dados descrita na especificação. Compiladores para OpenQASM devem oferecer suporte a uma ampla gama de operações clássicas para constantes de tempo de compilação, mas o suporte para essas operações em valores de tempo de execução pode variar entre as implementações.[1]
A linguagem foi primeiramente descrita em um artigo publicado em julho de 2017, e uma implementação de código-fonte de referência foi lançada como parte do Kit de Software de Informações Quânticas da IBM (Qiskit) para uso com sua plataforma de computação quântica em nuvem, a IBM Quantum Experience.[2] A linguagem possui qualidades semelhantes às tradicionais linguagens de descrição de hardware como Verilog.
OpenQASM define sua versão no início de um arquivo fonte como um número, como na declaração:
OPENQASM 3;
O nível das implementações originais publicadas do OpenQASM é OpenQASM 2.0. A versão 3.0 da especificação é a atual e pode ser visualizada no repositório OpenQASM no GitHub.
Exemplos
editarA seguir está um exemplo de código-fonte OpenQASM da biblioteca oficial. O programa adiciona dois números de quatro bits.[3]
/*
* somador quântico de carry em cascata
* Cuccaro et al, quant-ph/0410184
*/
OPENQASM 3;
include "stdgates.inc";
porta maioria a, b, c {
cx c, b;
cx c, a;
ccx a, b, c;
}
porta desmaioria a, b, c {
ccx a, b, c;
cx c, a;
cx a, b;
}
qubit[1] cin;
qubit[4] a;
qubit[4] b;
qubit[1] cout;
bit[5] ans;
uint[4] a_in = 1; // a = 0001
uint[4] b_in = 15; // b = 1111
// inicializar qubits
reset cin;
reset a;
reset b;
reset cout;
// definir estados de entrada
para i de [0: 3] {
se(bool(a_in[i])) x a[i];
se(bool(b_in[i])) x b[i];
}
// adicionar a a b, armazenando o resultado em b
maioria cin[0], b[0], a[0];
para i de [0: 2] { maioria a[i], b[i + 1], a[i + 1]; }
cx a[3], cout[0];
para i de [2: -1: 0] { desmaioria a[i],b[i+1],a[i+1]; }
desmaioria cin[0], b[0], a[0];
medir b[0:3] -> ans[0:3];
medir cout[0] -> ans[4];
Referências
- ↑ «OpenQASM Live Specification». Consultado em Dezembro 26, 2022
- ↑ qiskit-openqasm: OpenQASM specification, International Business Machines, 4 de julho de 2017, consultado em 6 de julho de 2017
- ↑ «openqasm/adder.qasm at master · openqasm/openqasm · GitHub». GitHub. 29 Janeiro 2022