Expresiones clásicas
La API de C de Qiskit para expresiones clásicas ofrece herramientas para examinar las expresiones clásicas utilizadas en Qiskit. Esta API permite a los usuarios recorrer y examinar árboles de expresiones mediante un conjunto de enumeraciones, estructuras y funciones de acceso. Puedes examinar la estructura de las expresiones, identificar los tipos de nodos, consultar información sobre los tipos y acceder a las propiedades detalladas de cada nodo del árbol de expresiones. Actualmente, solo se puede acceder a las expresiones clásicas a través de la API de flujo de control, por ejemplo, al consultar condiciones que se componen de expresiones clásicas.
Ten en cuenta que las funciones de esta API devuelven punteros prestados que siguen siendo válidos mientras exista el árbol de expresiones principal, por lo que no es necesario liberar estos punteros.
Tipos de datos
QkExprNodeKind
enum QkExprNodeKind
Los diferentes tipos de nodos de expresión que pueden aparecer en un árbol de expresiones clásico.
Valores:
QkExprNodeKind_Unary del censo
Expresión con una operación unaria (p. ej., NOT, negación)
QkExprNodeKind_Binary del censo
Expresión con operaciones binarias (por ejemplo, AND, OR, operaciones aritméticas)
QkExprNodeKind_Cast del censo
Expresión de conversión de tipos
QkExprNodeKind_Value del censo
Expresión de valor literal
QkExprNodeKind_Var del censo
Expresión de referencia variable
QkExprNodeKind_Stretch del censo
Expresión de estiramiento (relacionada con el tiempo)
QkExprNodeKind_Index del censo
Expresión con índice o subíndice
QkExprType
enum QkExprType
Los tipos de datos que se pueden utilizar en las expresiones clásicas.
Valores:
QkExprType_Bool del censo
Tipo de booleano
QkExprType_Duration del censo
Tipo de duración
QkExprType_Float del censo
Tipo de coma flotante
QkExprType_Uint del censo
Tipo entero sin signo
QkExprTypeInfo
struct QkExprTypeInfo
La representación completa del tipo de datos utilizado en una expresión.
QkExprType ty
El tipo de expresión
uint32_t anchura
Ancho en bits del tipo de expresión «Uint»
QkUnaryOpType
enum QkUnaryOpType
Los tipos de operación que puede contener una expresión unaria. Los valores comienzan en 1 para ajustarse a la convención « Python » del sistema de expresión clásico.
Valores:
QkUnaryOpType_BitNot del censo
Operación NOT bit a bit
QkUnaryOpType_LogicNot del censo
Operación lógica «NO»
QkUnaryOpType_Negate del censo
Negación aritmética
QkUnaryExprInfo
struct QkUnaryExprInfo
Describe una expresión unaria, incluyendo su operador, su operando, el tipo de resultado y si se trata de una constante. Devuelto por la qk_expr_unary_info función. El operand campo es un puntero prestado al operando de la expresión de operación unaria.
QkUnaryOpType op
El operador unario
const QkExprNode *operando
Puntero tomado en préstamo a la expresión operanda
QkExprTypeInfo ty
Tipo de resultado de la operación
constante de tipo bool
Si la expresión es constante
QkBinaryOpType
enum QkBinaryOpType
Los tipos de operación que puede contener una expresión binaria. Los valores se cuentan a partir de 1 para ajustarse a la convenci Python.
Valores:
QkBinaryOpType_BitAnd del censo
Operación AND bit a bit
QkBinaryOpType_BitOr del censo
Operación OR bit a bit
QkBinaryOpType_BitXor del censo
Operación XOR bit a bit
QkBinaryOpType_LogicAnd del censo
Operación lógica «Y»
QkBinaryOpType_LogicOr del censo
Operación «O» lógico
QkBinaryOpType_Equal del censo
Comparación de igualdad
QkBinaryOpType_NotEqual del censo
Comparación de la desigualdad
QkBinaryOpType_Less del censo
Menos que la comparación
QkBinaryOpType_LessEqual del censo
Comparación «menor o igual que»
QkBinaryOpType_Greater del censo
Más que una simple comparación
QkBinaryOpType_GreaterEqual del censo
Comparación «mayor o igual que»
QkBinaryOpType_ShiftLeft del censo
Operación de desplazamiento a la izquierda
QkBinaryOpType_ShiftRight del censo
Operación de desplazamiento a la derecha
QkBinaryOpType_Add del censo
Operación de suma
QkBinaryOpType_Sub del encuestador
Operación de resta
QkBinaryOpType_Mul del censo
Operación de multiplicación
QkBinaryOpType_Div del censo
Operación de división
QkBinaryExprInfo
struct QkBinaryExprInfo
Describe una expresión binaria, incluyendo su operador, sus operandos, el tipo de resultado y si se trata de una constante. Devuelto por la qk_expr_binary_info función. Los left campos y right son punteros prestados a los operandos de la expresión de operación binaria.
QkBinaryOpType op
El operador binario
const QkExprNode *izquierda
Expresión de puntero tomado prestado al operando de la izquierda
const QkExprNode *derecha
Expresión de puntero tomado en préstamo al operando correcto
QkExprTypeInfo ty
Tipo de resultado de la operación
constante de tipo bool
Si la expresión es constante
QkCastExprInfo
struct QkCastExprInfo
Describe una expresión de conversión, incluyendo el operando, el tipo de destino, si es implícita y si es constante. Devuelto por la qk_expr_cast_info función. El operand campo es un puntero prestado al operando de la expresión de conversión.
const QkExprNode *operando
Puntero tomado en préstamo a la expresión operanda que se está convirtiendo
QkExprTypeInfo ty
Tipo de destino del lanzamiento
bool implícito
Si la conversión es implícita (automática) o explícita
constante de tipo bool
Si la expresión es constante
QkIndexExprInfo
struct QkIndexExprInfo
Describe una expresión de índice, incluyendo el destino, el índice, el tipo de resultado y si es constante. Devuelto por la qk_expr_index_info función. Los target campos y index son punteros prestados al destino y al índice de la expresión de la operación de índice.
const QkExprNode *target
Puntero tomado en préstamo a la expresión de destino que se está indexando
const QkExprNode *index
Puntero tomado en préstamo a la expresión de índice
QkExprTypeInfo ty
Tipo de resultado de la operación de indexación
constante de tipo bool
Si la expresión es constante
QkDurationType
enum QkDurationType
Representa las diferentes unidades de tiempo que se utilizan en las expresiones de duración.
Valores:
QkDurationType_Dt del censo
Unidades de tiempo del sistema
QkDurationType_Ps del censo
Picosegundos
QkDurationType_Ns del censo
Nanosegundos
QkDurationType_Us del censo
Microsegundos
QkDurationType_Ms del censo
Milisegundos
QkDurationType_S del censo
Segundos
sindicato QkDurationValue
#include <types.h>
Una unión que permite almacenar las unidades de tiempo del sistema (dt) como un número entero o el tiempo real como un número de tipo «float».
Esta unión forma parte de la QkDurationInfo estructura y no debe utilizarse directamente.
int64_t dt
QkDurationType_DtUnidades de tiempo del sistema (activas cuando ty está en QkDurationInfo )
a paso ligero
Valor en tiempo real (activo para todos los demás tipos de duración)
QkDurationInfo
struct QkDurationInfo
La representación completa de un valor de duración.
El ty campo actúa como un discriminante que determina qué campo de la value unión está activo.
Al inicializarlo desde C, es responsabilidad del usuario asegurarse de que:
- Cuando
tyesQkDurationType_Dt, la duración se almacena como un número entero envalue.dt. - Para el resto de tipos de duración, la duración se almacena como un valor de coma flotante en
value.time.
QkDurationType ty
El tipo de unidad de duración (criterio de selección para la unión)
QkDurationValue valor
El valor de la duración
Funciones
qk_expr_kind
QkExprNodeKind qk_expr_kind(const QkExprNode *expr)
Devuelve el tipo de un nodo de expresión clásico.
Ejemplo
QKExprNodeKind kind = qk_expr_kind(expr);Seguridad
El comportamiento no está definido si expr no es un puntero válido y no nulo a un QkExprNode.
Parámetros
- expr – Un puntero al nodo de expresión que se va a inspeccionar.
Devuelve
La enumeración de tipos que describe qué variante expr concreta de la expresión contiene.
qk_expr_binary_info
QkBinaryExprInfo qk_expr_binary_info(const QkExprNode *expr)
Extraer información de un nodo de expresión binaria.
Genera un error si expr no apunta a un nodo de expresión binaria.
Ejemplo
QkBinaryExprInfo info = qk_expr_binary_info(expr);
const QkExprNode *lhs = info.left;
const QkExprNode *rhs = info.right;Seguridad
El comportamiento no está definido si expr no es un puntero válido y no nulo a un QkExprNode.
Parámetros
- expr – Un puntero a un nodo de expresión binaria.
Devuelve
Una QkBinaryExprInfo estructura que describe el operador, los operandos, el tipo de resultado y si la expresión es una constante.
qk_expr_unary_info
QkUnaryExprInfo qk_expr_unary_info(const QkExprNode *expr)
Extraer información de un nodo de expresión unaria.
Genera un error si expr no apunta a un nodo de expresión unaria.
Ejemplo
QkUnaryExprInfo info = qk_expr_unary_info(expr);
QkUnaryOpType op = info.op;Seguridad
El comportamiento no está definido si expr no es un puntero válido y no nulo a un QkExprNode.
Parámetros
- expr – Un puntero a un nodo de expresión unaria.
Devuelve
Una QkUnaryExprInfo estructura que describe el operador, el operando, el tipo de resultado y si la expresión es una constante.
qk_expr_cast_info
QkCastExprInfo qk_expr_cast_info(const QkExprNode *expr)
Extraer información de un nodo de expresión «cast».
Genera un error si expr no apunta a un nodo de expresión de conversión.
Ejemplo
QkCastExprInfo info = qk_expr_cast_info(expr);
const QkExprNode *operand = info.operand;Seguridad
El comportamiento no está definido si expr no es un puntero válido y no nulo a un QkExprNode.
Parámetros
- expr – Un puntero a un nodo de expresión de conversión.
Devuelve
Una QkCastExprInfo estructura que describe el operando, el tipo de destino, si la conversión es implícita y si la expresión es una constante.
qk_expr_index_info
QkIndexExprInfo qk_expr_index_info(const QkExprNode *expr)
Extraer información de un nodo de expresión de índice.
Genera un error si expr no apunta a un nodo de expresión de índice.
Ejemplo
QkIndexExprInfo info = qk_expr_index_info(expr);
const QkExprNode *target = info.target;
const QkExprNode *index = info.index;Seguridad
El comportamiento no está definido si expr no es un puntero válido y no nulo a un QkExprNode.
Parámetros
- expr – Un puntero a un nodo de expresión de índice.
Devuelve
Una QkIndexExprInfo estructura que describe el objetivo indexado, la expresión de índice, el tipo de resultado y si la expresión es constante.
qk_expr_as_value
const QkValue *qk_expr_as_value(const QkExprNode *expr)
Devuelve una vista del valor subyacente del nodo de expresión.
Genera un error si expr no apunta a un nodo de expresión de valor.
Ejemplo
const QkValue *value = qk_expr_as_value(expr);Seguridad
El comportamiento no está definido si expr no es un puntero válido y no nulo a un QkExprNode.
Parámetros
- expr – Un puntero a un nodo de expresión de valor.
Devuelve
QkValue Un puntero al almacenado en expr.
qk_expr_as_var
const QkVar *qk_expr_as_var(const QkExprNode *expr)
Devuelve una vista de la variable subyacente del nodo de expresión.
Genera un error si expr no apunta a un nodo de expresión variable.
Ejemplo
const QkVar *var = qk_expr_as_var(expr);Seguridad
El comportamiento no está definido si expr no es un puntero válido y no nulo a un QkExprNode.
Parámetros
- expr – Un puntero a un nodo de expresión variable.
Devuelve
QkVar Un puntero al almacenado en expr.
qk_expr_as_stretch
const QkStretch *qk_expr_as_stretch(const QkExprNode *expr)
Devuelve una vista del tramo subyacente del nodo de expresión.
Genera un error si expr no apunta a un nodo de expresión de tramo.
Ejemplo
const QkStretch *stretch = qk_expr_as_stretch(expr);Seguridad
El comportamiento no está definido si expr no es un puntero válido y no nulo a un QkExprNode.
Parámetros
- expr – Un puntero a un nodo de expresión de estiramiento.
Devuelve
QkStretch Un puntero al almacenado en expr.
qk_value_type_info
QkExprTypeInfo qk_value_type_info(const QkValue *value)
Devuelve la información sobre el tipo de un valor.
Ejemplo
QkExprTypeInfo type_info = qk_value_type_info(value);Seguridad
El comportamiento no está definido si value no es un puntero válido y no nulo a un Value.
Parámetros
- valor : un puntero al objeto
QkValueque se va a inspeccionar.
Devuelve
Una QkExprTypeInfo estructura que contiene la información sobre los tipos de valor.
qk_value_duration_info
QkDurationInfo qk_value_duration_info(const QkValue *value)
Extraer información estructurada a partir de un valor de duración.
Da un error si value no apunta a un valor de duración.
Ejemplo
QkDurationInfo info = qk_value_duration_info(value);Seguridad
El comportamiento no está definido si value no es un puntero válido y no nulo a un QkValue.
Parámetros
- valor : un puntero a un valor de duración.
Devuelve
Una QkDurationInfo estructura que contiene la unidad de duración y el valor sin procesar.
qk_value_float
double qk_value_float(const QkValue *value)
Extraer el valor de coma flotante de un QkValue.
Genera un error si value no apunta a un valor de tipo float.
Ejemplo
double raw = qk_value_float(value);Seguridad
El comportamiento no está definido si value no es un puntero válido y no nulo a un QkValue.
Parámetros
- valor : un puntero a un valor de tipo float.
Devuelve
El double valor almacenado en value.
qk_value_uint
uint64_t qk_value_uint(const QkValue *value)
Extraer el valor entero sin signo de un QkValue de tipo QkExprType_Uint.
Deberías utilizar qk_value_type_info para asegurarte de que el valor quepa en uint64_t antes de llamar a esta función.
Da un error si value no apunta a un QkExprType_Uint valor o si el entero almacenado no cabe en uint64_t.
Ejemplo
uint64_t raw = qk_value_uint(value);Seguridad
El comportamiento no está definido si value no es un puntero válido y no nulo a un QkValue.
Parámetros
- valor : un puntero a un valor de tipo uint.
Devuelve
El valor entero convertido a uint64_t.
qk_value_bool
bool qk_value_bool(const QkValue *value)
Extraer el valor de un QkValue de tipo QkExprType_Bool.
Genera un error si value no apunta a un valor de tipo bool.
Ejemplo
bool raw = qk_value_bool(value);Seguridad
El comportamiento no está definido si value no es un puntero válido y no nulo a un QkValue.
Parámetros
- valor : un puntero a un valor de tipo bool.
Devuelve
false``true si la representación entera almacenada es distinta de cero; en caso contrario,.
qk_var_name
char *qk_var_name(const QkVar *var)
Devuelve el nombre de una variable como una cadena de C recién asignada.
Ejemplo
char *name = qk_var_name(var);
if (name != NULL) {
// Use the name...
qk_str_free(name);
}Seguridad
El comportamiento no está definido si var no es un puntero válido y no nulo a un QkVar.
Parámetros
- var : un puntero a la variable que se va a inspeccionar.
Devuelve
Una cadena terminada en nulo que contenga el nombre de la variable, o bien NULL , si var hace referencia a una variable no autónoma (es decir, basada en un bit clásico o en un registro clásico). La función a la que se llama es propietaria de la cadena devuelta y debe liberarla con qk_str_free.
qk_var_type_info
QkExprTypeInfo qk_var_type_info(const QkVar *var)
Devuelve toda la información sobre el tipo de una variable.
Da un error si var es un poco variable, algo que esta API aún no admite.
Ejemplo
QkExprTypeInfo type_info = qk_var_type_info(var);Seguridad
El comportamiento no está definido si var no es un puntero válido y no nulo a un QkVar.
Parámetros
- var : un puntero a la variable que se va a inspeccionar.
Devuelve
Una QkExprTypeInfo estructura que contiene la información sobre el tipo de variable.
qk_stretch_name
char *qk_stretch_name(const QkStretch *stretch)
Devuelve el nombre de un tramo.
Ejemplo
char *name = qk_stretch_name(stretch);
// Use the name...
qk_str_free(name);Seguridad
El comportamiento no está definido si stretch no es un puntero válido y no nulo a un QkStretch.
Parámetros
- stretch : un puntero al tramo que se va a inspeccionar.
Devuelve
Una cadena terminada en nulo que contiene el nombre del tramo. La función a la que se llama es propietaria de la cadena devuelta y debe liberarla con qk_str_free.