@@ -49,75 +49,184 @@ const std::string QE1LIB = "gate rccx a, b, c {\n"
4949const std::map<std::string, std::shared_ptr<Gate>> STANDARD_GATES = {
5050 // gates from which all other gates can be constructed.
5151 {" gphase" ,
52- std::make_shared<StandardGate>(StandardGate ({0 , 0 , 1 , qc::GPhase}))},
53- {" U" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 3 , qc::U}))},
52+ std::make_shared<StandardGate>(StandardGate ({.nControls = 0 ,
53+ .nTargets = 0 ,
54+ .nParameters = 1 ,
55+ .type = qc::GPhase}))},
56+ {" U" ,
57+ std::make_shared<StandardGate>(StandardGate (
58+ {.nControls = 0 , .nTargets = 1 , .nParameters = 3 , .type = qc::U}))},
5459
5560 // natively supported gates
56- {" p" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 1 , qc::P}))},
57- {" u1" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 1 , qc::P}))},
58- {" phase" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 1 , qc::P}))},
59- {" cphase" , std::make_shared<StandardGate>(StandardGate ({1 , 1 , 1 , qc::P}))},
60- {" cp" , std::make_shared<StandardGate>(StandardGate ({1 , 1 , 1 , qc::P}))},
61-
62- {" id" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 0 , qc::I}))},
63- {" u2" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 2 , qc::U2 }))},
64- {" u3" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 3 , qc::U}))},
65- {" u" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 3 , qc::U}))},
66-
67- {" x" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 0 , qc::X}))},
68- {" cx" , std::make_shared<StandardGate>(StandardGate ({1 , 1 , 0 , qc::X}))},
69- {" CX" , std::make_shared<StandardGate>(StandardGate ({1 , 1 , 0 , qc::X}))},
70- {" ccx" , std::make_shared<StandardGate>(StandardGate ({2 , 1 , 0 , qc::X}))},
71- {" c3x" , std::make_shared<StandardGate>(StandardGate ({3 , 1 , 0 , qc::X}))},
72- {" c4x" , std::make_shared<StandardGate>(StandardGate ({4 , 1 , 0 , qc::X}))},
73-
74- {" rx" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 1 , qc::RX }))},
75- {" crx" , std::make_shared<StandardGate>(StandardGate ({1 , 1 , 1 , qc::RX }))},
76-
77- {" y" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 0 , qc::Y}))},
78- {" cy" , std::make_shared<StandardGate>(StandardGate ({1 , 1 , 0 , qc::Y}))},
79-
80- {" ry" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 1 , qc::RY }))},
81- {" cry" , std::make_shared<StandardGate>(StandardGate ({1 , 1 , 1 , qc::RY }))},
82-
83- {" z" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 0 , qc::Z}))},
84- {" cz" , std::make_shared<StandardGate>(StandardGate ({1 , 1 , 0 , qc::Z}))},
85-
86- {" rz" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 1 , qc::RZ }))},
87- {" crz" , std::make_shared<StandardGate>(StandardGate ({1 , 1 , 1 , qc::RZ }))},
88-
89- {" h" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 0 , qc::H}))},
90- {" ch" , std::make_shared<StandardGate>(StandardGate ({1 , 1 , 0 , qc::H}))},
91-
92- {" s" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 0 , qc::S}))},
93- {" sdg" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 0 , qc::Sdg}))},
94-
95- {" t" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 0 , qc::T}))},
96- {" tdg" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 0 , qc::Tdg}))},
97-
98- {" sx" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 0 , qc::SX }))},
99- {" sxdg" , std::make_shared<StandardGate>(StandardGate ({0 , 1 , 0 , qc::SXdg}))},
61+ {" p" ,
62+ std::make_shared<StandardGate>(StandardGate (
63+ {.nControls = 0 , .nTargets = 1 , .nParameters = 1 , .type = qc::P}))},
64+ {" u1" ,
65+ std::make_shared<StandardGate>(StandardGate (
66+ {.nControls = 0 , .nTargets = 1 , .nParameters = 1 , .type = qc::P}))},
67+ {" phase" ,
68+ std::make_shared<StandardGate>(StandardGate (
69+ {.nControls = 0 , .nTargets = 1 , .nParameters = 1 , .type = qc::P}))},
70+ {" cphase" ,
71+ std::make_shared<StandardGate>(StandardGate (
72+ {.nControls = 1 , .nTargets = 1 , .nParameters = 1 , .type = qc::P}))},
73+ {" cp" ,
74+ std::make_shared<StandardGate>(StandardGate (
75+ {.nControls = 1 , .nTargets = 1 , .nParameters = 1 , .type = qc::P}))},
76+
77+ {" id" ,
78+ std::make_shared<StandardGate>(StandardGate (
79+ {.nControls = 0 , .nTargets = 1 , .nParameters = 0 , .type = qc::I}))},
80+ {" u2" ,
81+ std::make_shared<StandardGate>(StandardGate (
82+ {.nControls = 0 , .nTargets = 1 , .nParameters = 2 , .type = qc::U2 }))},
83+ {" u3" ,
84+ std::make_shared<StandardGate>(StandardGate (
85+ {.nControls = 0 , .nTargets = 1 , .nParameters = 3 , .type = qc::U}))},
86+ {" u" ,
87+ std::make_shared<StandardGate>(StandardGate (
88+ {.nControls = 0 , .nTargets = 1 , .nParameters = 3 , .type = qc::U}))},
89+
90+ {" x" ,
91+ std::make_shared<StandardGate>(StandardGate (
92+ {.nControls = 0 , .nTargets = 1 , .nParameters = 0 , .type = qc::X}))},
93+ {" cx" ,
94+ std::make_shared<StandardGate>(StandardGate (
95+ {.nControls = 1 , .nTargets = 1 , .nParameters = 0 , .type = qc::X}))},
96+ {" CX" ,
97+ std::make_shared<StandardGate>(StandardGate (
98+ {.nControls = 1 , .nTargets = 1 , .nParameters = 0 , .type = qc::X}))},
99+ {" ccx" ,
100+ std::make_shared<StandardGate>(StandardGate (
101+ {.nControls = 2 , .nTargets = 1 , .nParameters = 0 , .type = qc::X}))},
102+ {" c3x" ,
103+ std::make_shared<StandardGate>(StandardGate (
104+ {.nControls = 3 , .nTargets = 1 , .nParameters = 0 , .type = qc::X}))},
105+ {" c4x" ,
106+ std::make_shared<StandardGate>(StandardGate (
107+ {.nControls = 4 , .nTargets = 1 , .nParameters = 0 , .type = qc::X}))},
108+
109+ {" rx" ,
110+ std::make_shared<StandardGate>(StandardGate (
111+ {.nControls = 0 , .nTargets = 1 , .nParameters = 1 , .type = qc::RX }))},
112+ {" crx" ,
113+ std::make_shared<StandardGate>(StandardGate (
114+ {.nControls = 1 , .nTargets = 1 , .nParameters = 1 , .type = qc::RX }))},
115+
116+ {" y" ,
117+ std::make_shared<StandardGate>(StandardGate (
118+ {.nControls = 0 , .nTargets = 1 , .nParameters = 0 , .type = qc::Y}))},
119+ {" cy" ,
120+ std::make_shared<StandardGate>(StandardGate (
121+ {.nControls = 1 , .nTargets = 1 , .nParameters = 0 , .type = qc::Y}))},
122+
123+ {" ry" ,
124+ std::make_shared<StandardGate>(StandardGate (
125+ {.nControls = 0 , .nTargets = 1 , .nParameters = 1 , .type = qc::RY }))},
126+ {" cry" ,
127+ std::make_shared<StandardGate>(StandardGate (
128+ {.nControls = 1 , .nTargets = 1 , .nParameters = 1 , .type = qc::RY }))},
129+
130+ {" z" ,
131+ std::make_shared<StandardGate>(StandardGate (
132+ {.nControls = 0 , .nTargets = 1 , .nParameters = 0 , .type = qc::Z}))},
133+ {" cz" ,
134+ std::make_shared<StandardGate>(StandardGate (
135+ {.nControls = 1 , .nTargets = 1 , .nParameters = 0 , .type = qc::Z}))},
136+
137+ {" rz" ,
138+ std::make_shared<StandardGate>(StandardGate (
139+ {.nControls = 0 , .nTargets = 1 , .nParameters = 1 , .type = qc::RZ }))},
140+ {" crz" ,
141+ std::make_shared<StandardGate>(StandardGate (
142+ {.nControls = 1 , .nTargets = 1 , .nParameters = 1 , .type = qc::RZ }))},
143+
144+ {" r" ,
145+ std::make_shared<StandardGate>(StandardGate (
146+ {.nControls = 0 , .nTargets = 1 , .nParameters = 2 , .type = qc::R}))},
147+ {" prx" ,
148+ std::make_shared<StandardGate>(StandardGate (
149+ {.nControls = 0 , .nTargets = 1 , .nParameters = 2 , .type = qc::R}))},
150+ {" cr" ,
151+ std::make_shared<StandardGate>(StandardGate (
152+ {.nControls = 1 , .nTargets = 1 , .nParameters = 2 , .type = qc::R}))},
153+
154+ {" h" ,
155+ std::make_shared<StandardGate>(StandardGate (
156+ {.nControls = 0 , .nTargets = 1 , .nParameters = 0 , .type = qc::H}))},
157+ {" ch" ,
158+ std::make_shared<StandardGate>(StandardGate (
159+ {.nControls = 1 , .nTargets = 1 , .nParameters = 0 , .type = qc::H}))},
160+
161+ {" s" ,
162+ std::make_shared<StandardGate>(StandardGate (
163+ {.nControls = 0 , .nTargets = 1 , .nParameters = 0 , .type = qc::S}))},
164+ {" sdg" ,
165+ std::make_shared<StandardGate>(StandardGate (
166+ {.nControls = 0 , .nTargets = 1 , .nParameters = 0 , .type = qc::Sdg}))},
167+
168+ {" t" ,
169+ std::make_shared<StandardGate>(StandardGate (
170+ {.nControls = 0 , .nTargets = 1 , .nParameters = 0 , .type = qc::T}))},
171+ {" tdg" ,
172+ std::make_shared<StandardGate>(StandardGate (
173+ {.nControls = 0 , .nTargets = 1 , .nParameters = 0 , .type = qc::Tdg}))},
174+
175+ {" sx" ,
176+ std::make_shared<StandardGate>(StandardGate (
177+ {.nControls = 0 , .nTargets = 1 , .nParameters = 0 , .type = qc::SX }))},
178+ {" sxdg" ,
179+ std::make_shared<StandardGate>(StandardGate (
180+ {.nControls = 0 , .nTargets = 1 , .nParameters = 0 , .type = qc::SXdg}))},
100181 {" c3sqrtx" ,
101- std::make_shared<StandardGate>(StandardGate ({3 , 1 , 0 , qc::SXdg}))},
182+ std::make_shared<StandardGate>(StandardGate (
183+ {.nControls = 3 , .nTargets = 1 , .nParameters = 0 , .type = qc::SXdg}))},
102184
103- {" swap" , std::make_shared<StandardGate>(StandardGate ({0 , 2 , 0 , qc::SWAP }))},
185+ {" swap" ,
186+ std::make_shared<StandardGate>(StandardGate (
187+ {.nControls = 0 , .nTargets = 2 , .nParameters = 0 , .type = qc::SWAP }))},
104188 {" cswap" ,
105- std::make_shared<StandardGate>(StandardGate ({1 , 2 , 0 , qc::SWAP }))},
189+ std::make_shared<StandardGate>(StandardGate (
190+ {.nControls = 1 , .nTargets = 2 , .nParameters = 0 , .type = qc::SWAP }))},
106191
107192 {" iswap" ,
108- std::make_shared<StandardGate>(StandardGate ({0 , 2 , 0 , qc::iSWAP}))},
193+ std::make_shared<StandardGate>(StandardGate ({.nControls = 0 ,
194+ .nTargets = 2 ,
195+ .nParameters = 0 ,
196+ .type = qc::iSWAP}))},
109197 {" iswapdg" ,
110- std::make_shared<StandardGate>(StandardGate ({0 , 2 , 0 , qc::iSWAPdg}))},
111-
112- {" rxx" , std::make_shared<StandardGate>(StandardGate ({0 , 2 , 1 , qc::RXX }))},
113- {" ryy" , std::make_shared<StandardGate>(StandardGate ({0 , 2 , 1 , qc::RYY }))},
114- {" rzz" , std::make_shared<StandardGate>(StandardGate ({0 , 2 , 1 , qc::RZZ }))},
115- {" rzx" , std::make_shared<StandardGate>(StandardGate ({0 , 2 , 1 , qc::RZX }))},
116- {" dcx" , std::make_shared<StandardGate>(StandardGate ({0 , 2 , 0 , qc::DCX }))},
117- {" ecr" , std::make_shared<StandardGate>(StandardGate ({0 , 2 , 0 , qc::ECR }))},
198+ std::make_shared<StandardGate>(StandardGate ({.nControls = 0 ,
199+ .nTargets = 2 ,
200+ .nParameters = 0 ,
201+ .type = qc::iSWAPdg}))},
202+
203+ {" rxx" ,
204+ std::make_shared<StandardGate>(StandardGate (
205+ {.nControls = 0 , .nTargets = 2 , .nParameters = 1 , .type = qc::RXX }))},
206+ {" ryy" ,
207+ std::make_shared<StandardGate>(StandardGate (
208+ {.nControls = 0 , .nTargets = 2 , .nParameters = 1 , .type = qc::RYY }))},
209+ {" rzz" ,
210+ std::make_shared<StandardGate>(StandardGate (
211+ {.nControls = 0 , .nTargets = 2 , .nParameters = 1 , .type = qc::RZZ }))},
212+ {" rzx" ,
213+ std::make_shared<StandardGate>(StandardGate (
214+ {.nControls = 0 , .nTargets = 2 , .nParameters = 1 , .type = qc::RZX }))},
215+ {" dcx" ,
216+ std::make_shared<StandardGate>(StandardGate (
217+ {.nControls = 0 , .nTargets = 2 , .nParameters = 0 , .type = qc::DCX }))},
218+ {" ecr" ,
219+ std::make_shared<StandardGate>(StandardGate (
220+ {.nControls = 0 , .nTargets = 2 , .nParameters = 0 , .type = qc::ECR }))},
118221 {" xx_minus_yy" ,
119- std::make_shared<StandardGate>(StandardGate ({0 , 2 , 2 , qc::XXminusYY}))},
222+ std::make_shared<StandardGate>(StandardGate ({.nControls = 0 ,
223+ .nTargets = 2 ,
224+ .nParameters = 2 ,
225+ .type = qc::XXminusYY}))},
120226 {" xx_plus_yy" ,
121- std::make_shared<StandardGate>(StandardGate ({0 , 2 , 2 , qc::XXplusYY}))},
227+ std::make_shared<StandardGate>(StandardGate ({.nControls = 0 ,
228+ .nTargets = 2 ,
229+ .nParameters = 2 ,
230+ .type = qc::XXplusYY}))},
122231};
123232} // namespace qasm3
0 commit comments