Flusso di controllo
L'API C di Qiskit per il flusso di controllo offre funzionalità che consentono di esaminare le istruzioni relative al flusso di controllo utilizzate nei circuiti quantistici. È possibile verificare il tipo di istruzione di flusso di controllo, accedere ai blocchi circuitali annidati, esaminare le condizioni e i parametri dei cicli, nonché recuperare le mappature tra qubit e bit classici tra i blocchi annidati e il circuito di livello superiore.
typedef struct QkControlFlowInstruction QkControlFlowInstructionLa struttura QkControlFlowInstruction “opaque” è l’elemento principale utilizzato dall’API C per rappresentare e analizzare le istruzioni relative al flusso di controllo all’interno di un circuito. Si ottiene tramite una chiamata a qk_circuit_get_control_flow_instruction() e deve essere liberato tramite una chiamata a qk_control_flow_instruction_free(). La maggior parte delle funzioni dell'API C che agiscono sui costrutti di flusso di controllo richiedono un puntatore a questa struttura opaca, rendendola lo strumento fondamentale per l'analisi delle istruzioni di flusso di controllo dal C. Si noti che la maggior parte delle funzioni di questa API che utilizzano QkControlFlowInstruction come input restituiscono puntatori presi in prestito che rimangono validi fintanto che esiste l'istruzione di flusso di controllo; pertanto, non è necessario liberare separatamente tali puntatori.
Tipi di dati
QkControlFlowKind
enum QkControlFlowKind
Questa enumerazione rappresenta i diversi tipi di istruzioni di flusso di controllo che possono comparire in un circuito quantistico.
Valori:
censitore QkControlFlowKind_Box
Istruzioni per l'uso di A Box
censitore QkControlFlowKind_BreakLoop
Istruzione di interruzione del ciclo
censitore QkControlFlowKind_ContinueLoop
Continua l'istruzione di ciclo
censitore QkControlFlowKind_ForLoop
Istruzione del ciclo "for"
censitore QkControlFlowKind_IfElse
Istruzione if-else
censitore QkControlFlowKind_Switch
Istruzioni relative all'istruzione "switch case"
censitore QkControlFlowKind_While
Istruzione di ciclo while
QkConditionType
enum QkConditionType
Rappresenta il tipo di condizione o di destinazione dello switch in un'istruzione di controllo del flusso.
Questa enumerazione viene utilizzata per indicare se una condizione (nelle istruzioni " IfElse " o "While") o un target "Switch" (nelle istruzioni "Switch") agisce su un bit classico, un registro classico o un'espressione classica.
Valori:
censitore QkConditionType_ClBit
Condizione basata su un bit classico
censitore QkConditionType_ClReg
Condizione basata su un registro classico
censitore QkConditionType_Expr
Condizione basata su un'espressione classica
QkConditionBitInfo
struct QkConditionBitInfo
Informazioni su una condizione di bit classica.
Questa struttura contiene i dettagli di una condizione che agisce su un singolo bit classico
uint32_t clbit
L'indice del bit classico nel circuito
bool condizione
Il valore atteso del bit classico (vero o falso)
QkBoxDurationKind
enum QkBoxDurationKind
Indica il tipo di specifica di durata per un'istruzione Box.
Le istruzioni "box" possono non avere durata, avere un valore di durata concreto oppure una durata specificata tramite un'espressione classica.
Valori:
censitore QkBoxDurationKind_NoDuration
Durata non specificata
censitore QkBoxDurationKind_Duration
Valore della durata effettiva (rappresentato come QkDurationInfo)
censitore QkBoxDurationKind_Expr
Durata espressa con un'espressione classica
QkSwitchCaseLabels
struct QkSwitchCaseLabels
Contiene le etichette per un caso "case" di Switch.
Questa struttura contiene un array di valori di etichetta con cui viene effettuato il confronto nel caso "case" dello Switch. Ad esempio, un caso come case(1, 2, 3) avrebbe tre etichette: 1, 2 e 3. La memoria per l'array delle etichette viene allocata tramite qk_control_flow_switch_case_labels_uint e deve essere liberata utilizzando qk_control_flow_switch_case_labels_clear.
const uint64_t *labels
Puntatore a un array di valori di etichetta
size_t num_labels
Numero di etichette nell'array
QkLoopParamKind
enum QkLoopParamKind
Il tipo del parametro di ciclo in un'istruzione di controllo del flusso " ForLoop ".
Questa enumerazione indica se un ciclo "for" non ha alcun parametro di ciclo, utilizza un simbolo "Parameter" oppure utilizza una variabile (QkVar) per tenere traccia del valore di iterazione.
Valori:
censitore QkLoopParamKind_NoLoopParam
Non è stato specificato alcun parametro di ciclo per l'istruzione ForLoop
censitore QkLoopParamKind_Parameter
Il parametro "Loop" è un parametro
censitore QkLoopParamKind_Variable
Il parametro del ciclo è una variabile
QkSymbolType
enum QkSymbolType
Il tipo di simbolo nel contesto di un ForLoop.
Questa enumerazione indica se un simbolo è una variabile indipendente o un elemento all'interno di un vettore di parametri a cui si accede tramite un indice.
Valori:
censitore QkSymbolType_Standalone
Un simbolo a sé stante con un nome semplice
censitore QkSymbolType_Element
Un simbolo di elemento con un nome di base e un indice
QkSymbolInfo
struct QkSymbolInfo
Informazioni sul simbolo, tra cui il tipo e i dati.
Questa struttura rappresenta un simbolo in un contesto di tipo " ForLoop ", che può essere sia una variabile a sé stante sia un elemento indicizzato.
QkSymbolType ty
Il tipo di simbolo (autonomo o elemento)
char *nome
Una stringa C terminata da carattere nullo contenente il nome del simbolo. Per i simboli autonomi, si tratta del nome della variabile. Per i simboli degli elementi, questo è il nome di base del vettore dei parametri. Chi effettua la chiamata è responsabile della liberazione di questa stringa utilizzando qk_str_free.
size_t indice
Per i simboli degli elementi, si tratta dell'indice nel vettore dei parametri. Per i simboli autonomi, questo campo non viene utilizzato e va ignorato.
QkLoopCollectionType
enum QkLoopCollectionType
Il tipo di raccolta utilizzato in un'istruzione di controllo del flusso " ForLoop ".
Valori:
censitore QkLoopCollectionType_List
Il ciclo esegue un'iterazione su un elenco esplicito di elementi
censitore QkLoopCollectionType_Range
Il ciclo esegue un'iterazione su un intervallo in stile Python (inizio, fine, passo)
QkLoopElements
struct QkLoopElements
Una struttura contenente gli elementi del ciclo provenienti da un'istruzione di controllo del flusso " ForLoop ".
Questa struttura viene restituita da qk_control_flow_loop_elements e contiene sia un puntatore all'array degli elementi del ciclo sia il numero di elementi presenti nell'array. Il puntatore è preso in prestito e non deve essere liberato dal chiamante.
const ptrdiff_t *elements
Puntatore all'array degli elementi del ciclo.
size_t len
Numero di elementi nell'array.
Funzioni
qk_control_flow_kind
QkControlFlowKind qk_control_flow_kind(const QkControlFlowInstruction *cf_inst)
Ottenere un'istruzione relativa al flusso di controllo.
Esempio
// Assuming cf_inst is obtained from a circuit with control flow
QkControlFlowKind kind = qk_control_flow_kind(cf_inst);
switch (kind) {
case QkControlFlowKind_Box:
// do something with the box instruction
break;
case QkControlFlowKind_BreakLoop:
// do something with the break loop instruction
break;
case QkControlFlowKind_ContinueLoop:
// do something with the continue loop instruction
break;
case QkControlFlowKind_ForLoop:
// do something with the for loop instruction
break;
case QkControlFlowKind_IfElse:
// do something with the if-else instruction
break;
case QkControlFlowKind_Switch:
// do something with the switch instruction
break;
case QkControlFlowKind_While:
// do something with the while loop instruction
break;
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo.
Risultati
Il tipo di istruzione relativa al flusso di controllo.
qk_control_flow_num_blocks
size_t qk_control_flow_num_blocks(const QkControlFlowInstruction *cf_inst)
Ottiene il numero di blocchi di circuito presenti in un'istruzione di flusso di controllo.
Esempio
// Assuming cf_inst is obtained from a circuit with control flow
size_t num_blocks = qk_control_flow_num_blocks(cf_inst);
for (size_t i = 0; i < num_blocks; i++) {
const QkCircuit *block_circuit = qk_control_flow_block_circuit(cf_inst, i);
// Process each block...
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo.
Risultati
Il numero di blocchi di circuito contenuti in questa istruzione di flusso di controllo.
qk_control_flow_block_circuit
const QkCircuit *qk_control_flow_block_circuit(const QkControlFlowInstruction *cf_inst, size_t block_idx)
Ottenere un puntatore a un blocco circuitale all’interno di un’istruzione di flusso di controllo.
Le istruzioni di controllo del flusso contengono uno o più blocchi circuitali (ad esempio, l’istruzione “ IfElse ” ne ha due, mentre l’istruzione “Switch” può averne più di uno). Questa funzione recupera un blocco specifico in base all'indice.
Esempio
// Assuming cf_inst is an IfElse control flow instruction
const QkCircuit *true_block = qk_control_flow_block_circuit(cf_inst, 0);
const QkCircuit *false_block = qk_control_flow_block_circuit(cf_inst, 1);
// Process the true and false blocks...Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo.
- block_idx – L'indice del blocco da recuperare.
block_idxdeve rientrare nei limiti (<qk_control_flow_num_blocks).
Risultati
Un puntatore al blocco QkCircuit che rappresenta il blocco richiesto. Il circuito è valido fintanto che esiste l'istruzione di controllo del flusso. Il circuito è di proprietà dell'istruzione di controllo del flusso e non deve essere liberato dal chiamante.
qk_control_flow_qubit_map
const uint32_t *qk_control_flow_qubit_map(const QkControlFlowInstruction *cf_inst)
Ottieni la mappatura dei qubit per un'istruzione di flusso di controllo.
Restituisce un puntatore a un array che associa i qubit utilizzati nei blocchi dell'istruzione di flusso di controllo ai rispettivi indici nel circuito di livello superiore. La lunghezza dell'array è pari al numero di qubit utilizzati dall'istruzione di flusso di controllo. Per ogni indice i di qubit nel blocco annidato, la mappatura all’indice i nell’array fornisce l’indice del qubit corrispondente nel circuito di livello superiore.
Esempio
// Assuming cf_inst is obtained from a circuit with control flow
const uint32_t *qubit_map = qk_control_flow_qubit_map(cf_inst);
uint32_t num_qubits = qk_circuit_num_qubits(qk_control_flow_block_circuit(cf_inst, 0));
for (uint32_t i = 0; i < num_qubits; i++) {
printf("Block qubit %u maps to circuit qubit %u\n", i, qubit_map[i]);
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo.
Risultati
Un puntatore a un array di uint32_t valori che rappresentano la mappatura dei qubit. L'array è valido fintanto che esiste l'istruzione di controllo del flusso. L'array è di proprietà dell'istruzione di flusso di controllo e non deve essere liberato dal chiamante.
qk_control_flow_clbit_map
const uint32_t *qk_control_flow_clbit_map(const QkControlFlowInstruction *cf_inst)
Ottieni la mappatura a bit classica per un'istruzione di controllo del flusso.
Restituisce un puntatore a un array che associa i bit classici utilizzati nei blocchi delle istruzioni di flusso di controllo ai rispettivi indici nel circuito di livello superiore. La lunghezza dell'array è pari al numero di bit classici utilizzati dall'istruzione di controllo del flusso. Per ogni indice i di bit classico nel blocco annidato, la mappatura all'indice i nell'array fornisce il corrispondente indice di bit classico nel circuito di livello superiore.
Esempio
// Assuming cf_inst is obtained from a circuit with control flow
const uint32_t *clbit_map = qk_control_flow_clbit_map(cf_inst);
uint32_t num_clbits = qk_circuit_num_clbits(qk_control_flow_block_circuit(cf_inst, 0));
for (uint32_t i = 0; i < num_clbits; i++) {
printf("Block clbit %u maps to circuit clbit %u\n", i, clbit_map[i]);
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo.
Risultati
Un puntatore a un array di uint32_t valori che rappresentano la mappatura classica dei bit. L'array è valido fintanto che esiste l'istruzione di controllo del flusso. L'array è di proprietà dell'istruzione di flusso di controllo e non deve essere liberato dal chiamante.
qk_control_flow_condition_type
QkConditionType qk_control_flow_condition_type(const QkControlFlowInstruction *cf_inst)
Ottiene il tipo di condizione di un'istruzione di flusso di controllo.
Restituisce il tipo di condizione utilizzata in un'istruzione " IfElse " o "While". Il tipo di condizione indica se la condizione si basa su un bit classico, un registro classico o un'espressione classica.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso di tipo " IfElse " o "While".
Esempio
// Assuming cf_inst is an IfElse or While control flow instruction
QkConditionType cond_type = qk_control_flow_condition_type(cf_inst);
switch (cond_type) {
case QkConditionType_ClBit:
// do something with classical bit...
break;
case QkConditionType_ClReg:
// do something with classical register...
break;
case QkConditionType_Expr:
// Process expression...
break;
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore valido a un elemento
QkControlFlowInstructionche deve rappresentare un’istruzione “ IfElse ” o “While”.
Risultati
Un QkConditionType valore di enumerazione che indica il tipo di condizione.
qk_control_flow_condition_bit_info
QkConditionBitInfo qk_control_flow_condition_bit_info(const QkControlFlowInstruction *cf_inst)
Ottieni le informazioni relative alle condizioni bit classiche per un'istruzione di controllo del flusso.
Estrae l'indice di bit classico e il valore atteso da un'istruzione " IfElse " o "While" che presenti una condizione di bit classica.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso " IfElse " o "While", oppure se la condizione non è di tipo bit.
Esempio
// Assuming cf_inst is an IfElse or While instruction with a bit condition
QkConditionBitInfo bit_info = qk_control_flow_condition_bit_info(cf_inst);
printf("Condition: clbit[%u] == %s\n", bit_info.clbit, bit_info.condition ? "true" : "false");Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore valido a un elemento
QkControlFlowInstructionche deve rappresentare un’istruzione “ IfElse ” o “While” con una condizione bit classica.
Risultati
Una QkConditionBitInfo struttura contenente il classico indice di bit e il valore atteso.
qk_control_flow_condition_reg_cond_bit_width
uint64_t qk_control_flow_condition_reg_cond_bit_width(const QkControlFlowInstruction *cf_inst)
Ottieni la larghezza in bit della condizione di registro classica per un'istruzione di controllo del flusso.
Estrae la larghezza in bit del registro classico da un'istruzione " IfElse " o "While" che presenti una condizione relativa a un registro classico.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso " IfElse " o "While", oppure se la condizione non è di tipo registro.
Esempio
// Assuming cf_inst is an IfElse or While instruction with a register condition
uint64_t bit_width = qk_control_flow_condition_reg_cond_bit_width(cf_inst);
printf("Register bit width: %lu\n", bit_width);Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore valido a un elemento
QkControlFlowInstructionche deve rappresentare un’istruzioneIfElseoWhilecon una condizione di registro classica.
Risultati
La larghezza in bit della condizione sul registro classico.
qk_control_flow_condition_reg
const QkClassicalRegister *qk_control_flow_condition_reg(const QkControlFlowInstruction *cf_inst)
Ottieni il registro classico per la condizione di un'istruzione di controllo del flusso.
Estrae il registro classico da un'istruzione IfElse o While che presenta una condizione relativa al registro classico.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso " IfElse " o "While", oppure se la condizione non è di tipo registro.
Esempio
// Assuming cf_inst is an IfElse or While instruction with a register condition
const QkClassicalRegister* creg = qk_control_flow_condition_reg(cf_inst);
// Use the classical register pointerSicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore valido a un elemento
QkControlFlowInstructionche deve rappresentare un’istruzioneIfElseoWhilecon una condizione di registro classica.
Risultati
QkClassicalRegisterUn puntatore preso in prestito a. Il puntatore rimane valido fintanto che il circuito padre rimane valido.
qk_control_flow_condition_reg_cond_uint
uint64_t qk_control_flow_condition_reg_cond_uint(const QkControlFlowInstruction *cf_inst)
Ottiene il valore della condizione del registro classico per un'istruzione di controllo del flusso.
Estrae la condizione come valore intero senza segno da un'istruzione “ IfElse ” o “While” che presenti una condizione a registro classica.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso " IfElse " o "While", se la condizione non è di tipo registro o se il valore della condizione non rientra in un uint64_t.
Esempio
// Assuming cf_inst is an IfElse or While instruction with a register condition
uint64_t expected_value = qk_control_flow_condition_reg_cond_uint(cf_inst);
printf("Expected register value: %lu\n", expected_value);Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore valido a un elemento
QkControlFlowInstructionche deve rappresentare un’istruzioneIfElseoWhilecon una condizione di registro classica.
Risultati
Il valore della condizione.
qk_control_flow_condition_expr
const QkExprNode *qk_control_flow_condition_expr(const QkControlFlowInstruction *cf_inst)
Ricava l'espressione classica di un'istruzione di controllo del flusso.
Estrae l'espressione classica da un'istruzione IfElse o While che presenta una condizione basata su un'espressione.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso " IfElse " o "While", oppure se la condizione non è di tipo espressione.
Utilizzo di esempio
// Assuming while_inst is a While control flow instruction with an expression condition
QkConditionType cond_type = qk_control_flow_condition_type(while_inst);
if (cond_type == QkConditionType_Expr) {
const QkExprNode *expr = qk_control_flow_condition_expr(while_inst);
// Use the expression...
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore valido a un elemento
QkControlFlowInstructionche deve rappresentare un’istruzione “ IfElse ” o “While” con una condizione espressa da un’espressione.
Risultati
Un puntatore preso in prestito a che QkExprNode rappresenta l'espressione classica. Il puntatore rimane valido fintanto che il circuito padre rimane valido.
qk_control_flow_box_duration_kind
QkBoxDurationKind qk_control_flow_box_duration_kind(const QkControlFlowInstruction *cf_inst)
Ottieni la durata di un'istruzione di controllo del flusso del tipo "Box".
Le istruzioni "box" possono non avere durata, avere un valore di durata concreto come QkDurationInfo, oppure una durata specificata tramite un'espressione. Questa funzione restituisce il tipo di durata presente.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso di tipo Box.
Esempio
// Assuming cf_inst is a Box control flow instruction
QkBoxDurationKind duration_kind = qk_control_flow_box_duration_kind(cf_inst);
switch (duration_kind) {
case QkBoxDurationKind_NoDuration:
// do something...
break;
case QkBoxDurationKind_Duration:
// do something...
break;
case QkBoxDurationKind_Expr:
// do something...
break;
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo. L'istruzione di flusso di controllo deve essere di tipo Box.
Risultati
Il tipo di durata come QkBoxDurationKind.
qk_control_flow_box_duration_val_info
QkDurationInfo qk_control_flow_box_duration_val_info(const QkControlFlowInstruction *cf_inst)
Ottieni le informazioni relative alla durata di un'istruzione di flusso di un controllo Box.
Questa funzione recupera il valore e il tipo della durata di un'istruzione Box che ha una durata concreta.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso di tipo Box con una durata specifica.
Esempio
// Assuming cf_inst is a Box instruction with a concrete duration
QkDurationInfo duration_info = qk_control_flow_box_duration_val_info(cf_inst);
if (duration_info.ty == QkDurationType_Dt) {
int64_t dt = duration_info.value.dt;
} else {
double time = duration_info.value.time;
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo. L'istruzione di flusso di controllo deve essere di tipo "Box" e avere una durata specifica.
Risultati
Una QkDurationInfo struttura contenente il valore della durata e l'unità di misura.
qk_control_flow_box_duration_expr
const QkExprNode *qk_control_flow_box_duration_expr(const QkControlFlowInstruction *cf_inst)
Ottieni l'espressione della durata di un'istruzione di flusso di un controllo Box.
Questa funzione restituisce un puntatore all'espressione che definisce la durata di un'istruzione Box quando tale durata è specificata come espressione.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso di tipo Box con una durata espressa da un'espressione.
Esempio
// Assuming cf_inst is a Box instruction with an expression duration
const QkExpr *duration_expr = qk_control_flow_box_duration_expr(cf_inst);
// Use the expression to evaluate or analyze the duration...Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo. L'istruzione di flusso di controllo deve essere di tipo Box con una durata espressa da un'espressione.
Risultati
Un puntatore all'espressione QkExpr che rappresenta la durata. L'espressione è valida fintanto che esiste l'istruzione di controllo del flusso. L'espressione appartiene all'istruzione di flusso di controllo e non deve essere liberata dal chiamante.
qk_control_flow_loop_collection_type
QkLoopCollectionType qk_control_flow_loop_collection_type(const QkControlFlowInstruction *cf_inst)
Ottiene il tipo di raccolta utilizzata in un'istruzione di controllo del flusso " ForLoop ".
Questa funzione determina se un oggetto di tipo ForLoop itera su un elenco esplicito di elementi o su un intervallo in stile Python.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso di tipo " ForLoop ".
Esempio
// Assuming cf_inst is a ForLoop instruction
QkLoopCollectionType collection_type = qk_control_flow_loop_collection_type(cf_inst);
if (collection_type == QkLoopCollectionType_List) {
// Handle list-based loop
} else if (collection_type == QkLoopCollectionType_Range) {
// Handle range-based loop
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore a un’istruzione di flusso di controllo che deve essere di tipo ForLoop.
Risultati
Un CLoopCollectionType valore di enumerazione che indica il tipo di raccolta.
qk_control_flow_loop_elements
QkLoopElements qk_control_flow_loop_elements(const QkControlFlowInstruction *cf_inst)
Ottieni l'elenco degli elementi su cui opera l'iterazione di un ForLoop.
Questa funzione recupera l'elenco degli elementi da un'istruzione di controllo del flusso " ForLoop " che utilizza una raccolta di elenchi esplicita. Utilizzare qk_control_flow_loop_collection_type per determinare il tipo di raccolta prima di chiamare questa funzione.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso di tipo " ForLoop " con una collezione di tipo lista.
Esempio
// Assuming cf_inst is a ForLoop instruction with a List collection type
QkLoopElements loop_elements = qk_control_flow_loop_elements(cf_inst);
for (size_t i = 0; i < loop_elements.len; i++) {
printf("Element %zu: %zu\n", i, loop_elements.elements[i]);
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore a un’istruzione di flusso di controllo che deve essere un’istruzione di controllo condizionale ( ForLoop ) con una collezione di tipo List.
Risultati
Una QkLoopElements struttura contenente un puntatore all'array degli elementi del ciclo e il numero di elementi. Il puntatore viene preso in prestito per tutta la durata dell'istruzione di flusso di controllo e non deve essere liberato dal chiamante.
qk_control_flow_loop_range
void qk_control_flow_loop_range(const QkControlFlowInstruction *cf_inst, int64_t *out_start, int64_t *out_stop, int64_t *out_step)
Ottiene i parametri di un intervallo ( ForLoop ) che itera su un intervallo in stile Python.
Questa funzione recupera i valori di inizio, fine e passo da un'istruzione di controllo del flusso " ForLoop " che utilizza una raccolta di intervalli. Utilizzare qk_control_flow_loop_collection_type per determinare il tipo di raccolta prima di chiamare questa funzione.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso di tipo " ForLoop " con una raccolta di intervalli.
Esempio
// Assuming cf_inst is a ForLoop instruction with a Range collection type
int64_t start, stop, step;
qk_control_flow_loop_range(cf_inst, &start, &stop, &step);
printf("Loop range: start=%ld, stop=%ld, step=%ld\n", start, stop, step);Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction, oppure se uno qualsiasi tra out_start, out_stop, o out_step non è un puntatore valido e allineato su cui scrivere.
Parametri
- cf_inst – Un puntatore a un’istruzione di flusso di controllo che deve essere un’istruzione di controllo condizionale ( ForLoop ) con una raccolta Range.
- out_start – Un parametro di output che verrà impostato sul valore iniziale dell'intervallo.
- out_stop – Un parametro di uscita che verrà impostato sul valore di fine corsa.
- out_step – Un parametro di output che verrà impostato sul valore dell'incremento dell'intervallo.
qk_control_flow_loop_param_kind
QkLoopParamKind qk_control_flow_loop_param_kind(const QkControlFlowInstruction *cf_inst)
Ottiene il tipo del parametro di ciclo utilizzato in un'istruzione di controllo del flusso " ForLoop ".
Questa funzione determina se un' ForLoop e non ha alcun parametro di ciclo, utilizza un simbolo Parameter oppure una variabile (QkVar) per tenere traccia del valore di iterazione.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso di tipo " ForLoop ".
Esempio
// Assuming cf_inst is a ForLoop instruction
QkLoopParamKind param_kind = qk_control_flow_loop_param_kind(cf_inst);
if (param_kind == QkLoopParamKind_Parameter) {
// Loop uses a Parameter symbol
} else if (param_kind == QkLoopParamKind_Variable) {
// Loop uses a Variable
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore a un’istruzione di flusso di controllo che deve essere di tipo ForLoop.
Risultati
Un QkLoopParamKind valore di enumerazione che indica il tipo di parametro del ciclo.
qk_control_flow_loop_symbol_info
QkSymbolInfo qk_control_flow_loop_symbol_info(const QkControlFlowInstruction *cf_inst)
Recupera le informazioni relative al simbolo del parametro di ciclo da un'istruzione di controllo del flusso " ForLoop ".
Questa funzione recupera le informazioni relative al simbolo del parametro di ciclo da un'istruzione " ForLoop " che utilizza un parametro come parametro di ciclo. Il valore restituito QkSymbolInfo contiene il tipo, il nome e l'indice del simbolo (nel caso dei simboli che costituiscono elementi di un vettore di parametri).
Genera un errore se cf_inst non è un'istruzione di controllo del flusso di tipo " ForLoop " con un parametro di ciclo.
Esempio
// Assuming cf_inst is a ForLoop control flow instruction with a Parameter loop parameter
QkSymbolInfo symbol_info = qk_control_flow_loop_symbol_info(cf_inst);
if (symbol_info.ty == QkSymbolType_Standalone) {
printf("Loop parameter: %s\n", symbol_info.name);
} else if (symbol_info.ty == QkSymbolType_Element) {
printf("Loop parameter: %s[%zu]\n", symbol_info.name, symbol_info.index);
}
qk_str_free(symbol_info.name);Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore valido a un oggetto
QkControlFlowInstructionche deve rappresentare un ForLoop e con un parametro di tipo “loop”.
Risultati
Una QkSymbolInfo struttura contenente le informazioni sui simboli. Chi effettua la chiamata deve liberare la stringa restituita nel name campo utilizzando qk_str_free.
qk_control_flow_loop_variable
const QkVar *qk_control_flow_loop_variable(const QkControlFlowInstruction *cf_inst)
Recupera la variabile di ciclo da un'istruzione di controllo del flusso " ForLoop ".
Questa funzione restituisce un puntatore alla variabile (QkVar) utilizzata come parametro del ciclo nell'istruzione " ForLoop ". Il puntatore restituito viene preso in prestito per tutta la durata dell'istruzione di flusso di controllo e non deve essere liberato dal chiamante.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso di ForLoop e con un parametro di ciclo variabile.
Esempio
// Assuming cf_inst is a ForLoop control flow instruction with a Variable loop parameter
const QkVar *loop_var = qk_control_flow_loop_variable(cf_inst);
// Use the loop variable pointer to access variable informationSicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore valido a un oggetto
QkControlFlowInstructionche deve rappresentare un ForLoop e con un parametro di ciclo variabile.
Risultati
Un puntatore alla variabile QkVar che rappresenta la variabile di ciclo. Il puntatore è valido per tutta la durata dell'istruzione di controllo del flusso.
qk_control_flow_switch_target_type
QkConditionType qk_control_flow_switch_target_type(const QkControlFlowInstruction *cf_inst)
Ottiene il tipo della destinazione dell'istruzione di controllo di flusso Switch.
Le istruzioni switch possono operare su diversi tipi di destinatari: un bit classico, un registro classico o un'espressione. Questa funzione restituisce il tipo di target utilizzato dall'istruzione Switch.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso Switch.
Esempio
// Assuming cf_inst is a Switch control flow instruction
QkConditionType target_type = qk_control_flow_switch_target_type(cf_inst);
switch (target_type) {
case QkConditionType_ClBit:
// do something
break;
case QkConditionType_ClReg:
// do something
break;
case QkConditionType_Expr:
// do something
break;
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo. L'istruzione di controllo del flusso deve essere di tipo Switch.
Risultati
Il tipo di condizione della destinazione Switch è QkConditionType.
qk_control_flow_switch_target_bit
uint32_t qk_control_flow_switch_target_bit(const QkControlFlowInstruction *cf_inst)
Ottieni l'indice dei bit classico per una destinazione Switch.
Questa funzione restituisce l'indice del bit classico su cui opera un'istruzione Switch quando la destinazione della Switch è un bit classico.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso Switch con un bit di destinazione classico.
Esempio
// Assuming cf_inst is a Switch instruction with a classical bit target
uint32_t clbit_idx = qk_control_flow_switch_target_bit(cf_inst);
printf("Switch operates on clbit %u\n", clbit_idx);Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo. L'istruzione di controllo del flusso deve essere di tipo Switch con un bit di destinazione classico.
Risultati
L'indice del bit classico nel circuito.
qk_control_flow_switch_target_register
const QkClassicalRegister *qk_control_flow_switch_target_register(const QkControlFlowInstruction *cf_inst)
Ottiene il registro classico su cui opera un'istruzione Switch.
Questa funzione recupera il registro classico utilizzato come destinazione dello Switch quando quest'ultimo opera su un registro.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso di esecuzione Switch con un registro come destinazione.
Esempio
// Assuming cf_inst is a Switch instruction with a register target
const QkClassicalRegister *reg = qk_control_flow_switch_target_register(cf_inst);
// Use the register to get its name, size, etc...Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo. L'istruzione di controllo del flusso deve essere di tipo Switch con un registro come destinazione.
Risultati
QkClassicalRegister Un puntatore alla su cui opera Switch. Il registro rimane valido fintanto che esiste l'istruzione di controllo del flusso. Il registro appartiene all'istruzione di controllo del flusso e non deve essere liberato dal chiamante.
qk_control_flow_switch_target_expr
const QkExprNode *qk_control_flow_switch_target_expr(const QkControlFlowInstruction *cf_inst)
Ottieni l'espressione relativa a una destinazione Switch.
Questa funzione restituisce un puntatore all'espressione classica su cui opera un'istruzione Switch quando il target di Switch è un'espressione.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso Switch con un'espressione come destinazione.
Esempio
// Assuming cf_inst is a Switch instruction with an expression target
const QkExpr *target_expr = qk_control_flow_switch_target_expr(cf_inst);
// Evaluate the expression...Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo. L'istruzione di controllo del flusso deve essere di tipo Switch con un'espressione come operando.
Risultati
Un puntatore all'espressione QkExpr che rappresenta l'espressione di destinazione dello Switch. L'espressione è valida fintanto che esiste l'istruzione di controllo del flusso. L'espressione appartiene all'istruzione di flusso di controllo e non deve essere liberata dal chiamante.
qk_control_flow_switch_num_cases
size_t qk_control_flow_switch_num_cases(const QkControlFlowInstruction *cf_inst)
Ottenere il numero di casi presenti in un'istruzione Switch.
Restituisce il numero totale di blocchi "case" presenti nell'istruzione Switch, compreso il "case" predefinito, se presente.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso Switch.
Esempio
// Assuming cf_inst is a Switch control flow instruction
size_t num_cases = qk_control_flow_switch_num_cases(cf_inst);
for (size_t i = 0; i < num_cases; i++) {
// Analyze the case...
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo. L'istruzione di controllo del flusso deve essere di tipo Switch.
Risultati
Il numero di casi presenti nell'istruzione Switch.
qk_control_flow_switch_is_case_default
bool qk_control_flow_switch_is_case_default(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Verifica se un caso specifico in un'istruzione Switch è il caso predefinito.
Le istruzioni switch possono contenere un caso predefinito che viene applicato quando nessun altro caso è soddisfatto. Questa funzione verifica se il caso all'indice specificato è quello predefinito. Il caso predefinito può includere anche etichette iniziali, che possono essere recuperate tramite qk_control_flow_switch_case_labels_uint sul caso predefinito.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso Switch.
Esempio
// Assuming cf_inst is a Switch control flow instruction
for (size_t i = 0; i < qk_control_flow_switch_num_cases(cf_inst); i++) {
if (qk_control_flow_switch_is_case_default(cf_inst, i)) {
printf("Case %zu is the default case\n", i);
}
}Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo. L'istruzione di controllo del flusso deve essere di tipo Switch.
- case_idx – L'indice del caso da verificare. Deve essere inferiore al valore restituito da
qk_control_flow_switch_num_cases.
Risultati
true se il caso in questione case_idx è quello predefinito, false altrimenti.
qk_control_flow_switch_case_labels_bit_width
uint64_t qk_control_flow_switch_case_labels_bit_width(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Calcola la larghezza massima in bit necessaria per rappresentare le etichette in un caso "case" di Switch.
Questa funzione restituisce il numero massimo di bit necessari per rappresentare una qualsiasi delle etichette di interi senza segno nel caso specificato. Ciò è utile per determinare la larghezza in bit minima necessaria per memorizzare o elaborare le etichette dei casi.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso Switch.
Esempio
// Assuming cf_inst is a Switch control flow instruction
uint64_t bit_width = qk_control_flow_switch_case_labels_bit_width(cf_inst, 0);
printf("Maximum bit width for case 0: %lu\n", bit_width);Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo. L'istruzione di controllo del flusso deve essere di tipo Switch.
- case_idx – L'indice del caso di cui si desidera recuperare la larghezza in bit dell'etichetta. Deve essere inferiore al valore restituito da
qk_control_flow_switch_num_cases.
Risultati
La larghezza massima in bit delle etichette nel caso, oppure 0 se il caso non contiene etichette di tipo intero senza segno (ad esempio, solo un specificatore DEFAULT).
qk_control_flow_switch_case_labels_uint
QkSwitchCaseLabels qk_control_flow_switch_case_labels_uint(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Recupera le etichette relative a un caso specifico in un'istruzione Switch.
Ogni caso in un'istruzione Switch può avere una o più etichette (ad esempio, case(1, 2, 3)) ne ha tre: 1, 2 e 3). Questa funzione recupera tutte le etichette relative a un determinato caso. Si noti che il caso predefinito può includere anche delle etichette, che possono essere recuperate tramite questa funzione. Quando viene chiamata in un caso predefinito senza etichette aggiuntive, la funzione imposta num_labels = 0 e labels = NULL nella struct restituita QkSwitchCaseLabels . Prima di chiamare questa funzione, è necessario utilizzare qk_control_flow_switch_case_labels_bit_width per assicurarsi che le etichette entrino in uint64_t.
Genera un errore se cf_inst non è un'istruzione di controllo del flusso Switch oppure se un'etichetta "case" non rientra in uint64_t.
Esempio
// Assuming cf_inst is a Switch control flow instruction
QkSwitchCaseLabels case_labels = qk_control_flow_switch_case_labels_uint(cf_inst, 0);
for (size_t i = 0; i < case_labels.num_labels; i++) {
printf("Label %zu: %lu\n", i, case_labels.labels[i]);
}
qk_control_flow_switch_case_labels_clear(&case_labels);Sicurezza
Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction, oppure se out_labels non è un puntatore valido a una QkSwitchCaseLabels struct.
Parametri
- cf_inst – Un puntatore all'istruzione di flusso di controllo. L'istruzione di controllo del flusso deve essere di tipo Switch.
- case_idx – L'indice del caso di cui si desidera recuperare le etichette. Deve essere inferiore al valore restituito da
qk_control_flow_switch_num_cases.
Risultati
Una QkSwitchCaseLabels struttura contenente le informazioni relative all'etichetta per il caso specificato. La struttura conterrà un puntatore a un array di etichette e il numero di etichette. num_labels > 0In tal caso, è necessario chiamare qk_control_flow_switch_case_labels_clear per liberare la memoria allocata da questa funzione.
qk_control_flow_switch_case_labels_clear
void qk_control_flow_switch_case_labels_clear(QkSwitchCaseLabels *labels)
Cancella una QkSwitchCaseLabels struttura.
È necessario richiamare questa funzione per liberare la memoria allocata da qk_control_flow_switch_case_labels_uint. Dopo aver chiamato questa funzione, il puntatore "labels" nella struttura verrà impostato a null e il conteggio verrà azzerato.
Esempio
// Assuming cf_inst is a Switch control flow instruction
QkSwitchCaseLabels case_labels = qk_control_flow_switch_case_labels_uint(cf_inst, 0);
// Use the labels...
qk_control_flow_switch_case_labels_clear(&case_labels);Sicurezza
Il comportamento è indefinito se labels non è un puntatore valido a un QkSwitchCaseLabels.
Parametri
- labels – Un puntatore alla
QkSwitchCaseLabelsstruttura da cancellare. La struttura deve essere stata precedentemente popolata daqk_control_flow_switch_case_labels_uint.