22 static int64_t div_floor(int64_t a, int64_t b) {
27 int64_t corr = (rem != 0 && ((rem < 0) != (b < 0)));
34 static int64_t mod_floor(int64_t a, int64_t b) {
36 if (rem != 0 && ((rem < 0) != (b < 0))) {
45 auto a = v[0]->as_const_complex()->value;
46 auto b = v[1]->as_const_complex()->value;
47 return tree::make<values::ConstComplex>(a + b);
52 auto a = v[0]->as_const_real()->value;
53 auto b = v[1]->as_const_real()->value;
54 return tree::make<values::ConstReal>(a + b);
59 auto a = v[0]->as_const_int()->value;
60 auto b = v[1]->as_const_int()->value;
61 return tree::make<values::ConstInt>(a + b);
66 auto a = v[0]->as_const_string()->value;
67 auto b = v[1]->as_const_string()->value;
68 return tree::make<values::ConstString>(a + b);
73 auto a = v[0]->as_const_complex()->value;
74 auto b = v[1]->as_const_complex()->value;
75 return tree::make<values::ConstComplex>(a - b);
80 auto a = v[0]->as_const_real()->value;
81 auto b = v[1]->as_const_real()->value;
82 return tree::make<values::ConstReal>(a - b);
87 auto a = v[0]->as_const_int()->value;
88 auto b = v[1]->as_const_int()->value;
89 return tree::make<values::ConstInt>(a - b);
94 auto a = v[0]->as_const_complex()->value;
95 return tree::make<values::ConstComplex>(-a);
100 auto a = v[0]->as_const_real()->value;
101 return tree::make<values::ConstReal>(-a);
106 auto a = v[0]->as_const_int()->value;
107 return tree::make<values::ConstInt>(-a);
112 auto a = v[0]->as_const_complex()->value;
113 auto b = v[1]->as_const_complex()->value;
114 return tree::make<values::ConstComplex>(a * b);
119 auto a = v[0]->as_const_real()->value;
120 auto b = v[1]->as_const_real()->value;
121 return tree::make<values::ConstReal>(a * b);
126 auto a = v[0]->as_const_int()->value;
127 auto b = v[1]->as_const_int()->value;
128 return tree::make<values::ConstInt>(a * b);
133 auto a = v[0]->as_const_complex()->value;
134 auto b = v[1]->as_const_complex()->value;
135 return tree::make<values::ConstComplex>(a / b);
140 auto a = v[0]->as_const_real()->value;
141 auto b = v[1]->as_const_real()->value;
142 return tree::make<values::ConstReal>(a / b);
147 auto a = v[0]->as_const_int()->value;
148 auto b = v[1]->as_const_int()->value;
149 return tree::make<values::ConstInt>(div_floor(a, b));
154 auto a = v[0]->as_const_int()->value;
155 auto b = v[1]->as_const_int()->value;
156 return tree::make<values::ConstInt>(mod_floor(a, b));
161 auto a = v[0]->as_const_complex()->value;
162 auto b = v[1]->as_const_complex()->value;
163 return tree::make<values::ConstComplex>(std::pow(a, b));
168 auto a = v[0]->as_const_real()->value;
169 auto b = v[1]->as_const_real()->value;
170 return tree::make<values::ConstReal>(std::pow(a, b));
175 auto a = v[0]->as_const_complex()->value;
176 auto b = v[1]->as_const_complex()->value;
177 return tree::make<values::ConstBool>(a == b);
182 auto a = v[0]->as_const_complex()->value;
183 auto b = v[1]->as_const_complex()->value;
184 return tree::make<values::ConstBool>(a != b);
189 auto a = v[0]->as_const_real()->value;
190 auto b = v[1]->as_const_real()->value;
191 return tree::make<values::ConstBool>(a == b);
196 auto a = v[0]->as_const_real()->value;
197 auto b = v[1]->as_const_real()->value;
198 return tree::make<values::ConstBool>(a != b);
203 auto a = v[0]->as_const_real()->value;
204 auto b = v[1]->as_const_real()->value;
205 return tree::make<values::ConstBool>(a >= b);
210 auto a = v[0]->as_const_real()->value;
211 auto b = v[1]->as_const_real()->value;
212 return tree::make<values::ConstBool>(a > b);
217 auto a = v[0]->as_const_real()->value;
218 auto b = v[1]->as_const_real()->value;
219 return tree::make<values::ConstBool>(a <= b);
224 auto a = v[0]->as_const_real()->value;
225 auto b = v[1]->as_const_real()->value;
226 return tree::make<values::ConstBool>(a < b);
231 auto a = v[0]->as_const_int()->value;
232 auto b = v[1]->as_const_int()->value;
233 return tree::make<values::ConstBool>(a == b);
238 auto a = v[0]->as_const_int()->value;
239 auto b = v[1]->as_const_int()->value;
240 return tree::make<values::ConstBool>(a != b);
245 auto a = v[0]->as_const_int()->value;
246 auto b = v[1]->as_const_int()->value;
247 return tree::make<values::ConstBool>(a >= b);
252 auto a = v[0]->as_const_int()->value;
253 auto b = v[1]->as_const_int()->value;
254 return tree::make<values::ConstBool>(a > b);
259 auto a = v[0]->as_const_int()->value;
260 auto b = v[1]->as_const_int()->value;
261 return tree::make<values::ConstBool>(a <= b);
266 auto a = v[0]->as_const_int()->value;
267 auto b = v[1]->as_const_int()->value;
268 return tree::make<values::ConstBool>(a < b);
273 auto a = v[0]->as_const_bool()->value;
274 auto b = v[1]->as_const_bool()->value;
275 return tree::make<values::ConstBool>(a == b);
280 auto a = v[0]->as_const_bool()->value;
281 auto b = v[1]->as_const_bool()->value;
282 return tree::make<values::ConstBool>(a != b);
287 auto a = v[0]->as_const_bool()->value;
288 auto b = v[1]->as_const_bool()->value;
289 return tree::make<values::ConstBool>(a >= b);
294 auto a = v[0]->as_const_bool()->value;
295 auto b = v[1]->as_const_bool()->value;
296 return tree::make<values::ConstBool>(a > b);
301 auto a = v[0]->as_const_bool()->value;
302 auto b = v[1]->as_const_bool()->value;
303 return tree::make<values::ConstBool>(a <= b);
308 auto a = v[0]->as_const_bool()->value;
309 auto b = v[1]->as_const_bool()->value;
310 return tree::make<values::ConstBool>(a < b);
315 auto a = v[0]->as_const_int()->value;
316 return tree::make<values::ConstInt>(~a);
321 auto a = v[0]->as_const_int()->value;
322 auto b = v[1]->as_const_int()->value;
323 return tree::make<values::ConstInt>(a & b);
328 auto a = v[0]->as_const_int()->value;
329 auto b = v[1]->as_const_int()->value;
330 return tree::make<values::ConstInt>(a ^ b);
335 auto a = v[0]->as_const_int()->value;
336 auto b = v[1]->as_const_int()->value;
337 return tree::make<values::ConstInt>(a | b);
342 auto a = v[0]->as_const_int()->value;
343 auto b = v[1]->as_const_int()->value;
344 return tree::make<values::ConstInt>(a << b);
349 auto a = v[0]->as_const_int()->value;
350 auto b = v[1]->as_const_int()->value;
351 return tree::make<values::ConstInt>(a >> b);
356 auto a = v[0]->as_const_int()->value;
357 auto b = v[1]->as_const_int()->value;
358 return tree::make<values::ConstInt>((int64_t)(((uint64_t)a) >> b));
363 auto a = v[0]->as_const_bool()->value;
364 return tree::make<values::ConstBool>(!a);
369 auto a = v[0]->as_const_bool()->value;
370 auto b = v[1]->as_const_bool()->value;
371 return tree::make<values::ConstBool>(a && b);
376 auto a = v[0]->as_const_bool()->value;
377 auto b = v[1]->as_const_bool()->value;
378 return tree::make<values::ConstBool>(!a ^ !b);
383 auto a = v[0]->as_const_bool()->value;
384 auto b = v[1]->as_const_bool()->value;
385 return tree::make<values::ConstBool>(a || b);
390 auto a = v[0]->as_const_bool()->value;
391 auto b = v[1]->as_const_complex()->value;
392 auto c = v[2]->as_const_complex()->value;
393 return tree::make<values::ConstComplex>(a ? b : c);
398 auto a = v[0]->as_const_bool()->value;
399 auto b = v[1]->as_const_real()->value;
400 auto c = v[2]->as_const_real()->value;
401 return tree::make<values::ConstReal>(a ? b : c);
406 auto a = v[0]->as_const_bool()->value;
407 auto b = v[1]->as_const_int()->value;
408 auto c = v[2]->as_const_int()->value;
409 return tree::make<values::ConstInt>(a ? b : c);
414 auto a = v[0]->as_const_bool()->value;
415 auto b = v[1]->as_const_bool()->value;
416 auto c = v[2]->as_const_bool()->value;
417 return tree::make<values::ConstBool>(a ? b : c);
422 auto a = v[0]->as_const_complex()->value;
423 return tree::make<values::ConstComplex>(std::sqrt(a));
428 auto a = v[0]->as_const_complex()->value;
429 return tree::make<values::ConstComplex>(std::exp(a));
434 auto a = v[0]->as_const_complex()->value;
435 return tree::make<values::ConstComplex>(std::log(a));
440 auto a = v[0]->as_const_complex()->value;
441 return tree::make<values::ConstComplex>(std::sin(a));
446 auto a = v[0]->as_const_complex()->value;
447 return tree::make<values::ConstComplex>(std::cos(a));
452 auto a = v[0]->as_const_complex()->value;
453 return tree::make<values::ConstComplex>(std::tan(a));
458 auto a = v[0]->as_const_complex()->value;
459 return tree::make<values::ConstComplex>(std::sinh(a));
464 auto a = v[0]->as_const_complex()->value;
465 return tree::make<values::ConstComplex>(std::cosh(a));
470 auto a = v[0]->as_const_complex()->value;
471 return tree::make<values::ConstComplex>(std::tanh(a));
476 auto a = v[0]->as_const_complex()->value;
477 return tree::make<values::ConstComplex>(std::asin(a));
482 auto a = v[0]->as_const_complex()->value;
483 return tree::make<values::ConstComplex>(std::acos(a));
488 auto a = v[0]->as_const_complex()->value;
489 return tree::make<values::ConstComplex>(std::atan(a));
494 auto a = v[0]->as_const_complex()->value;
495 return tree::make<values::ConstComplex>(std::asinh(a));
500 auto a = v[0]->as_const_complex()->value;
501 return tree::make<values::ConstComplex>(std::acosh(a));
506 auto a = v[0]->as_const_complex()->value;
507 return tree::make<values::ConstComplex>(std::atanh(a));
512 auto a = v[0]->as_const_real()->value;
513 return tree::make<values::ConstReal>(std::sqrt(a));
518 auto a = v[0]->as_const_real()->value;
519 return tree::make<values::ConstReal>(std::exp(a));
524 auto a = v[0]->as_const_real()->value;
525 return tree::make<values::ConstReal>(std::log(a));
530 auto a = v[0]->as_const_real()->value;
531 return tree::make<values::ConstReal>(std::sin(a));
536 auto a = v[0]->as_const_real()->value;
537 return tree::make<values::ConstReal>(std::cos(a));
542 auto a = v[0]->as_const_real()->value;
543 return tree::make<values::ConstReal>(std::tan(a));
548 auto a = v[0]->as_const_real()->value;
549 return tree::make<values::ConstReal>(std::sinh(a));
554 auto a = v[0]->as_const_real()->value;
555 return tree::make<values::ConstReal>(std::cosh(a));
560 auto a = v[0]->as_const_real()->value;
561 return tree::make<values::ConstReal>(std::tanh(a));
566 auto a = v[0]->as_const_real()->value;
567 return tree::make<values::ConstReal>(std::asin(a));
572 auto a = v[0]->as_const_real()->value;
573 return tree::make<values::ConstReal>(std::acos(a));
578 auto a = v[0]->as_const_real()->value;
579 return tree::make<values::ConstReal>(std::atan(a));
584 auto a = v[0]->as_const_real()->value;
585 return tree::make<values::ConstReal>(std::asinh(a));
590 auto a = v[0]->as_const_real()->value;
591 return tree::make<values::ConstReal>(std::acosh(a));
596 auto a = v[0]->as_const_real()->value;
597 return tree::make<values::ConstReal>(std::atanh(a));
602 auto a = v[0]->as_const_real()->value;
603 return tree::make<values::ConstReal>(std::abs(a));
608 auto a = v[0]->as_const_int()->value;
609 return tree::make<values::ConstInt>(std::abs(a));
614 auto a = v[0]->as_const_real()->value;
615 auto b = v[1]->as_const_real()->value;
621 auto a = v[0]->as_const_real()->value;
622 auto b = v[1]->as_const_real()->value;
623 return tree::make<values::ConstComplex>(std::polar<double>(a, b));
628 auto a = v[0]->as_const_complex()->value;
629 return tree::make<values::ConstReal>(std::real<double>(a));
634 auto a = v[0]->as_const_complex()->value;
635 return tree::make<values::ConstReal>(std::imag<double>(a));
640 auto a = v[0]->as_const_complex()->value;
641 return tree::make<values::ConstReal>(std::arg<double>(a));
646 auto a = v[0]->as_const_complex()->value;
647 return tree::make<values::ConstReal>(std::norm<double>(a));
652 auto a = v[0]->as_const_complex()->value;
653 return tree::make<values::ConstComplex>(std::conj<double>(a));
values::Value op_ne_rr(const values::Values &v)
values::Value fn_cos_r(const values::Values &v)
values::Value fn_atanh_r(const values::Values &v)
values::Value op_pow_rr(const values::Values &v)
values::Value op_sub_cc(const values::Values &v)
values::Value fn_abs_r(const values::Values &v)
values::Value op_neg_c(const values::Values &v)
values::Value op_bor_ii(const values::Values &v)
std::complex< double > Complex
Complex number primitive used within the semantic trees.
values::Value op_tcnd_bbb(const values::Values &v)
values::Value fn_sin_c(const values::Values &v)
values::Value fn_imag_c(const values::Values &v)
values::Value op_le_rr(const values::Values &v)
values::Value op_sub_ii(const values::Values &v)
values::Value op_pow_cc(const values::Values &v)
values::Value fn_tanh_c(const values::Values &v)
values::Value fn_asin_c(const values::Values &v)
values::Value op_gt_ii(const values::Values &v)
Types from_spec(const std::string &spec)
Constructs a set of types from a shorthand string representation.
Toplevel namespace with entry points for the new API.
values::Value op_add_ii(const values::Values &v)
values::Value op_lt_bb(const values::Values &v)
values::Value op_gt_rr(const values::Values &v)
values::Value fn_acosh_r(const values::Values &v)
Header file generated by func-gen.
values::Value op_add_rr(const values::Values &v)
values::Value op_neg_i(const values::Values &v)
values::Value fn_exp_r(const values::Values &v)
values::Value op_tcnd_bii(const values::Values &v)
values::Value op_ge_ii(const values::Values &v)
values::Value op_ge_rr(const values::Values &v)
values::Value op_add_ss(const values::Values &v)
values::Value op_shl_ii(const values::Values &v)
values::Value op_tcnd_bcc(const values::Values &v)
values::Value op_lxor_bb(const values::Values &v)
values::Value op_neg_r(const values::Values &v)
values::Value op_eq_rr(const values::Values &v)
values::Value op_tcnd_brr(const values::Values &v)
values::Value op_int_div_ii(const values::Values &v)
values::Value fn_asin_r(const values::Values &v)
tree::Any< Node > Values
Zero or more cQASM values.
values::Value op_band_ii(const values::Values &v)
values::Value op_lt_rr(const values::Values &v)
values::Value fn_tan_r(const values::Values &v)
void register_into(resolver::FunctionTable &table)
Registers a bunch of functions usable during constant propagation into the given function table...
values::Value fn_sinh_c(const values::Values &v)
values::Value op_le_ii(const values::Values &v)
Table of all overloads of all constant propagation functions.
values::Value fn_norm_c(const values::Values &v)
values::Value fn_sinh_r(const values::Values &v)
values::Value op_lor_bb(const values::Values &v)
values::Value fn_tan_c(const values::Values &v)
values::Value fn_asinh_r(const values::Values &v)
values::Value op_ne_bb(const values::Values &v)
values::Value fn_sqrt_r(const values::Values &v)
values::Value op_eq_cc(const values::Values &v)
values::Value op_add_cc(const values::Values &v)
values::Value fn_acos_r(const values::Values &v)
Namespace for the "new" cQASM 1.x API.
values::Value fn_atanh_c(const values::Values &v)
values::Value fn_conj_c(const values::Values &v)
values::Value op_mul_rr(const values::Values &v)
values::Value op_mod_ii(const values::Values &v)
values::Value fn_acosh_c(const values::Values &v)
values::Value fn_asinh_c(const values::Values &v)
values::Value op_srl_ii(const values::Values &v)
tree::One< Node > Value
A cQASM value, either known at compile-time or an expression for something only known at runtime...
values::Value op_eq_ii(const values::Values &v)
values::Value fn_abs_i(const values::Values &v)
values::Value fn_real_c(const values::Values &v)
values::Value op_sub_rr(const values::Values &v)
values::Value op_le_bb(const values::Values &v)
values::Value fn_atan_r(const values::Values &v)
void check_const(const Value &value)
Throws an AnalysisError if the given value is not a constant, i.e.
values::Value op_binv_i(const values::Values &v)
values::Value op_linv_b(const values::Values &v)
values::Value op_mul_cc(const values::Values &v)
values::Value fn_tanh_r(const values::Values &v)
values::Value op_ge_bb(const values::Values &v)
values::Value fn_sqrt_c(const values::Values &v)
values::Value op_lt_ii(const values::Values &v)
values::Value fn_cos_c(const values::Values &v)
values::Value op_land_bb(const values::Values &v)
values::Value fn_acos_c(const values::Values &v)
values::Value fn_cosh_r(const values::Values &v)
values::Value fn_log_c(const values::Values &v)
values::Value op_div_rr(const values::Values &v)
values::Value op_ne_cc(const values::Values &v)
values::Value fn_exp_c(const values::Values &v)
values::Value fn_atan_c(const values::Values &v)
values::Value fn_cosh_c(const values::Values &v)
values::Value fn_arg_c(const values::Values &v)
values::Value fn_log_r(const values::Values &v)
values::Value fn_complex_rr(const values::Values &v)
values::Value fn_polar_rr(const values::Values &v)
values::Value op_eq_bb(const values::Values &v)
values::Value op_gt_bb(const values::Values &v)
values::Value op_div_cc(const values::Values &v)
void add(const std::string &name, const types::Types ¶m_types, const FunctionImpl &impl)
Registers a function.
values::Value op_bxor_ii(const values::Values &v)
values::Value op_ne_ii(const values::Values &v)
values::Value fn_sin_r(const values::Values &v)
values::Value op_sra_ii(const values::Values &v)
values::Value op_mul_ii(const values::Values &v)