diff --git a/.github/workflows/pytest.yml b/.github/workflows/pytest.yml
index 65838077..12ff5ddb 100644
--- a/.github/workflows/pytest.yml
+++ b/.github/workflows/pytest.yml
@@ -39,4 +39,4 @@ jobs:
uv sync --extra tests
- name: Run tests
run: |
- uv run pytest tests/test_frontend tests/test_analog tests/test_analysis -v
+ uv run pytest tests/ -v
diff --git a/.gitignore b/.gitignore
index 103aadc1..030cec62 100644
--- a/.gitignore
+++ b/.gitignore
@@ -179,4 +179,5 @@ tests/test.bat
.pre-commit-config.yaml
-*.antlr/
\ No newline at end of file
+*.antlr/
+examples/*
diff --git a/docs/analysis/analog_analysis.md b/docs/analysis/analog_analysis.md
index 17cf4c63..e4e0952d 100644
--- a/docs/analysis/analog_analysis.md
+++ b/docs/analysis/analog_analysis.md
@@ -40,4 +40,4 @@ symbol_table = AnalogSymbolTableBuilder(cfg, type_checker.dataflow_result).symbo
///
-The type checker dataflow result is available at `type_checker.dataflow_result`.
+The type checker dataflow result is available at `type_checker.dataflow_result`. This result is used to build the Symbol Table. Note that the Symbol Table will run the Type Checker to get the dataflow result if the result is not provided.
diff --git a/docs/analysis/atomic_analysis.md b/docs/analysis/atomic_analysis.md
index a79afbbd..c556c0d7 100644
--- a/docs/analysis/atomic_analysis.md
+++ b/docs/analysis/atomic_analysis.md
@@ -10,6 +10,13 @@ The atomic Control Flow Graph (CFG) is implemented by the `AtomicCFGBuilder` cla
The atomic type checker is implemented by the `AtomicTypeChecker` class in [`type_checker.py`](../../src/oqd_core/analysis/atomic/type_checker.py). The `AtomicTypeLattice` class defines a concrete lattice for atomic types with `leq`, `join`, and `meet` methods. Type inference rules are implemented by the `AtomicSemantics` class in [`semantics.py`](../../src/oqd_core/analysis/atomic/semantics.py). The type checker runs forward dataflow analysis over the CFG.
+Protocol blocks (`parallel` / `serial`) accept only pulse statements: `Pulse` nodes, pulse declarations, pulse variable references, and nested protocols. In `serial` blocks, pulse declarations update the local environment for later statements in the same block.
+
+## Symbol Table
+
+The atomic symbol table is implemented in [`symbol_table.py`](../../src/oqd_core/analysis/atomic/symbol_table.py). The `AtomicSymbolTableBuilder` class runs a second forward dataflow pass over the CFG, using the type checker output to track register and target dimensions. The result is an `AtomicSymbolTable` with register environments per block and a statement index.
+
+`SymbolBinding.target_dim` is an `int` giving the total ion-target dimension (register size, extracted ion, or sum of list elements). Unlike the analog symbol table, atomic targets do not use a `(qreg, qmode)` tuple.
## Usage of the type checker
@@ -19,7 +26,7 @@ The atomic type checker is implemented by the `AtomicTypeChecker` class in [`typ
```py
from oqd_core.frontend.atomic import parse_atomic
-from oqd_core.analysis.atomic import AtomicCFGBuilder, AtomicTypeChecker
+from oqd_core.analysis.atomic import AtomicCFGBuilder, AtomicTypeChecker, AtomicSymbolTableBuilder
source = """
ions = ionreg(1)
@@ -30,8 +37,9 @@ pulse(mw, 1e-5, ions[0], true)
circuit = parse_atomic(source)
cfg = AtomicCFGBuilder().run(circuit)
type_checker = AtomicTypeChecker(cfg)
+symbol_table = AtomicSymbolTableBuilder(cfg, type_checker.dataflow_result).symbol_table
```
///
-The output of the type checker is stored in `type_checker.dataflow_result`.
+The type checker dataflow result is available at `type_checker.dataflow_result`. This result is used to build the Symbol Table. Note that the Symbol Table will run the Type Checker to get the dataflow result if the result is not provided.
diff --git a/docs/grammar/atomic_grammar.md b/docs/grammar/atomic_grammar.md
index 37b8630f..86fdaceb 100644
--- a/docs/grammar/atomic_grammar.md
+++ b/docs/grammar/atomic_grammar.md
@@ -70,9 +70,9 @@ The grammar supports the core atomic statements through `beam`, `pulse`, `parall
- `target`: target expression (`aexpr`)
- `measured`: boolean expression (`aexpr`), optional, defaults to `false`
- `parallel { ... }`
- - `...`: block (`block`) containing pulse statements to run in parallel
+ - `...`: block (`block`) containing pulse statements, pulse declarations, pulse references, and nested protocols that will be run in parallel.
- `serial { ... }`
- - `...`: block (`block`) containing pulse statements to run in serial
+ - `...`: block (`block`) containing pulse statements, pulse declarations, pulse references, and nested protocols that will be run in a serial sequence.
## Generate Parser Files for Frontend
diff --git a/docs/interfaces/analog_interface.md b/docs/interfaces/analog_interface.md
index 764b2874..90015e78 100644
--- a/docs/interfaces/analog_interface.md
+++ b/docs/interfaces/analog_interface.md
@@ -41,13 +41,13 @@ The basis of operators for the bosonic degree of freedom are the ladder operator
The basis operators can be combined with the operations:
-- Addition
[][oqd_core.interface.analog.expr.OperatorAdd]
+- Addition [][oqd_core.interface.analog.expr.OperatorExprAdd]
-- Subtraction [][oqd_core.interface.analog.expr.OperatorSub]
+- Subtraction [][oqd_core.interface.analog.expr.OperatorExprSub]
-- Multiplication [][oqd_core.interface.analog.expr.OperatorMul]
+- Multiplication [][oqd_core.interface.analog.expr.OperatorExprMul]
-- Tensor Product [][oqd_core.interface.analog.expr.OperatorKron]
+- Tensor Product [][oqd_core.interface.analog.expr.OperatorExprKron]
## Math Expressions
diff --git a/docs/interfaces/atomic_interface.md b/docs/interfaces/atomic_interface.md
index ac51b572..e98017fa 100644
--- a/docs/interfaces/atomic_interface.md
+++ b/docs/interfaces/atomic_interface.md
@@ -84,7 +84,7 @@ The [`AtomicCircuit`][oqd_core.interface.atomic.circuit.AtomicCircuit] is the to
type: example
```py
-from oqd_core.interface.atomic import AtomicCircuit, Beam
+from oqd_core.interface.atomic import AtomicCircuit, Beam, Access
circuit = AtomicCircuit()
@@ -96,7 +96,8 @@ mw = Beam(
wavevector=[0.0, 0.0, 1.0],
)
-circuit.pulse(duration=10e-6, target=0, beam=mw, measured=False)
+ions = Access(name="ions")
+circuit.pulse(beam=mw, duration=10e-6, target=ions, measured=False)
```
///
diff --git a/docs/reference/analog_compiler.md b/docs/reference/analog_compiler.md
index 2204268b..7a64a3b9 100644
--- a/docs/reference/analog_compiler.md
+++ b/docs/reference/analog_compiler.md
@@ -1,12 +1,12 @@
# Analog Compiler
-The analog compiler is implemented in `src/oqd_core/compiler/analog`. The entry point is [`compile_analog_circuit`][oqd_core.compiler.analog.passes.compile.compile_analog_circuit], which takes an [`AnalogCircuit`][oqd_core.interface.analog.circuit.AnalogCircuit], a `ControlFlowGraph`, and an `AnalogSymbolTable`.
+The analog compiler is implemented in `src/oqd_core/compiler/analog`. The entry point is [`compile_analog_circuit`][oqd_core.compiler.analog.passes.compile.compile_analog_circuit], which takes an [`AnalogCircuit`][oqd_core.interface.analog.circuit.AnalogCircuit], a [`ControlFlowGraph`][oqd_core.analysis.utils.control_flow.ControlFlowGraph], and an `AnalogSymbolTable`[oqd_core.analysis.analog.symbol_table.AnalogSymbolTable].
The compile pipeline:
- Canonicalize operators over the CFG via [`canonicalize_operators_cfg`][oqd_core.compiler.analog.cfg_passes.walk.canonicalize_operators_cfg]
- Canonicalize math expressions over the CFG via [`canonicalize_math_cfg`][oqd_core.compiler.analog.cfg_passes.walk.canonicalize_math_cfg]
- Verify register access and Hamiltonian target dimensions
-- Infer circuit Hilbert space dimensions from canonicalized `Evolve` statements
+- Infer Hilbert space dimensions from canonicalized `Evolve` statements
## Compile Passes
@@ -122,5 +122,5 @@ circuit = parse_analog(source)
cfg = AnalogCFGBuilder().run(circuit)
type_checker = AnalogTypeChecker(cfg)
symbol_table = AnalogSymbolTableBuilder(cfg, type_checker.dataflow_result).symbol_table
-circuit, (n_qreg, n_qmode) = compile_analog_circuit(circuit, cfg, symbol_table)
+circuit, cfg, n_qreg, n_qmode = compile_analog_circuit(circuit, cfg, symbol_table)
```
diff --git a/docs/reference/analog_interface.md b/docs/reference/analog_interface.md
index a73818da..e50ea2f1 100644
--- a/docs/reference/analog_interface.md
+++ b/docs/reference/analog_interface.md
@@ -16,6 +16,9 @@
options:
heading_level: 3
members: [
+ "OperatorExpr",
+ "OperatorBinaryOp",
+ "OperatorTerminal",
"AnalogExpr",
"AnalogExprSubtypes",
"CastAnalogExpr",
diff --git a/docs/reference/atomic_canonicalization.md b/docs/reference/atomic_canonicalization.md
deleted file mode 100644
index d97484e6..00000000
--- a/docs/reference/atomic_canonicalization.md
+++ /dev/null
@@ -1 +0,0 @@
-::: oqd_core.compiler.atomic
diff --git a/docs/reference/atomic_compiler.md b/docs/reference/atomic_compiler.md
new file mode 100644
index 00000000..9b6d97ab
--- /dev/null
+++ b/docs/reference/atomic_compiler.md
@@ -0,0 +1,117 @@
+# Atomic Compiler
+
+The atomic compiler is implemented in `src/oqd_core/compiler/atomic`. The entry point is [`compile_atomic_circuit`][oqd_core.compiler.atomic.passes.compile.compile_atomic_circuit], which takes an [`AtomicCircuit`][oqd_core.interface.atomic.circuit.AtomicCircuit], a [`ControlFlowGraph`][oqd_core.analysis.utils.control_flow.ControlFlowGraph] and an [`AtomicSymbolTable`][oqd_core.analysis.atomic.symbol_table.AtomicSymbolTable].
+
+The compile pipeline:
+- Canonicalize declaration values over the CFG via [`canonicalize_declarations_cfg`][oqd_core.compiler.atomic.cfg_passes.walk.canonicalize_declarations_cfg]
+- Canonicalize nested protocols and relative time via [`canonicalize_protocol_cfg`][oqd_core.compiler.atomic.cfg_passes.protocol.canonicalize_protocol_cfg]
+- Rebuild the CFG from the updated circuit via [`AtomicCFGBuilder`][oqd_core.analysis.atomic.cfg.AtomicCFGBuilder]
+- Re-run the type checker and symbol table on the rebuilt CFG
+- Verify pulse target dimensions via [`verify_pulse_target_dim`][oqd_core.compiler.atomic.verify.passes.verify_pulse_target_dim]
+
+## Compile Passes
+
+
+::: oqd_core.compiler.atomic.passes.compile
+ options:
+ heading_level: 3
+ members: [
+ "compile_atomic_circuit",
+ ]
+
+## CFG Passes
+
+
+::: oqd_core.compiler.atomic.cfg_passes.walk
+ options:
+ heading_level: 3
+ members: [
+ "iter_stmt_blocks",
+ "canonicalize_declarations_cfg",
+ "canonicalize_beam",
+ "canonicalize_scalar_expr",
+ ]
+
+::: oqd_core.compiler.atomic.cfg_passes.protocol
+ options:
+ heading_level: 3
+ members: [
+ "apply_protocol_passes",
+ "canonicalize_protocol_tree",
+ "canonicalize_protocol_circuit",
+ ]
+
+::: oqd_core.compiler.atomic.cfg_passes.resolve
+ options:
+ heading_level: 3
+ members: [
+ "resolve_scalar_expr",
+ "resolve_beam_expr",
+ "resolve_beam_ref",
+ "resolve_pulse_expr",
+ "resolve_pulse_ref",
+ "resolve_protocol_pulses",
+ ]
+
+## Verification Passes
+
+
+::: oqd_core.compiler.atomic.verify.passes
+ options:
+ heading_level: 3
+ members: [
+ "verify_pulse_target_dim",
+ ]
+
+## Atomic Math Passes
+
+
+::: oqd_core.compiler.atomic.math.passes
+ options:
+ heading_level: 3
+ members: [
+ "canonicalize_math_expr",
+ "evaluate_math_expr",
+ "simplify_math_expr",
+ "print_math_expr",
+ ]
+
+## Atomic Math Rewrite Rules
+
+
+::: oqd_core.compiler.atomic.math.rules
+ options:
+ heading_level: 3
+ members: [
+ "DistributeMathExpr",
+ "PartitionMathExpr",
+ "ProperOrderMathExpr",
+ "PruneMathExpr",
+ "EvaluateMathExpr",
+ "SimplifyMathExpr",
+ "PrintMathExpr",
+ ]
+
+## Usage
+
+
+
+/// admonition | Example
+ type: example
+```py
+from oqd_core.frontend.atomic import parse_atomic
+from oqd_core.analysis.atomic import AtomicCFGBuilder, AtomicTypeChecker, AtomicSymbolTableBuilder
+from oqd_core.compiler.atomic.passes.compile import compile_atomic_circuit
+
+source = """
+ions = ionreg(1)
+mw = beam(2.0, 1.0, 0.0, [1.0, 0.0, 0.0], [0.0, 0.0, 1.0])
+pulse(mw, 1e-5, ions[0], true)
+"""
+
+circuit = parse_atomic(source)
+cfg = AtomicCFGBuilder().run(circuit)
+type_checker = AtomicTypeChecker(cfg)
+symbol_table = AtomicSymbolTableBuilder(cfg, type_checker.dataflow_result).symbol_table
+circuit, cfg = compile_atomic_circuit(circuit, cfg, symbol_table, type_checker.dataflow_result)
+```
diff --git a/docs/reference/atomic_interface.md b/docs/reference/atomic_interface.md
index 3fa4d91e..445c33b7 100644
--- a/docs/reference/atomic_interface.md
+++ b/docs/reference/atomic_interface.md
@@ -19,6 +19,10 @@
"AtomicExpr",
"AtomicExprSubtypes",
"CastAtomicExpr",
+ "IonExpr",
+ "CollectionExpr",
+ "IndexingExpr",
+ "RegisterExpr",
"Terminal",
"Access",
"IonRegister",
diff --git a/docs/reference/math_interface.md b/docs/reference/math_interface.md
deleted file mode 100644
index e69de29b..00000000
diff --git a/examples/analog/test.analog b/examples/analog/test.analog
index d452fbac..0650e435 100644
--- a/examples/analog/test.analog
+++ b/examples/analog/test.analog
@@ -35,7 +35,7 @@ if (x > 0){
initialize(r)
}
if (x == 1) {
- evolve(H_single, 1.0, r)
+ evolve(H_single, 1.0, q0)
}
else { evolve(H_pair, 0.5, r) }
n = 3
@@ -67,7 +67,7 @@ if (a > b) {
initialize(r)
// evolve(hamiltonian, duration, target)
-evolve(H_single, 2.0, r)
+evolve(H_single, 2.0, q1)
evolve(H_pair, 1.0, targets)
evolve(%X %* 0.5, pi, q0)
diff --git a/examples/analog/test.ipynb b/examples/analog/test.ipynb
index 7ec2d4d6..ffde8eab 100644
--- a/examples/analog/test.ipynb
+++ b/examples/analog/test.ipynb
@@ -34,111 +34,316 @@
"execution_count": 2,
"id": "1c5481c1",
"metadata": {},
+ "outputs": [],
+ "source": [
+ "from oqd_compiler_infrastructure import Post, PrettyPrint\n",
+ "\n",
+ "from oqd_core.analysis.analog.cfg import AnalogCFGBuilder\n",
+ "from oqd_core.analysis.analog.type_checker import AnalogTypeChecker\n",
+ "from oqd_core.frontend.analog import parse_analog\n",
+ "\n",
+ "printer = Post(PrettyPrint())\n",
+ "\n",
+ "with open(\"test.analog\", mode=\"r\", encoding=\"utf8\") as f:\n",
+ " source = f.read()\n",
+ "\n",
+ "circuit = parse_analog(source)\n",
+ "cfg = AnalogCFGBuilder().run(circuit)\n",
+ "checker = AnalogTypeChecker(cfg)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "08b33d2c",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "line 1:8 no viable alternative at input 'r = qreg['\n"
+ ]
+ }
+ ],
+ "source": [
+ "from oqd_core.frontend.analog import parse_analog\n",
+ "\n",
+ "program = \"r = qreg[2] \\n H_single = 0.5 %* %X %+ 0.5 %* %Z \\n evolve(H_single, 1.0, r[0])\"\n",
+ "circuit = parse_analog(program)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "f628d79e",
+ "metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "r = qreg(2)\n",
- "s = qmode(3)\n",
- "q0 = r[0]\n",
- "q1 = r[1]\n",
- "targets = [q0, q1]\n",
- "pi = 3.14159\n",
- "tau = 2 * pi\n",
- "omega = #omega\n",
- "phase = #t * omega + #phi\n",
- "neg = -1\n",
- "cubed = 2 ^ 3\n",
- "sine = sin(0.5)\n",
- "cosed = cos(phase)\n",
- "cplx = 1.0 + 1j * 0.5\n",
- "X = %X\n",
- "Y = %Y\n",
- "Z = %Z\n",
- "I = %I\n",
- "C = %C\n",
- "A = %A\n",
- "J = %J\n",
- "H_single = 0.5 %* %X %+ 0.5 %* %Z\n",
- "H_pair = %X %@ %I %+ %I %@ %X\n",
- "H_rabi = 0.5 * #t %* (%X %@ %I) %+ 0.5 %* (%I %@ %Y)\n",
- "x = 1\n",
- "if (x > 0) {\n",
- "initialize(r)\n",
- "}\n",
- "if (x == 1) {\n",
- "evolve(H_single, 1.0, r)\n",
- "} else {\n",
- "evolve(H_pair, 0.5, r)\n",
- "}\n",
- "n = 3\n",
- "while (n > 0) {\n",
- "evolve(H_rabi, 0.1, targets)\n",
- "n = n - 1\n",
- "}\n",
- "while (true) {\n",
- "if (x == 1) {\n",
- "break\n",
- "}\n",
- "}\n",
- "a = 5\n",
- "b = 3\n",
- "if (a > b) {\n",
- "if (b > 0) {\n",
- "initialize(targets)\n",
- "} else {\n",
- "measure(r)\n",
- "}\n",
- "}\n",
- "initialize(r)\n",
- "evolve(H_single, 2.0, r)\n",
- "evolve(H_pair, 1.0, targets)\n",
- "evolve(%X %* 0.5, pi, q0)\n",
- "measure(r)\n",
- "measurement = measure(q0)\n",
- "flag = 1\n",
- "if (flag != 0) {\n",
- "x = 0\n",
- "}\n",
- "if (x <= 1) {\n",
- "x = 1\n",
- "}\n",
- "if (x >= 0) {\n",
- "x = 0\n",
- "}\n",
- "a = true\n",
- "if (a) {\n",
- "b = 5\n",
- "}\n",
- "\n"
+ "\"in_env={0: {}, 1: {}, 2: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None)}, 3: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None)}, 4: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None)}, 5: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None)}, 6: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 7: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 8: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 9: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 10: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 11: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 12: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 13: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 14: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 15: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 16: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 17: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 18: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 19: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 20: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 21: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 22: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 23: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 24: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 25: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 26: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 27: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 28: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 29: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 30: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 31: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 32: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 33: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 34: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 35: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 36: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 37: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 38: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 39: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 40: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 41: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 42: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 43: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 44: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 45: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'targets': SymbolBinding(lattice_type=TList(elem=), target_dim=(2, 0), list_elem=SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None))}, 46: {'r': SymbolBinding(lattice_type=, target_dim=(2, 0), list_elem=None), 's': SymbolBinding(lattice_type=, target_dim=(0, 3), list_elem=None), 'q0': SymbolBinding(lattice_type=, target_dim=(1, 0), list_elem=None), 'q1': SymbolBinding(lattice_type=