uniqc.originir.originir_line_parser module#
OriginIR line parser module.
This module provides regex-based parsing for individual OriginIR lines, supporting 1-3 qubit gates, parameterized gates, dagger flags, and control qubits.
- Key exports:
OriginIR_LineParser: Parser class for individual OriginIR lines.
- class uniqc.originir.originir_line_parser.OriginIR_LineParser[source]#
Bases:
objectParser for individual OriginIR lines.
Provides regex-based parsing for OriginIR gate statements with support for 1-3 qubit gates, parameterized gates, dagger flags, and control qubits.
- blank = ' *'#
- cid = 'c *\\[ *(\\d+) *\\]'#
- comma = ','#
- control_qubits = ' *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?'#
- dagger_flag = ' *(dagger *)?'#
- static handle_1q(line)[source]#
Parse a 1-qubit gate line.
- Returns:
(operation, qubit, dagger_flag, control_qubits)
- Return type:
- static handle_1q1p(line)[source]#
Parse a 1-qubit 1-parameter gate line.
- Returns:
(operation, qubit, parameter, dagger_flag, control_qubits)
- Return type:
- static handle_1q2p(line)[source]#
Parse a 1-qubit 2-parameter gate line.
- Returns:
(operation, qubit, [p1, p2], dagger_flag, control_qubits)
- Return type:
- static handle_1q3p(line)[source]#
Parse a 1-qubit 3-parameter gate line.
- Returns:
(operation, qubit, [p1, p2, p3], dagger_flag, control_qubits)
- Return type:
- static handle_1q4p(line)[source]#
Parse a 1-qubit 4-parameter gate line.
- Returns:
(operation, qubit, [p1, p2, p3, p4], dagger_flag, control_qubits)
- Return type:
- static handle_2q(line)[source]#
Parse a 2-qubit gate line.
- Returns:
(operation, [q1, q2], dagger_flag, control_qubits)
- Return type:
- static handle_2q15p(line)[source]#
Parse a 2-qubit 15-parameter gate line.
- Returns:
(operation, [q1, q2], parameters, dagger_flag, control_qubits)
- Return type:
- static handle_2q1p(line)[source]#
Parse a 2-qubit 1-parameter gate line.
- Returns:
(operation, [q1, q2], parameter, dagger_flag, control_qubits)
- Return type:
- static handle_2q3p(line)[source]#
Parse a 2-qubit 3-parameter gate line.
- Returns:
(operation, [q1, q2], [p1, p2, p3], dagger_flag, control_qubits)
- Return type:
- static handle_3q(line)[source]#
Parse a 3-qubit gate line.
- Returns:
(operation, [q1, q2, q3], dagger_flag, control_qubits)
- Return type:
- static handle_barrier(line)[source]#
Parse a BARRIER statement line.
- Returns:
(“BARRIER”, qubit_indices)
- Return type:
- static handle_control(line)[source]#
Parse a line to extract control qubits information and the type of control operation.
This function analyzes a given line of text to identify and extract information about control qubits and determine whether the line represents the beginning of a control operation (CONTROL) or the end of a control operation (ENDCONTROL) in OriginIR language.
- Parameters:
line (str) – The line of text to be parsed for control qubit information.
- Returns:
A tuple where the first element is a string indicating the control operation type (“CONTROL” or “ENDCONTROL”) and the second element is a list of integers representing the parsed control qubits.
- Return type:
Notes
The function relies on the regexp_control regular expression to match the CONTROL or ENDCONTROL patterns in OriginIR language. This regular expression should be predefined and properly constructed to capture the necessary information from the line.
- static handle_dagger(line)[source]#
Parse a line to identify DAGGER or ENDDAGGER commands in OriginIR.
This function checks a line of text to determine if it contains a command related to the start or end of a DAGGER operation block in the OriginIR language.
- Parameters:
line (str) – The line of text to be parsed.
- Returns:
Returns “DAGGER” if the line is a DAGGER command, “ENDDAGGER” if it’s an ENDDAGGER command, or None if neither command is present.
- Return type:
str or None
Notes
The DAGGER command in OriginIR denotes the start of a block where the operations are to be applied in reverse order with conjugate transposition (dagger operation). The ENDDAGGER command signifies the end of such a block.
- static handle_def(line)[source]#
Parse a DEF block header line.
Format: DEF name(q[0], q[1], …) (param1, param2, …)
- Returns:
(operation=”DEF”, qubits_list, params_list, name)
- Return type:
- static handle_measure(line)[source]#
Parse a MEASURE statement line.
- Returns:
(qubit, cbit)
- Return type:
- lbracket = '\\('#
- opname = '([A-Za-z][A-Za-z\\d]*)'#
- param_list = '( *[A-Za-z_][A-Za-z0-9_]* *,)* *[A-Za-z_][A-Za-z0-9_]* *'#
- param_name = '[A-Za-z_][A-Za-z0-9_]*'#
- parameter = '([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?)'#
- static parse_line(line)[source]#
Parse a single OriginIR line and return operation details.
- Parameters:
line – Single line of OriginIR code.
- Returns:
(operation, qubits, cbit, parameter, dagger_flag, control_qubits)
- Return type:
- qid = 'q *\\[ *(\\d+) *\\]'#
- qid_list = '( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *'#
- rbracket = '\\)'#
- regexp_1q = re.compile('^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$')#
- regexp_1q1p = re.compile('^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *\\) *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$')#
- regexp_1q1p_str = '^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *\\) *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$'#
- regexp_1q2p = re.compile('^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *\\) *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)*)#
- regexp_1q2p_str = '^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *\\) *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$'#
- regexp_1q3p = re.compile('^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *\\) *(dagger *)? *(con)#
- regexp_1q3p_str = '^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *\\) *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$'#
- regexp_1q4p = re.compile('^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*))#
- regexp_1q4p_str = '^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *\\) *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$'#
- regexp_1q_str = '^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$'#
- regexp_2q = re.compile('^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *q *\\[ *(\\d+) *\\] *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$')#
- regexp_2q15p = re.compile('^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?))#
- regexp_2q15p_str = '^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *\\) *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$'#
- regexp_2q1p = re.compile('^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *\\) *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *)#
- regexp_2q1p_str = '^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *\\) *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$'#
- regexp_2q3p = re.compile('^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?))#
- regexp_2q3p_str = '^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *q *\\[ *(\\d+) *\\] *, *\\( *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *, *([-+]?\\d+(\\.\\d*)?([eE][-+]?\\d+)?) *\\) *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$'#
- regexp_2q_str = '^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *q *\\[ *(\\d+) *\\] *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$'#
- regexp_3q = re.compile('^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *q *\\[ *(\\d+) *\\] *, *q *\\[ *(\\d+) *\\] *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$')#
- regexp_3q_str = '^([A-Za-z][A-Za-z\\d]*) *q *\\[ *(\\d+) *\\] *, *q *\\[ *(\\d+) *\\] *, *q *\\[ *(\\d+) *\\] *(dagger *)? *(controlled_by *\\(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *\\) *)?$'#
- regexp_barrier = re.compile('^BARRIER(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *)$')#
- regexp_barrier_str = '^BARRIER(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *)$'#
- regexp_control = re.compile('^(CONTROL|ENDCONTROL)(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *)$')#
- regexp_control_str = '^(CONTROL|ENDCONTROL)(( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] *)$'#
- regexp_def = re.compile('^DEF *([A-Za-z_][A-Za-z0-9_]*) *\\( *( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] * *\\)(?: *\\( *( *[A-Za-z_][A-Za-z0-9_]* *,)* *[A-Za-z_][A-Za-z0-9_]* * *\\))?$')#
- regexp_def_str = '^DEF *([A-Za-z_][A-Za-z0-9_]*) *\\( *( *q *\\[ *(\\d+) *\\] *,)* *q *\\[ *(\\d+) *\\] * *\\)(?: *\\( *( *[A-Za-z_][A-Za-z0-9_]* *,)* *[A-Za-z_][A-Za-z0-9_]* * *\\))?$'#
- regexp_enddef = re.compile('^ENDDEF$')#
- regexp_enddef_str = '^ENDDEF$'#
- regexp_meas = re.compile('^MEASURE *q *\\[ *(\\d+) *\\] *, *c *\\[ *(\\d+) *\\]$')#
- regexp_measure_str = '^MEASURE *q *\\[ *(\\d+) *\\] *, *c *\\[ *(\\d+) *\\]$'#
- regexp_qid = re.compile('q *\\[ *(\\d+) *\\]')#