Espressioni classiche
L'API C di Qiskit per le espressioni classiche offre funzionalità che consentono di esaminare le espressioni classiche utilizzate in Qiskit. Questa API consente agli utenti di esplorare ed esaminare gli alberi di espressioni tramite una serie di enumerazioni, strutture e funzioni di accesso. È possibile esaminare la struttura delle espressioni, identificare i tipi di nodo, interrogare le informazioni sui tipi e accedere alle proprietà dettagliate di ciascun nodo nell'albero delle espressioni. Attualmente, è possibile accedere alle espressioni classiche solo tramite l'API di controllo del flusso, ad esempio quando si effettuano query su condizioni costituite da espressioni classiche.
Si noti che le funzioni di questa API restituiscono puntatori presi in prestito che rimangono validi fintanto che esiste l'albero di espressioni padre, pertanto non è necessario liberare tali puntatori.
Tipi di dati
QkExprNodeKind
enum QkExprNodeKind
I diversi tipi di nodi di espressione che possono comparire in un albero di espressione classico.
Valori:
censitore QkExprNodeKind_Unary
Espressione con operazione unaria (ad es., NOT, negazione)
censitore QkExprNodeKind_Binary
Espressione con operazioni binarie (ad es. AND, OR, operazioni aritmetiche)
censitore QkExprNodeKind_Cast
Espressione con conversione di tipo
censitore QkExprNodeKind_Value
Espressione con valore letterale
censitore QkExprNodeKind_Var
Espressione di riferimento variabile
censitore QkExprNodeKind_Stretch
Espressione di allungamento (legata al tempo)
censitore QkExprNodeKind_Index
Espressione con indice/sottoscritto
QkExprType
enum QkExprType
I tipi di dati che possono essere utilizzati nelle espressioni classiche.
Valori:
censitore QkExprType_Bool
Tipo booleano
censitore QkExprType_Duration
Tipo di durata
censitore QkExprType_Float
Tipo a virgola mobile
censitore QkExprType_Uint
Tipo intero senza segno
QkExprTypeInfo
struct QkExprTypeInfo
La rappresentazione completa del tipo di dati utilizzato per un'espressione.
QkExprType ty
Il tipo di espressione
uint32_t larghezza
Larghezza in bit per il tipo di espressione Uint
QkUnaryOpType
enum QkUnaryOpType
I tipi di operazione che un'espressione unaria può contenere. I valori partono da 1 per allinearsi alla convenzione " Python " del sistema di espressione classico.
Valori:
censitore QkUnaryOpType_BitNot
Operazione NOT bit a bit
censitore QkUnaryOpType_LogicNot
Operazione logica NOT
censitore QkUnaryOpType_Negate
Negazione aritmetica
QkUnaryExprInfo
struct QkUnaryExprInfo
Descrive un'espressione unaria, indicando l'operatore, l'operando, il tipo di risultato e se si tratta di una costante. qk_expr_unary_info Restituito dalla funzione. Il operand campo è un puntatore preso in prestito all'operando dell'espressione dell'operazione unaria.
QkUnaryOpType op
L'operatore unario
const QkExprNode *operando
Puntatore preso in prestito all'espressione operanda
QkExprTypeInfo ty
Tipo di risultato dell'operazione
costante booleana
Se l'espressione è costante
QkBinaryOpType
enum QkBinaryOpType
I tipi di operazione che un'espressione binaria può contenere. I valori partono da 1 per rispettare la convenz Python.
Valori:
censitore QkBinaryOpType_BitAnd
Operazione AND bit a bit
censitore QkBinaryOpType_BitOr
Operazione OR bit a bit
censitore QkBinaryOpType_BitXor
Operazione XOR bit a bit
censitore QkBinaryOpType_LogicAnd
Operazione logica AND
censitore QkBinaryOpType_LogicOr
Operazione OR logica
censitore QkBinaryOpType_Equal
Confronto tra valori
censitore QkBinaryOpType_NotEqual
Confronto delle disuguaglianze
censitore QkBinaryOpType_Less
Meno del confronto
censitore QkBinaryOpType_LessEqual
Confronto "minore o uguale a"
censitore QkBinaryOpType_Greater
Più grande del confronto
censitore QkBinaryOpType_GreaterEqual
Confronto "maggiore o uguale a"
censitore QkBinaryOpType_ShiftLeft
Operazione di spostamento a sinistra
censitore QkBinaryOpType_ShiftRight
Operazione di spostamento a destra
censitore QkBinaryOpType_Add
Operazione di addizione
censitore QkBinaryOpType_Sub
Operazione di sottrazione
censitore QkBinaryOpType_Mul
Operazione di moltiplicazione
censitore QkBinaryOpType_Div
Operazione di divisione
QkBinaryExprInfo
struct QkBinaryExprInfo
Descrive un'espressione binaria, compresi l'operatore, gli operandi, il tipo di risultato e se si tratta di una costante. qk_expr_binary_info Restituito dalla funzione. I left campi e right sono puntatori presi in prestito agli operandi dell'espressione dell'operazione binaria.
QkBinaryOpType op
L'operatore binario
const QkExprNode *sinistra
Espressione con puntatore preso in prestito all'operando di sinistra
const QkExprNode *right
Puntatore preso in prestito all'espressione dell'operando a destra
QkExprTypeInfo ty
Tipo di risultato dell'operazione
costante booleana
Se l'espressione è costante
QkCastExprInfo
struct QkCastExprInfo
Descrive un'espressione di conversione, indicando l'operando, il tipo di destinazione, se è implicita e se è costante. qk_expr_cast_info Restituito dalla funzione. Il operand campo è un puntatore preso in prestito all'operando dell'espressione di conversione.
const QkExprNode *operando
Puntatore preso in prestito all'espressione operanda oggetto della conversione
QkExprTypeInfo ty
Tipo di destinazione del lancio
bool implicito
A prescindere dal fatto che la conversione sia implicita (automatica) o esplicita
costante booleana
Se l'espressione è costante
QkIndexExprInfo
struct QkIndexExprInfo
Descrive un'espressione di indice, specificando il target, l'indice, il tipo di risultato e se si tratta di una costante. qk_expr_index_info Restituito dalla funzione. I target campi e index sono puntatori presi in prestito alla destinazione e all'indice dell'espressione dell'operazione di indicizzazione.
const QkExprNode *target
Puntatore preso in prestito all'espressione di destinazione oggetto dell'indicizzazione
const QkExprNode *index
Puntatore preso in prestito all'espressione indice
QkExprTypeInfo ty
Tipo di risultato dell'operazione di indicizzazione
costante booleana
Se l'espressione è costante
QkDurationType
enum QkDurationType
Rappresenta le diverse unità di tempo utilizzate nelle espressioni relative alla durata.
Valori:
censitore QkDurationType_Dt
Unità di misura del tempo di sistema
censitore QkDurationType_Ps
Picosecondi
censitore QkDurationType_Ns
Nanosecondi
censitore QkDurationType_Us
Microsecondi
censitore QkDurationType_Ms
Millisecondi
censitore QkDurationType_S
Secondi
sindacato QkDurationValue
#include <types.h>
Un'unione che consenta di memorizzare le unità di tempo del sistema (dt) come numero intero oppure il tempo reale come numero in virgola mobile.
Questo unione fa parte della QkDurationInfo struttura e non dovrebbe essere utilizzata direttamente.
int64_t dt
Unità di tempo di sistema (attive quando ty in QkDurationInfo è QkDurationType_Dt)
a passo di corsa
Valore in tempo reale (attivo per tutti gli altri tipi di durata)
QkDurationInfo
struct QkDurationInfo
La rappresentazione completa di un valore di durata.
Il ty campo funge da discriminante che determina quale campo dell'unione value sia attivo.
Quando viene inizializzato dal C, spetta all'utente assicurarsi che:
- Quando
tyèQkDurationType_Dt, la durata viene memorizzata come numero intero invalue.dt. - Per tutti gli altri tipi di durata, la durata viene memorizzata come valore in virgola mobile in
value.time.
QkDurationType ty
Il tipo di unità di durata (criterio di appartenenza all'unione)
QkDurationValue valore
Il valore della durata
Funzioni
qk_expr_kind
QkExprNodeKind qk_expr_kind(const QkExprNode *expr)
Restituisce il tipo di un nodo di espressione classico.
Esempio
QKExprNodeKind kind = qk_expr_kind(expr);Sicurezza
Il comportamento è indefinito se expr non è un puntatore valido e non nullo a un QkExprNode.
Parametri
- expr – Un puntatore al nodo dell'espressione da esaminare.
Risultati
L'enumerazione che descrive quale variante expr concreta dell'espressione contiene.
qk_expr_binary_info
QkBinaryExprInfo qk_expr_binary_info(const QkExprNode *expr)
Estrarre informazioni da un nodo di espressione binaria.
Genera un errore se expr non punta a un nodo di espressione binaria.
Esempio
QkBinaryExprInfo info = qk_expr_binary_info(expr);
const QkExprNode *lhs = info.left;
const QkExprNode *rhs = info.right;Sicurezza
Il comportamento è indefinito se expr non è un puntatore valido e non nullo a un QkExprNode.
Parametri
- expr – Un puntatore a un nodo di espressione binaria.
Risultati
Una QkBinaryExprInfo struttura che descrive l'operatore, gli operandi, il tipo di risultato e se l'espressione è una costante.
qk_expr_unary_info
QkUnaryExprInfo qk_expr_unary_info(const QkExprNode *expr)
Estrai le informazioni da un nodo di espressione unaria.
Genera un errore se expr non punta a un nodo di espressione unaria.
Esempio
QkUnaryExprInfo info = qk_expr_unary_info(expr);
QkUnaryOpType op = info.op;Sicurezza
Il comportamento è indefinito se expr non è un puntatore valido e non nullo a un QkExprNode.
Parametri
- expr – Un puntatore a un nodo di espressione unaria.
Risultati
Una QkUnaryExprInfo struttura che descrive l'operatore, l'operando, il tipo del risultato e se l'espressione è una costante.
qk_expr_cast_info
QkCastExprInfo qk_expr_cast_info(const QkExprNode *expr)
Estrai le informazioni da un nodo "cast expression".
Genera un errore se expr non punta a un nodo di espressione di conversione.
Esempio
QkCastExprInfo info = qk_expr_cast_info(expr);
const QkExprNode *operand = info.operand;Sicurezza
Il comportamento è indefinito se expr non è un puntatore valido e non nullo a un QkExprNode.
Parametri
- expr – Un puntatore a un nodo di espressione di conversione.
Risultati
Una QkCastExprInfo struttura che descrive l'operando, il tipo di destinazione, se la conversione è implicita e se l'espressione è una costante.
qk_expr_index_info
QkIndexExprInfo qk_expr_index_info(const QkExprNode *expr)
Estrai le informazioni da un nodo di espressione indice.
Genera un errore se expr non punta a un nodo di espressione indice.
Esempio
QkIndexExprInfo info = qk_expr_index_info(expr);
const QkExprNode *target = info.target;
const QkExprNode *index = info.index;Sicurezza
Il comportamento è indefinito se expr non è un puntatore valido e non nullo a un QkExprNode.
Parametri
- expr – Un puntatore a un nodo di espressione di indice.
Risultati
Una QkIndexExprInfo struttura che descrive l'obiettivo indicizzato, l'espressione dell'indice, il tipo di risultato e se l'espressione è costante.
qk_expr_as_value
const QkValue *qk_expr_as_value(const QkExprNode *expr)
Restituisce una vista del valore sottostante del nodo di espressione.
Genera un errore se expr non punta a un nodo di espressione di valore.
Esempio
const QkValue *value = qk_expr_as_value(expr);Sicurezza
Il comportamento è indefinito se expr non è un puntatore valido e non nullo a un QkExprNode.
Parametri
- expr – Un puntatore a un nodo di espressione di valore.
Risultati
Un puntatore al QkValue memorizzato all'interno di expr.
qk_expr_as_var
const QkVar *qk_expr_as_var(const QkExprNode *expr)
Restituisce una vista della variabile sottostante del nodo di espressione.
Genera un errore se expr non punta a un nodo di espressione variabile.
Esempio
const QkVar *var = qk_expr_as_var(expr);Sicurezza
Il comportamento è indefinito se expr non è un puntatore valido e non nullo a un QkExprNode.
Parametri
- expr – Un puntatore a un nodo di espressione variabile.
Risultati
Un puntatore al QkVar memorizzato all'interno di expr.
qk_expr_as_stretch
const QkStretch *qk_expr_as_stretch(const QkExprNode *expr)
Restituisce una vista del tratto sottostante del nodo di espressione.
Genera un errore se expr non punta a un nodo di espressione estesa.
Esempio
const QkStretch *stretch = qk_expr_as_stretch(expr);Sicurezza
Il comportamento è indefinito se expr non è un puntatore valido e non nullo a un QkExprNode.
Parametri
- expr – Un puntatore a un nodo di espressione di estensione.
Risultati
Un puntatore al QkStretch memorizzato all'interno di expr.
qk_value_type_info
QkExprTypeInfo qk_value_type_info(const QkValue *value)
Restituisce le informazioni sul tipo di un valore.
Esempio
QkExprTypeInfo type_info = qk_value_type_info(value);Sicurezza
Il comportamento è indefinito se value non è un puntatore valido e non nullo a un Value.
Parametri
- valore – Un puntatore all’oggetto
QkValueda esaminare.
Risultati
Una QkExprTypeInfo struttura contenente le informazioni sul tipo di valore.
qk_value_duration_info
QkDurationInfo qk_value_duration_info(const QkValue *value)
Estrarre informazioni strutturate da un valore di durata.
Genera un errore se value non punta a un valore di durata.
Esempio
QkDurationInfo info = qk_value_duration_info(value);Sicurezza
Il comportamento è indefinito se value non è un puntatore valido e non nullo a un QkValue.
Parametri
- valore – Un puntatore a un valore di durata.
Risultati
Una QkDurationInfo struttura contenente l'unità di misura della durata e il valore grezzo.
qk_value_float
double qk_value_float(const QkValue *value)
Estrai il valore in virgola mobile da un QkValue.
Genera un errore se value non punta a un valore di tipo float.
Esempio
double raw = qk_value_float(value);Sicurezza
Il comportamento è indefinito se value non è un puntatore valido e non nullo a un QkValue.
Parametri
- valore – Un puntatore a un valore di tipo float.
Risultati
Il double valore memorizzato in value.
qk_value_uint
uint64_t qk_value_uint(const QkValue *value)
Estrai il valore intero senza segno da un QkValue di tipo QkExprType_Uint.
È opportuno utilizzare qk_value_type_info per assicurarsi che il valore rientri in uint64_t prima di chiamare questa funzione.
Genera un errore se value non punta a un QkExprType_Uint valore o se il numero intero memorizzato non rientra in uint64_t.
Esempio
uint64_t raw = qk_value_uint(value);Sicurezza
Il comportamento è indefinito se value non è un puntatore valido e non nullo a un QkValue.
Parametri
- valore – Un puntatore a un valore di tipo uint.
Risultati
Il valore intero convertito in uint64_t.
qk_value_bool
bool qk_value_bool(const QkValue *value)
Estrai il valore da un QkValue di tipo QkExprType_Bool.
Genera un errore se value non punta a un valore di tipo booleano.
Esempio
bool raw = qk_value_bool(value);Sicurezza
Il comportamento è indefinito se value non è un puntatore valido e non nullo a un QkValue.
Parametri
- valore – Un puntatore a un valore di tipo bool.
Risultati
true se la rappresentazione intera memorizzata è diversa da zero, altrimenti false.
qk_var_name
char *qk_var_name(const QkVar *var)
Restituisce il nome di una variabile come stringa C appena allocata.
Esempio
char *name = qk_var_name(var);
if (name != NULL) {
// Use the name...
qk_str_free(name);
}Sicurezza
Il comportamento è indefinito se var non è un puntatore valido e non nullo a un QkVar.
Parametri
- var – Un puntatore alla variabile da esaminare.
Risultati
Una stringa terminata da un carattere nullo contenente il nome della variabile, oppure NULL se var si riferisce a una variabile non autonoma (cioè basata su un bit classico o su un registro classico). Chi ha effettuato la chiamata è il proprietario della stringa restituita e deve liberarla con qk_str_free.
qk_var_type_info
QkExprTypeInfo qk_var_type_info(const QkVar *var)
Restituisce tutte le informazioni sul tipo di una variabile.
Genera un errore se var è un po’ variabile, cosa che non è ancora supportata da questa API.
Esempio
QkExprTypeInfo type_info = qk_var_type_info(var);Sicurezza
Il comportamento è indefinito se var non è un puntatore valido e non nullo a un QkVar.
Parametri
- var – Un puntatore alla variabile da esaminare.
Risultati
Una QkExprTypeInfo struttura contenente le informazioni sul tipo delle variabili.
qk_stretch_name
char *qk_stretch_name(const QkStretch *stretch)
Restituisce il nome di un tratto.
Esempio
char *name = qk_stretch_name(stretch);
// Use the name...
qk_str_free(name);Sicurezza
Il comportamento è indefinito se stretch non è un puntatore valido e non nullo a un QkStretch.
Parametri
- stretch – Un puntatore alla sezione da esaminare.
Risultati
Una stringa terminata da carattere nullo contenente il nome del tratto. Chi ha effettuato la chiamata è il proprietario della stringa restituita e deve liberarla con qk_str_free.