Concepts ======== While most toolkits represent quantum circuit gates along with their mathematical representations, at this level of abstraction we can take a very high-level view. All data structures are immutable once constructed. Gate Definitions ---------------- We represent a gate with a very simplistic approximation: just enough information to recreate the gate in a toolkit and provide enough information for translation. Thus we only care about three items for a GateDef: * The gate *name* (such as `H`, `HGate`, `CX`, etc) * The names of the gate's arguments (`theta`, `phi`) * A set of bit IDs that the gate operates on GateDefs can be bound in various ways: * A gate with all arguments bound is a Gate * A gate with all arguments and qubits bound is an Instruction * A gate with *partial* (or full) argument bindings can be used as part of a pattern for matching. This allows a translation rule to match, say, `RX(pi)` to a negation, while still mapping `RX({})` to other instructions. This is not currently fully explored. Dialects -------- Dialects are simply a name and a set of GateDefs. Circuits -------- Circuits are comprised of a dialect name, a sequence of instructions, and a set of bits that the circuit operates on. TranslationRules ---------------- A TranslationRule is a pattern and a replacement, which encodes rules for mapping arguments. TranslationSet -------------- And predictably, a TranslationSet represents a mapping from one Dialect to another.