Skip to main content
IBM Quantum Platform

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 QkControlFlowInstruction

La 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_idx deve 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 QkControlFlowInstruction che 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 QkControlFlowInstruction che 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 QkControlFlowInstruction che deve rappresentare un’istruzione IfElse o While con 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 pointer

Sicurezza

Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.

Parametri

  • cf_inst – Un puntatore valido a un elemento QkControlFlowInstruction che deve rappresentare un’istruzione IfElse o While con 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 QkControlFlowInstruction che deve rappresentare un’istruzione IfElse o While con 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 QkControlFlowInstruction che 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 QkControlFlowInstruction che 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 information

Sicurezza

Il comportamento è indefinito se cf_inst non è un puntatore valido a un QkControlFlowInstruction.

Parametri

  • cf_inst – Un puntatore valido a un oggetto QkControlFlowInstruction che 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 QkSwitchCaseLabels struttura da cancellare. La struttura deve essere stata precedentemente popolata da qk_control_flow_switch_case_labels_uint.
Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.