diff --git a/src/bloqade/squin/op/stmts.py b/src/bloqade/squin/op/stmts.py index 9a2437f4..a17dd6e7 100644 --- a/src/bloqade/squin/op/stmts.py +++ b/src/bloqade/squin/op/stmts.py @@ -103,6 +103,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): """ @@ -138,6 +146,18 @@ 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: + 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) class X(PauliOp): pass diff --git a/src/bloqade/squin/qubit.py b/src/bloqade/squin/qubit.py index c796b2af..b18fc710 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()})