From c05275b95173a1bbf18ea2d09fda8cba9b08a090 Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Thu, 24 Apr 2025 16:16:13 -0400 Subject: [PATCH 1/6] adding Broadcast statement --- src/bloqade/squin/op/stmts.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/bloqade/squin/op/stmts.py b/src/bloqade/squin/op/stmts.py index 9a2437f..98923bc 100644 --- a/src/bloqade/squin/op/stmts.py +++ b/src/bloqade/squin/op/stmts.py @@ -22,6 +22,15 @@ class CompositeOp(Operator): pass +@statement(dialect=dialect) +class Broadcast(CompositeOp): + traits = frozenset( + {ir.Pure(), lowering.FromPythonCall(), MaybeUnitary(), HasSites()} + ) + is_unitary: bool = info.attribute(default=False) + op: ir.SSAValue = info.argument(OpType) + + @statement class BinaryOp(CompositeOp): lhs: ir.SSAValue = info.argument(OpType) From 47255d5a941357896c5f699559d9071a6b57968b Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Thu, 24 Apr 2025 16:18:02 -0400 Subject: [PATCH 2/6] add docs --- src/bloqade/squin/op/stmts.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bloqade/squin/op/stmts.py b/src/bloqade/squin/op/stmts.py index 98923bc..4973c97 100644 --- a/src/bloqade/squin/op/stmts.py +++ b/src/bloqade/squin/op/stmts.py @@ -24,6 +24,8 @@ class CompositeOp(Operator): @statement(dialect=dialect) class Broadcast(CompositeOp): + """This takes an operator and allows it to be applied to a list of qubits.""" + traits = frozenset( {ir.Pure(), lowering.FromPythonCall(), MaybeUnitary(), HasSites()} ) From 25dadd4ecb8402c93a66a0edb78d0a48478c19a4 Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Thu, 24 Apr 2025 16:27:10 -0400 Subject: [PATCH 3/6] adding other statements --- src/bloqade/squin/op/stmts.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/bloqade/squin/op/stmts.py b/src/bloqade/squin/op/stmts.py index 4973c97..7956b92 100644 --- a/src/bloqade/squin/op/stmts.py +++ b/src/bloqade/squin/op/stmts.py @@ -114,6 +114,14 @@ class ConstantUnitary(ConstantOp): ) +class U3(PrimitiveOp): + traits = frozenset({ir.Pure(), lowering.FromPythonCall(), Unitary(), FixedSites(1)}) + theta: ir.SSAValue = info.argument(types.Float) + phi: ir.SSAValue = info.argument(types.Float) + lam: ir.SSAValue = info.argument(types.Float) + result: ir.ResultValue = info.result(OpType) + + @statement(dialect=dialect) class PhaseOp(PrimitiveOp): """ @@ -149,6 +157,16 @@ class PauliOp(ConstantUnitary): pass +@statement(dialect=dialect) +class CliffordString(ConstantUnitary): + traits = frozenset({ir.Pure(), lowering.FromPythonCall(), Unitary(), HasSites()}) + string: str = info.attribute() + + def verify(self) -> None: + # TODO: implement verification of the Clifford string + pass + + @statement(dialect=dialect) class X(PauliOp): pass From 9e2edf6451b9c61d4d0cb3de9d1b590bd04da98c Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Fri, 25 Apr 2025 10:46:28 -0400 Subject: [PATCH 4/6] removing broadcast as operator --- src/bloqade/squin/op/stmts.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/bloqade/squin/op/stmts.py b/src/bloqade/squin/op/stmts.py index 7956b92..952c8b0 100644 --- a/src/bloqade/squin/op/stmts.py +++ b/src/bloqade/squin/op/stmts.py @@ -22,17 +22,6 @@ class CompositeOp(Operator): pass -@statement(dialect=dialect) -class Broadcast(CompositeOp): - """This takes an operator and allows it to be applied to a list of qubits.""" - - traits = frozenset( - {ir.Pure(), lowering.FromPythonCall(), MaybeUnitary(), HasSites()} - ) - is_unitary: bool = info.attribute(default=False) - op: ir.SSAValue = info.argument(OpType) - - @statement class BinaryOp(CompositeOp): lhs: ir.SSAValue = info.argument(OpType) From 36a7b7b2cd74ace6ce85357c3eb050cad0b0edf8 Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Fri, 25 Apr 2025 10:47:54 -0400 Subject: [PATCH 5/6] adding broadcast as apply statement --- src/bloqade/squin/qubit.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/bloqade/squin/qubit.py b/src/bloqade/squin/qubit.py index c796b2a..b18fc71 100644 --- a/src/bloqade/squin/qubit.py +++ b/src/bloqade/squin/qubit.py @@ -34,6 +34,13 @@ class Apply(ir.Statement): qubits: ir.SSAValue = info.argument(ilist.IListType[QubitType]) +@statement(dialect=dialect) +class Broadcast(ir.Statement): + traits = frozenset({lowering.FromPythonCall()}) + operator: ir.SSAValue = info.argument(OpType) + qubits: ir.SSAValue = info.argument(ilist.IListType[QubitType]) + + @statement(dialect=dialect) class Measure(ir.Statement): traits = frozenset({lowering.FromPythonCall()}) From d9f62f2ba1112f636a090b3cb26afa3f657207b2 Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Fri, 25 Apr 2025 10:55:50 -0400 Subject: [PATCH 6/6] adding verify for CliffordString --- src/bloqade/squin/op/stmts.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/bloqade/squin/op/stmts.py b/src/bloqade/squin/op/stmts.py index 952c8b0..a17dd6e 100644 --- a/src/bloqade/squin/op/stmts.py +++ b/src/bloqade/squin/op/stmts.py @@ -152,8 +152,10 @@ class CliffordString(ConstantUnitary): string: str = info.attribute() def verify(self) -> None: - # TODO: implement verification of the Clifford string - pass + if not set("XYZHS").issuperset(self.string): + raise ValueError( + f"Invalid Clifford string: {self.string}. Must be a combination of 'X', 'Y', 'Z', 'H', and 'S'." + ) @statement(dialect=dialect)