Expressões clássicas
A API C do Qiskit para expressões clássicas oferece recursos para inspecionar as expressões clássicas utilizadas no Qiskit. Essa API permite que os usuários percorram e examinem árvores de expressões por meio de um conjunto de enums, estruturas e funções de acesso. É possível examinar a estrutura das expressões, identificar os tipos de nós, consultar informações sobre os tipos e acessar as propriedades detalhadas de cada nó na árvore de expressões. Atualmente, só é possível acessar expressões clássicas por meio da API de fluxo de controle, por exemplo, ao consultar condições compostas por expressões clássicas.
Observe que as funções desta API retornam ponteiros emprestados que permanecem válidos enquanto a árvore de expressões pai existir; portanto, esses ponteiros não precisam ser liberados.
Tipos de dados
QkExprNodeKind
enum QkExprNodeKind
Os diferentes tipos de nós de expressão que podem aparecer em uma árvore de expressão clássica.
Valores:
QkExprNodeKind_Unary do recenseador
Expressão de operação unária (por exemplo, NOT, negação)
QkExprNodeKind_Binary do recenseador
Expressão de operação binária (por exemplo, AND, OR, operações aritméticas)
QkExprNodeKind_Cast do recenseador
Expressão com conversão de tipo
QkExprNodeKind_Value do recenseador
Expressão de valor literal
QkExprNodeKind_Var do recenseador
Expressão de referência variável
QkExprNodeKind_Stretch do recenseador
Expressão de extensão (relacionada ao tempo)
QkExprNodeKind_Index do recenseador
Expressão com índice/subíndice
QkExprType
enum QkExprType
Os tipos de dados que podem ser usados em expressões clássicas.
Valores:
QkExprType_Bool do recenseador
Tipo booleano
QkExprType_Duration do recenseador
Tipo de duração
QkExprType_Float do recenseador
Tipo de ponto flutuante
QkExprType_Uint do recenseador
Tipo inteiro sem sinal
QkExprTypeInfo
struct QkExprTypeInfo
A representação completa do tipo de dados utilizado em uma expressão.
QkExprType ty
O tipo de expressão
uint32_t largura
Largura em bits do tipo de expressão Uint
QkUnaryOpType
enum QkUnaryOpType
Os tipos de operação que uma expressão unária pode conter. Os valores começam em 1 para se adequarem à convenção “ Python ” do sistema de expressão clássico.
Valores:
QkUnaryOpType_BitNot do recenseador
Operação NOT bit a bit
QkUnaryOpType_LogicNot do recenseador
Operação lógica NÃO
QkUnaryOpType_Negate do recenseador
Negação aritmética
QkUnaryExprInfo
struct QkUnaryExprInfo
Descreve uma expressão unária, incluindo seu operador, operando, tipo de resultado e se é uma constante. qk_expr_unary_info Retornado pela função. O operand campo é um ponteiro emprestado para o operando da expressão da operação unária.
QkUnaryOpType op
O operador unário
const QkExprNode *operando
Ponteiro emprestado para a expressão operanda
QkExprTypeInfo ty
Tipo de resultado da operação
constante booleana
Se a expressão é constante
QkBinaryOpType
enum QkBinaryOpType
Os tipos de operação que uma expressão binária pode conter. Os valores começam em 1 para seguir a convenção d Python.
Valores:
QkBinaryOpType_BitAnd do recenseador
Operação AND bit a bit
QkBinaryOpType_BitOr do recenseador
Operação OR bit a bit
QkBinaryOpType_BitXor do recenseador
Operação XOR bit a bit
QkBinaryOpType_LogicAnd do recenseador
Operação lógica AND
QkBinaryOpType_LogicOr do recenseador
Operação OR lógica
QkBinaryOpType_Equal do recenseador
Comparação de igualdade
QkBinaryOpType_NotEqual do recenseador
Comparação de desigualdades
QkBinaryOpType_Less do recenseador
Menos do que a comparação
QkBinaryOpType_LessEqual do recenseador
Comparação “menor ou igual a”
QkBinaryOpType_Greater do recenseador
Maior do que a comparação
QkBinaryOpType_GreaterEqual do recenseador
Comparação “maior ou igual que”
QkBinaryOpType_ShiftLeft do recenseador
Operação de deslocamento para a esquerda
QkBinaryOpType_ShiftRight do recenseador
Operação de deslocamento para a direita
QkBinaryOpType_Add do recenseador
Operação de adição
QkBinaryOpType_Sub do recenseador
Operação de subtração
QkBinaryOpType_Mul do recenseador
Operação de multiplicação
QkBinaryOpType_Div do recenseador
Operação de divisão
QkBinaryExprInfo
struct QkBinaryExprInfo
Descreve uma expressão binária, incluindo seu operador, operandos, tipo de resultado e se ela é uma constante. qk_expr_binary_info Retornado pela função. Os left campos e right são ponteiros emprestados para os operandos da expressão da operação binária.
QkBinaryOpType op
O operador binário
const QkExprNode *left
Ponteiro emprestado para a expressão do operando à esquerda
const QkExprNode *direita
Ponteiro emprestado para a expressão do operando à direita
QkExprTypeInfo ty
Tipo de resultado da operação
constante booleana
Se a expressão é constante
QkCastExprInfo
struct QkCastExprInfo
Descreve uma expressão de conversão de tipo, incluindo o operando, o tipo de destino, se é implícita e se é constante. qk_expr_cast_info Retornado pela função. O operand campo é um ponteiro emprestado para o operando da expressão de conversão.
const QkExprNode *operando
Ponteiro emprestado para a expressão operanda que está sendo convertida
QkExprTypeInfo ty
Tipo de alvo do feitiço
bool implícito
Se a conversão é implícita (automática) ou explícita
constante booleana
Se a expressão é constante
QkIndexExprInfo
struct QkIndexExprInfo
Descreve uma expressão de índice, incluindo o destino, o índice, o tipo de resultado e se ela é constante. qk_expr_index_info Retornado pela função. Os target campos e index são ponteiros emprestados para o alvo e o índice da expressão da operação de indexação.
const QkExprNode *target
Ponteiro emprestado para a expressão-alvo que está sendo indexada
const QkExprNode *index
Ponteiro emprestado para a expressão de índice
QkExprTypeInfo ty
Tipo de resultado da operação de indexação
constante booleana
Se a expressão é constante
QkDurationType
enum QkDurationType
Representa as diferentes unidades de tempo utilizadas em expressões de duração.
Valores:
QkDurationType_Dt do recenseador
Unidades de tempo do sistema
QkDurationType_Ps do recenseador
Picossegundos
QkDurationType_Ns do recenseador
Nanossegundos
QkDurationType_Us do recenseador
Microssegundos
QkDurationType_Ms do recenseador
Milissegundos
QkDurationType_S do recenseador
Segundos
sindicato QkDurationValue
#include <types.h>
Uma união que armazena as unidades de tempo do sistema (dt) como um número inteiro ou o tempo real como um número de precisão flutuante.
Essa união faz parte da QkDurationInfo estrutura e não deve ser usada diretamente.
int64_t dt
QkDurationType_DtUnidades de tempo do sistema (ativas quando ty está em QkDurationInfo )
a passos acelerados
Valor em tempo real (ativo para todos os outros tipos de duração)
QkDurationInfo
struct QkDurationInfo
A representação completa de um valor de duração.
O ty campo atua como um discriminante que determina qual campo da value união está ativo.
Ao ser inicializado a partir do C, cabe ao usuário garantir que:
- Quando
tyéQkDurationType_Dt, a duração é armazenada como um número inteiro emvalue.dt. - Para todos os outros tipos de duração, a duração é armazenada como um valor de ponto flutuante em
value.time.
QkDurationType ty
O tipo de unidade de duração (critério de seleção para a união)
QkDurationValue valor
O valor da duração
Funções
qk_expr_kind
QkExprNodeKind qk_expr_kind(const QkExprNode *expr)
Retorna o tipo de um nó de expressão clássico.
Exemplo
QKExprNodeKind kind = qk_expr_kind(expr);Segurança
O comportamento é indefinido se expr não for um ponteiro válido e não nulo para um QkExprNode.
Parâmetros
- expr – Um ponteiro para o nó de expressão a ser inspecionado.
Retorna
A enumeração do tipo que descreve qual variante expr de expressão concreta está contida.
qk_expr_binary_info
QkBinaryExprInfo qk_expr_binary_info(const QkExprNode *expr)
Extrair informações de um nó de expressão binária.
Gera um erro de panico se expr não apontar para um nó de expressão binária.
Exemplo
QkBinaryExprInfo info = qk_expr_binary_info(expr);
const QkExprNode *lhs = info.left;
const QkExprNode *rhs = info.right;Segurança
O comportamento é indefinido se expr não for um ponteiro válido e não nulo para um QkExprNode.
Parâmetros
- expr – Um ponteiro para um nó de expressão binária.
Retorna
Uma QkBinaryExprInfo estrutura que descreve o operador, os operandos, o tipo do resultado e se a expressão é constante.
qk_expr_unary_info
QkUnaryExprInfo qk_expr_unary_info(const QkExprNode *expr)
Extrair informações de um nó de expressão unária.
Gera uma exceção se expr não apontar para um nó de expressão unária.
Exemplo
QkUnaryExprInfo info = qk_expr_unary_info(expr);
QkUnaryOpType op = info.op;Segurança
O comportamento é indefinido se expr não for um ponteiro válido e não nulo para um QkExprNode.
Parâmetros
- expr – Um ponteiro para um nó de expressão unária.
Retorna
Uma QkUnaryExprInfo estrutura que descreve o operador, o operando, o tipo do resultado e se a expressão é uma constante.
qk_expr_cast_info
QkCastExprInfo qk_expr_cast_info(const QkExprNode *expr)
Extrair informações de um nó de expressão de conversão.
Gera um erro se expr não apontar para um nó de expressão de conversão.
Exemplo
QkCastExprInfo info = qk_expr_cast_info(expr);
const QkExprNode *operand = info.operand;Segurança
O comportamento é indefinido se expr não for um ponteiro válido e não nulo para um QkExprNode.
Parâmetros
- expr – Um ponteiro para um nó de expressão de conversão.
Retorna
Uma QkCastExprInfo estrutura que descreve o operando, o tipo de destino, se a conversão é implícita e se a expressão é constante.
qk_expr_index_info
QkIndexExprInfo qk_expr_index_info(const QkExprNode *expr)
Extrair informações de um nó de expressão de índice.
Gera um erro de panico se expr não apontar para um nó de expressão de índice.
Exemplo
QkIndexExprInfo info = qk_expr_index_info(expr);
const QkExprNode *target = info.target;
const QkExprNode *index = info.index;Segurança
O comportamento é indefinido se expr não for um ponteiro válido e não nulo para um QkExprNode.
Parâmetros
- expr – Um ponteiro para um nó de expressão de índice.
Retorna
Uma QkIndexExprInfo estrutura que descreve o alvo indexado, a expressão de índice, o tipo do resultado e se a expressão é constante.
qk_expr_as_value
const QkValue *qk_expr_as_value(const QkExprNode *expr)
Retorna uma visualização do valor subjacente do nó de expressão.
Gera um erro de panico se expr não apontar para um nó de expressão de valor.
Exemplo
const QkValue *value = qk_expr_as_value(expr);Segurança
O comportamento é indefinido se expr não for um ponteiro válido e não nulo para um QkExprNode.
Parâmetros
- expr – Um ponteiro para um nó de expressão de valor.
Retorna
Um ponteiro para o valor QkValue armazenado dentro de expr.
qk_expr_as_var
const QkVar *qk_expr_as_var(const QkExprNode *expr)
Retorna uma visualização da variável subjacente do nó de expressão.
Gera um erro de panico se expr não apontar para um nó de expressão variável.
Exemplo
const QkVar *var = qk_expr_as_var(expr);Segurança
O comportamento é indefinido se expr não for um ponteiro válido e não nulo para um QkExprNode.
Parâmetros
- expr – Um ponteiro para um nó de expressão variável.
Retorna
Um ponteiro para o valor QkVar armazenado dentro de expr.
qk_expr_as_stretch
const QkStretch *qk_expr_as_stretch(const QkExprNode *expr)
Retorna uma visualização do trecho subjacente do nó de expressão.
Gera um erro se expr não apontar para um nó de expressão de extensão.
Exemplo
const QkStretch *stretch = qk_expr_as_stretch(expr);Segurança
O comportamento é indefinido se expr não for um ponteiro válido e não nulo para um QkExprNode.
Parâmetros
- expr – Um ponteiro para um nó de expressão de extensão.
Retorna
Um ponteiro para o valor QkStretch armazenado dentro de expr.
qk_value_type_info
QkExprTypeInfo qk_value_type_info(const QkValue *value)
Retorna as informações de tipo de um valor.
Exemplo
QkExprTypeInfo type_info = qk_value_type_info(value);Segurança
O comportamento é indefinido se value não for um ponteiro válido e não nulo para um Value.
Parâmetros
- valor – Um ponteiro para o objeto
QkValuea ser inspecionado.
Retorna
Uma QkExprTypeInfo estrutura que contém as informações sobre o tipo de valor.
qk_value_duration_info
QkDurationInfo qk_value_duration_info(const QkValue *value)
Extrair informações estruturadas a partir de um valor de duração.
Gera um erro se value não apontar para um valor de duração.
Exemplo
QkDurationInfo info = qk_value_duration_info(value);Segurança
O comportamento é indefinido se value não for um ponteiro válido e não nulo para um QkValue.
Parâmetros
- valor – Um ponteiro para um valor de duração.
Retorna
Uma QkDurationInfo estrutura que contém a unidade de duração e o valor bruto.
qk_value_float
double qk_value_float(const QkValue *value)
Extrair o valor de ponto flutuante de um QkValue.
Gera um erro se value não apontar para um valor do tipo float.
Exemplo
double raw = qk_value_float(value);Segurança
O comportamento é indefinido se value não for um ponteiro válido e não nulo para um QkValue.
Parâmetros
- valor – Um ponteiro para um valor do tipo float.
Retorna
O double valor armazenado em value.
qk_value_uint
uint64_t qk_value_uint(const QkValue *value)
Extraia o valor inteiro sem sinal de um QkValue do tipo QkExprType_Uint.
Você deve usar qk_value_type_info para garantir que o valor caiba em uint64_t antes de chamar essa função.
Gera um erro de panico se value não apontar para um QkExprType_Uint valor ou se o inteiro armazenado não couber em uint64_t.
Exemplo
uint64_t raw = qk_value_uint(value);Segurança
O comportamento é indefinido se value não for um ponteiro válido e não nulo para um QkValue.
Parâmetros
- value – Um ponteiro para um valor do tipo uint.
Retorna
O valor inteiro convertido para uint64_t.
qk_value_bool
bool qk_value_bool(const QkValue *value)
Extraia o valor de um QkValue do tipo QkExprType_Bool.
Gera um erro se value não apontar para um valor do tipo bool.
Exemplo
bool raw = qk_value_bool(value);Segurança
O comportamento é indefinido se value não for um ponteiro válido e não nulo para um QkValue.
Parâmetros
- valor – Um ponteiro para um valor do tipo bool.
Retorna
false``true se a representação inteira armazenada for diferente de zero; caso contrário,.
qk_var_name
char *qk_var_name(const QkVar *var)
Retorna o nome de uma variável como uma string C recém-alocada.
Exemplo
char *name = qk_var_name(var);
if (name != NULL) {
// Use the name...
qk_str_free(name);
}Segurança
O comportamento é indefinido se var não for um ponteiro válido e não nulo para um QkVar.
Parâmetros
- var – Um ponteiro para a variável a ser inspecionada.
Retorna
Uma string terminada por caractere nulo contendo o nome da variável, ou NULL , caso var se trate de uma variável não autônoma (ou seja, baseada em um bit clássico ou em um registro clássico). A função de chamada é responsável pela string retornada e deve liberá-la com qk_str_free.
qk_var_type_info
QkExprTypeInfo qk_var_type_info(const QkVar *var)
Retorna todas as informações de tipo de uma variável.
Gera um erro se var for um pouco variável, o que ainda não é suportado por esta API.
Exemplo
QkExprTypeInfo type_info = qk_var_type_info(var);Segurança
O comportamento é indefinido se var não for um ponteiro válido e não nulo para um QkVar.
Parâmetros
- var – Um ponteiro para a variável a ser inspecionada.
Retorna
Uma QkExprTypeInfo estrutura que contém as informações sobre o tipo da variável.
qk_stretch_name
char *qk_stretch_name(const QkStretch *stretch)
Retorna o nome de um trecho.
Exemplo
char *name = qk_stretch_name(stretch);
// Use the name...
qk_str_free(name);Segurança
O comportamento é indefinido se stretch não for um ponteiro válido e não nulo para um QkStretch.
Parâmetros
- stretch – Um ponteiro para o trecho a ser inspecionado.
Retorna
Uma string terminada por caractere nulo contendo o nome do trecho. A função de chamada é responsável pela string retornada e deve liberá-la com qk_str_free.