制御フロー
制御フロー用のQiskit C APIは、量子回路で使用される制御フロー命令を検査するための機能を提供します。 制御フロー命令のタイプを照会したり、ネストされた回路ブロックにアクセスしたり、条件やループパラメータを確認したり、ネストされたブロックと最上位の回路間の量子ビットおよび古典ビットのマッピングを取得したりすることができます。
typedef struct QkControlFlowInstruction QkControlFlowInstructionopaque QkControlFlowInstruction struct は、C API が回路内の制御フロー命令を表し、それらを処理するために使用する主要なハンドルです。 これは の呼び出しによって取得され qk_circuit_get_control_flow_instruction() 、 の呼び出しによって解放する必要があります qk_control_flow_instruction_free()。 制御フロー構造を操作するC API関数のほとんどは、この不透明な構造体へのポインタを引数として受け取るため、この構造体はCから制御フロー命令を検査するための中心的な手段となっている。 なお、このAPIにおいて、``を入力 QkControlFlowInstruction として使用する関数のほとんどは、制御フロー命令が存在する限り有効な「借用ポインタ」を返すため、これらのポインタを個別に解放する必要はありません。
データ型
QkControlFlowKind
enum QkControlFlowKind
この列挙型は、量子回路に現れる可能性のあるさまざまな種類の制御フロー命令を表しています。
値:
列挙子 QkControlFlowKind_Box
「A Box」の操作手順
列挙子 QkControlFlowKind_BreakLoop
ループ終了命令
列挙子 QkControlFlowKind_ContinueLoop
ループ命令を続行する
列挙子 QkControlFlowKind_ForLoop
forループ命令
列挙子 QkControlFlowKind_IfElse
if-else文
列挙子 QkControlFlowKind_Switch
case文
列挙子 QkControlFlowKind_While
whileループ命令
QkConditionType
enum QkConditionType
制御フロー命令における条件またはスイッチのターゲットの種類を表します。
この列挙型は、( IfElse またはWhile文内の)条件、あるいは(Switch文内の)Switchターゲットが、古典的なビット、古典的なレジスタ、または古典的な式のいずれを操作するかを識別するために使用されます。
値:
列挙子 QkConditionType_ClBit
古典的なビットに基づく条件
列挙子 QkConditionType_ClReg
古典的なレジスタに基づく条件
列挙子 QkConditionType_Expr
古典的な式に基づく条件
QkConditionBitInfo
struct QkConditionBitInfo
古典的なビット条件に関する情報。
この構造体には、単一の古典ビットに対して作用する状態の詳細が含まれています
uint32_t clbit
回路における古典ビットのインデックス
bool 条件
古典的なビット(真または偽)の期待値
QkBoxDurationKind
enum QkBoxDurationKind
Box命令の持続時間指定の一種を表します。
ボックス指示には、持続時間を指定しない場合、具体的な持続時間の値を指定する場合、または古典的な式で持続時間を指定する場合があります。
値:
列挙子 QkBoxDurationKind_NoDuration
期間が指定されていません
列挙子 QkBoxDurationKind_Duration
QkDurationInfo具体的な期間値(として表される)
列挙子 QkBoxDurationKind_Expr
古典的な式で表された持続時間
QkSwitchCaseLabels
struct QkSwitchCaseLabels
Switchのcase文のラベルが含まれています。
この構造体は、Switchのcase文で照合されるラベル値の配列を保持しています。 たとえば、のような case(1, 2, 3) ケースでは、1、2、3 の3つのラベルが付きます。 qk_control_flow_switch_case_labels_clearラベル配列用のメモリは によって qk_control_flow_switch_case_labels_uint 割り当てられ、 を使用して解放する必要があります。
const uint64_t *labels
ラベル値の配列へのポインタ
size_t num_labels
配列内のラベルの数
QkLoopParamKind
enum QkLoopParamKind
ForLoop の制御フロー命令におけるループパラメータの型。
この列挙型は、forループがループパラメータを持たないか、Parameterシンボルを使用するか、あるいはVariable (QkVar) を使用して反復値を追跡するかを示します。
値:
列挙子 QkLoopParamKind_NoLoopParam
ForLoop 命令に対してループパラメータが指定されていません
列挙子 QkLoopParamKind_Parameter
ループパラメータはパラメータです
列挙子 QkLoopParamKind_Variable
ループパラメータは変数です
QkSymbolType
enum QkSymbolType
ForLoop のコンテキストにおけるシンボルの種類。
この列挙型は、シンボルが独立した変数であるか、それともインデックスによってアクセスされるパラメータベクトル内の要素であるかを示します。
値:
列挙子 QkSymbolType_Standalone
シンプルな名前を持つ独立したシンボル
列挙子 QkSymbolType_Element
基本名と添え字を持つ元素記号
QkSymbolInfo
struct QkSymbolInfo
型やデータなどのシンボル情報。
この構造体は、 ForLoop のコンテキストにおけるシンボルを表しており、独立した変数である場合もあれば、インデックス付き要素である場合もあります。
QkSymbolType ty
シンボルの種類(単独型または要素型)
char *name
シンボル名を含む、ヌル終端のC文字列。 単独のシンボルについては、これが変数名となります。 元素の記号については、これがパラメータベクトルの基本名となります。 qk_str_freeこの文字列の解放は、呼び出し元が責任を持って行う必要があります。
size_t index
元素の記号については、これはパラメータベクトル内のインデックスです。 スタンドアロンのシンボルについては、このフィールドは使用されないため、無視してください。
QkLoopCollectionType
enum QkLoopCollectionType
ForLoop の制御フロー命令で使用されるコレクションの型。
値:
列挙子 QkLoopCollectionType_List
このループは、明示的に指定された要素のリストを反復処理します
列挙子 QkLoopCollectionType_Range
このループは、 Python 形式の範囲(start、stop、step)を反復処理します
QkLoopElements
struct QkLoopElements
ForLoop の制御フロー命令に含まれるループ要素を格納する構造体。
この構造体は によって qk_control_flow_loop_elements 返され、ループ要素の配列へのポインタと、その配列に含まれる要素数の両方を格納しています。 このポインタは借用されたものであり、呼び出し元が解放してはなりません。
const ptrdiff_t *elements
ループ要素の配列へのポインタ。
size_t len
配列に含まれる要素の数。
関数
qk_control_flow_kind
QkControlFlowKind qk_control_flow_kind(const QkControlFlowInstruction *cf_inst)
そのような制御フロー命令を取得します。
例
// 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;
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。
戻り値
制御フロー命令の一種。
qk_control_flow_num_blocks
size_t qk_control_flow_num_blocks(const QkControlFlowInstruction *cf_inst)
制御フロー命令に含まれる回路ブロックの数を取得します。
例
// 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...
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。
戻り値
この制御フロー命令に含まれる回路ブロックの数。
qk_control_flow_block_circuit
const QkCircuit *qk_control_flow_block_circuit(const QkControlFlowInstruction *cf_inst, size_t block_idx)
制御フロー命令内の回路ブロックへのポインタを取得します。
制御フロー命令には、1つ以上の回路ブロックが含まれます(たとえば、「 IfElse 」には2つのブロックがあり、「Switch」には複数のブロックが含まれる場合があります)。 この関数は、インデックスを指定して特定のブロックを取得します。
例
// 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...安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。
- block_idx – 取得するブロックのインデックス。
qk_control_flow_num_blocks``block_idx範囲内(<)でなければなりません。
戻り値
QkCircuit 要求されたブロックを表すポインタ。 制御フロー命令が存在する限り、この回路は有効です。 この回路は制御フロー命令によって所有されており、呼び出し元が解放してはならない。
qk_control_flow_qubit_map
const uint32_t *qk_control_flow_qubit_map(const QkControlFlowInstruction *cf_inst)
制御フロー命令の量子ビットマッピングを取得します。
制御フロー命令のブロックで使用される量子ビットを、トップレベル回路内のインデックスに対応付けた配列へのポインタを返します。 配列の長さは、制御フロー命令で使用される量子ビットの数に等しい。 ネストされたブロック内の各量子ビットインデックス i について、配列のインデックス i におけるマッピングは、最上位回路における対応する量子ビットインデックスを返します。
例
// 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]);
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。
戻り値
量子ビットのマッピングを表す値の uint32_t 配列へのポインタ。 その制御フロー命令が存在する限り、その配列は有効です。 この配列は制御フロー命令が所有しており、呼び出し元が解放してはならない。
qk_control_flow_clbit_map
const uint32_t *qk_control_flow_clbit_map(const QkControlFlowInstruction *cf_inst)
制御フロー命令の古典的なビットマップを取得します。
制御フロー命令のブロックで使用される従来のビットを、最上位回路におけるそれらのインデックスにマッピングした配列へのポインタを返します。 配列の長さは、制御フロー命令で使用される古典ビットの数に等しい。 ネストされたブロック内の各古典ビットインデックス i について、配列のインデックス i におけるマッピングは、最上位回路における対応する古典ビットインデックスを返します。
例
// 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]);
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。
戻り値
古典的なビットマッピングを表す値の uint32_t 配列へのポインタ。 その制御フロー命令が存在する限り、その配列は有効です。 この配列は制御フロー命令が所有しており、呼び出し元が解放してはならない。
qk_control_flow_condition_type
QkConditionType qk_control_flow_condition_type(const QkControlFlowInstruction *cf_inst)
制御フロー命令の条件タイプを取得します。
IfElse またはWhile文で使用される条件の型を返します。 条件タイプは、その条件が古典的なビット、古典的なレジスタ、あるいは古典的な式に基づいているかを示します。
が IfElse またはWhileの制御フロー命令でない場合 cf_inst 、エラーが発生します。
例
// 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;
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – IfElse またはWhile命令を表す必要がある、
QkControlFlowInstructionへの有効なポインタ。
戻り値
条件型を示す列挙 QkConditionType 値。
qk_control_flow_condition_bit_info
QkConditionBitInfo qk_control_flow_condition_bit_info(const QkControlFlowInstruction *cf_inst)
制御フロー命令の古典的なビット状態情報を取得します。
IfElse またはWhile命令のうち、古典的なビット条件を持つものから、古典的なビットインデックスと期待値を抽出します。
が IfElse またはWhileの制御フロー命令でない場合 cf_inst 、あるいは条件がビット型でない場合、エラーが発生します。
例
// 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");安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – IfElse またはWhile命令(古典的なビット条件を持つもの
QkControlFlowInstruction)を表す必要がある、への有効なポインタ。
戻り値
従来のビットインデックスと期待値を含む構造体。 QkConditionBitInfo
qk_control_flow_condition_reg_cond_bit_width
uint64_t qk_control_flow_condition_reg_cond_bit_width(const QkControlFlowInstruction *cf_inst)
制御フロー命令の古典的なレジスタ条件のビット幅を取得します。
IfElse またはWhile命令のうち、クラシックレジスタの条件を持つものから、そのクラシックレジスタのビット幅を抽出します。
が IfElse またはWhileの制御フロー命令でない場合 cf_inst 、あるいは条件がレジスタ型でない場合、エラーが発生します。
例
// 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);安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – IfElse またはWhile命令(古典的なレジスタ条件付き)を
QkControlFlowInstruction表す、有効なポインタ。
戻り値
古典レジスタに対する条件のビット幅。
qk_control_flow_condition_reg
const QkClassicalRegister *qk_control_flow_condition_reg(const QkControlFlowInstruction *cf_inst)
制御フロー命令の条件に対する古典的なレジスタを取得します。
IfElse またはWhile命令のうち、古典レジスタ条件を持つものから、その古典レジスタを抽出します。
が IfElse またはWhileの制御フロー命令でない場合 cf_inst 、あるいは条件がレジスタ型でない場合、エラーが発生します。
例
// 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安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – IfElse またはWhile命令(古典的なレジスタ条件付き)を
QkControlFlowInstruction表す、有効なポインタ。
戻り値
QkClassicalRegister. への借用ポインタ。 親回路が有効である限り、ポインタも有効なままです。
qk_control_flow_condition_reg_cond_uint
uint64_t qk_control_flow_condition_reg_cond_uint(const QkControlFlowInstruction *cf_inst)
制御フロー命令の古典的なレジスタ条件の条件値を取得します。
従来のレジスタ条件を持つ IfElse またはWhile命令から、その条件を符号なし整数値として抽出します。
uint64_tが IfElse またはWhileの制御フロー命令でない場合 cf_inst 、条件がレジスタ型でない場合、または条件の値が.に収まらない場合は、パニックが発生する。
例
// 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);安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – IfElse またはWhile命令(古典的なレジスタ条件付き)を
QkControlFlowInstruction表す、有効なポインタ。
戻り値
条件値。
qk_control_flow_condition_expr
const QkExprNode *qk_control_flow_condition_expr(const QkControlFlowInstruction *cf_inst)
制御フロー命令の古典的な式を導き出してください。
式に基づく条件を持つ IfElse またはWhile文から、古典的な式を抽出します。
が IfElse またはWhileの制御フロー命令でない場合 cf_inst 、あるいは条件が式型でない場合、エラーが発生します。
使用例
// 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...
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
QkControlFlowInstruction** cf_inst** – IfElse または式を条件とするWhile命令を表す、有効なポインタ。
戻り値
QkExprNode 古典的な式を表すへの借用ポインタ。 親回路が有効である限り、ポインタも有効なままです。
qk_control_flow_box_duration_kind
QkBoxDurationKind qk_control_flow_box_duration_kind(const QkControlFlowInstruction *cf_inst)
Box制御フロー命令の継続時間を取得します。
Boxの指示には、持続時間を指定しない場合、具体的な持続時間値(例: QkDurationInfo)を指定する場合、または式で持続時間を指定する場合があります。 この関数は、どのような種類の期間が存在するかを返します。
が Box 制御フロー命令でない場合 cf_inst 、パニックが発生します。
例
// 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;
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。 制御フロー命令は、Box 型でなければなりません。
戻り値
QkBoxDurationKind「.」のような期間。
qk_control_flow_box_duration_val_info
QkDurationInfo qk_control_flow_box_duration_val_info(const QkControlFlowInstruction *cf_inst)
Box コントロールフロー命令の継続時間に関する情報を取得します。
この関数は、具体的な持続時間を持つBox命令の持続時間の値と型を取得します。
が、具体的な持続時間を持つBox制御フロー命令でない場合 cf_inst 、パニックが発生します。
例
// 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;
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。 制御フロー命令は、具体的な実行時間を伴う「Box」型の命令でなければなりません。
戻り値
持続時間と単位を含む構造体 QkDurationInfo 。
qk_control_flow_box_duration_expr
const QkExprNode *qk_control_flow_box_duration_expr(const QkControlFlowInstruction *cf_inst)
Box コントロールフロー命令の継続時間を取得します。
この関数は、Box命令の持続時間が式として指定されている場合、その持続時間を定義する式へのポインタを取得します。
が、式による持続時間を持つBox制御フロー命令でない場合 cf_inst 、エラーが発生します。
例
// 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...安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。 制御フロー命令は、式持続時間を持つ「Box」型の命令でなければなりません。
戻り値
持続時間 QkExpr 式を表すポインタ。 その式は、制御フロー命令が存在する限り有効です。 この式は制御フロー命令に属しており、呼び出し元が解放してはならない。
qk_control_flow_loop_collection_type
QkLoopCollectionType qk_control_flow_loop_collection_type(const QkControlFlowInstruction *cf_inst)
ForLoop の制御フロー命令で使用されているコレクションの型を取得します。
この関数は、 ForLoop が明示的な要素のリストを反復処理するのか、それとも Python 形式の範囲を反復処理するのかを判定します。
が ForLoop の制御フロー命令でない場合 cf_inst 、パニックが発生します。
例
// 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
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。これは ForLoop でなければならない。
戻り値
コレクションの型を示す列挙型の CLoopCollectionType 値。
qk_control_flow_loop_elements
QkLoopElements qk_control_flow_loop_elements(const QkControlFlowInstruction *cf_inst)
ForLoop が反復処理を行う要素のリストを取得します。
この関数は、明示的なリストコレクションを使用する ForLoop の制御フロー命令から、要素のリストを取得します。 この関数を呼び出す前に、 を使用して qk_control_flow_loop_collection_type コレクションの型を確認してください。
が、リストコレクションを伴う ForLoop の制御フロー命令でない場合 cf_inst 、エラーが発生します。
例
// 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]);
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。これは、List コレクションを持つ ForLoop でなければならない。
戻り値
ループ要素の配列へのポインタと要素数を格納する構造体 QkLoopElements 。 ポインタは制御フロー命令の実行期間中のみ借用されるものであり、呼び出し元がこれを解放してはならない。
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)
Python 形式の範囲を反復処理する ForLoop の範囲パラメータを取得します。
この関数は、範囲コレクションを使用する ForLoop の制御フロー命令から、開始値、終了値、およびステップ値を取得します。 この関数を呼び出す前に、 を使用して qk_control_flow_loop_collection_type コレクションの型を確認してください。
が、範囲コレクションを持つ ForLoop の制御フロー命令でない場合 cf_inst 、エラーが発生します。
例
// 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);安全
out_start``QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、あるいは、 out_stop、、 のいずれかが書き込み用のアラインメントが確保された有効なポインタでない場合、 out_step その動作は未定義となります。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。これは、Rangeコレクションを持つ ForLoop でなければならない。
- out_start – 範囲の開始値に設定される出力パラメータ。
- out_stop – 範囲のストップ値に設定される出力パラメータ。
- out_step – 範囲のステップ値に設定される出力パラメータ。
qk_control_flow_loop_param_kind
QkLoopParamKind qk_control_flow_loop_param_kind(const QkControlFlowInstruction *cf_inst)
ForLoop の制御フロー命令で使用されているループパラメータの種類を取得します。
この関数は、 ForLoop にループパラメータがないか、Parameterシンボルを使用しているか、あるいはVariable (QkVar) を使用して反復値を追跡しているかを判定します。
が ForLoop の制御フロー命令でない場合 cf_inst 、パニックが発生します。
例
// 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
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。これは ForLoop でなければならない。
戻り値
QkLoopParamKind ループパラメータの種類を示す列挙値。
qk_control_flow_loop_symbol_info
QkSymbolInfo qk_control_flow_loop_symbol_info(const QkControlFlowInstruction *cf_inst)
ForLoop の制御フロー命令から、ループパラメータのシンボル情報を取得します。
この関数は、ループパラメータとして「Parameter」を使用する ForLoop 命令から、ループパラメータのシンボル情報を取得します。 返される QkSymbolInfo 値には、シンボルの型、名前、およびインデックス(パラメータベクトルの要素であるシンボルの場合)が含まれます。
が、パラメータ loop を持つ ForLoop 制御フロー命令でない場合 cf_inst 、エラーが発生します。
例
// 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);安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 「
QkControlFlowInstructionForLoop 」を表す有効なポインタであり、そのには「Parameter loop」パラメータが含まれている必要があります。
戻り値
QkSymbolInfo シンボル情報を格納する構造体。 qk_str_free呼び出し元は、. を使用して、フィールド name 内の返された文字列を解放する必要があります。
qk_control_flow_loop_variable
const QkVar *qk_control_flow_loop_variable(const QkControlFlowInstruction *cf_inst)
ForLoop の制御フロー命令からループ変数を取得します。
この関数は、 ForLoop 命令のループパラメータとして使用されるVariable(QkVar)へのポインタを取得します。 返されるポインタは、制御フロー命令の実行期間中のみ借用されるものであり、呼び出し元がこれを解放してはならない。
が、変数ループパラメータを持つ ForLoop の制御フロー命令でない場合 cf_inst 、エラーが発生します。
例
// 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安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – ループパラメータが可変である ForLoop を表す、有効なポインタ。
QkControlFlowInstruction
戻り値
ループ変 QkVar 数を表すポインタ。 このポインタは、制御フロー命令の存続期間中、有効です。
qk_control_flow_switch_target_type
QkConditionType qk_control_flow_switch_target_type(const QkControlFlowInstruction *cf_inst)
Switch制御フロー命令のSwitchターゲットの型を取得します。
switch文は、古典的なビット、古典的なレジスタ、あるいは式など、さまざまな種類の対象に対して処理を行うことができます。 この関数は、Switch文がどのタイプのターゲットを使用しているかを返します。
が Switch 制御フロー命令でない場合 cf_inst 、パニックが発生します。
例
// 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;
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。 制御フロー命令は、Switch 型でなければなりません。
戻り値
Switchターゲットの条件タイプは QkConditionType. です。
qk_control_flow_switch_target_bit
uint32_t qk_control_flow_switch_target_bit(const QkControlFlowInstruction *cf_inst)
Switchターゲットのクラシックビットインデックスを取得します。
この関数は、Switch文のターゲットが古典ビットである場合に、そのSwitch文が操作する古典ビットのインデックスを取得します。
が、従来のビットターゲットを持つSwitch制御フロー命令でない場合 cf_inst 、パニックが発生する。
例
// 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);安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。 制御フロー命令は、従来のビットターゲットを持つSwitch型の命令でなければなりません。
戻り値
回路内の古典ビットのインデックス。
qk_control_flow_switch_target_register
const QkClassicalRegister *qk_control_flow_switch_target_register(const QkControlFlowInstruction *cf_inst)
Switch文が操作対象とする古典的なレジスタを取得します。
この関数は、Switchがレジスタに対して操作を行う際に、Switchのターゲットとして使用される古典的なレジスタを取得します。
が、レジスタをターゲットとするSwitch制御フロー命令でない場合 cf_inst 、エラーが発生します。
例
// 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...安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。 制御フロー命令は、レジスタをターゲットとするSwitch型の命令でなければなりません。
戻り値
QkClassicalRegister Switch が操作対象とする へのポインタ。 その制御フロー命令が存在する限り、レジスタは有効です。 このレジスタは制御フロー命令によって所有されており、呼び出し元が解放してはならない。
qk_control_flow_switch_target_expr
const QkExprNode *qk_control_flow_switch_target_expr(const QkControlFlowInstruction *cf_inst)
Switchターゲットの式を取得します。
この関数は、Switch文のターゲットが式である場合に、Switch文が操作する従来の式へのポインタを取得します。
が、式をターゲットとするSwitch制御フロー命令でない場合 cf_inst 、パニックが発生します。
例
// 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...安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。 制御フロー命令は、式をターゲットとするSwitch型の命令でなければなりません。
戻り値
Switchの QkExpr ターゲット式を表すポインタ。 その式は、制御フロー命令が存在する限り有効です。 この式は制御フロー命令に属しており、呼び出し元が解放してはならない。
qk_control_flow_switch_num_cases
size_t qk_control_flow_switch_num_cases(const QkControlFlowInstruction *cf_inst)
Switch文内のケース数を取得します。
Switch文に含まれるcaseブロックの総数を返します。デフォルトのcaseがある場合は、それも含まれます。
が Switch 制御フロー命令でない場合 cf_inst 、パニックが発生します。
例
// 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...
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。 制御フロー命令は、Switch 型でなければなりません。
戻り値
Switch文内のケースの数。
qk_control_flow_switch_is_case_default
bool qk_control_flow_switch_is_case_default(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Switch文内の特定のケースがデフォルトのケースであるかどうかを確認します。
switch文には、他のどのケースにも一致しない場合に適用されるデフォルトのケースを指定することができます。 この関数は、指定されたインデックスにあるケースがデフォルトのケースであるかどうかを確認します。 デフォルトのケースには先頭のラベルが含まれている場合もあり、これらはデフォルトのケースに対して を実行することで qk_control_flow_switch_case_labels_uint 取得できます。
が Switch 制御フロー命令でない場合 cf_inst 、パニックが発生します。
例
// 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);
}
}安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。 制御フロー命令は、Switch 型でなければなりません。
- case_idx – 確認するケースのインデックス。
qk_control_flow_switch_num_cases. によって返される値よりも小さくなければならない。
戻り値
true が case_idx デフォルトの場合、 false そうでない場合は。
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)
Switchのcase文でラベルを表現するために必要な最大ビット幅を取得します。
この関数は、指定されたケースにおいて、符号なし整数のラベルのいずれかを表現するために必要な最大ビット数を返します。 これは、ケースラベルを保存または処理するために必要な最小ビット幅を決定するのに役立ちます。
が Switch 制御フロー命令でない場合 cf_inst 、パニックが発生します。
例
// 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);安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。 制御フロー命令は、Switch 型でなければなりません。
- case_idx – ラベルのビット幅を取得するケースのインデックス。
qk_control_flow_switch_num_cases. によって返される値よりも小さくなければならない。
戻り値
ケース内のラベルの最大ビット幅。ただし、ケースに符号なし整数ラベルが含まれていない場合(たとえば、DEFAULT指定子のみの場合)は0となる。
qk_control_flow_switch_case_labels_uint
QkSwitchCaseLabels qk_control_flow_switch_case_labels_uint(const QkControlFlowInstruction *cf_inst, size_t case_idx)
Switch文内で、特定のケースに対応するラベルを取得する。
case(1, 2, 3)Switch文の各caseには、1つ以上のラベルを指定できます(例:には、1、2、3の3つのラベルがあります)。 この関数は、指定されたケースのすべてのラベルを取得します。 なお、デフォルトの場合でもラベルが含まれることがあり、この関数によってそれらを取得することができます。 追加のラベルを指定せずにデフォルトのケースが呼び出された場合、この関数は、返される QkSwitchCaseLabels struct 内の labels = NULL および を設定 num_labels = 0 します。 uint64_tこの関数を呼び出す前に、ラベルが に収まることを確認するために を使用 qk_control_flow_switch_case_labels_bit_width してください。
uint64_tが Switch の制御フロー命令でない場合 cf_inst 、または case ラベルが に収まらない場合、エラーが発生します。
例
// 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);安全
QkControlFlowInstructionがへの有効なポインタでない場合 cf_inst 、またはが QkSwitchCaseLabels への有効なポインタでない場合 out_labels 、その挙動は未定義となる。
パラメーター
- cf_inst – 制御フロー命令へのポインタ。 制御フロー命令は、Switch 型でなければなりません。
- case_idx – ラベルを取得するケースのインデックス。
qk_control_flow_switch_num_cases. によって返される値よりも小さくなければならない。
戻り値
指定されたケースに関するラベル情報を格納した構造体 QkSwitchCaseLabels 。 この構造体には、ラベルの配列へのポインタと、ラベルの数が格納されます。 num_labels > 0その場合は、この関数によって割り当てられたメモリを解放するために を呼び出す qk_control_flow_switch_case_labels_clear 必要があります。
qk_control_flow_switch_case_labels_clear
void qk_control_flow_switch_case_labels_clear(QkSwitchCaseLabels *labels)
構造体を QkSwitchCaseLabels クリアする。
qk_control_flow_switch_case_labels_uintこの関数は、によって割り当てられたメモリを解放するために呼び出す必要があります。 この関数を呼び出すと、構造体内のlabelsポインタはnullに設定され、countは0に設定されます。
例
// 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);安全
QkSwitchCaseLabelsがへの有効なポインタでない場合 labels 、その挙動は未定義となる。
パラメーター
- labels – クリアする構造体
QkSwitchCaseLabelsへのポインタ。qk_control_flow_switch_case_labels_uintその構造体には、あらかじめ値が設定されている必要があります。