111 template <
typename T =
void>
159 virtual bool equals(
const Node& rhs)
const = 0;
164 virtual bool operator==(
const Node& rhs)
const = 0;
170 return !(*
this == rhs);
178 virtual void visit_internal(
VisitorBase &visitor,
void *retval=
nullptr) = 0;
185 template <
typename T>
191 void dump(std::ostream &out=std::cout,
int indent=0);
197 void dump_seq(std::ostream &out=std::cout,
int indent=0);
203 virtual BitRefs *as_bit_refs();
209 virtual const BitRefs *as_bit_refs()
const;
221 virtual const ConstAxis *as_const_axis()
const;
233 virtual const ConstBool *as_const_bool()
const;
269 virtual const ConstInt *as_const_int()
const;
281 virtual const ConstJson *as_const_json()
const;
293 virtual const ConstReal *as_const_real()
const;
317 virtual const ConstString *as_const_string()
const;
329 virtual const Constant *as_constant()
const;
341 virtual const Function *as_function()
const;
353 virtual const QubitRefs *as_qubit_refs()
const;
365 virtual const Reference *as_reference()
const;
371 virtual VariableRef *as_variable_ref();
377 virtual const VariableRef *as_variable_ref()
const;
383 ::tree::cbor::MapWriter &map,
384 const ::tree::base::PointerMap &ids
391 const ::tree::cbor::MapReader &map,
392 ::tree::base::IdentifierMap &ids
413 const Reference *as_reference()
const override;
418 static std::shared_ptr<Reference>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
443 void find_reachable(::tree::base::PointerMap &map)
const override;
448 void check_complete(const ::tree::base::PointerMap &map)
const override;
460 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
468 BitRefs *as_bit_refs()
override;
474 const BitRefs *as_bit_refs()
const override;
489 bool equals(
const Node &rhs)
const override;
494 bool operator==(
const Node &rhs)
const override;
500 ::tree::cbor::MapWriter &map,
501 const ::tree::base::PointerMap &ids
507 static std::shared_ptr<BitRefs>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
527 const Constant *as_constant()
const override;
532 static std::shared_ptr<Constant>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
555 void find_reachable(::tree::base::PointerMap &map)
const override;
560 void check_complete(const ::tree::base::PointerMap &map)
const override;
572 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
586 const ConstAxis *as_const_axis()
const override;
601 bool equals(
const Node &rhs)
const override;
606 bool operator==(
const Node &rhs)
const override;
612 ::tree::cbor::MapWriter &map,
613 const ::tree::base::PointerMap &ids
619 static std::shared_ptr<ConstAxis>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
642 void find_reachable(::tree::base::PointerMap &map)
const override;
647 void check_complete(const ::tree::base::PointerMap &map)
const override;
659 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
673 const ConstBool *as_const_bool()
const override;
688 bool equals(
const Node &rhs)
const override;
693 bool operator==(
const Node &rhs)
const override;
699 ::tree::cbor::MapWriter &map,
700 const ::tree::base::PointerMap &ids
706 static std::shared_ptr<ConstBool>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
729 void find_reachable(::tree::base::PointerMap &map)
const override;
734 void check_complete(const ::tree::base::PointerMap &map)
const override;
746 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
775 bool equals(
const Node &rhs)
const override;
780 bool operator==(
const Node &rhs)
const override;
786 ::tree::cbor::MapWriter &map,
787 const ::tree::base::PointerMap &ids
793 static std::shared_ptr<ConstComplex>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
816 void find_reachable(::tree::base::PointerMap &map)
const override;
821 void check_complete(const ::tree::base::PointerMap &map)
const override;
833 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
862 bool equals(
const Node &rhs)
const override;
867 bool operator==(
const Node &rhs)
const override;
873 ::tree::cbor::MapWriter &map,
874 const ::tree::base::PointerMap &ids
880 static std::shared_ptr<ConstComplexMatrix>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
903 void find_reachable(::tree::base::PointerMap &map)
const override;
908 void check_complete(const ::tree::base::PointerMap &map)
const override;
920 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
934 const ConstInt *as_const_int()
const override;
949 bool equals(
const Node &rhs)
const override;
954 bool operator==(
const Node &rhs)
const override;
960 ::tree::cbor::MapWriter &map,
961 const ::tree::base::PointerMap &ids
967 static std::shared_ptr<ConstInt>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
990 void find_reachable(::tree::base::PointerMap &map)
const override;
995 void check_complete(const ::tree::base::PointerMap &map)
const override;
1007 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
1021 const ConstJson *as_const_json()
const override;
1036 bool equals(
const Node &rhs)
const override;
1041 bool operator==(
const Node &rhs)
const override;
1047 ::tree::cbor::MapWriter &map,
1048 const ::tree::base::PointerMap &ids
1054 static std::shared_ptr<ConstJson>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
1077 void find_reachable(::tree::base::PointerMap &map)
const override;
1082 void check_complete(const ::tree::base::PointerMap &map)
const override;
1094 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
1108 const ConstReal *as_const_real()
const override;
1123 bool equals(
const Node &rhs)
const override;
1128 bool operator==(
const Node &rhs)
const override;
1134 ::tree::cbor::MapWriter &map,
1135 const ::tree::base::PointerMap &ids
1141 static std::shared_ptr<ConstReal>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
1164 void find_reachable(::tree::base::PointerMap &map)
const override;
1169 void check_complete(const ::tree::base::PointerMap &map)
const override;
1181 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
1210 bool equals(
const Node &rhs)
const override;
1215 bool operator==(
const Node &rhs)
const override;
1221 ::tree::cbor::MapWriter &map,
1222 const ::tree::base::PointerMap &ids
1228 static std::shared_ptr<ConstRealMatrix>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
1251 void find_reachable(::tree::base::PointerMap &map)
const override;
1256 void check_complete(const ::tree::base::PointerMap &map)
const override;
1268 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
1282 const ConstString *as_const_string()
const override;
1297 bool equals(
const Node &rhs)
const override;
1302 bool operator==(
const Node &rhs)
const override;
1308 ::tree::cbor::MapWriter &map,
1309 const ::tree::base::PointerMap &ids
1315 static std::shared_ptr<ConstString>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
1350 void find_reachable(::tree::base::PointerMap &map)
const override;
1355 void check_complete(const ::tree::base::PointerMap &map)
const override;
1367 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
1381 const Function *as_function()
const override;
1396 bool equals(
const Node &rhs)
const override;
1401 bool operator==(
const Node &rhs)
const override;
1407 ::tree::cbor::MapWriter &map,
1408 const ::tree::base::PointerMap &ids
1414 static std::shared_ptr<Function>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
1438 void find_reachable(::tree::base::PointerMap &map)
const override;
1443 void check_complete(const ::tree::base::PointerMap &map)
const override;
1455 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
1469 const QubitRefs *as_qubit_refs()
const override;
1484 bool equals(
const Node &rhs)
const override;
1489 bool operator==(
const Node &rhs)
const override;
1495 ::tree::cbor::MapWriter &map,
1496 const ::tree::base::PointerMap &ids
1502 static std::shared_ptr<QubitRefs>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
1525 void find_reachable(::tree::base::PointerMap &map)
const override;
1530 void check_complete(const ::tree::base::PointerMap &map)
const override;
1542 void visit_internal(
VisitorBase &visitor,
void *retval)
override;
1550 VariableRef *as_variable_ref()
override;
1556 const VariableRef *as_variable_ref()
const override;
1571 bool equals(
const Node &rhs)
const override;
1576 bool operator==(
const Node &rhs)
const override;
1582 ::tree::cbor::MapWriter &map,
1583 const ::tree::base::PointerMap &ids
1589 static std::shared_ptr<VariableRef>
deserialize(const ::tree::cbor::MapReader &map, ::tree::base::IdentifierMap &ids);
1621 friend class VariableRef;
1626 virtual void raw_visit_node(
Node &node,
void *retval) = 0;
1631 virtual void raw_visit_bit_refs(
BitRefs &node,
void *retval) = 0;
1636 virtual void raw_visit_const_axis(
ConstAxis &node,
void *retval) = 0;
1641 virtual void raw_visit_const_bool(
ConstBool &node,
void *retval) = 0;
1646 virtual void raw_visit_const_complex(
ConstComplex &node,
void *retval) = 0;
1651 virtual void raw_visit_const_complex_matrix(
ConstComplexMatrix &node,
void *retval) = 0;
1656 virtual void raw_visit_const_int(
ConstInt &node,
void *retval) = 0;
1661 virtual void raw_visit_const_json(
ConstJson &node,
void *retval) = 0;
1666 virtual void raw_visit_const_real(
ConstReal &node,
void *retval) = 0;
1671 virtual void raw_visit_const_real_matrix(
ConstRealMatrix &node,
void *retval) = 0;
1676 virtual void raw_visit_const_string(
ConstString &node,
void *retval) = 0;
1681 virtual void raw_visit_constant(
Constant &node,
void *retval) = 0;
1686 virtual void raw_visit_function(
Function &node,
void *retval) = 0;
1691 virtual void raw_visit_qubit_refs(
QubitRefs &node,
void *retval) = 0;
1696 virtual void raw_visit_reference(
Reference &node,
void *retval) = 0;
1701 virtual void raw_visit_variable_ref(VariableRef &node,
void *retval) = 0;
1715 template <
typename T>
1722 void raw_visit_node(
Node &node,
void *retval)
override;
1727 void raw_visit_bit_refs(
BitRefs &node,
void *retval)
override;
1732 void raw_visit_const_axis(
ConstAxis &node,
void *retval)
override;
1737 void raw_visit_const_bool(
ConstBool &node,
void *retval)
override;
1742 void raw_visit_const_complex(
ConstComplex &node,
void *retval)
override;
1747 void raw_visit_const_complex_matrix(
ConstComplexMatrix &node,
void *retval)
override;
1752 void raw_visit_const_int(
ConstInt &node,
void *retval)
override;
1757 void raw_visit_const_json(
ConstJson &node,
void *retval)
override;
1762 void raw_visit_const_real(
ConstReal &node,
void *retval)
override;
1767 void raw_visit_const_real_matrix(
ConstRealMatrix &node,
void *retval)
override;
1772 void raw_visit_const_string(
ConstString &node,
void *retval)
override;
1777 void raw_visit_constant(
Constant &node,
void *retval)
override;
1782 void raw_visit_function(
Function &node,
void *retval)
override;
1787 void raw_visit_qubit_refs(
QubitRefs &node,
void *retval)
override;
1792 void raw_visit_reference(
Reference &node,
void *retval)
override;
1797 void raw_visit_variable_ref(VariableRef &node,
void *retval)
override;
1804 virtual T visit_node(
Node &node) = 0;
1810 return visit_reference(node);
1817 return visit_constant(node);
1824 return visit_constant(node);
1831 return visit_constant(node);
1838 return visit_constant(node);
1845 return visit_constant(node);
1852 return visit_constant(node);
1859 return visit_constant(node);
1866 return visit_constant(node);
1873 return visit_constant(node);
1880 return visit_node(node);
1887 return visit_node(node);
1894 return visit_reference(node);
1901 return visit_node(node);
1908 return visit_reference(node);
1916 template <
typename T>
1918 if (retval ==
nullptr) {
1919 this->visit_node(node);
1921 *((T*)retval) = this->visit_node(node);
1934 template <
typename T>
1936 if (retval ==
nullptr) {
1937 this->visit_bit_refs(node);
1939 *((T*)retval) = this->visit_bit_refs(node);
1952 template <
typename T>
1954 if (retval ==
nullptr) {
1955 this->visit_const_axis(node);
1957 *((T*)retval) = this->visit_const_axis(node);
1970 template <
typename T>
1972 if (retval ==
nullptr) {
1973 this->visit_const_bool(node);
1975 *((T*)retval) = this->visit_const_bool(node);
1988 template <
typename T>
1990 if (retval ==
nullptr) {
1991 this->visit_const_complex(node);
1993 *((T*)retval) = this->visit_const_complex(node);
2006 template <
typename T>
2008 if (retval ==
nullptr) {
2009 this->visit_const_complex_matrix(node);
2011 *((T*)retval) = this->visit_const_complex_matrix(node);
2024 template <
typename T>
2026 if (retval ==
nullptr) {
2027 this->visit_const_int(node);
2029 *((T*)retval) = this->visit_const_int(node);
2042 template <
typename T>
2044 if (retval ==
nullptr) {
2045 this->visit_const_json(node);
2047 *((T*)retval) = this->visit_const_json(node);
2060 template <
typename T>
2062 if (retval ==
nullptr) {
2063 this->visit_const_real(node);
2065 *((T*)retval) = this->visit_const_real(node);
2078 template <
typename T>
2080 if (retval ==
nullptr) {
2081 this->visit_const_real_matrix(node);
2083 *((T*)retval) = this->visit_const_real_matrix(node);
2096 template <
typename T>
2098 if (retval ==
nullptr) {
2099 this->visit_const_string(node);
2101 *((T*)retval) = this->visit_const_string(node);
2114 template <
typename T>
2116 if (retval ==
nullptr) {
2117 this->visit_constant(node);
2119 *((T*)retval) = this->visit_constant(node);
2132 template <
typename T>
2134 if (retval ==
nullptr) {
2135 this->visit_function(node);
2137 *((T*)retval) = this->visit_function(node);
2150 template <
typename T>
2152 if (retval ==
nullptr) {
2153 this->visit_qubit_refs(node);
2155 *((T*)retval) = this->visit_qubit_refs(node);
2168 template <
typename T>
2170 if (retval ==
nullptr) {
2171 this->visit_reference(node);
2173 *((T*)retval) = this->visit_reference(node);
2186 template <
typename T>
2188 if (retval ==
nullptr) {
2189 this->visit_variable_ref(node);
2191 *((T*)retval) = this->visit_variable_ref(node);
2214 void visit_bit_refs(
BitRefs &node)
override;
2219 void visit_const_axis(
ConstAxis &node)
override;
2224 void visit_const_bool(
ConstBool &node)
override;
2239 void visit_const_int(
ConstInt &node)
override;
2244 void visit_const_json(
ConstJson &node)
override;
2249 void visit_const_real(
ConstReal &node)
override;
2259 void visit_const_string(
ConstString &node)
override;
2264 void visit_constant(
Constant &node)
override;
2269 void visit_function(
Function &node)
override;
2274 void visit_qubit_refs(
QubitRefs &node)
override;
2279 void visit_reference(
Reference &node)
override;
2284 void visit_variable_ref(VariableRef &node)
override;
2307 ::tree::base::PointerMap *
ids;
2311 bool in_link =
false;
2316 void write_indent();
2323 Dumper(std::ostream &out,
int indent=0, ::tree::base::PointerMap *ids =
nullptr) : out(out), indent(indent), ids(ids) {};
2328 void visit_node(
Node &node)
override;
2332 void visit_bit_refs(
BitRefs &node)
override;
2337 void visit_const_axis(
ConstAxis &node)
override;
2342 void visit_const_bool(
ConstBool &node)
override;
2357 void visit_const_int(
ConstInt &node)
override;
2362 void visit_const_json(
ConstJson &node)
override;
2367 void visit_const_real(
ConstReal &node)
override;
2377 void visit_const_string(
ConstString &node)
override;
2382 void visit_constant(
Constant &node)
override;
2387 void visit_function(
Function &node)
override;
2392 void visit_qubit_refs(
QubitRefs &node)
override;
2397 void visit_reference(
Reference &node)
override;
2402 void visit_variable_ref(VariableRef &node)
override;
2409 template <
typename T>
2412 this->visit_internal(visitor, &retval);
Two-dimensional matrix of some kind of type.
cqasm::v1::primitives::RMatrix value
The contained value.
virtual T visit_const_axis(ConstAxis &node)
Visitor function for ConstAxis nodes.
Represents a reference to some storage location.
virtual T visit_constant(Constant &node)
Fallback function for Constant nodes.
virtual T visit_variable_ref(VariableRef &node)
Visitor function for VariableRef nodes.
std::complex< double > Complex
Complex number primitive used within the semantic trees.
Internal class for implementing the visitor pattern.
void raw_visit_function(Function &node, void *retval) override
Internal visitor function for Function nodes.
void raw_visit_const_real_matrix(ConstRealMatrix &node, void *retval) override
Internal visitor function for ConstRealMatrix nodes.
bool operator!=(const Node &rhs) const
Pointer-based inequality operator.
void raw_visit_const_bool(ConstBool &node, void *retval) override
Internal visitor function for ConstBool nodes.
::tree::base::Maybe< T > Maybe
virtual T visit_function(Function &node)
Visitor function for Function nodes.
This can be returned by user-defined functions as a placeholder value for something that needs to be ...
::tree::base::Link< T > Link
std::ostream & operator<<(std::ostream &os, const Value &value)
Stream << overload for a single value.
::tree::base::OptLink< T > OptLink
Represents a qubit, or a set of qubits for single-gate-multiple-qubit notation.
void raw_visit_const_real(ConstReal &node, void *retval) override
Internal visitor function for ConstReal nodes.
void raw_visit_node(Node &node, void *retval) override
Internal visitor function for nodes of any type.
Represents a variable reference.
error_model::ErrorModelRef deserialize(const ::tree::cbor::MapReader &map)
Deserializes the given primitive object from CBOR.
Toplevel namespace with entry points for the new API.
virtual T visit_const_complex(ConstComplex &node)
Visitor function for ConstComplex nodes.
Visitor base class defaulting to DFS pre-order traversal.
Represents a value of type string.
void raw_visit_const_int(ConstInt &node, void *retval) override
Internal visitor function for ConstInt nodes.
Base class for the visitor pattern for the tree.
virtual T visit_const_complex_matrix(ConstComplexMatrix &node)
Visitor function for ConstComplexMatrix nodes.
virtual T visit_const_real_matrix(ConstRealMatrix &node)
Visitor function for ConstRealMatrix nodes.
double Real
Real number primitive used within the AST and semantic trees.
Main class for all nodes.
virtual T visit_const_bool(ConstBool &node)
Visitor function for ConstBool nodes.
T visit(Visitor< T > &visitor)
Visit this object.
void raw_visit_const_string(ConstString &node, void *retval) override
Internal visitor function for ConstString nodes.
cqasm::v1::primitives::Bool value
The contained value.
cqasm::v1::primitives::Int value
The contained value.
cqasm::v1::primitives::Real value
The contained value.
std::int64_t Int
Integer primitive used within the AST and semantic trees.
void raw_visit_const_json(ConstJson &node, void *retval) override
Internal visitor function for ConstJson nodes.
Main class for all nodes.
Link< cqasm::v1::semantic::Variable > variable
The referenced variable.
Represents a value of type complex.
void serialize(const error_model::ErrorModelRef &obj, ::tree::cbor::MapWriter &map)
virtual T visit_const_real(ConstReal &node)
Visitor function for ConstReal nodes.
Many< ConstInt > index
The qubit index that this is a measurement bit for, starting at 0.
Represents a value of type bool.
Many< ConstInt > index
Set of qubit indices referred to, starting at 0.
virtual T visit_const_int(ConstInt &node)
Visitor function for ConstInt nodes.
cqasm::v1::primitives::Complex value
The contained value.
cqasm::v1::primitives::CMatrix value
The contained value.
virtual T visit_reference(Reference &node)
Fallback function for Reference nodes.
void raw_visit_const_axis(ConstAxis &node, void *retval) override
Internal visitor function for ConstAxis nodes.
void raw_visit_const_complex(ConstComplex &node, void *retval) override
Internal visitor function for ConstComplex nodes.
T initialize()
Generates a default value for the given primitive type.
bool Bool
Boolean primitive used within the semantic trees.
Visitor class that debug-dumps a tree to a stream.
virtual T visit_const_json(ConstJson &node)
Visitor function for ConstJson nodes.
cqasm::tree::Any< T > Any
cqasm::tree::Link< T > Link
Defines primitive types for use in trees generated by tree-gen.
std::ostream & out
Output stream to dump to.
Namespace for the "new" cQASM 1.x API.
cqasm::v1::primitives::Str name
Name of the function as it appears or should appear in the cQASM file.
Wrapper for pulling parts of tree-gen's support library into libqasm.
void raw_visit_bit_refs(BitRefs &node, void *retval) override
Internal visitor function for BitRefs nodes.
Represents a value of type json.
Represents an axis value (x, y, or z).
void raw_visit_reference(Reference &node, void *retval) override
Internal visitor function for Reference nodes.
Represents a value of type real_matrix.
cqasm::v1::primitives::Str value
The contained value.
::tree::base::Any< T > Any
virtual T visit_bit_refs(BitRefs &node)
Visitor function for BitRefs nodes.
std::string Str
String primitive used within the AST and semantic trees.
cqasm::v1::primitives::Axis value
The contained value.
::tree::base::Many< T > Many
void raw_visit_qubit_refs(QubitRefs &node, void *retval) override
Internal visitor function for QubitRefs nodes.
Represents a measurement bit, or a number of measurement bits for conditional gates with multiple con...
::tree::base::PointerMap * ids
When non-null, the print node IDs from here instead of link contents.
Represents a constant value.
Any< cqasm::v1::values::Node > operands
Operands for the function.
One< cqasm::v1::types::Node > return_type
Operands for the function.
cqasm::tree::One< T > One
Represents a value of type int.
Represents a value of type real.
virtual T visit_qubit_refs(QubitRefs &node)
Visitor function for QubitRefs nodes.
cqasm::tree::Many< T > Many
::tree::base::One< T > One
void raw_visit_const_complex_matrix(ConstComplexMatrix &node, void *retval) override
Internal visitor function for ConstComplexMatrix nodes.
Represents a value of type complex_matrix.
Dumper(std::ostream &out, int indent=0, ::tree::base::PointerMap *ids=nullptr)
Construct a dumping visitor.
Axis
Axis primitive used within the semantic trees.
Defines the types of values available within cQASM's type system, as well as some utility functions...
cqasm::v1::primitives::Str value
The contained value.
NodeType
Enumeration of all node types.
void raw_visit_variable_ref(VariableRef &node, void *retval) override
Internal visitor function for VariableRef nodes.
cqasm::tree::OptLink< T > OptLink
virtual T visit_const_string(ConstString &node)
Visitor function for ConstString nodes.
void raw_visit_constant(Constant &node, void *retval) override
Internal visitor function for Constant nodes.
cqasm::tree::Maybe< T > Maybe