Steuerungsfluss
Die Qiskit-C-API für den Kontrollfluss bietet Funktionen zur Überprüfung der in Quantenschaltungen verwendeten Kontrollflussanweisungen. Sie können den Typ einer Kontrollflussanweisung abfragen, auf verschachtelte Schaltkreise zugreifen, Bedingungen und Schleifenparameter überprüfen sowie die Zuordnungen von Qubits und klassischen Bits zwischen verschachtelten Blöcken und dem obersten Schaltkreis abrufen.
typedef struct QkControlFlowInstruction QkControlFlowInstructionDie „opaque QkControlFlowInstruction struct“ ist das wichtigste Element, das von der C-API verwendet wird, um Kontrollflussanweisungen innerhalb einer Schaltung darzustellen und zu analysieren. Es wird durch einen Aufruf von erhalten und qk_circuit_get_control_flow_instruction() muss durch einen Aufruf von freigegeben werden qk_control_flow_instruction_free(). Die meisten C-API-Funktionen, die auf Kontrollflusskonstrukte zugreifen, erwarten einen Zeiger auf diese undurchsichtige Struktur, wodurch diese zum zentralen Mittel für die Überprüfung von Kontrollflussanweisungen aus C wird. Beachten Sie, dass die meisten Funktionen dieser API, die QkControlFlowInstruction als Eingabe verwenden, ausgeliehene Zeiger zurückgeben, die so lange gültig bleiben, wie die Kontrollflussanweisung existiert; daher müssen diese Zeiger nicht separat freigegeben werden.
Datentypen
QkControlFlowKind
enum QkControlFlowKind
Diese Enumeration stellt die verschiedenen Arten von Kontrollflussanweisungen dar, die in einem Quantenschaltkreis vorkommen können.
Werte:
Zähler QkControlFlowKind_Box
Anleitung für „A Box“
Zähler QkControlFlowKind_BreakLoop
Befehl „Break-Schleife“
Zähler QkControlFlowKind_ContinueLoop
Anweisung „Schleife fortsetzen“
Zähler QkControlFlowKind_ForLoop
For-Schleifenanweisung
Zähler QkControlFlowKind_IfElse
If-else-Anweisung
Zähler QkControlFlowKind_Switch
Switch-Case-Anweisung
Zähler QkControlFlowKind_While
While-Schleifen-Anweisung
QkConditionType
enum QkConditionType
Stellt die Art der Bedingung oder des Switch-Ziels in einer Anweisung zur Ablaufsteuerung dar.
Diese Enumeration dient dazu, anzugeben, ob eine Bedingung (in „ IfElse “- oder „While“-Anweisungen) oder ein „Switch“-Ziel (in „Switch“-Anweisungen) auf ein klassisches Bit, ein klassisches Register oder einen klassischen Ausdruck angewendet wird.
Werte:
Zähler QkConditionType_ClBit
Bedingung auf der Grundlage eines klassischen Bits
Zähler QkConditionType_ClReg
Bedingung auf der Grundlage eines klassischen Registers
Zähler QkConditionType_Expr
Bedingung auf der Grundlage eines klassischen Ausdrucks
QkConditionBitInfo
struct QkConditionBitInfo
Informationen zu einer klassischen Bitbedingung.
Diese Struktur enthält die Details einer Bedingung, die auf ein einzelnes klassisches Bit angewendet wird
uint32_t clbit
Der Index des klassischen Bits in der Schaltung
bool Bedingung
Der Erwartungswert des klassischen Bits (wahr oder falsch)
QkBoxDurationKind
enum QkBoxDurationKind
Bezeichnet die Art der Dauerangabe für eine „Box“-Anweisung.
Anweisungen in einem Feld können keine Dauer, einen konkreten Dauerwert oder eine als klassischer Ausdruck angegebene Dauer haben.
Werte:
Zähler QkBoxDurationKind_NoDuration
Keine Dauer angegeben
Zähler QkBoxDurationKind_Duration
Konkreter Dauerwert (dargestellt als QkDurationInfo)
Zähler QkBoxDurationKind_Expr
Dauer, angegeben als klassischer Ausdruck
QkSwitchCaseLabels
struct QkSwitchCaseLabels
Enthält die Bezeichnungen für einen Switch-Fall.
Diese Struktur enthält ein Array mit Label-Werten, mit denen ein „Switch“-Case abgeglichen wird. Ein Fall wie case(1, 2, 3) hätte beispielsweise drei Bezeichnungen: 1, 2 und 3. qk_control_flow_switch_case_labels_clearDer Speicher für das Array „labels“ wird mit qk_control_flow_switch_case_labels_uint zugewiesen und muss mit freigegeben werden.
const uint64_t *labels
Zeiger auf ein Array von Beschriftungswerten
size_t num_labels
Anzahl der Bezeichnungen im Array
QkLoopParamKind
enum QkLoopParamKind
Der Typ des Schleifenparameters in einer „ ForLoop “-Steueranweisung.
Diese Enumeration gibt an, ob eine for-Schleife keinen Schleifenparameter hat, ein Parametersymbol verwendet oder eine Variable (QkVar) zur Verfolgung des Iterationswerts nutzt.
Werte:
Zähler QkLoopParamKind_NoLoopParam
Für die Anweisung „ ForLoop “ wurde kein Schleifenparameter angegeben
Zähler QkLoopParamKind_Parameter
Der Schleifenparameter ist ein Parameter
Zähler QkLoopParamKind_Variable
Der Schleifenparameter ist eine Variable
QkSymbolType
enum QkSymbolType
Der Symboltyp im Kontext von „ ForLoop “.
Diese Enumeration gibt an, ob es sich bei einem Symbol um eine eigenständige Variable oder um ein Element innerhalb eines Parametervektors handelt, auf das über einen Index zugegriffen wird.
Werte:
Zähler QkSymbolType_Standalone
Ein eigenständiges Symbol mit einem einfachen Namen
Zähler QkSymbolType_Element
Ein Elementsymbol mit einem Basisnamen und einem Index
QkSymbolInfo
struct QkSymbolInfo
Symbolinformationen, einschließlich Typ und Daten.
Diese Struktur repräsentiert ein Symbol im Kontext von „ ForLoop “, das entweder eine eigenständige Variable oder ein indiziertes Element sein kann.
QkSymbolType ty
Die Art des Symbols (eigenständiges Symbol oder Element)
char *name
Eine mit einem Null-Zeichen abgeschlossene C-Zeichenkette, die den Symbolnamen enthält. Bei eigenständigen Symbolen ist dies der Variablenname. Bei Elementsymbolen handelt es sich hierbei um den Basisnamen des Parametervektors. Der Aufrufer ist dafür verantwortlich, diese Zeichenkette mithilfe von qk_str_free. freizugeben.
size_t index
Bei Elementsymbolen ist dies der Index im Parametervektor. Bei eigenständigen Symbolen wird dieses Feld nicht verwendet und sollte ignoriert werden.
QkLoopCollectionType
enum QkLoopCollectionType
Der Typ der Sammlung, der in einer „ ForLoop “-Steuerungsanweisung verwendet wird.
Werte:
Zähler QkLoopCollectionType_List
Die Schleife durchläuft eine explizit angegebene Liste von Elementen
Zähler QkLoopCollectionType_Range
Die Schleife durchläuft einen Bereich im Stil von „ Python “ (Start, Ende, Schritt)
QkLoopElements
struct QkLoopElements
Eine Struktur, die Schleifenelemente aus einer „ ForLoop “-Steueranweisung enthält.
Diese Struktur wird von qk_control_flow_loop_elements zurückgegeben und enthält sowohl einen Zeiger auf das Array der Schleifenelemente als auch die Anzahl der Elemente im Array. Der Zeiger wird ausgeliehen und darf vom Aufrufer nicht freigegeben werden.
const ptrdiff_t *elements
Zeiger auf das Array der Schleifenelemente.
size_t len
Anzahl der Elemente im Array.
Funktionen
qk_control_flow_kind
QkControlFlowKind qk_control_flow_kind(const QkControlFlowInstruction *cf_inst)
Rufe eine Anweisung zur Steuerung des Programmablaufs ab.
Beispiel
// 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;
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung.
Rückgabe
Die Art der Anweisung zur Steuerung des Programmablaufs.
qk_control_flow_num_blocks
size_t qk_control_flow_num_blocks(const QkControlFlowInstruction *cf_inst)
Ermittelt die Anzahl der Schaltkreise in einer Anweisung zur Ablaufsteuerung.
Beispiel
// 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...
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung.
Rückgabe
Die Anzahl der in dieser Ablaufsteuerungsanweisung enthaltenen Schaltkreise.
qk_control_flow_block_circuit
const QkCircuit *qk_control_flow_block_circuit(const QkControlFlowInstruction *cf_inst, size_t block_idx)
Erhalte einen Zeiger auf einen Schaltkreisblock innerhalb einer Anweisung zur Kontrollflusssteuerung.
Ablaufsteuerungsanweisungen enthalten einen oder mehrere Schaltkreise (z. B. besteht „ IfElse “ aus zwei Blöcken, während „Switch“ mehrere Blöcke haben kann). Diese Funktion ruft einen bestimmten Block anhand seines Indexes ab.
Beispiel
// 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...Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung.
- block_idx – Der Index des abzurufenden Blocks.
block_idxmuss innerhalb der Grenzen liegen (<qk_control_flow_num_blocks).
Rückgabe
Ein Zeiger auf den QkCircuit Block, der den angeforderten Block darstellt. Die Schaltung ist so lange gültig, wie die Anweisung zur Steuerungsabfolge vorhanden ist. Der Kreislauf gehört zur Kontrollflussanweisung und darf vom Aufrufer nicht freigegeben werden.
qk_control_flow_qubit_map
const uint32_t *qk_control_flow_qubit_map(const QkControlFlowInstruction *cf_inst)
Rufe die Qubit-Zuordnung für einen Befehl zur Steuerungsabfolge ab.
Gibt einen Zeiger auf ein Array zurück, das die in den Blöcken der Kontrollflussanweisung verwendeten Qubits ihren Indizes in der Schaltung der obersten Ebene zuordnet. Die Länge des Arrays entspricht der Anzahl der von der Steuerflussanweisung verwendeten Qubits. Für jeden Qubit-Index i im verschachtelten Block liefert die Zuordnung am Index i im Array den entsprechenden Qubit-Index in der Schaltung der obersten Ebene.
Beispiel
// 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]);
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung.
Rückgabe
Ein Zeiger auf ein Array von uint32_t Werten, die die Qubit-Zuordnung darstellen. Das Array ist so lange gültig, wie die Anweisung zur Steuerung des Programmablaufs existiert. Das Array gehört zur Ablaufsteuerungsanweisung und darf vom Aufrufer nicht freigegeben werden.
qk_control_flow_clbit_map
const uint32_t *qk_control_flow_clbit_map(const QkControlFlowInstruction *cf_inst)
Rufen Sie die klassische Bit-Zuordnung für einen Kontrollflussbefehl ab.
Gibt einen Zeiger auf ein Array zurück, das die klassischen Bits, die in den Blöcken der Kontrollflussanweisung verwendet werden, ihren Indizes in der obersten Schaltungsebene zuordnet. Die Länge des Arrays entspricht der Anzahl der klassischen Bits, die von der Kontrollflussanweisung verwendet werden. Für jeden klassischen Bit-Index i im verschachtelten Block liefert die Zuordnung am Index i im Array den entsprechenden klassischen Bit-Index in der Schaltung der obersten Ebene.
Beispiel
// 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]);
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung.
Rückgabe
Ein Zeiger auf ein Array von uint32_t Werten, die die klassische Bit-Zuordnung darstellen. Das Array ist so lange gültig, wie die Anweisung zur Steuerung des Programmablaufs existiert. Das Array gehört zur Ablaufsteuerungsanweisung und darf vom Aufrufer nicht freigegeben werden.
qk_control_flow_condition_type
QkConditionType qk_control_flow_condition_type(const QkControlFlowInstruction *cf_inst)
Die Bedingungsart einer Ablaufanweisung abrufen.
Gibt den Typ der Bedingung zurück, die in einer „ IfElse “- oder „While“-Anweisung verwendet wird. Die Bedingungsart gibt an, ob die Bedingung auf einem klassischen Bit, einem klassischen Register oder einem klassischen Ausdruck basiert.
Es kommt zu einem Fehler, wenn cf_inst keine „ IfElse “- oder „While“-Steueranweisung ist.
Beispiel
// 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;
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein gültiger Zeiger auf ein
QkControlFlowInstructionElement, das eine Anweisung vom Typ „ IfElse “ oder „While“ darstellen muss.
Rückgabe
Ein QkConditionType Enum-Wert, der den Konditionstyp angibt.
qk_control_flow_condition_bit_info
QkConditionBitInfo qk_control_flow_condition_bit_info(const QkControlFlowInstruction *cf_inst)
Rufe die Informationen zum Status der klassischen Bits einer Befehlsausführungsanweisung ab.
Extrahiert den klassischen Bit-Index und den Erwartungswert aus einer „ IfElse “- oder „While“-Anweisung, die eine klassische Bit-Bedingung enthält.
Es kommt zu einem Fehler, wenn cf_inst keine „ IfElse “- oder „While“-Anweisung ist oder wenn die Bedingung kein Bit-Typ ist.
Beispiel
// 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");Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein gültiger Zeiger auf ein
QkControlFlowInstructionElement, das eine „ IfElse “- oder „While“-Anweisung mit einer klassischen Bitbedingung darstellen muss.
Rückgabe
Eine QkConditionBitInfo Struktur, die den klassischen Bit-Index und den Erwartungswert enthält.
qk_control_flow_condition_reg_cond_bit_width
uint64_t qk_control_flow_condition_reg_cond_bit_width(const QkControlFlowInstruction *cf_inst)
Ermittle die Bitbreite der klassischen Registerbedingung für einen Kontrollflussbefehl.
Ermittelt die Bitbreite des klassischen Registers aus einem „ IfElse “- oder „While“-Befehl, der eine Bedingung für ein klassisches Register enthält.
Es kommt zu einem Fehler, wenn cf_inst keine „ IfElse “- oder „While“-Steueranweisung ist oder wenn die Bedingung kein Registertyp ist.
Beispiel
// 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);Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein gültiger Zeiger auf ein
QkControlFlowInstructionElement, das eine „ IfElse “- oder „While“-Anweisung mit einer klassischen Registerbedingung darstellen muss.
Rückgabe
Die Bitbreite der Bedingung über das klassische Register.
qk_control_flow_condition_reg
const QkClassicalRegister *qk_control_flow_condition_reg(const QkControlFlowInstruction *cf_inst)
Rufen Sie das klassische Register für die Bedingung einer Kontrollflussanweisung ab.
Extrahiert das klassische Register aus einer „ IfElse “- oder „While“-Anweisung, die eine Bedingung für das klassische Register enthält.
Es kommt zu einem Fehler, wenn cf_inst keine „ IfElse “- oder „While“-Steueranweisung ist oder wenn die Bedingung kein Registertyp ist.
Beispiel
// 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 pointerSicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein gültiger Zeiger auf ein
QkControlFlowInstructionElement, das eine „ IfElse “- oder „While“-Anweisung mit einer klassischen Registerbedingung darstellen muss.
Rückgabe
Ein ausgeliehener Zeiger auf das QkClassicalRegister. Der Zeiger bleibt gültig, solange die übergeordnete Schaltung gültig bleibt.
qk_control_flow_condition_reg_cond_uint
uint64_t qk_control_flow_condition_reg_cond_uint(const QkControlFlowInstruction *cf_inst)
Ruft den Wert der klassischen Registerbedingung für eine Kontrollflussanweisung ab.
Extrahiert die Bedingung als vorzeichenlosen Ganzzahlwert aus einer „ IfElse “- oder „While“-Anweisung, die eine klassische Registerbedingung enthält.
uint64_tEs kommt zu einem Fehler, wenn cf_inst keine „ IfElse “- oder „While“-Anweisung ist, wenn die Bedingung kein Registertyp ist oder wenn der Wert der Bedingung nicht in ein passt.
Beispiel
// 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);Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein gültiger Zeiger auf ein
QkControlFlowInstructionElement, das eine „ IfElse “- oder „While“-Anweisung mit einer klassischen Registerbedingung darstellen muss.
Rückgabe
Der Bedingungswert.
qk_control_flow_condition_expr
const QkExprNode *qk_control_flow_condition_expr(const QkControlFlowInstruction *cf_inst)
Ermitteln Sie die klassische Formulierung für eine Anweisung zur Ablaufsteuerung.
Extrahiert den klassischen Ausdruck aus einer „ IfElse “- oder „While“-Anweisung, die eine ausdrucksbasierte Bedingung enthält.
Es kommt zu einem Fehler, wenn cf_inst keine „ IfElse “- oder „While“-Anweisung ist oder wenn die Bedingung kein Ausdruckstyp ist.
Beispiel für die Verwendung
// 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...
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein gültiger Zeiger auf ein
QkControlFlowInstructionElement, das eine „ IfElse “- oder „While“-Anweisung mit einer Ausdrucksbedingung darstellen muss.
Rückgabe
Ein ausgeliehener Zeiger auf das QkExprNode , das den klassischen Ausdruck darstellt. Der Zeiger bleibt gültig, solange die übergeordnete Schaltung gültig bleibt.
qk_control_flow_box_duration_kind
QkBoxDurationKind qk_control_flow_box_duration_kind(const QkControlFlowInstruction *cf_inst)
Ermitteln Sie die Dauer einer Ablaufanweisung vom Typ „Box“.
Anweisungen in einem Block können keine Dauer haben, einen konkreten Dauerwert wie QkDurationInfo oder eine als Ausdruck angegebene Dauer. Diese Funktion gibt zurück, um welche Art von Dauer es sich handelt.
Es kommt zu einem Fehler, wenn cf_inst keine „Box“-Steueranweisung ist.
Beispiel
// 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;
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung. Die Anweisung zur Ablaufsteuerung muss vom Typ „Box“ sein.
Rückgabe
Die Art der Dauer als QkBoxDurationKind.
qk_control_flow_box_duration_val_info
QkDurationInfo qk_control_flow_box_duration_val_info(const QkControlFlowInstruction *cf_inst)
Rufen Sie die Informationen zur Dauer einer Ablaufanweisung des Box-Steuerelements ab.
Diese Funktion ruft den Dauerwert und den Typ einer „Box“-Anweisung ab, die eine konkrete Dauer hat.
Es kommt zu einer Panik, wenn cf_inst keine „Box“-Steuerflussanweisung mit einer konkreten Dauer ist.
Beispiel
// 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;
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung. Die Ablaufsteuerungsanweisung muss vom Typ „Box“ sein und eine konkrete Dauer haben.
Rückgabe
Eine QkDurationInfo Struktur, die den Dauerwert und die Einheit enthält.
qk_control_flow_box_duration_expr
const QkExprNode *qk_control_flow_box_duration_expr(const QkControlFlowInstruction *cf_inst)
Rufe den Dauerausdruck einer Ablaufanweisung des Box-Steuerelements ab.
Diese Funktion gibt einen Zeiger auf den Ausdruck zurück, der die Dauer für eine Box-Anweisung definiert, wenn die Dauer als Ausdruck angegeben wird.
Es kommt zu einer Panik, wenn cf_inst keine „Box“-Steuerflussanweisung mit einer Ausdrucksdauer ist.
Beispiel
// 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...Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung. Die Kontrollflussanweisung muss vom Typ „Box“ sein und eine Ausdrucksdauer aufweisen.
Rückgabe
Ein Zeiger auf den QkExpr Ausdruck, der die Dauer angibt. Der Ausdruck ist gültig, solange die Anweisung zur Steuerung des Programmablaufs vorhanden ist. Der Ausdruck gehört zur Ablaufsteuerungsanweisung und darf vom Aufrufer nicht freigegeben werden.
qk_control_flow_loop_collection_type
QkLoopCollectionType qk_control_flow_loop_collection_type(const QkControlFlowInstruction *cf_inst)
Ruft den Typ der Sammlung ab, die in einer „ ForLoop “-Steueranweisung verwendet wird.
Diese Funktion ermittelt, ob eine ForLoop eine explizite Liste von Elementen oder einen Bereich im Stil von Python durchläuft.
Es kommt zu einem Fehler, wenn cf_inst keine „ ForLoop “-Steuerungsanweisung ist.
Beispiel
// 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
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf eine Kontrollflussanweisung, bei der es sich um eine „ ForLoop “ handeln muss.
Rückgabe
Ein CLoopCollectionType Enum-Wert, der den Sammlungstyp angibt.
qk_control_flow_loop_elements
QkLoopElements qk_control_flow_loop_elements(const QkControlFlowInstruction *cf_inst)
Rufe die Liste der Elemente ab, über die ein „ ForLoop “ durchläuft.
Diese Funktion ruft die Liste der Elemente aus einer „ ForLoop “-Ablaufanweisung ab, die eine explizite Listen-Sammlung verwendet. Verwenden qk_control_flow_loop_collection_type Sie, um den Sammlungstyp zu ermitteln, bevor Sie diese Funktion aufrufen.
Es wird ein Fehler ausgelöst, wenn cf_inst keine „ ForLoop “-Steuerungsanweisung mit einer Listen-Sammlung ist.
Beispiel
// 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]);
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf eine Kontrollflussanweisung, bei der es sich um eine „ ForLoop “ mit einer „List“-Sammlung handeln muss.
Rückgabe
Eine QkLoopElements Struktur, die einen Zeiger auf das Array der Schleifenelemente und die Anzahl der Elemente enthält. Der Zeiger wird für die Dauer der Kontrollflussanweisung ausgeliehen und darf vom Aufrufer nicht freigegeben werden.
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)
Ruft die Bereichsparameter eines „ ForLoop “ ab, der einen Bereich im Stil von „ Python “ durchläuft.
Diese Funktion ruft die Start-, Stopp- und Schrittwerte aus einer „ ForLoop “-Steuerungsanweisung ab, die eine Bereichssammlung verwendet. Verwenden qk_control_flow_loop_collection_type Sie, um den Sammlungstyp zu ermitteln, bevor Sie diese Funktion aufrufen.
Es wird ein Fehler ausgelöst, wenn cf_inst keine „ ForLoop “-Steuerungsanweisung mit einer Bereichssammlung ist.
Beispiel
// 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);Sicherheit
out_stop``out_start``QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist oder wenn oder out_step keine ausgerichteten, gültigen Zeiger sind, auf die geschrieben werden kann.
Parameter
- cf_inst – Ein Zeiger auf eine Kontrollflussanweisung, bei der es sich um eine „ ForLoop “ mit einer „Range“-Sammlung handeln muss.
- out_start – Ein Ausgabeparameter, der auf den Startwert des Bereichs gesetzt wird.
- out_stop – Ein Ausgabeparameter, der auf den Bereichsendwert gesetzt wird.
- out_step – Ein Ausgabeparameter, der auf den Schrittwert des Bereichs gesetzt wird.
qk_control_flow_loop_param_kind
QkLoopParamKind qk_control_flow_loop_param_kind(const QkControlFlowInstruction *cf_inst)
Ermittelt den Typ des Schleifenparameters, der in einer „ ForLoop “-Steueranweisung verwendet wird.
Diese Funktion ermittelt, ob ein „ ForLoop “ keinen Schleifenparameter hat, ein Parametersymbol verwendet oder eine Variable (QkVar) zur Verfolgung des Iterationswerts nutzt.
Es kommt zu einem Fehler, wenn cf_inst keine „ ForLoop “-Steuerungsanweisung ist.
Beispiel
// 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
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf eine Kontrollflussanweisung, bei der es sich um eine „ ForLoop “ handeln muss.
Rückgabe
Ein QkLoopParamKind Enum-Wert, der die Art des Schleifenparameters angibt.
qk_control_flow_loop_symbol_info
QkSymbolInfo qk_control_flow_loop_symbol_info(const QkControlFlowInstruction *cf_inst)
Rufe die Informationen zum Schleifenparameter-Symbol aus einer „ ForLoop “-Steuerungsanweisung ab.
Diese Funktion ruft die Symbolinformationen des Schleifenparameters aus einer „ ForLoop “-Anweisung ab, die einen Parameter als Schleifenparameter verwendet. Der Rückgabewert QkSymbolInfo enthält den Typ, den Namen und den Index des Symbols (bei Symbolen, die Elemente eines Parametervektors sind).
Es tritt ein Fehler auf, wenn cf_inst keine „ ForLoop “-Steuerungsanweisung mit einem „loop“-Parameter ist.
Beispiel
// 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);Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein gültiger Zeiger auf ein
QkControlFlowInstructionObjekt, das eine „ ForLoop “ mit einem „loop“-Parameter darstellen muss.
Rückgabe
Eine QkSymbolInfo Struktur, die die Symbolinformationen enthält. Der Aufrufer muss die zurückgegebene Zeichenkette im name Feld mithilfe qk_str_freevon freigeben.
qk_control_flow_loop_variable
const QkVar *qk_control_flow_loop_variable(const QkControlFlowInstruction *cf_inst)
Rufe die Schleifenvariable aus einer „ ForLoop “-Anweisung zur Steuerung des Programmablaufs ab.
Diese Funktion gibt einen Zeiger auf die Variable (QkVar) zurück, die als Schleifenparameter in einer Anweisung vom Typ „ ForLoop “ verwendet wird. Der zurückgegebene Zeiger wird für die Dauer der Ausführungsanweisung ausgeliehen und darf vom Aufrufer nicht freigegeben werden.
Es kommt zu einem Fehler, wenn cf_inst keine „ ForLoop “-Steuerungsanweisung mit einem variablen Schleifenparameter ist.
Beispiel
// 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 informationSicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein gültiger Zeiger auf ein
QkControlFlowInstructionObjekt, das eine „ ForLoop “ mit einem variablen Schleifenparameter darstellen muss.
Rückgabe
Ein Zeiger auf die QkVar , die die Schleifenvariable darstellt. Der Zeiger ist für die gesamte Laufzeit der Kontrollflussanweisung gültig.
qk_control_flow_switch_target_type
QkConditionType qk_control_flow_switch_target_type(const QkControlFlowInstruction *cf_inst)
Ruft den Typ des Switch-Ziels für eine Switch-Steuerungsanweisung ab.
Switch-Anweisungen können auf verschiedene Arten von Zielen angewendet werden: ein klassisches Bit, ein klassisches Register oder ein Ausdruck. Diese Funktion gibt zurück, welche Art von Ziel die Switch-Anweisung verwendet.
Es kommt zu einem Fehler, wenn cf_inst keine „Switch“-Anweisung zur Steuerung des Programmablaufs ist.
Beispiel
// 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;
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung. Die Anweisung zur Steuerung des Programmablaufs muss vom Typ „Switch“ sein.
Rückgabe
Die Bedingungsart des Switch-Ziels lautet QkConditionType.
qk_control_flow_switch_target_bit
uint32_t qk_control_flow_switch_target_bit(const QkControlFlowInstruction *cf_inst)
Den klassischen Bit-Index für ein Switch-Ziel abrufen.
Diese Funktion gibt den Index des klassischen Bits zurück, auf das eine Switch-Anweisung wirkt, wenn das Switch-Ziel ein klassisches Bit ist.
Es kommt zu einer Panik, wenn cf_inst keine „Switch“-Anweisung zur Ablaufsteuerung mit einem klassischen Bit-Ziel ist.
Beispiel
// 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);Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung. Die Kontrollflussanweisung muss vom Typ „Switch“ sein und ein klassisches Bit-Ziel haben.
Rückgabe
Der Index des klassischen Bits in der Schaltung.
qk_control_flow_switch_target_register
const QkClassicalRegister *qk_control_flow_switch_target_register(const QkControlFlowInstruction *cf_inst)
Ruft das klassische Register ab, auf das eine Switch-Anweisung wirkt.
Diese Funktion ruft das klassische Register ab, das als Ziel des Schalters verwendet wird, wenn der Schalter auf ein Register einwirkt.
Es kommt zu einem Fehler, wenn cf_inst keine „Switch“-Anweisung zur Steuerung des Programmablaufs mit einem Register als Ziel ist.
Beispiel
// 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...Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung. Die Kontrollflussanweisung muss vom Typ „Switch“ sein und ein Register als Ziel haben.
Rückgabe
Ein Zeiger auf das QkClassicalRegister Objekt, auf das der Switch angewendet wird. Das Register ist so lange gültig, wie die Anweisung zur Steuerung des Programmablaufs existiert. Das Register gehört zur Kontrollflussanweisung und darf vom Aufrufer nicht freigegeben werden.
qk_control_flow_switch_target_expr
const QkExprNode *qk_control_flow_switch_target_expr(const QkControlFlowInstruction *cf_inst)
Den Ausdruck für ein Switch-Ziel abrufen.
Diese Funktion gibt einen Zeiger auf den klassischen Ausdruck zurück, auf den eine Switch-Anweisung angewendet wird, wenn das Switch-Ziel ein Ausdruck ist.
Löst eine Panik aus, wenn cf_inst keine „Switch“-Anweisung zur Steuerung des Programmablaufs mit einem Ausdrucksziel ist.
Beispiel
// 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...Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung. Die Anweisung zur Ablaufsteuerung muss vom Typ „Switch“ sein und ein Ausdrucksziel haben.
Rückgabe
Ein Zeiger auf den QkExpr Ausdruck, der das Switch-Ziel darstellt. Der Ausdruck ist gültig, solange die Anweisung zur Steuerung des Programmablaufs vorhanden ist. Der Ausdruck gehört zur Ablaufsteuerungsanweisung und darf vom Aufrufer nicht freigegeben werden.
qk_control_flow_switch_num_cases
size_t qk_control_flow_switch_num_cases(const QkControlFlowInstruction *cf_inst)
Ermitteln Sie die Anzahl der Fälle in einer Switch-Anweisung.
Gibt die Gesamtzahl der „case“-Blöcke in der „switch“-Anweisung zurück, einschließlich des „default“-Falls, falls vorhanden.
Es kommt zu einem Fehler, wenn cf_inst keine „Switch“-Anweisung zur Steuerung des Programmablaufs ist.
Beispiel
// 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...
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung. Die Anweisung zur Steuerung des Programmablaufs muss vom Typ „Switch“ sein.
Rückgabe
Die Anzahl der Fälle in der Switch-Anweisung.
qk_control_flow_switch_is_case_default
bool qk_control_flow_switch_is_case_default(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Prüfe, ob ein bestimmter Fall in einer Switch-Anweisung der Standardfall ist.
Switch-Anweisungen können einen „default“-Fall enthalten, der dann zutrifft, wenn kein anderer Fall zutrifft. Diese Funktion prüft, ob der Fall am angegebenen Index der Standardfall ist. Der Standardfall kann auch führende Bezeichnungen enthalten, die durch qk_control_flow_switch_case_labels_uint im Standardfall abgerufen werden können.
Es kommt zu einem Fehler, wenn cf_inst keine „Switch“-Anweisung zur Steuerung des Programmablaufs ist.
Beispiel
// 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);
}
}Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung. Die Anweisung zur Steuerung des Programmablaufs muss vom Typ „Switch“ sein.
- case_idx – Der Index des zu prüfenden Falls. Muss kleiner sein als der von
qk_control_flow_switch_num_cases… zurückgegebene Wert.
Rückgabe
true Wenn der Fall bei case_idx der Standardfall ist, false ansonsten.
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)
Ermitteln Sie die maximale Bitbreite, die zur Darstellung der Bezeichnungen in einem „Switch case“ erforderlich ist.
Diese Funktion gibt die maximale Anzahl an Bits zurück, die benötigt wird, um eine der vorzeichenlosen Ganzzahl-Bezeichnungen im angegebenen Fall darzustellen. Dies ist hilfreich, um die Mindestbitbreite zu ermitteln, die zum Speichern oder Verarbeiten der Fallbezeichnungen erforderlich ist.
Es kommt zu einem Fehler, wenn cf_inst keine „Switch“-Anweisung zur Steuerung des Programmablaufs ist.
Beispiel
// 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);Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung. Die Anweisung zur Steuerung des Programmablaufs muss vom Typ „Switch“ sein.
- case_idx – Der Index des Falls, dessen Label-Bitbreite abgerufen werden soll. Muss kleiner sein als der von
qk_control_flow_switch_num_cases… zurückgegebene Wert.
Rückgabe
Die maximale Bitbreite der Bezeichnungen im Fall oder 0, wenn der Fall keine Bezeichnungen für vorzeichenlose Ganzzahlen enthält (z. B. nur einen DEFAULT-Spezifizierer).
qk_control_flow_switch_case_labels_uint
QkSwitchCaseLabels qk_control_flow_switch_case_labels_uint(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Rufe die Labels für einen bestimmten Fall in einer Switch-Anweisung ab.
case(1, 2, 3)Jeder Fall in einer Switch-Anweisung kann eine oder mehrere Bezeichnungen haben (z. B. hat drei Bezeichnungen: 1, 2 und 3). Diese Funktion ruft alle Bezeichnungen für einen bestimmten Fall ab. Beachten Sie, dass der Standardfall auch Beschriftungen enthalten kann, die mit dieser Funktion abgerufen werden können. Wird die Funktion in einem Standardfall ohne zusätzliche Bezeichnungen aufgerufen, setzt num_labels = 0 sie und labels = NULL in der zurückgegebenen QkSwitchCaseLabels Struktur. uint64_tBevor Sie diese Funktion aufrufen, sollten Sie verwenden qk_control_flow_switch_case_labels_bit_width , um sicherzustellen, dass die Beschriftungen in passen.
uint64_tEs kommt zu einem Fehler, wenn cf_inst keine „Switch“-Anweisung zur Steuerung des Programmablaufs ist oder wenn ein „case“-Label nicht in passt.
Beispiel
// 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);Sicherheit
QkControlFlowInstructionDas Verhalten ist nicht definiert, wenn cf_inst kein gültiger Zeiger auf ein ist oder wenn out_labels kein gültiger Zeiger auf eine QkSwitchCaseLabels Struktur ist.
Parameter
- cf_inst – Ein Zeiger auf die Kontrollflussanweisung. Die Anweisung zur Steuerung des Programmablaufs muss vom Typ „Switch“ sein.
- case_idx – Der Index des Falls, dessen Bezeichnungen abgerufen werden sollen. Muss kleiner sein als der von
qk_control_flow_switch_num_cases… zurückgegebene Wert.
Rückgabe
Eine QkSwitchCaseLabels Struktur mit den Label-Informationen für den angegebenen Fall. Die Struktur enthält einen Zeiger auf ein Array von Bezeichnungen sowie die Anzahl der Bezeichnungen. In num_labels > 0diesem Fall sollten Sie die Funktion aufrufen qk_control_flow_switch_case_labels_clear , um den von dieser Funktion zugewiesenen Speicher freizugeben.
qk_control_flow_switch_case_labels_clear
void qk_control_flow_switch_case_labels_clear(QkSwitchCaseLabels *labels)
Eine QkSwitchCaseLabels Struktur löschen.
qk_control_flow_switch_case_labels_uintDiese Funktion muss aufgerufen werden, um den von … zugewiesenen Speicher freizugeben. Nach dem Aufruf dieser Funktion wird der Zeiger „labels“ in der Struktur auf null gesetzt und der Zähler auf null zurückgesetzt.
Beispiel
// 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);Sicherheit
QkSwitchCaseLabelsDas Verhalten ist nicht definiert, wenn labels kein gültiger Zeiger auf ein ist.
Parameter
- labels – Ein Zeiger auf die
QkSwitchCaseLabelszu löschende Struktur. Die Struktur muss zuvor mitqk_control_flow_switch_case_labels_uint. gefüllt worden sein.