├── .git-blame-ignore-revs ├── .gitattributes ├── .github ├── CODEOWNERS ├── change-filters.yml ├── dependabot.yml └── workflows │ ├── breaking-change-to-main.yml │ ├── ci-py.yml │ ├── ci-rs.yml │ ├── docs.yml │ ├── drop-cache.yml │ ├── notify-coverage.yml │ ├── pr-title.yml │ ├── python-wheels.yml │ ├── release-please.yml │ ├── release-plz.yml │ ├── semver-checks.yml │ └── unsoundness.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .release-please-manifest.json ├── Cargo.lock ├── Cargo.toml ├── DEVELOPMENT.md ├── LICENCE ├── README.md ├── _typos.toml ├── codecov.yml ├── devenv.lock ├── devenv.nix ├── devenv.yaml ├── hugr-cli ├── CHANGELOG.md ├── Cargo.toml ├── README.md ├── src │ ├── extensions.rs │ ├── hugr_io.rs │ ├── lib.rs │ ├── main.rs │ ├── mermaid.rs │ └── validate.rs └── tests │ ├── external.rs │ ├── gen_extensions.rs │ └── validate.rs ├── hugr-core ├── CHANGELOG.md ├── Cargo.toml ├── README.md ├── examples │ └── extension │ │ └── declarative.yaml ├── resources ├── src │ ├── builder.rs │ ├── builder │ │ ├── build_traits.rs │ │ ├── cfg.rs │ │ ├── circuit.rs │ │ ├── conditional.rs │ │ ├── dataflow.rs │ │ ├── handle.rs │ │ ├── module.rs │ │ └── tail_loop.rs │ ├── core.rs │ ├── envelope.rs │ ├── envelope │ │ ├── header.rs │ │ ├── package_json.rs │ │ └── serde_with.rs │ ├── export.rs │ ├── extension.rs │ ├── extension │ │ ├── const_fold.rs │ │ ├── declarative.rs │ │ ├── declarative │ │ │ ├── ops.rs │ │ │ ├── signature.rs │ │ │ └── types.rs │ │ ├── op_def.rs │ │ ├── op_def │ │ │ └── serialize_signature_func.rs │ │ ├── prelude.rs │ │ ├── prelude │ │ │ ├── generic.rs │ │ │ └── unwrap_builder.rs │ │ ├── resolution.rs │ │ ├── resolution │ │ │ ├── extension.rs │ │ │ ├── ops.rs │ │ │ ├── test.rs │ │ │ ├── types.rs │ │ │ ├── types_mut.rs │ │ │ └── weak_registry.rs │ │ ├── simple_op.rs │ │ └── type_def.rs │ ├── hugr.rs │ ├── hugr │ │ ├── hugrmut.rs │ │ ├── ident.rs │ │ ├── internal.rs │ │ ├── patch.rs │ │ ├── patch │ │ │ ├── consts.rs │ │ │ ├── inline_call.rs │ │ │ ├── inline_dfg.rs │ │ │ ├── insert_cut.rs │ │ │ ├── insert_identity.rs │ │ │ ├── outline_cfg.rs │ │ │ ├── port_types.rs │ │ │ ├── replace.rs │ │ │ ├── simple_replace.rs │ │ │ └── simple_replace │ │ │ │ └── serial.rs │ │ ├── persistent │ │ │ └── state_space │ │ │ │ └── serial.rs │ │ ├── serialize.rs │ │ ├── serialize │ │ │ ├── test.rs │ │ │ ├── upgrade.rs │ │ │ └── upgrade │ │ │ │ ├── test.rs │ │ │ │ └── testcases │ │ │ │ ├── empty_hugr.json │ │ │ │ └── hugr_with_named_op.json │ │ ├── validate.rs │ │ ├── validate │ │ │ └── test.rs │ │ ├── views.rs │ │ └── views │ │ │ ├── impls.rs │ │ │ ├── petgraph.rs │ │ │ ├── render.rs │ │ │ ├── rerooted.rs │ │ │ ├── root_checked.rs │ │ │ ├── root_checked │ │ │ ├── dfg.rs │ │ │ └── snapshots │ │ │ │ ├── hugr_core__hugr__views__root_checked__dfg__test__map_io_cx_gate.snap │ │ │ │ ├── hugr_core__hugr__views__root_checked__dfg__test__map_io_cycle_3qb.snap │ │ │ │ ├── hugr_core__hugr__views__root_checked__dfg__test__map_io_duplicate_output.snap │ │ │ │ └── hugr_core__hugr__views__root_checked__dfg__test__map_io_recursive.snap │ │ │ ├── sibling_subgraph.rs │ │ │ ├── snapshots │ │ │ ├── hugr_core__hugr__views__render__tests__custom_node_labels.snap │ │ │ ├── hugr_core__hugr__views__tests__dot_cfg.snap │ │ │ ├── hugr_core__hugr__views__tests__dot_dfg.snap │ │ │ ├── hugr_core__hugr__views__tests__dot_empty_dfg.snap │ │ │ ├── hugr_core__hugr__views__tests__dot_func.snap │ │ │ ├── hugr_core__hugr__views__tests__dot_module.snap │ │ │ ├── hugr_core__hugr__views__tests__mmd_cfg.snap │ │ │ ├── hugr_core__hugr__views__tests__mmd_dfg.snap │ │ │ ├── hugr_core__hugr__views__tests__mmd_empty_dfg.snap │ │ │ ├── hugr_core__hugr__views__tests__mmd_func.snap │ │ │ └── hugr_core__hugr__views__tests__mmd_module.snap │ │ │ └── tests.rs │ ├── import.rs │ ├── lib.rs │ ├── macros.rs │ ├── ops.rs │ ├── ops │ │ ├── constant.rs │ │ ├── constant │ │ │ └── custom.rs │ │ ├── controlflow.rs │ │ ├── custom.rs │ │ ├── dataflow.rs │ │ ├── handle.rs │ │ ├── module.rs │ │ ├── sum.rs │ │ ├── tag.rs │ │ └── validate.rs │ ├── package.rs │ ├── proptest.rs │ ├── snapshots │ │ ├── hugr_core__package__test__cfg.snap │ │ ├── hugr_core__package__test__dfg.snap │ │ ├── hugr_core__package__test__funcdef.snap │ │ └── hugr_core__package__test__module.snap │ ├── std_extensions.rs │ ├── std_extensions │ │ ├── arithmetic │ │ │ ├── conversions.rs │ │ │ ├── conversions │ │ │ │ └── const_fold.rs │ │ │ ├── float_ops.rs │ │ │ ├── float_ops │ │ │ │ └── const_fold.rs │ │ │ ├── float_types.rs │ │ │ ├── int_ops.rs │ │ │ ├── int_ops │ │ │ │ └── const_fold.rs │ │ │ ├── int_types.rs │ │ │ └── mod.rs │ │ ├── collections.rs │ │ ├── collections │ │ │ ├── array.rs │ │ │ ├── array │ │ │ │ ├── array_clone.rs │ │ │ │ ├── array_conversion.rs │ │ │ │ ├── array_discard.rs │ │ │ │ ├── array_kind.rs │ │ │ │ ├── array_op.rs │ │ │ │ ├── array_repeat.rs │ │ │ │ ├── array_scan.rs │ │ │ │ ├── array_value.rs │ │ │ │ └── op_builder.rs │ │ │ ├── list.rs │ │ │ ├── list │ │ │ │ └── list_fold.rs │ │ │ ├── static_array.rs │ │ │ └── value_array.rs │ │ ├── logic.rs │ │ └── ptr.rs │ ├── types.rs │ ├── types │ │ ├── check.rs │ │ ├── custom.rs │ │ ├── poly_func.rs │ │ ├── row_var.rs │ │ ├── serialize.rs │ │ ├── signature.rs │ │ ├── type_param.rs │ │ └── type_row.rs │ └── utils.rs └── tests │ ├── model.rs │ └── snapshots │ ├── model__roundtrip_add.snap │ ├── model__roundtrip_alias.snap │ ├── model__roundtrip_call.snap │ ├── model__roundtrip_cfg.snap │ ├── model__roundtrip_cond.snap │ ├── model__roundtrip_const.snap │ ├── model__roundtrip_constraints.snap │ ├── model__roundtrip_entrypoint.snap │ ├── model__roundtrip_loop.snap │ ├── model__roundtrip_order.snap │ └── model__roundtrip_params.snap ├── hugr-llvm ├── CHANGELOG.md ├── Cargo.toml ├── README.md ├── default.nix ├── nix │ ├── sources.json │ └── sources.nix └── src │ ├── custom.rs │ ├── custom │ ├── extension_op.rs │ ├── load_constant.rs │ └── types.rs │ ├── emit.rs │ ├── emit │ ├── args.rs │ ├── func.rs │ ├── func │ │ └── mailbox.rs │ ├── libc.rs │ ├── namer.rs │ ├── ops.rs │ ├── ops │ │ ├── cfg.rs │ │ └── snapshots │ │ │ ├── hugr_llvm__emit__ops__cfg__test__diverse_outputs@llvm14.snap │ │ │ ├── hugr_llvm__emit__ops__cfg__test__diverse_outputs@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__emit__ops__cfg__test__nested@llvm14.snap │ │ │ └── hugr_llvm__emit__ops__cfg__test__nested@pre-mem2reg@llvm14.snap │ ├── snapshots │ │ ├── hugr_llvm__emit__test__test_fns__diverse_cfg_children@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__diverse_cfg_children@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__diverse_module_children@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__diverse_module_children@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_call@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_call@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_call_indirect@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_call_indirect@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_conditional@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_conditional@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_custom_op@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_custom_op@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_dfg@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_dfg@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_load_constant@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_load_constant@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_tag@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__emit_hugr_tag@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__load_function@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__load_function@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__tail_loop@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__tail_loop@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__emit__test__test_fns__tail_loop_simple@llvm14.snap │ │ └── hugr_llvm__emit__test__test_fns__tail_loop_simple@pre-mem2reg@llvm14.snap │ └── test.rs │ ├── extension.rs │ ├── extension │ ├── collections.rs │ ├── collections │ │ ├── array.rs │ │ ├── list.rs │ │ ├── snapshots │ │ │ ├── hugr_llvm__extension__collections__array__test__emit_all_ops@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__array__test__emit_all_ops@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__array__test__emit_array_value@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__array__test__emit_array_value@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__array__test__emit_clone@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__array__test__emit_clone@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__array__test__emit_get@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__array__test__emit_get@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__const@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__const@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__get@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__get@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__insert@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__insert@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__length@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__length@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__pop@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__pop@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__push@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__push@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__set@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__list__test__set@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__stack_array__test__emit_all_ops@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__stack_array__test__emit_all_ops@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__stack_array__test__emit_array_value@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__stack_array__test__emit_array_value@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__stack_array__test__emit_clone@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__stack_array__test__emit_clone@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__stack_array__test__emit_get@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__stack_array__test__emit_get@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__emit_static_array_of_static_array@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__emit_static_array_of_static_array@pre-mem2reg@llvm14.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@llvm14_0.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@llvm14_1.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@llvm14_2.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@llvm14_3.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@pre-mem2reg@llvm14_0.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@pre-mem2reg@llvm14_1.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@pre-mem2reg@llvm14_2.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@pre-mem2reg@llvm14_3.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_op_codegen@llvm14_0.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_op_codegen@llvm14_1.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_op_codegen@llvm14_2.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_op_codegen@llvm14_3.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_op_codegen@pre-mem2reg@llvm14_0.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_op_codegen@pre-mem2reg@llvm14_1.snap │ │ │ ├── hugr_llvm__extension__collections__static_array__test__static_array_op_codegen@pre-mem2reg@llvm14_2.snap │ │ │ └── hugr_llvm__extension__collections__static_array__test__static_array_op_codegen@pre-mem2reg@llvm14_3.snap │ │ ├── stack_array.rs │ │ └── static_array.rs │ ├── conversions.rs │ ├── float.rs │ ├── int.rs │ ├── logic.rs │ ├── prelude.rs │ └── snapshots │ │ ├── hugr_llvm__extension__conversions__test__convert_s@llvm14.snap │ │ ├── hugr_llvm__extension__conversions__test__convert_s@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__conversions__test__convert_u@llvm14.snap │ │ ├── hugr_llvm__extension__conversions__test__convert_u@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__conversions__test__ifrombool@llvm14.snap │ │ ├── hugr_llvm__extension__conversions__test__ifrombool@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__conversions__test__itobool@llvm14.snap │ │ ├── hugr_llvm__extension__conversions__test__itobool@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__conversions__test__trunc_s@llvm14.snap │ │ ├── hugr_llvm__extension__conversions__test__trunc_s@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__conversions__test__trunc_u@llvm14.snap │ │ ├── hugr_llvm__extension__conversions__test__trunc_u@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__const_float@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__const_float@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fadd@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fadd@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fdiv@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fdiv@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__feq@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__feq@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fge@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fge@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fgt@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fgt@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fle@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fle@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__flt@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__flt@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fmul@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fmul@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fne@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fne@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fneg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fneg@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fpow@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fpow@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fsub@llvm14.snap │ │ ├── hugr_llvm__extension__float__test__fsub@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__emission@llvm14_idiv_checked_s_[3].snap │ │ ├── hugr_llvm__extension__int__test__emission@llvm14_idiv_checked_u_[3].snap │ │ ├── hugr_llvm__extension__int__test__emission@llvm14_idivmod_checked_s_[6].snap │ │ ├── hugr_llvm__extension__int__test__emission@llvm14_idivmod_checked_u_[6].snap │ │ ├── hugr_llvm__extension__int__test__emission@llvm14_idivmod_s_[3].snap │ │ ├── hugr_llvm__extension__int__test__emission@llvm14_idivmod_u_[3].snap │ │ ├── hugr_llvm__extension__int__test__emission@llvm14_imod_checked_s_[6].snap │ │ ├── hugr_llvm__extension__int__test__emission@llvm14_imod_checked_u_[6].snap │ │ ├── hugr_llvm__extension__int__test__emission@llvm14_ineg_[2].snap │ │ ├── hugr_llvm__extension__int__test__emission@llvm14_is_to_u_[3].snap │ │ ├── hugr_llvm__extension__int__test__emission@llvm14_iu_to_s_[3].snap │ │ ├── hugr_llvm__extension__int__test__emission@pre-mem2reg@llvm14_idiv_checked_s_[3].snap │ │ ├── hugr_llvm__extension__int__test__emission@pre-mem2reg@llvm14_idiv_checked_u_[3].snap │ │ ├── hugr_llvm__extension__int__test__emission@pre-mem2reg@llvm14_idivmod_checked_s_[6].snap │ │ ├── hugr_llvm__extension__int__test__emission@pre-mem2reg@llvm14_idivmod_checked_u_[6].snap │ │ ├── hugr_llvm__extension__int__test__emission@pre-mem2reg@llvm14_idivmod_s_[3].snap │ │ ├── hugr_llvm__extension__int__test__emission@pre-mem2reg@llvm14_idivmod_u_[3].snap │ │ ├── hugr_llvm__extension__int__test__emission@pre-mem2reg@llvm14_imod_checked_s_[6].snap │ │ ├── hugr_llvm__extension__int__test__emission@pre-mem2reg@llvm14_imod_checked_u_[6].snap │ │ ├── hugr_llvm__extension__int__test__emission@pre-mem2reg@llvm14_ineg_[2].snap │ │ ├── hugr_llvm__extension__int__test__emission@pre-mem2reg@llvm14_is_to_u_[3].snap │ │ ├── hugr_llvm__extension__int__test__emission@pre-mem2reg@llvm14_iu_to_s_[3].snap │ │ ├── hugr_llvm__extension__int__test__iadd@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__iadd@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__idiv_s@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__idiv_s@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__idiv_u@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__idiv_u@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__ieq@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__ieq@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__ilt_s@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__ilt_s@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__imod_s@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__imod_s@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__imod_u@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__imod_u@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__inarrow_s_3_2@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__inarrow_s_3_2@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__inarrow_u_6_4@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__inarrow_u_6_4@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__ipow@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__ipow@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__isub@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__isub@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__iwiden_s_1_6@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__iwiden_s_1_6@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__iwiden_s_2_3@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__iwiden_s_2_3@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__iwiden_u_1_6@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__iwiden_u_1_6@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__iwiden_u_2_3@llvm14.snap │ │ ├── hugr_llvm__extension__int__test__iwiden_u_2_3@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__logic__test__and@llvm14.snap │ │ ├── hugr_llvm__extension__logic__test__and@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__logic__test__eq@llvm14.snap │ │ ├── hugr_llvm__extension__logic__test__eq@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__logic__test__not@llvm14.snap │ │ ├── hugr_llvm__extension__logic__test__not@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__logic__test__or@llvm14.snap │ │ ├── hugr_llvm__extension__logic__test__or@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__logic__test__xor@llvm14.snap │ │ ├── hugr_llvm__extension__logic__test__xor@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_barrier@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_barrier@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_const_external_symbol@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_const_external_symbol@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_const_usize@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_const_usize@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_exit@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_exit@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_load_nat@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_load_nat@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_make_tuple@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_make_tuple@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_noop@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_noop@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_panic@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_panic@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_print@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_print@pre-mem2reg@llvm14.snap │ │ ├── hugr_llvm__extension__prelude__test__prelude_unpack_tuple@llvm14.snap │ │ └── hugr_llvm__extension__prelude__test__prelude_unpack_tuple@pre-mem2reg@llvm14.snap │ ├── lib.rs │ ├── snapshots │ ├── hugr_llvm__sum__test__build_untag_tag@nofields.snap │ ├── hugr_llvm__sum__test__build_untag_tag@nofields_elided_fields.snap │ ├── hugr_llvm__sum__test__build_untag_tag@one_variant_one_field.snap │ ├── hugr_llvm__sum__test__build_untag_tag@one_variant_one_field_elided_fields.snap │ ├── hugr_llvm__sum__test__build_untag_tag@one_variant_two_fields.snap │ ├── hugr_llvm__sum__test__build_untag_tag@one_variant_two_fields_elided_fields.snap │ ├── hugr_llvm__sum__test__build_untag_tag@two_variant_one_field.snap │ ├── hugr_llvm__sum__test__build_untag_tag@two_variant_one_field_elided_fields.snap │ ├── hugr_llvm__sum__test__build_untag_tag@unit.snap │ ├── hugr_llvm__sum__test__build_untag_tag@unit_elided_fields.snap │ ├── hugr_llvm__types__test__func_type_to_llvm@llvm14_0.snap │ ├── hugr_llvm__types__test__func_type_to_llvm@llvm14_1.snap │ ├── hugr_llvm__types__test__func_type_to_llvm@llvm14_2.snap │ ├── hugr_llvm__types__test__sum_type_to_llvm@llvm14_0.snap │ ├── hugr_llvm__types__test__sum_type_to_llvm@llvm14_1.snap │ ├── hugr_llvm__types__test__sum_type_to_llvm@llvm14_2.snap │ ├── hugr_llvm__types__test__sum_type_to_llvm@llvm14_3.snap │ ├── hugr_llvm__types__test__type_to_llvm@llvm14_0.snap │ ├── hugr_llvm__types__test__type_to_llvm@llvm14_1.snap │ ├── hugr_llvm__types__test__type_to_llvm@llvm14_2.snap │ ├── hugr_llvm__types__test__type_to_llvm@llvm14_3.snap │ ├── hugr_llvm__types__test__type_to_llvm@llvm14_4.snap │ ├── hugr_llvm__types__test__type_to_llvm@llvm14_5.snap │ ├── hugr_llvm__types__test__type_to_llvm@llvm14_6.snap │ └── hugr_llvm__types__test__type_to_llvm@llvm14_7.snap │ ├── sum.rs │ ├── sum │ └── layout.rs │ ├── test.rs │ ├── types.rs │ ├── utils.rs │ └── utils │ ├── fat.rs │ ├── inline_constant_functions.rs │ ├── int_op_builder.rs │ ├── logic_op_builder.rs │ └── type_map.rs ├── hugr-model ├── CHANGELOG.md ├── Cargo.toml ├── README.md ├── capnp │ └── hugr-v0.capnp ├── src │ ├── capnp │ │ ├── hugr_v0_capnp.rs │ │ └── mod.rs │ ├── lib.rs │ └── v0 │ │ ├── ast │ │ ├── hugr.pest │ │ ├── mod.rs │ │ ├── parse.rs │ │ ├── print.rs │ │ ├── python.rs │ │ ├── resolve.rs │ │ └── view.rs │ │ ├── binary │ │ ├── mod.rs │ │ ├── read.rs │ │ └── write.rs │ │ ├── mod.rs │ │ ├── scope │ │ ├── link.rs │ │ ├── mod.rs │ │ ├── symbol.rs │ │ └── vars.rs │ │ └── table │ │ ├── mod.rs │ │ └── view.rs └── tests │ ├── binary.rs │ ├── fixtures │ ├── model-add.edn │ ├── model-alias.edn │ ├── model-call.edn │ ├── model-cfg.edn │ ├── model-cond.edn │ ├── model-const.edn │ ├── model-constraints.edn │ ├── model-decl-exts.edn │ ├── model-entrypoint.edn │ ├── model-lists.edn │ ├── model-literals.edn │ ├── model-loop.edn │ ├── model-order.edn │ └── model-params.edn │ ├── snapshots │ ├── text__declarative_extensions.snap │ └── text__literals.snap │ └── text.rs ├── hugr-passes ├── CHANGELOG.md ├── Cargo.toml ├── README.md └── src │ ├── call_graph.rs │ ├── composable.rs │ ├── const_fold.rs │ ├── const_fold │ ├── test.rs │ └── value_handle.rs │ ├── dataflow.rs │ ├── dataflow │ ├── datalog.rs │ ├── partial_value.rs │ ├── results.rs │ ├── test.rs │ └── value_row.rs │ ├── dead_code.rs │ ├── dead_funcs.rs │ ├── force_order.rs │ ├── half_node.rs │ ├── lib.rs │ ├── linearize_array.rs │ ├── lower.rs │ ├── merge_bbs.rs │ ├── monomorphize.rs │ ├── nest_cfgs.rs │ ├── non_local.rs │ ├── non_local │ └── localize.rs │ ├── replace_types.rs │ ├── replace_types │ ├── handlers.rs │ └── linearize.rs │ ├── untuple.rs │ └── validation.rs ├── hugr-persistent ├── Cargo.toml ├── src │ ├── lib.rs │ ├── parents_view.rs │ ├── persistent_hugr.rs │ ├── resolver.rs │ ├── state_space.rs │ ├── tests.rs │ ├── trait_impls.rs │ ├── walker.rs │ └── walker │ │ └── pinned.rs └── tests │ └── persistent_walker_example.rs ├── hugr-py ├── .gitignore ├── CHANGELOG.md ├── Cargo.toml ├── LICENCE ├── README.md ├── docs │ ├── .gitignore │ ├── _static │ │ ├── _redirect.html │ │ └── hugr_logo_no_bg.svg │ ├── api-docs │ │ ├── .gitignore │ │ ├── _templates │ │ │ ├── autosummary │ │ │ │ ├── base.rst │ │ │ │ ├── class.rst │ │ │ │ └── module.rst │ │ │ └── versioning.html │ │ ├── conf.py │ │ └── index.rst │ └── build.sh ├── pyproject.toml ├── rust │ └── lib.rs ├── src │ └── hugr │ │ ├── __init__.py │ │ ├── _hugr │ │ └── __init__.pyi │ │ ├── _serialization │ │ ├── __init__.py │ │ ├── extension.py │ │ ├── ops.py │ │ ├── serial_hugr.py │ │ ├── testing_hugr.py │ │ └── tys.py │ │ ├── build │ │ ├── __init__.py │ │ ├── base.py │ │ ├── cfg.py │ │ ├── cond_loop.py │ │ ├── dfg.py │ │ ├── function.py │ │ └── tracked_dfg.py │ │ ├── conftest.py │ │ ├── envelope.py │ │ ├── exceptions.py │ │ ├── ext.py │ │ ├── hugr │ │ ├── __init__.py │ │ ├── base.py │ │ ├── node_port.py │ │ └── render.py │ │ ├── model │ │ ├── __init__.py │ │ └── export.py │ │ ├── ops.py │ │ ├── package.py │ │ ├── py.typed │ │ ├── qsystem │ │ ├── __init__.py │ │ └── result.py │ │ ├── std │ │ ├── __init__.py │ │ ├── _json_defs │ │ │ ├── README.md │ │ │ ├── arithmetic │ │ │ │ ├── conversions.json │ │ │ │ ├── float.json │ │ │ │ ├── float │ │ │ │ │ └── types.json │ │ │ │ ├── int.json │ │ │ │ └── int │ │ │ │ │ └── types.json │ │ │ ├── collections │ │ │ │ ├── array.json │ │ │ │ ├── list.json │ │ │ │ ├── static_array.json │ │ │ │ └── value_array.json │ │ │ ├── logic.json │ │ │ ├── prelude.json │ │ │ └── ptr.json │ │ ├── collections │ │ │ ├── __init__.py │ │ │ ├── array.py │ │ │ ├── list.py │ │ │ ├── static_array.py │ │ │ └── value_array.py │ │ ├── float.py │ │ ├── int.py │ │ ├── logic.py │ │ └── prelude.py │ │ ├── tys.py │ │ ├── utils.py │ │ └── val.py └── tests │ ├── __init__.py │ ├── __snapshots__ │ └── test_hugr_build.ambr │ ├── conftest.py │ ├── serialization │ ├── __init__.py │ ├── test_basic.py │ └── test_extension.py │ ├── test_bimap.py │ ├── test_cfg.py │ ├── test_cond_loop.py │ ├── test_custom.py │ ├── test_envelope.py │ ├── test_hugr_build.py │ ├── test_nodes.py │ ├── test_ops.py │ ├── test_package.py │ ├── test_prelude.py │ ├── test_qsys_result.py │ ├── test_tracked_dfg.py │ ├── test_tys.py │ ├── test_val.py │ └── test_version.py ├── hugr ├── CHANGELOG.md ├── Cargo.toml ├── README.md ├── assets │ ├── LICENCE.md │ └── hugr_logo.svg ├── benches │ ├── bench_main.rs │ └── benchmarks │ │ ├── hugr.rs │ │ ├── hugr │ │ └── examples.rs │ │ ├── mod.rs │ │ ├── subgraph.rs │ │ └── types.rs └── src │ ├── hugr.rs │ └── lib.rs ├── justfile ├── pyproject.toml ├── release-please-config.json ├── release-plz.toml ├── resources └── test │ ├── hugr-0.hugr │ ├── hugr-1.hugr │ ├── hugr-2.hugr │ ├── hugr-3.hugr │ └── issue-1189.hugr ├── ruff.toml ├── scripts ├── __init__.py └── generate_schema.py ├── specification ├── hugr.md ├── schema │ ├── .gitattributes │ ├── hugr_schema_live.json │ ├── hugr_schema_strict_live.json │ ├── serialization.md │ ├── testing_hugr_schema_live.json │ └── testing_hugr_schema_strict_live.json └── std_extensions │ ├── arithmetic │ ├── conversions.json │ ├── float.json │ ├── float │ │ └── types.json │ ├── int.json │ └── int │ │ └── types.json │ ├── collections │ ├── array.json │ ├── list.json │ ├── static_array.json │ └── value_array.json │ ├── logic.json │ ├── prelude.json │ └── ptr.json └── uv.lock /.git-blame-ignore-revs: -------------------------------------------------------------------------------- 1 | # Commits to ignore in blame output 2 | # 3 | # To configure git to use this file, run: 4 | # > git config blame.ignoreRevsFile .git-blame-ignore-revs 5 | 6 | # Bump to rust edition 2024, and a bunch of automated lint fixes 7 | # https://github.com/CQCL/hugr/pull/2195 8 | 16903a65294aede245a4c8bb2a07a4692a619769 9 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | **/snapshots/*.snap -diff 2 | 3 | hugr-model/src/capnp/hugr_*.rs linguist-generated=true 4 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # for syntax see https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners#codeowners-syntax 2 | 3 | # base rule, hugrverse team is codeowner for whole repo 4 | * @CQCL/hugr 5 | 6 | # Add specific rules below. 7 | # Lower the rule, higher the precedence 8 | 9 | # The release PRs that trigger publication to crates.io or PyPI always modify the changelog. 10 | # We require those PRs to be approved by someone with release permissions. 11 | **/CHANGELOG.md @aborgna-q @cqc-alec @ss2165 @doug-q 12 | -------------------------------------------------------------------------------- /.github/change-filters.yml: -------------------------------------------------------------------------------- 1 | # Filters used by [dorny/path-filters](https://github.com/dorny/paths-filter) 2 | # to detect changes in each subproject, and only run the corresponding jobs. 3 | 4 | # Dependencies and common workspace configuration. 5 | rust-config: &rust-config 6 | - "Cargo.lock" 7 | - "Cargo.toml" 8 | - ".github/workflows/ci-rs.yml" 9 | 10 | model: &model 11 | - *rust-config 12 | - "hugr-model/**" 13 | 14 | llvm: &llvm 15 | - *rust-config 16 | - "hugr-llvm/**" 17 | - "hugr-core/**" 18 | 19 | rust: &rust 20 | - *rust-config 21 | - *model 22 | - *llvm 23 | - "hugr/**" 24 | - "hugr-cli/**" 25 | - "hugr-core/**" 26 | - "hugr-passes/**" 27 | - "specification/schema/**" 28 | 29 | python: 30 | - *rust 31 | - "hugr-py/**" 32 | - "pyproject.toml" 33 | - "uv.lock" 34 | - "specification/schema/**" 35 | - ".github/workflows/ci-py.yml" 36 | -------------------------------------------------------------------------------- /.github/workflows/breaking-change-to-main.yml: -------------------------------------------------------------------------------- 1 | name: Check for breaking changes targeting main 2 | on: 3 | pull_request_target: 4 | branches: 5 | - "**" 6 | types: 7 | - opened 8 | - edited 9 | - synchronize 10 | - labeled 11 | - unlabeled 12 | merge_group: 13 | types: [checks_requested] 14 | 15 | jobs: 16 | breaking-change-to-main: 17 | name: Check for breaking changes targeting main 18 | uses: CQCL/hugrverse-actions/.github/workflows/breaking-change-to-main.yml@main 19 | secrets: 20 | GITHUB_PAT: ${{ secrets.HUGRBOT_PAT }} 21 | with: 22 | release_branch: ${{ vars.BREAKING_RELEASE_BRANCH }} 23 | -------------------------------------------------------------------------------- /.github/workflows/drop-cache.yml: -------------------------------------------------------------------------------- 1 | name: cleanup caches by a branch 2 | on: 3 | pull_request: 4 | types: 5 | - closed 6 | 7 | jobs: 8 | drop-cache: 9 | uses: CQCL/hugrverse-actions/.github/workflows/drop-cache.yml@main 10 | -------------------------------------------------------------------------------- /.github/workflows/notify-coverage.yml: -------------------------------------------------------------------------------- 1 | name: Notify coverage changes 2 | 3 | # Daily notification for coverage changes in `main`. 4 | # 5 | # PR coverage diffs are computed directly in the `Continuous Integration` workflow. 6 | 7 | on: 8 | schedule: 9 | # 04:00 every Monday 10 | - cron: '0 4 * * 1' 11 | workflow_dispatch: {} 12 | 13 | jobs: 14 | coverage-trend: 15 | uses: CQCL/hugrverse-actions/.github/workflows/coverage-trend.yml@main 16 | secrets: 17 | CODECOV_GET_TOKEN: ${{ secrets.CODECOV_GET_TOKEN }} 18 | 19 | notify-slack: 20 | needs: coverage-trend 21 | runs-on: ubuntu-latest 22 | if: needs.coverage-trend.outputs.should_notify == 'true' 23 | steps: 24 | - name: Send notification 25 | uses: slackapi/slack-github-action@v2.1.0 26 | with: 27 | method: chat.postMessage 28 | token: ${{ secrets.SLACK_BOT_TOKEN }} 29 | payload: | 30 | channel: 'C05GGH4GP4N' 31 | text: ${{ needs.coverage-trend.outputs.msg }} 32 | -------------------------------------------------------------------------------- /.github/workflows/pr-title.yml: -------------------------------------------------------------------------------- 1 | name: Check Conventional Commits format 2 | on: 3 | pull_request_target: 4 | branches: 5 | - '**' 6 | types: 7 | - opened 8 | - edited 9 | - synchronize 10 | - labeled 11 | - unlabeled 12 | merge_group: 13 | types: [checks_requested] 14 | 15 | jobs: 16 | check-title: 17 | name: check-title 18 | uses: CQCL/hugrverse-actions/.github/workflows/pr-title.yml@main 19 | secrets: 20 | GITHUB_PAT: ${{ secrets.HUGRBOT_PAT }} 21 | -------------------------------------------------------------------------------- /.github/workflows/release-please.yml: -------------------------------------------------------------------------------- 1 | # Automatic changelog and version bumping with release-please for python projects 2 | name: Release-please 🐍 3 | 4 | on: 5 | workflow_dispatch: {} 6 | push: 7 | branches: 8 | - main 9 | 10 | permissions: 11 | contents: write 12 | pull-requests: write 13 | 14 | jobs: 15 | release-please: 16 | name: Create release PR 17 | runs-on: ubuntu-latest 18 | steps: 19 | - uses: googleapis/release-please-action@v4 20 | with: 21 | # Using a personal access token so releases created by this workflow can trigger the deployment workflow 22 | token: ${{ secrets.HUGRBOT_PAT }} 23 | config-file: release-please-config.json 24 | -------------------------------------------------------------------------------- /.github/workflows/release-plz.yml: -------------------------------------------------------------------------------- 1 | # Automatic changelog, version bumping, and semver-checks with release-plz for rust projects 2 | name: Release-plz 🦀 3 | 4 | on: 5 | push: 6 | branches: 7 | - main 8 | 9 | env: 10 | LLVM_VERSION: "14.0" 11 | 12 | jobs: 13 | release-plz: 14 | name: Release-plz 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout repository 18 | uses: actions/checkout@v4 19 | with: 20 | fetch-depth: 0 21 | token: ${{ secrets.HUGRBOT_PAT }} 22 | - name: Install Rust toolchain 23 | uses: dtolnay/rust-toolchain@stable 24 | 25 | # These are needed when doing a crate release, since `cargo release` 26 | # checks that the crate can be compiled before publishing it. 27 | - name: Install LLVM and Clang 28 | uses: KyleMayes/install-llvm-action@v2 29 | with: 30 | version: ${{ env.LLVM_VERSION }} 31 | # Use a temporary directory to avoid polluting the workspace, 32 | # otherwise release-plz fails due to uncommitted changes. 33 | directory: ${{ runner.temp }}/llvm 34 | 35 | - name: Run release-plz 36 | uses: MarcoIeni/release-plz-action@v0.5 37 | env: 38 | GITHUB_TOKEN: ${{ secrets.HUGRBOT_PAT }} 39 | CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | debug/ 4 | target/ 5 | 6 | # These are backup files generated by rustfmt 7 | **/*.rs.bk 8 | 9 | # MSVC Windows builds of rustc generate these, which store debugging information 10 | *.pdb 11 | 12 | # Failing proptest artifacts 13 | proptest-regressions/ 14 | 15 | # snaphsot test failures 16 | *.snap.new 17 | 18 | # Devenv 19 | .devenv* 20 | devenv.local.nix 21 | 22 | # Coverage report 23 | lcov.info 24 | 25 | # Byte-compiled / optimized / DLL files 26 | __pycache__/ 27 | *.py[cod] 28 | *$py.class 29 | *.egg-info 30 | 31 | # Unit test / coverage reports 32 | htmlcov/ 33 | .coverage 34 | 35 | # Jupyter Notebook 36 | .ipynb_checkpoints 37 | 38 | # Environments 39 | .env 40 | .venv 41 | env/ 42 | venv/ 43 | 44 | # ruff 45 | .ruff_cache 46 | 47 | # MacOS 48 | *.DS_Store 49 | -------------------------------------------------------------------------------- /.release-please-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "hugr-py": "0.12.2" 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | hugr/README.md -------------------------------------------------------------------------------- /_typos.toml: -------------------------------------------------------------------------------- 1 | [default.extend-identifiers] 2 | bck = "bck" # BiMap uses abbreviation 3 | ser_it = "ser_it" 4 | SerCollection = "SerCollection" 5 | strat = "strat" # common abbreviation for strategy 6 | # some arithmetic op names: 7 | inot = "inot" 8 | fle = "fle" 9 | flt = "flt" 10 | olt = "olt" 11 | OLT = "OLT" 12 | FLT = "FLT" 13 | ine = "ine" 14 | # llvm generic parameters 15 | OT = "OT" 16 | ot = "ot" 17 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | # Codecov coverage report configuration 2 | 3 | # Coverage report 4 | # Do not fail if the coverage is not met 5 | coverage: 6 | status: 7 | patch: 8 | default: 9 | informational: false 10 | only_pulls: true 11 | project: 12 | default: 13 | informational: true 14 | 15 | # Ignore tests and binaries 16 | ignore: 17 | - "hugr-py/tests" 18 | - "scripts" 19 | 20 | # Coverage groups config 21 | flag_management: 22 | default_rules: # the rules that will be followed for any flag added, generally 23 | # Use previous coverage if one is not available for the current commit. 24 | # 25 | # (E.g. if the PR doesn't modify a subproject, we don't submit a coverage report for it.) 26 | carryforward: true 27 | -------------------------------------------------------------------------------- /devenv.yaml: -------------------------------------------------------------------------------- 1 | inputs: 2 | nixpkgs: 3 | url: github:NixOS/nixpkgs/nixpkgs-unstable 4 | fenix: 5 | url: github:nix-community/fenix 6 | inputs: 7 | nixpkgs: 8 | follows: nixpkgs 9 | -------------------------------------------------------------------------------- /hugr-cli/src/validate.rs: -------------------------------------------------------------------------------- 1 | //! The `validate` subcommand. 2 | 3 | use anyhow::Result; 4 | use clap::Parser; 5 | use hugr::HugrView; 6 | use hugr::package::PackageValidationError; 7 | use tracing::info; 8 | 9 | use crate::CliError; 10 | use crate::hugr_io::HugrInputArgs; 11 | 12 | /// Validate and visualise a HUGR file. 13 | #[derive(Parser, Debug)] 14 | #[clap(version = "1.0", long_about = None)] 15 | #[clap(about = "Validate a HUGR.")] 16 | #[group(id = "hugr")] 17 | #[non_exhaustive] 18 | pub struct ValArgs { 19 | /// Hugr input. 20 | #[command(flatten)] 21 | pub input_args: HugrInputArgs, 22 | } 23 | 24 | /// String to print when validation is successful. 25 | pub const VALID_PRINT: &str = "HUGR valid!"; 26 | 27 | impl ValArgs { 28 | /// Run the HUGR cli and validate against an extension registry. 29 | pub fn run(&mut self) -> Result<()> { 30 | if self.input_args.hugr_json { 31 | let hugr = self.input_args.get_hugr()?; 32 | hugr.validate() 33 | .map_err(PackageValidationError::Validation) 34 | .map_err(CliError::Validate)?; 35 | } else { 36 | let package = self.input_args.get_package()?; 37 | package.validate().map_err(CliError::Validate)?; 38 | }; 39 | 40 | info!("{VALID_PRINT}"); 41 | 42 | Ok(()) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /hugr-core/resources: -------------------------------------------------------------------------------- 1 | ../resources/ -------------------------------------------------------------------------------- /hugr-core/src/hugr/serialize/upgrade.rs: -------------------------------------------------------------------------------- 1 | use thiserror::Error; 2 | 3 | #[derive(Debug, Error)] 4 | #[non_exhaustive] 5 | pub enum UpgradeError { 6 | #[error(transparent)] 7 | Deserialize(#[from] serde_json::Error), 8 | 9 | #[error("Version {0} HUGR serialization format is not supported.")] 10 | KnownVersionUnsupported(String), 11 | 12 | #[error("Unsupported HUGR serialization format.")] 13 | UnknownVersionUnsupported, 14 | } 15 | 16 | #[cfg(all(test, not(miri)))] 17 | // see serialize::test. 18 | mod test; 19 | -------------------------------------------------------------------------------- /hugr-core/src/hugr/serialize/upgrade/testcases/empty_hugr.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "live", 3 | "nodes": [ 4 | { 5 | "parent": 0, 6 | "op": "Module" 7 | } 8 | ], 9 | "edges": [], 10 | "metadata": [ 11 | null 12 | ], 13 | "encoder": "hugr-rs v0.15.4", 14 | "entrypoint": 0 15 | } 16 | -------------------------------------------------------------------------------- /hugr-core/src/hugr/views/root_checked/snapshots/hugr_core__hugr__views__root_checked__dfg__test__map_io_cx_gate.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/hugr/views/root_checked/dfg.rs 3 | expression: dfg_hugr.mermaid_string() 4 | --- 5 | graph LR 6 | subgraph 0 ["(0) Module"] 7 | direction LR 8 | subgraph 1 ["(1) FuncDefn: #quot;main#quot;"] 9 | direction LR 10 | 2["(2) Input"] 11 | 3["(3) Output"] 12 | subgraph 4 ["(4) [**DFG**]"] 13 | direction LR 14 | style 4 stroke:#832561,stroke-width:3px 15 | 5["(5) Input"] 16 | 6["(6) Output"] 17 | 7["(7) test.quantum.CX"] 18 | 5--"0:1
qubit"-->7 19 | 5--"1:0
qubit"-->7 20 | 7--"0:0
qubit"-->6 21 | 7--"1:1
qubit"-->6 22 | end 23 | 2--"0:0
qubit"-->4 24 | 2--"1:1
qubit"-->4 25 | 4--"0:0
qubit"-->3 26 | 4--"1:1
qubit"-->3 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /hugr-core/src/hugr/views/root_checked/snapshots/hugr_core__hugr__views__root_checked__dfg__test__map_io_cycle_3qb.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/hugr/views/root_checked/dfg.rs 3 | expression: dfg_hugr.mermaid_string() 4 | --- 5 | graph LR 6 | subgraph 0 ["(0) Module"] 7 | direction LR 8 | subgraph 1 ["(1) FuncDefn: #quot;main#quot;"] 9 | direction LR 10 | 2["(2) Input"] 11 | 3["(3) Output"] 12 | subgraph 4 ["(4) [**DFG**]"] 13 | direction LR 14 | style 4 stroke:#832561,stroke-width:3px 15 | 5["(5) Input"] 16 | 6["(6) Output"] 17 | 7["(7) test.quantum.CX"] 18 | 5--"0:1
qubit"-->7 19 | 5--"1:2
qubit"-->6 20 | 5--"2:0
qubit"-->7 21 | 7--"0:0
qubit"-->6 22 | 7--"1:1
qubit"-->6 23 | end 24 | 2--"0:0
qubit"-->4 25 | 2--"1:1
qubit"-->4 26 | 2--"2:2
qubit"-->4 27 | 4--"0:0
qubit"-->3 28 | 4--"1:1
qubit"-->3 29 | 4--"2:2
qubit"-->3 30 | end 31 | end 32 | -------------------------------------------------------------------------------- /hugr-core/src/hugr/views/root_checked/snapshots/hugr_core__hugr__views__root_checked__dfg__test__map_io_duplicate_output.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/hugr/views/root_checked/dfg.rs 3 | expression: dfg_hugr.mermaid_string() 4 | --- 5 | graph LR 6 | subgraph 0 ["(0) Module"] 7 | direction LR 8 | subgraph 1 ["(1) FuncDefn: #quot;main#quot;"] 9 | direction LR 10 | 2["(2) Input"] 11 | 3["(3) Output"] 12 | subgraph 4 ["(4) [**DFG**]"] 13 | direction LR 14 | style 4 stroke:#832561,stroke-width:3px 15 | 5["(5) Input"] 16 | 6["(6) Output"] 17 | 5--"0:0
Bool"-->6 18 | 5--"0:1
Bool"-->6 19 | end 20 | 2--"0:0
Bool"-->4 21 | 4--"0:0
Bool"-->3 22 | 4--"1:1
Bool"-->3 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /hugr-core/src/hugr/views/root_checked/snapshots/hugr_core__hugr__views__root_checked__dfg__test__map_io_recursive.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/hugr/views/root_checked/dfg.rs 3 | expression: hugr.mermaid_string() 4 | --- 5 | graph LR 6 | subgraph 0 ["(0) Module"] 7 | direction LR 8 | subgraph 1 ["(1) FuncDefn: #quot;foo#quot;"] 9 | direction LR 10 | 2["(2) Input"] 11 | 3["(3) Output"] 12 | subgraph 4 ["(4) DFG"] 13 | direction LR 14 | 5["(5) Input"] 15 | 6["(6) Output"] 16 | subgraph 7 ["(7) [**DFG**]"] 17 | direction LR 18 | style 7 stroke:#832561,stroke-width:3px 19 | 8["(8) Input"] 20 | 9["(9) Output"] 21 | 8--"0:1
qubit"-->9 22 | 8--"1:0
Bool"-->9 23 | end 24 | 5--"0:0
qubit"-->7 25 | 5--"1:1
Bool"-->7 26 | 7--"0:0
Bool"-->6 27 | 7--"1:1
qubit"-->6 28 | end 29 | 2--"0:0
qubit"-->4 30 | 2--"1:1
Bool"-->4 31 | 4--"0:0
Bool"-->3 32 | 4--"1:1
qubit"-->3 33 | end 34 | end 35 | -------------------------------------------------------------------------------- /hugr-core/src/hugr/views/snapshots/hugr_core__hugr__views__render__tests__custom_node_labels.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/hugr/views/render.rs 3 | expression: h.mermaid_string_with_formatter(config) 4 | --- 5 | graph LR 6 | subgraph 0 ["(node_0) Module"] 7 | direction LR 8 | subgraph 1 ["(node_1) FuncDefn: #quot;main#quot;"] 9 | direction LR 10 | 2["(node_2) Input"] 11 | 3["(node_3) Output"] 12 | subgraph 4 ["(node_4) [**DFG**]"] 13 | direction LR 14 | style 4 stroke:#832561,stroke-width:3px 15 | 5["(node_5) Input"] 16 | 6["(node_6) Output"] 17 | 5--"0:0
Bool"-->6 18 | end 19 | 2--"0:0
Bool"-->4 20 | 4--"0:0
Bool"-->3 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /hugr-core/src/hugr/views/snapshots/hugr_core__hugr__views__tests__dot_func.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/hugr/views/tests.rs 3 | expression: h.dot_string() 4 | --- 5 | digraph { 6 | 0 [shape=plain label=<
(0) Module
>] 7 | 1 [shape=plain color="#832561" penwidth="3px" label=<
(1) [**FuncDefn: "test"**]
0: [Bool] -> [Bool]
>] 8 | 2 [shape=plain label=<
(2) Input
0: Bool
>] 9 | 2:out0 -> 3:in0 [style=""] 10 | 3 [shape=plain label=<
0: Bool
(3) Output
>] 11 | hier0 [shape=plain label="0"] 12 | hier0 -> hier1 [style = "dashed"] 13 | hier1 [shape=plain label="1"] 14 | hier1 -> hier2 [style = "dashed"] 15 | hier1 -> hier3 [style = "dashed"] 16 | hier2 [shape=plain label="2"] 17 | hier3 [shape=plain label="3"] 18 | } 19 | -------------------------------------------------------------------------------- /hugr-core/src/hugr/views/snapshots/hugr_core__hugr__views__tests__dot_module.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/hugr/views/tests.rs 3 | expression: h.dot_string() 4 | --- 5 | digraph { 6 | 0 [shape=plain color="#832561" penwidth="3px" label=<
(0) [**Module**]
>] 7 | 1 [shape=plain label=<
(1) FuncDecl: "test"
0: [Bool] -> [Bool]
>] 8 | hier0 [shape=plain label="0"] 9 | hier0 -> hier1 [style = "dashed"] 10 | hier1 [shape=plain label="1"] 11 | } 12 | -------------------------------------------------------------------------------- /hugr-core/src/hugr/views/snapshots/hugr_core__hugr__views__tests__mmd_dfg.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/hugr/views/tests.rs 3 | expression: h.mermaid_string() 4 | --- 5 | graph LR 6 | subgraph 0 ["(0) Module"] 7 | direction LR 8 | subgraph 1 ["(1) FuncDefn: #quot;main#quot;"] 9 | direction LR 10 | 2["(2) Input"] 11 | 3["(3) Output"] 12 | subgraph 4 ["(4) [**DFG**]"] 13 | direction LR 14 | style 4 stroke:#832561,stroke-width:3px 15 | 5["(5) Input"] 16 | 6["(6) Output"] 17 | 7["(7) test.quantum.CX"] 18 | 8["(8) test.quantum.CX"] 19 | 5--"0:0
qubit"-->7 20 | 5--"1:1
qubit"-->7 21 | 7--"0:1
qubit"-->8 22 | 7--"1:0
qubit"-->8 23 | 7-."2:2".->8 24 | 8--"0:0
qubit"-->6 25 | 8--"1:1
qubit"-->6 26 | end 27 | 2--"0:0
qubit"-->4 28 | 2--"1:1
qubit"-->4 29 | 4--"0:0
qubit"-->3 30 | 4--"1:1
qubit"-->3 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /hugr-core/src/hugr/views/snapshots/hugr_core__hugr__views__tests__mmd_empty_dfg.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/hugr/views/tests.rs 3 | expression: h.mermaid_string() 4 | --- 5 | graph LR 6 | subgraph 0 ["(0) Module"] 7 | direction LR 8 | subgraph 1 ["(1) FuncDefn: #quot;main#quot;"] 9 | direction LR 10 | 2["(2) Input"] 11 | 3["(3) Output"] 12 | subgraph 4 ["(4) [**DFG**]"] 13 | direction LR 14 | style 4 stroke:#832561,stroke-width:3px 15 | 5["(5) Input"] 16 | 6["(6) Output"] 17 | 5--"0:0
Bool"-->6 18 | end 19 | 2--"0:0
Bool"-->4 20 | 4--"0:0
Bool"-->3 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /hugr-core/src/hugr/views/snapshots/hugr_core__hugr__views__tests__mmd_func.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/hugr/views/tests.rs 3 | expression: h.mermaid_string() 4 | --- 5 | graph LR 6 | subgraph 0 ["(0) Module"] 7 | direction LR 8 | subgraph 1 ["(1) [**FuncDefn: #quot;test#quot;**]"] 9 | direction LR 10 | style 1 stroke:#832561,stroke-width:3px 11 | 2["(2) Input"] 12 | 3["(3) Output"] 13 | 2--"0:0
Bool"-->3 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /hugr-core/src/hugr/views/snapshots/hugr_core__hugr__views__tests__mmd_module.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/hugr/views/tests.rs 3 | expression: h.mermaid_string() 4 | --- 5 | graph LR 6 | subgraph 0 ["(0) [**Module**]"] 7 | direction LR 8 | style 0 stroke:#832561,stroke-width:3px 9 | 1["(1) FuncDecl: #quot;test#quot;"] 10 | end 11 | -------------------------------------------------------------------------------- /hugr-core/src/lib.rs: -------------------------------------------------------------------------------- 1 | //! Extensible, graph-based program representation with first-class support for linear types. 2 | //! 3 | //! This crate contains the core definitions for the HUGR representation. 4 | //! See the [top-level crate documentation](https://docs.rs/hugr/latest/hugr/) for more information. 5 | 6 | // proptest-derive generates many of these warnings. 7 | // https://github.com/rust-lang/rust/issues/120363 8 | // https://github.com/proptest-rs/proptest/issues/447 9 | #![cfg_attr(test, allow(non_local_definitions))] 10 | #![cfg_attr(coverage_nightly, feature(coverage_attribute))] 11 | 12 | pub mod builder; 13 | pub mod core; 14 | pub mod envelope; 15 | pub mod export; 16 | pub mod extension; 17 | pub mod hugr; 18 | pub mod import; 19 | pub mod macros; 20 | pub mod ops; 21 | pub mod package; 22 | pub mod std_extensions; 23 | pub mod types; 24 | pub mod utils; 25 | 26 | pub use crate::core::{ 27 | CircuitUnit, Direction, IncomingPort, Node, NodeIndex, OutgoingPort, Port, PortIndex, Wire, 28 | }; 29 | pub use crate::extension::Extension; 30 | pub use crate::hugr::{Hugr, HugrView, SimpleReplacement}; 31 | 32 | #[cfg(test)] 33 | pub mod proptest; 34 | -------------------------------------------------------------------------------- /hugr-core/src/snapshots/hugr_core__package__test__dfg.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/package.rs 3 | expression: hugr.mermaid_string() 4 | --- 5 | graph LR 6 | subgraph 0 ["(0) Module"] 7 | direction LR 8 | subgraph 1 ["(1) FuncDefn: #quot;main#quot;"] 9 | direction LR 10 | 2["(2) Input"] 11 | 3["(3) Output"] 12 | subgraph 4 ["(4) [**DFG**]"] 13 | direction LR 14 | style 4 stroke:#832561,stroke-width:3px 15 | 5["(5) Input"] 16 | 6["(6) Output"] 17 | 5--"0:0
Bool"-->6 18 | end 19 | 2--"0:0
Bool"-->4 20 | 4--"0:0
Bool"-->3 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /hugr-core/src/snapshots/hugr_core__package__test__funcdef.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/package.rs 3 | expression: hugr.mermaid_string() 4 | --- 5 | graph LR 6 | subgraph 0 ["(0) Module"] 7 | direction LR 8 | subgraph 1 ["(1) [**FuncDefn: #quot;test#quot;**]"] 9 | direction LR 10 | style 1 stroke:#832561,stroke-width:3px 11 | 2["(2) Input"] 12 | 3["(3) Output"] 13 | 2--"0:0
Bool"-->3 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /hugr-core/src/snapshots/hugr_core__package__test__module.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/src/package.rs 3 | expression: hugr.mermaid_string() 4 | --- 5 | graph LR 6 | subgraph 0 ["(0) [**Module**]"] 7 | direction LR 8 | style 0 stroke:#832561,stroke-width:3px 9 | 1["(1) FuncDecl: #quot;test#quot;"] 10 | end 11 | -------------------------------------------------------------------------------- /hugr-core/src/std_extensions.rs: -------------------------------------------------------------------------------- 1 | //! Experiments for `Extension` definitions. 2 | //! 3 | //! These may be moved to other crates in the future, or dropped altogether. 4 | 5 | use crate::extension::ExtensionRegistry; 6 | 7 | pub mod arithmetic; 8 | pub mod collections; 9 | pub mod logic; 10 | pub mod ptr; 11 | 12 | /// Extension registry with all standard extensions and prelude. 13 | #[must_use] 14 | pub fn std_reg() -> ExtensionRegistry { 15 | let reg = ExtensionRegistry::new([ 16 | crate::extension::prelude::PRELUDE.clone(), 17 | arithmetic::int_ops::EXTENSION.to_owned(), 18 | arithmetic::int_types::EXTENSION.to_owned(), 19 | arithmetic::conversions::EXTENSION.to_owned(), 20 | arithmetic::float_ops::EXTENSION.to_owned(), 21 | arithmetic::float_types::EXTENSION.to_owned(), 22 | collections::array::EXTENSION.to_owned(), 23 | collections::list::EXTENSION.to_owned(), 24 | collections::static_array::EXTENSION.to_owned(), 25 | collections::value_array::EXTENSION.to_owned(), 26 | logic::EXTENSION.to_owned(), 27 | ptr::EXTENSION.to_owned(), 28 | ]); 29 | reg.validate() 30 | .expect("Standard extension registry is valid"); 31 | reg 32 | } 33 | 34 | lazy_static::lazy_static! { 35 | /// Standard extension registry. 36 | pub static ref STD_REG: ExtensionRegistry = std_reg(); 37 | } 38 | -------------------------------------------------------------------------------- /hugr-core/src/std_extensions/arithmetic/mod.rs: -------------------------------------------------------------------------------- 1 | //! Basic arithmetic operations. 2 | 3 | pub mod conversions; 4 | pub mod float_ops; 5 | pub mod float_types; 6 | pub mod int_ops; 7 | pub mod int_types; 8 | 9 | #[cfg(test)] 10 | mod test { 11 | use crate::{ 12 | std_extensions::arithmetic::int_types::{INT_TYPES, int_type}, 13 | types::type_param::TypeArg, 14 | }; 15 | 16 | use super::int_types::LOG_WIDTH_BOUND; 17 | 18 | #[test] 19 | fn test_int_types() { 20 | for i in 0..LOG_WIDTH_BOUND { 21 | assert_eq!( 22 | INT_TYPES[i as usize], 23 | int_type(TypeArg::BoundedNat { n: u64::from(i) }) 24 | ); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /hugr-core/src/std_extensions/collections.rs: -------------------------------------------------------------------------------- 1 | //! List type and operations. 2 | 3 | pub mod array; 4 | pub mod list; 5 | pub mod static_array; 6 | pub mod value_array; 7 | -------------------------------------------------------------------------------- /hugr-core/tests/snapshots/model__roundtrip_add.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/tests/model.rs 3 | expression: ast 4 | --- 5 | (hugr 0) 6 | 7 | (mod) 8 | 9 | (import core.meta.description) 10 | 11 | (import core.nat) 12 | 13 | (import core.fn) 14 | 15 | (import arithmetic.int.types.int) 16 | 17 | (declare-operation 18 | arithmetic.int.iadd 19 | (param ?0 core.nat) 20 | (core.fn 21 | [(arithmetic.int.types.int ?0) (arithmetic.int.types.int ?0)] 22 | [(arithmetic.int.types.int ?0)]) 23 | (meta 24 | (core.meta.description 25 | "addition modulo 2^N (signed and unsigned versions are the same op)"))) 26 | 27 | (define-func 28 | example.add 29 | (core.fn 30 | [(arithmetic.int.types.int 6) (arithmetic.int.types.int 6)] 31 | [(arithmetic.int.types.int 6)]) 32 | (dfg [%0 %1] [%2] 33 | (signature 34 | (core.fn 35 | [(arithmetic.int.types.int 6) (arithmetic.int.types.int 6)] 36 | [(arithmetic.int.types.int 6)])) 37 | ((arithmetic.int.iadd 6) [%0 %1] [%2] 38 | (signature 39 | (core.fn 40 | [(arithmetic.int.types.int 6) (arithmetic.int.types.int 6)] 41 | [(arithmetic.int.types.int 6)]))))) 42 | -------------------------------------------------------------------------------- /hugr-core/tests/snapshots/model__roundtrip_alias.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/tests/model.rs 3 | expression: "roundtrip(include_str!(\"../../hugr-model/tests/fixtures/model-alias.edn\"))" 4 | --- 5 | (hugr 0) 6 | 7 | (mod) 8 | 9 | (import core.fn) 10 | 11 | (import arithmetic.int.types.int) 12 | 13 | (import core.type) 14 | 15 | (declare-alias local.float core.type) 16 | 17 | (define-alias local.int core.type arithmetic.int.types.int) 18 | 19 | (define-alias local.endo core.type (core.fn [] [])) 20 | -------------------------------------------------------------------------------- /hugr-core/tests/snapshots/model__roundtrip_constraints.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/tests/model.rs 3 | expression: "roundtrip(include_str!(\"../../hugr-model/tests/fixtures/model-constraints.edn\"))" 4 | --- 5 | (hugr 0) 6 | 7 | (mod) 8 | 9 | (import collections.array.array) 10 | 11 | (import core.nat) 12 | 13 | (import core.type) 14 | 15 | (import core.nonlinear) 16 | 17 | (import core.fn) 18 | 19 | (declare-func 20 | array.replicate 21 | (param ?0 core.nat) 22 | (param ?1 core.type) 23 | (where (core.nonlinear ?1)) 24 | (core.fn [?1] [(collections.array.array ?0 ?1)])) 25 | 26 | (declare-func 27 | array.copy 28 | (param ?0 core.nat) 29 | (param ?1 core.type) 30 | (where (core.nonlinear ?1)) 31 | (core.fn 32 | [(collections.array.array ?0 ?1)] 33 | [(collections.array.array ?0 ?1) (collections.array.array ?0 ?1)])) 34 | 35 | (define-func 36 | util.copy 37 | (param ?0 core.type) 38 | (where (core.nonlinear ?0)) 39 | (core.fn [?0] [?0 ?0]) 40 | (dfg [%0] [%0 %0] (signature (core.fn [?0] [?0 ?0])))) 41 | -------------------------------------------------------------------------------- /hugr-core/tests/snapshots/model__roundtrip_entrypoint.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/tests/model.rs 3 | expression: "roundtrip(include_str!(\"../../hugr-model/tests/fixtures/model-entrypoint.edn\"))" 4 | --- 5 | (hugr 0) 6 | 7 | (mod) 8 | 9 | (import core.fn) 10 | 11 | (import core.entrypoint) 12 | 13 | (define-func main (core.fn [] []) 14 | (dfg (signature (core.fn [] [])) (meta core.entrypoint))) 15 | 16 | (mod) 17 | 18 | (import core.fn) 19 | 20 | (import core.entrypoint) 21 | 22 | (define-func wrapper_dfg (core.fn [] []) 23 | (dfg (signature (core.fn [] [])) (meta core.entrypoint))) 24 | 25 | (mod) 26 | 27 | (import core.make_adt) 28 | 29 | (import core.ctrl) 30 | 31 | (import core.fn) 32 | 33 | (import core.entrypoint) 34 | 35 | (import core.adt) 36 | 37 | (define-func wrapper_cfg (core.fn [] []) 38 | (dfg 39 | (signature (core.fn [] [])) 40 | (cfg 41 | (signature (core.fn [] [])) 42 | (cfg [%0] [%1] 43 | (signature (core.fn [(core.ctrl [])] [(core.ctrl [])])) 44 | (meta core.entrypoint) 45 | (block [%0] [%1] 46 | (signature (core.fn [(core.ctrl [])] [(core.ctrl [])])) 47 | (dfg [] [%2] 48 | (signature (core.fn [] [(core.adt [[]])])) 49 | ((core.make_adt 0) [] [%2] 50 | (signature (core.fn [] [(core.adt [[]])]))))))))) 51 | -------------------------------------------------------------------------------- /hugr-core/tests/snapshots/model__roundtrip_loop.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/tests/model.rs 3 | expression: "roundtrip(include_str!(\"../../hugr-model/tests/fixtures/model-loop.edn\"))" 4 | --- 5 | (hugr 0) 6 | 7 | (mod) 8 | 9 | (import core.make_adt) 10 | 11 | (import core.type) 12 | 13 | (import core.fn) 14 | 15 | (import core.adt) 16 | 17 | (define-func example.loop (param ?0 core.type) (core.fn [?0] [?0]) 18 | (dfg [%0] [%1] 19 | (signature (core.fn [?0] [?0])) 20 | (tail-loop [%0] [%1] 21 | (signature (core.fn [?0] [?0])) 22 | (dfg [%2] [%3] 23 | (signature (core.fn [?0] [(core.adt [[?0] [?0]])])) 24 | ((core.make_adt 0) [%2] [%3] 25 | (signature (core.fn [?0] [(core.adt [[?0] [?0]])]))))))) 26 | -------------------------------------------------------------------------------- /hugr-core/tests/snapshots/model__roundtrip_params.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-core/tests/model.rs 3 | expression: "roundtrip(include_str!(\"../../hugr-model/tests/fixtures/model-params.edn\"))" 4 | --- 5 | (hugr 0) 6 | 7 | (mod) 8 | 9 | (import core.bytes) 10 | 11 | (import core.nat) 12 | 13 | (import core.call) 14 | 15 | (import core.type) 16 | 17 | (import core.fn) 18 | 19 | (import core.str) 20 | 21 | (import core.float) 22 | 23 | (define-func 24 | example.swap 25 | (param ?0 core.type) 26 | (param ?1 core.type) 27 | (core.fn [?0 ?1] [?1 ?0]) 28 | (dfg [%0 %1] [%1 %0] (signature (core.fn [?0 ?1] [?1 ?0])))) 29 | 30 | (declare-func 31 | example.literals 32 | (param ?0 core.str) 33 | (param ?1 core.nat) 34 | (param ?2 core.bytes) 35 | (param ?3 core.float) 36 | (core.fn [] [])) 37 | 38 | (define-func example.call_literals (core.fn [] []) 39 | (dfg 40 | (signature (core.fn [] [])) 41 | ((core.call 42 | [] 43 | [] 44 | (example.literals 45 | "string" 46 | 42 47 | (bytes "SGVsbG8gd29ybGQg8J+Yig==") 48 | 6.023e23)) 49 | (signature (core.fn [] []))))) 50 | -------------------------------------------------------------------------------- /hugr-llvm/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "hugr-llvm" 3 | version = "0.20.1" 4 | description = "A general and extensible crate for lowering HUGRs into LLVM IR" 5 | 6 | edition.workspace = true 7 | rust-version.workspace = true 8 | 9 | readme = "README.md" 10 | license.workspace = true 11 | homepage.workspace = true 12 | repository.workspace = true 13 | documentation = "https://docs.rs/hugr-llvm" 14 | authors = ["TKET development team "] 15 | keywords = ["Quantum", "Quantinuum"] 16 | categories = ["compilers"] 17 | 18 | [features] 19 | test-utils = ["insta", "rstest", "portgraph"] 20 | 21 | default = ["llvm14-0"] 22 | llvm14-0 = ["inkwell/llvm14-0"] 23 | 24 | [lints] 25 | workspace = true 26 | 27 | [dependencies] 28 | inkwell = { version = "0.6.0", default-features = false } 29 | hugr-core = { path = "../hugr-core", version = "0.20.1" } 30 | anyhow.workspace = true 31 | itertools.workspace = true 32 | delegate.workspace = true 33 | petgraph.workspace = true 34 | strum.workspace = true 35 | 36 | insta = { workspace = true, optional = true } 37 | rstest = { workspace = true, optional = true } 38 | portgraph = { workspace = true, optional = true } 39 | derive_more = { workspace = true, features = ["debug"] } 40 | lazy_static.workspace = true 41 | 42 | [dev-dependencies] 43 | hugr-llvm = { "path" = ".", features = ["test-utils"] } 44 | -------------------------------------------------------------------------------- /hugr-llvm/default.nix: -------------------------------------------------------------------------------- 1 | { sources ? import nix/sources.nix 2 | , pkgs ? import sources.nixpkgs {} 3 | , lib ? pkgs.lib 4 | , crane ? import sources.crane { inherit pkgs; } 5 | , stdenv ? pkgs.stdenv 6 | , llvmVersion ? "14" 7 | , llvmPackages ? pkgs."llvmPackages_${llvmVersion}" 8 | , libffi ? pkgs.libffi 9 | , libxml2 ? pkgs.libxml2 10 | }: let 11 | inherit (llvmPackages) libllvm; 12 | commonArgs = { 13 | src = lib.cleanSourceWith { 14 | src = crane.path ./.; 15 | filter = path: t: crane.filterCargoSources path t || (builtins.match ".*\.snap" path != null); 16 | }; 17 | strictDeps = true; 18 | buildInputs = [ 19 | libllvm 20 | libffi 21 | libxml2 22 | ]; 23 | # TODO really we should get the version string from llvmPackages 24 | "LLVM_SYS_${llvmVersion}0_PREFIX" = "${libllvm.dev}"; 25 | }; 26 | hugr-llvm = crane.buildPackage(commonArgs // { 27 | cargoArtifacts = crane.buildDepsOnly commonArgs; 28 | }); 29 | in hugr-llvm 30 | -------------------------------------------------------------------------------- /hugr-llvm/nix/sources.json: -------------------------------------------------------------------------------- 1 | { 2 | "crane": { 3 | "branch": "master", 4 | "description": "A Nix library for building cargo projects. Never build twice thanks to incremental artifact caching.", 5 | "homepage": "https://crane.dev", 6 | "owner": "ipetkov", 7 | "repo": "crane", 8 | "rev": "7443df1c478947bf96a2e699209f53b2db26209d", 9 | "sha256": "0bvr05wwnli5h2hrgadd73p8s78d54gv3iqhadpbhwlicpnifdaf", 10 | "type": "tarball", 11 | "url": "https://github.com/ipetkov/crane/archive/7443df1c478947bf96a2e699209f53b2db26209d.tar.gz", 12 | "url_template": "https://github.com///archive/.tar.gz" 13 | }, 14 | "nixpkgs": { 15 | "branch": "nixpkgs-unstable", 16 | "description": "Nix Packages collection", 17 | "homepage": null, 18 | "owner": "NixOS", 19 | "repo": "nixpkgs", 20 | "rev": "3f316d2a50699a78afe5e77ca486ad553169061e", 21 | "sha256": "1gfnjl8zjai1cjqhx96jjnnq7zjdn0ajd14xmb09jrgnjs0dw1im", 22 | "type": "tarball", 23 | "url": "https://github.com/NixOS/nixpkgs/archive/3f316d2a50699a78afe5e77ca486ad553169061e.tar.gz", 24 | "url_template": "https://github.com///archive/.tar.gz" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__diverse_cfg_children@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/emit/test.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | br label %0 14 | 15 | 0: ; preds = %entry_block 16 | switch i1 false, label %1 [ 17 | ] 18 | 19 | 1: ; preds = %0 20 | br label %2 21 | 22 | 2: ; preds = %1 23 | ret i1 false 24 | } 25 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__diverse_module_children@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/emit/test.rs 3 | expression: module.to_string() 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define void @_hl.f1.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret void 14 | } 15 | 16 | define void @_hl.f2.4() { 17 | alloca_block: 18 | br label %entry_block 19 | 20 | entry_block: ; preds = %alloca_block 21 | ret void 22 | } 23 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__diverse_module_children@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/emit/test.rs 3 | expression: module.to_string() 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define void @_hl.f1.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret void 14 | } 15 | 16 | define void @_hl.f2.4() { 17 | alloca_block: 18 | br label %entry_block 19 | 20 | entry_block: ; preds = %alloca_block 21 | ret void 22 | } 23 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__emit_hugr_call@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/emit/test.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define void @_hl.main_void.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | call void @_hl.main_void.1() 14 | ret void 15 | } 16 | 17 | define i1 @_hl.main_unary.5(i1 %0) { 18 | alloca_block: 19 | br label %entry_block 20 | 21 | entry_block: ; preds = %alloca_block 22 | %1 = call i1 @_hl.main_unary.5(i1 %0) 23 | ret i1 %1 24 | } 25 | 26 | define { i1, i1 } @_hl.main_binary.9(i1 %0, i1 %1) { 27 | alloca_block: 28 | br label %entry_block 29 | 30 | entry_block: ; preds = %alloca_block 31 | %2 = call { i1, i1 } @_hl.main_binary.9(i1 %0, i1 %1) 32 | %3 = extractvalue { i1, i1 } %2, 0 33 | %4 = extractvalue { i1, i1 } %2, 1 34 | %mrv = insertvalue { i1, i1 } undef, i1 %3, 0 35 | %mrv7 = insertvalue { i1, i1 } %mrv, i1 %4, 1 36 | ret { i1, i1 } %mrv7 37 | } 38 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__emit_hugr_call_indirect@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/emit/test.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define void @_hl.main_void.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | call void @_hl.main_void.1() 14 | ret void 15 | } 16 | 17 | define i1 @_hl.main_unary.6(i1 %0) { 18 | alloca_block: 19 | br label %entry_block 20 | 21 | entry_block: ; preds = %alloca_block 22 | %1 = call i1 @_hl.main_unary.6(i1 %0) 23 | ret i1 %1 24 | } 25 | 26 | define { i1, i1 } @_hl.main_binary.11(i1 %0, i1 %1) { 27 | alloca_block: 28 | br label %entry_block 29 | 30 | entry_block: ; preds = %alloca_block 31 | %2 = call { i1, i1 } @_hl.main_binary.11(i1 %0, i1 %1) 32 | %3 = extractvalue { i1, i1 } %2, 0 33 | %4 = extractvalue { i1, i1 } %2, 1 34 | %mrv = insertvalue { i1, i1 } undef, i1 %3, 0 35 | %mrv8 = insertvalue { i1, i1 } %mrv, i1 %4, 1 36 | ret { i1, i1 } %mrv8 37 | } 38 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__emit_hugr_custom_op@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/emit/test.rs 3 | expression: module.to_string() 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i16 @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %0 = add i16 -24, 24 14 | ret i16 %0 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__emit_hugr_custom_op@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/emit/test.rs 3 | expression: module.to_string() 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i16 @_hl.main.1() { 9 | alloca_block: 10 | %"0" = alloca i16, align 2 11 | %"7_0" = alloca i16, align 2 12 | %"5_0" = alloca i16, align 2 13 | %"8_0" = alloca i16, align 2 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i16 24, i16* %"7_0", align 2 18 | store i16 -24, i16* %"5_0", align 2 19 | %"5_01" = load i16, i16* %"5_0", align 2 20 | %"7_02" = load i16, i16* %"7_0", align 2 21 | %0 = add i16 %"5_01", %"7_02" 22 | store i16 %0, i16* %"8_0", align 2 23 | %"8_03" = load i16, i16* %"8_0", align 2 24 | store i16 %"8_03", i16* %"0", align 2 25 | %"04" = load i16, i16* %"0", align 2 26 | ret i16 %"04" 27 | } 28 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__emit_hugr_dfg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/emit/test.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define {} @_hl.main.1({} %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret {} %0 14 | } 15 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__emit_hugr_dfg@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/emit/test.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define {} @_hl.main.1({} %0) { 9 | alloca_block: 10 | %"0" = alloca {}, align 8 11 | %"2_0" = alloca {}, align 8 12 | %"4_0" = alloca {}, align 8 13 | %"5_0" = alloca {}, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store {} %0, {}* %"2_0", align 1 18 | %"2_01" = load {}, {}* %"2_0", align 1 19 | store {} %"2_01", {}* %"5_0", align 1 20 | %"5_02" = load {}, {}* %"5_0", align 1 21 | store {} %"5_02", {}* %"4_0", align 1 22 | %"4_03" = load {}, {}* %"4_0", align 1 23 | store {} %"4_03", {}* %"0", align 1 24 | %"04" = load {}, {}* %"0", align 1 25 | ret {} %"04" 26 | } 27 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__emit_hugr_load_constant@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/emit/test.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i2, i16 } @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret { i2, i16 } { i2 -2, i16 -24 } 14 | } 15 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__emit_hugr_load_constant@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/emit/test.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i2, i16 } @_hl.main.1() { 9 | alloca_block: 10 | %"0" = alloca { i2, i16 }, align 8 11 | %"5_0" = alloca { i2, i16 }, align 8 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | store { i2, i16 } { i2 -2, i16 -24 }, { i2, i16 }* %"5_0", align 2 16 | %"5_01" = load { i2, i16 }, { i2, i16 }* %"5_0", align 2 17 | store { i2, i16 } %"5_01", { i2, i16 }* %"0", align 2 18 | %"02" = load { i2, i16 }, { i2, i16 }* %"0", align 2 19 | ret { i2, i16 } %"02" 20 | } 21 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__emit_hugr_tag@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/emit/test.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i2 @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret i2 1 14 | } 15 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__emit_hugr_tag@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/emit/test.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i2 @_hl.main.1() { 9 | alloca_block: 10 | %"0" = alloca i2, align 1 11 | %"4_0" = alloca i2, align 1 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | store i2 1, i2* %"4_0", align 1 16 | %"4_01" = load i2, i2* %"4_0", align 1 17 | store i2 %"4_01", i2* %"0", align 1 18 | %"02" = load i2, i2* %"0", align 1 19 | ret i2 %"02" 20 | } 21 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__load_function@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/emit/test.rs 3 | expression: module.to_string() 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define void ()* @_hl.main.2() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret void ()* @_hl.target_func.1 14 | } 15 | 16 | declare void @_hl.target_func.1() 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__load_function@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/emit/test.rs 3 | expression: module.to_string() 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define void ()* @_hl.main.2() { 9 | alloca_block: 10 | %"0" = alloca void ()*, align 8 11 | %"5_0" = alloca void ()*, align 8 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | store void ()* @_hl.target_func.1, void ()** %"5_0", align 8 16 | %"5_01" = load void ()*, void ()** %"5_0", align 8 17 | store void ()* %"5_01", void ()** %"0", align 8 18 | %"02" = load void ()*, void ()** %"0", align 8 19 | ret void ()* %"02" 20 | } 21 | 22 | declare void @_hl.target_func.1() 23 | -------------------------------------------------------------------------------- /hugr-llvm/src/emit/snapshots/hugr_llvm__emit__test__test_fns__tail_loop_simple@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/emit/test.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define {} @_hl.main.1(i64 %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | br label %loop_body 14 | 15 | loop_body: ; preds = %3, %entry_block 16 | %"5_0.0" = phi i64 [ %0, %entry_block ], [ %4, %3 ] 17 | %1 = insertvalue { i1, i64 } { i1 false, i64 poison }, i64 %"5_0.0", 1 18 | %2 = extractvalue { i1, i64 } %1, 0 19 | switch i1 %2, label %3 [ 20 | i1 true, label %5 21 | ] 22 | 23 | 3: ; preds = %loop_body 24 | %4 = extractvalue { i1, i64 } %1, 1 25 | br label %loop_body 26 | 27 | 5: ; preds = %loop_body 28 | br label %loop_out 29 | 30 | loop_out: ; preds = %5 31 | ret {} undef 32 | } 33 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension.rs: -------------------------------------------------------------------------------- 1 | pub mod collections; 2 | pub mod conversions; 3 | pub mod float; 4 | pub mod int; 5 | pub mod logic; 6 | pub mod prelude; 7 | 8 | pub use prelude::{DefaultPreludeCodegen, PreludeCodegen, PreludeCodegenExtension}; 9 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections.rs: -------------------------------------------------------------------------------- 1 | //! Emission logic for collections. 2 | 3 | pub mod array; 4 | pub mod list; 5 | pub mod stack_array; 6 | pub mod static_array; 7 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__array__test__emit_array_value@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i64*, i64 } @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %0 = call i8* @malloc(i64 mul (i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64), i64 2)) 14 | %1 = bitcast i8* %0 to i64* 15 | %2 = insertvalue { i64*, i64 } poison, i64* %1, 0 16 | %3 = insertvalue { i64*, i64 } %2, i64 0, 1 17 | %4 = getelementptr inbounds i64, i64* %1, i32 0 18 | store i64 1, i64* %4, align 4 19 | %5 = getelementptr inbounds i64, i64* %1, i32 1 20 | store i64 2, i64* %5, align 4 21 | ret { i64*, i64 } %3 22 | } 23 | 24 | declare i8* @malloc(i64) 25 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__array__test__emit_array_value@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i64*, i64 } @_hl.main.1() { 9 | alloca_block: 10 | %"0" = alloca { i64*, i64 }, align 8 11 | %"5_0" = alloca { i64*, i64 }, align 8 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | %0 = call i8* @malloc(i64 mul (i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64), i64 2)) 16 | %1 = bitcast i8* %0 to i64* 17 | %2 = insertvalue { i64*, i64 } poison, i64* %1, 0 18 | %3 = insertvalue { i64*, i64 } %2, i64 0, 1 19 | %4 = getelementptr inbounds i64, i64* %1, i32 0 20 | store i64 1, i64* %4, align 4 21 | %5 = getelementptr inbounds i64, i64* %1, i32 1 22 | store i64 2, i64* %5, align 4 23 | store { i64*, i64 } %3, { i64*, i64 }* %"5_0", align 8 24 | %"5_01" = load { i64*, i64 }, { i64*, i64 }* %"5_0", align 8 25 | store { i64*, i64 } %"5_01", { i64*, i64 }* %"0", align 8 26 | %"02" = load { i64*, i64 }, { i64*, i64 }* %"0", align 8 27 | ret { i64*, i64 } %"02" 28 | } 29 | 30 | declare i8* @malloc(i64) 31 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__list__test__const@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/list.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8* @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %0 = call i8* @__rt__list__new(i64 3, i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64), i64 8, i8* null) 14 | %1 = alloca i64, align 8 15 | store i64 1, i64* %1, align 4 16 | %2 = bitcast i64* %1 to i8* 17 | call void @__rt__list__push(i8* %0, i8* %2) 18 | %3 = alloca i64, align 8 19 | store i64 2, i64* %3, align 4 20 | %4 = bitcast i64* %3 to i8* 21 | call void @__rt__list__push(i8* %0, i8* %4) 22 | %5 = alloca i64, align 8 23 | store i64 3, i64* %5, align 4 24 | %6 = bitcast i64* %5 to i8* 25 | call void @__rt__list__push(i8* %0, i8* %6) 26 | ret i8* %0 27 | } 28 | 29 | declare i8* @__rt__list__new(i64, i64, i64, i8*) 30 | 31 | declare void @__rt__list__push(i8*, i8*) 32 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__list__test__const@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/list.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8* @_hl.main.1() { 9 | alloca_block: 10 | %"0" = alloca i8*, align 8 11 | %"5_0" = alloca i8*, align 8 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | %0 = call i8* @__rt__list__new(i64 3, i64 ptrtoint (i64* getelementptr (i64, i64* null, i32 1) to i64), i64 8, i8* null) 16 | %1 = alloca i64, align 8 17 | store i64 1, i64* %1, align 4 18 | %2 = bitcast i64* %1 to i8* 19 | call void @__rt__list__push(i8* %0, i8* %2) 20 | %3 = alloca i64, align 8 21 | store i64 2, i64* %3, align 4 22 | %4 = bitcast i64* %3 to i8* 23 | call void @__rt__list__push(i8* %0, i8* %4) 24 | %5 = alloca i64, align 8 25 | store i64 3, i64* %5, align 4 26 | %6 = bitcast i64* %5 to i8* 27 | call void @__rt__list__push(i8* %0, i8* %6) 28 | store i8* %0, i8** %"5_0", align 8 29 | %"5_01" = load i8*, i8** %"5_0", align 8 30 | store i8* %"5_01", i8** %"0", align 8 31 | %"02" = load i8*, i8** %"0", align 8 32 | ret i8* %"02" 33 | } 34 | 35 | declare i8* @__rt__list__new(i64, i64, i64, i8*) 36 | 37 | declare void @__rt__list__push(i8*, i8*) 38 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__list__test__get@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/list.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i1, i16 } @_hl.main.1(i8* %0, i64 %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = alloca i16, align 2 14 | %3 = bitcast i16* %2 to i8* 15 | %4 = call i1 @__rt__list__get(i8* %0, i64 %1, i8* %3) 16 | %5 = bitcast i8* %3 to i16* 17 | %6 = load i16, i16* %5, align 2 18 | %7 = insertvalue { i1, i16 } { i1 true, i16 poison }, i16 %6, 1 19 | %8 = select i1 %4, { i1, i16 } %7, { i1, i16 } { i1 false, i16 poison } 20 | ret { i1, i16 } %8 21 | } 22 | 23 | declare i1 @__rt__list__get(i8*, i64, i8*) 24 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__list__test__insert@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/list.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i8*, { i1, i16 } } @_hl.main.1(i8* %0, i64 %1, i16 %2) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %3 = alloca i16, align 2 14 | store i16 %2, i16* %3, align 2 15 | %4 = bitcast i16* %3 to i8* 16 | %5 = call i1 @__rt__list__insert(i8* %0, i64 %1, i8* %4) 17 | %6 = insertvalue { i1, i16 } { i1 false, i16 poison }, i16 %2, 1 18 | %7 = select i1 %5, { i1, i16 } { i1 true, i16 poison }, { i1, i16 } %6 19 | %mrv = insertvalue { i8*, { i1, i16 } } undef, i8* %0, 0 20 | %mrv8 = insertvalue { i8*, { i1, i16 } } %mrv, { i1, i16 } %7, 1 21 | ret { i8*, { i1, i16 } } %mrv8 22 | } 23 | 24 | declare i1 @__rt__list__insert(i8*, i64, i8*) 25 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__list__test__length@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/list.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i8*, i64 } @_hl.main.1(i8* %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = call i64 @__rt__list__length(i8* %0) 14 | %mrv = insertvalue { i8*, i64 } undef, i8* %0, 0 15 | %mrv6 = insertvalue { i8*, i64 } %mrv, i64 %1, 1 16 | ret { i8*, i64 } %mrv6 17 | } 18 | 19 | declare i64 @__rt__list__length(i8*) 20 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__list__test__length@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/list.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i8*, i64 } @_hl.main.1(i8* %0) { 9 | alloca_block: 10 | %"0" = alloca i8*, align 8 11 | %"1" = alloca i64, align 8 12 | %"2_0" = alloca i8*, align 8 13 | %"4_0" = alloca i8*, align 8 14 | %"4_1" = alloca i64, align 8 15 | br label %entry_block 16 | 17 | entry_block: ; preds = %alloca_block 18 | store i8* %0, i8** %"2_0", align 8 19 | %"2_01" = load i8*, i8** %"2_0", align 8 20 | %1 = call i64 @__rt__list__length(i8* %"2_01") 21 | store i8* %"2_01", i8** %"4_0", align 8 22 | store i64 %1, i64* %"4_1", align 4 23 | %"4_02" = load i8*, i8** %"4_0", align 8 24 | %"4_13" = load i64, i64* %"4_1", align 4 25 | store i8* %"4_02", i8** %"0", align 8 26 | store i64 %"4_13", i64* %"1", align 4 27 | %"04" = load i8*, i8** %"0", align 8 28 | %"15" = load i64, i64* %"1", align 4 29 | %mrv = insertvalue { i8*, i64 } undef, i8* %"04", 0 30 | %mrv6 = insertvalue { i8*, i64 } %mrv, i64 %"15", 1 31 | ret { i8*, i64 } %mrv6 32 | } 33 | 34 | declare i64 @__rt__list__length(i8*) 35 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__list__test__pop@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/list.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i8*, { i1, i16 } } @_hl.main.1(i8* %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = alloca i16, align 2 14 | %2 = bitcast i16* %1 to i8* 15 | %3 = call i1 @__rt__list__pop(i8* %0, i8* %2) 16 | %4 = bitcast i8* %2 to i16* 17 | %5 = load i16, i16* %4, align 2 18 | %6 = insertvalue { i1, i16 } { i1 true, i16 poison }, i16 %5, 1 19 | %7 = select i1 %3, { i1, i16 } %6, { i1, i16 } { i1 false, i16 poison } 20 | %mrv = insertvalue { i8*, { i1, i16 } } undef, i8* %0, 0 21 | %mrv6 = insertvalue { i8*, { i1, i16 } } %mrv, { i1, i16 } %7, 1 22 | ret { i8*, { i1, i16 } } %mrv6 23 | } 24 | 25 | declare i1 @__rt__list__pop(i8*, i8*) 26 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__list__test__push@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/list.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8* @_hl.main.1(i8* %0, i16 %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = alloca i16, align 2 14 | store i16 %1, i16* %2, align 2 15 | %3 = bitcast i16* %2 to i8* 16 | call void @__rt__list__push(i8* %0, i8* %3) 17 | ret i8* %0 18 | } 19 | 20 | declare void @__rt__list__push(i8*, i8*) 21 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__list__test__push@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/list.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8* @_hl.main.1(i8* %0, i16 %1) { 9 | alloca_block: 10 | %"0" = alloca i8*, align 8 11 | %"2_0" = alloca i8*, align 8 12 | %"2_1" = alloca i16, align 2 13 | %"4_0" = alloca i8*, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i8* %0, i8** %"2_0", align 8 18 | store i16 %1, i16* %"2_1", align 2 19 | %"2_01" = load i8*, i8** %"2_0", align 8 20 | %"2_12" = load i16, i16* %"2_1", align 2 21 | %2 = alloca i16, align 2 22 | store i16 %"2_12", i16* %2, align 2 23 | %3 = bitcast i16* %2 to i8* 24 | call void @__rt__list__push(i8* %"2_01", i8* %3) 25 | store i8* %"2_01", i8** %"4_0", align 8 26 | %"4_03" = load i8*, i8** %"4_0", align 8 27 | store i8* %"4_03", i8** %"0", align 8 28 | %"04" = load i8*, i8** %"0", align 8 29 | ret i8* %"04" 30 | } 31 | 32 | declare void @__rt__list__push(i8*, i8*) 33 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__list__test__set@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/list.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i8*, { i1, i16 } } @_hl.main.1(i8* %0, i64 %1, i16 %2) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %3 = alloca i16, align 2 14 | store i16 %2, i16* %3, align 2 15 | %4 = bitcast i16* %3 to i8* 16 | %5 = call i1 @__rt__list__set(i8* %0, i64 %1, i8* %4) 17 | %6 = bitcast i8* %4 to i16* 18 | %7 = load i16, i16* %6, align 2 19 | %8 = insertvalue { i1, i16 } { i1 false, i16 poison }, i16 %7, 1 20 | %9 = insertvalue { i1, i16 } { i1 true, i16 poison }, i16 %2, 1 21 | %10 = select i1 %5, { i1, i16 } %9, { i1, i16 } %8 22 | %mrv = insertvalue { i8*, { i1, i16 } } undef, i8* %0, 0 23 | %mrv8 = insertvalue { i8*, { i1, i16 } } %mrv, { i1, i16 } %10, 1 24 | ret { i8*, { i1, i16 } } %mrv8 25 | } 26 | 27 | declare i1 @__rt__list__set(i8*, i64, i8*) 28 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__stack_array__test__emit_array_value@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/stack_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define [2 x i64] @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret [2 x i64] [i64 1, i64 2] 14 | } 15 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__stack_array__test__emit_array_value@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/stack_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define [2 x i64] @_hl.main.1() { 9 | alloca_block: 10 | %"0" = alloca [2 x i64], align 8 11 | %"5_0" = alloca [2 x i64], align 8 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | store [2 x i64] [i64 1, i64 2], [2 x i64]* %"5_0", align 4 16 | %"5_01" = load [2 x i64], [2 x i64]* %"5_0", align 4 17 | store [2 x i64] %"5_01", [2 x i64]* %"0", align 4 18 | %"02" = load [2 x i64], [2 x i64]* %"0", align 4 19 | ret [2 x i64] %"02" 20 | } 21 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__stack_array__test__emit_clone@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/stack_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define void @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %0 = insertvalue [2 x i64] undef, i64 1, 0 14 | %1 = insertvalue [2 x i64] %0, i64 2, 1 15 | ret void 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__stack_array__test__emit_clone@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/stack_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define void @_hl.main.1() { 9 | alloca_block: 10 | %"7_0" = alloca i64, align 8 11 | %"5_0" = alloca i64, align 8 12 | %"8_0" = alloca [2 x i64], align 8 13 | %"9_0" = alloca [2 x i64], align 8 14 | %"9_1" = alloca [2 x i64], align 8 15 | br label %entry_block 16 | 17 | entry_block: ; preds = %alloca_block 18 | store i64 2, i64* %"7_0", align 4 19 | store i64 1, i64* %"5_0", align 4 20 | %"5_01" = load i64, i64* %"5_0", align 4 21 | %"7_02" = load i64, i64* %"7_0", align 4 22 | %0 = insertvalue [2 x i64] undef, i64 %"5_01", 0 23 | %1 = insertvalue [2 x i64] %0, i64 %"7_02", 1 24 | store [2 x i64] %1, [2 x i64]* %"8_0", align 4 25 | %"8_03" = load [2 x i64], [2 x i64]* %"8_0", align 4 26 | store [2 x i64] %"8_03", [2 x i64]* %"9_0", align 4 27 | store [2 x i64] %"8_03", [2 x i64]* %"9_1", align 4 28 | %"9_14" = load [2 x i64], [2 x i64]* %"9_1", align 4 29 | %"9_05" = load [2 x i64], [2 x i64]* %"9_0", align 4 30 | ret void 31 | } 32 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__stack_array__test__emit_get@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/stack_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define void @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %0 = insertvalue [2 x i64] undef, i64 1, 0 14 | %1 = insertvalue [2 x i64] %0, i64 2, 1 15 | %2 = icmp ult i64 1, 2 16 | br i1 %2, label %4, label %3 17 | 18 | 3: ; preds = %entry_block 19 | br label %10 20 | 21 | 4: ; preds = %entry_block 22 | %5 = alloca i64, i32 2, align 8 23 | %6 = bitcast i64* %5 to [2 x i64]* 24 | store [2 x i64] %1, [2 x i64]* %6, align 4 25 | %7 = getelementptr inbounds i64, i64* %5, i64 1 26 | %8 = load i64, i64* %7, align 4 27 | %9 = insertvalue { i1, i64 } { i1 true, i64 poison }, i64 %8, 1 28 | br label %10 29 | 30 | 10: ; preds = %3, %4 31 | %"0.0" = phi { i1, i64 } [ %9, %4 ], [ { i1 false, i64 poison }, %3 ] 32 | ret void 33 | } 34 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@llvm14_0.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/static_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @sa.a.97cb22bf.0 = constant { i64, [10 x i64] } { i64 10, [10 x i64] [i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9] } 9 | 10 | define { i64, [0 x i64] }* @_hl.main.1() { 11 | alloca_block: 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | ret { i64, [0 x i64] }* bitcast ({ i64, [10 x i64] }* @sa.a.97cb22bf.0 to { i64, [0 x i64] }*) 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@llvm14_1.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/static_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @sa.b.150c532c.0 = constant { i64, [10 x double] } { i64 10, [10 x double] [double 0.000000e+00, double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00, double 5.000000e+00, double 6.000000e+00, double 7.000000e+00, double 8.000000e+00, double 9.000000e+00] } 9 | 10 | define { i64, [0 x double] }* @_hl.main.1() { 11 | alloca_block: 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | ret { i64, [0 x double] }* bitcast ({ i64, [10 x double] }* @sa.b.150c532c.0 to { i64, [0 x double] }*) 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@llvm14_2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/static_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @sa.c.d2dddd66.0 = constant { i64, [10 x i1] } { i64 10, [10 x i1] [i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false] } 9 | 10 | define { i64, [0 x i1] }* @_hl.main.1() { 11 | alloca_block: 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | ret { i64, [0 x i1] }* bitcast ({ i64, [10 x i1] }* @sa.c.d2dddd66.0 to { i64, [0 x i1] }*) 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@llvm14_3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/static_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @sa.d.eee08a59.0 = constant { i64, [10 x { i1, i64 }] } { i64 10, [10 x { i1, i64 }] [{ i1, i64 } { i1 true, i64 0 }, { i1, i64 } { i1 true, i64 1 }, { i1, i64 } { i1 true, i64 2 }, { i1, i64 } { i1 true, i64 3 }, { i1, i64 } { i1 true, i64 4 }, { i1, i64 } { i1 true, i64 5 }, { i1, i64 } { i1 true, i64 6 }, { i1, i64 } { i1 true, i64 7 }, { i1, i64 } { i1 true, i64 8 }, { i1, i64 } { i1 true, i64 9 }] } 9 | 10 | define { i64, [0 x { i1, i64 }] }* @_hl.main.1() { 11 | alloca_block: 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | ret { i64, [0 x { i1, i64 }] }* bitcast ({ i64, [10 x { i1, i64 }] }* @sa.d.eee08a59.0 to { i64, [0 x { i1, i64 }] }*) 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@pre-mem2reg@llvm14_0.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/static_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @sa.a.97cb22bf.0 = constant { i64, [10 x i64] } { i64 10, [10 x i64] [i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9] } 9 | 10 | define { i64, [0 x i64] }* @_hl.main.1() { 11 | alloca_block: 12 | %"0" = alloca { i64, [0 x i64] }*, align 8 13 | %"5_0" = alloca { i64, [0 x i64] }*, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store { i64, [0 x i64] }* bitcast ({ i64, [10 x i64] }* @sa.a.97cb22bf.0 to { i64, [0 x i64] }*), { i64, [0 x i64] }** %"5_0", align 8 18 | %"5_01" = load { i64, [0 x i64] }*, { i64, [0 x i64] }** %"5_0", align 8 19 | store { i64, [0 x i64] }* %"5_01", { i64, [0 x i64] }** %"0", align 8 20 | %"02" = load { i64, [0 x i64] }*, { i64, [0 x i64] }** %"0", align 8 21 | ret { i64, [0 x i64] }* %"02" 22 | } 23 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@pre-mem2reg@llvm14_1.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/static_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @sa.b.150c532c.0 = constant { i64, [10 x double] } { i64 10, [10 x double] [double 0.000000e+00, double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00, double 5.000000e+00, double 6.000000e+00, double 7.000000e+00, double 8.000000e+00, double 9.000000e+00] } 9 | 10 | define { i64, [0 x double] }* @_hl.main.1() { 11 | alloca_block: 12 | %"0" = alloca { i64, [0 x double] }*, align 8 13 | %"5_0" = alloca { i64, [0 x double] }*, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store { i64, [0 x double] }* bitcast ({ i64, [10 x double] }* @sa.b.150c532c.0 to { i64, [0 x double] }*), { i64, [0 x double] }** %"5_0", align 8 18 | %"5_01" = load { i64, [0 x double] }*, { i64, [0 x double] }** %"5_0", align 8 19 | store { i64, [0 x double] }* %"5_01", { i64, [0 x double] }** %"0", align 8 20 | %"02" = load { i64, [0 x double] }*, { i64, [0 x double] }** %"0", align 8 21 | ret { i64, [0 x double] }* %"02" 22 | } 23 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__static_array__test__static_array_const_codegen@pre-mem2reg@llvm14_2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/static_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @sa.c.d2dddd66.0 = constant { i64, [10 x i1] } { i64 10, [10 x i1] [i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false] } 9 | 10 | define { i64, [0 x i1] }* @_hl.main.1() { 11 | alloca_block: 12 | %"0" = alloca { i64, [0 x i1] }*, align 8 13 | %"5_0" = alloca { i64, [0 x i1] }*, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store { i64, [0 x i1] }* bitcast ({ i64, [10 x i1] }* @sa.c.d2dddd66.0 to { i64, [0 x i1] }*), { i64, [0 x i1] }** %"5_0", align 8 18 | %"5_01" = load { i64, [0 x i1] }*, { i64, [0 x i1] }** %"5_0", align 8 19 | store { i64, [0 x i1] }* %"5_01", { i64, [0 x i1] }** %"0", align 8 20 | %"02" = load { i64, [0 x i1] }*, { i64, [0 x i1] }** %"0", align 8 21 | ret { i64, [0 x i1] }* %"02" 22 | } 23 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__static_array__test__static_array_op_codegen@llvm14_2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/static_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1({ i64, [0 x i64] }* %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = getelementptr inbounds { i64, [0 x i64] }, { i64, [0 x i64] }* %0, i32 0, i32 0 14 | %2 = load i64, i64* %1, align 4 15 | ret i64 %2 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__static_array__test__static_array_op_codegen@llvm14_3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/static_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1({ i64, [0 x i1] }* %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = getelementptr inbounds { i64, [0 x i1] }, { i64, [0 x i1] }* %0, i32 0, i32 0 14 | %2 = load i64, i64* %1, align 4 15 | ret i64 %2 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__static_array__test__static_array_op_codegen@pre-mem2reg@llvm14_2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/static_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1({ i64, [0 x i64] }* %0) { 9 | alloca_block: 10 | %"0" = alloca i64, align 8 11 | %"2_0" = alloca { i64, [0 x i64] }*, align 8 12 | %"4_0" = alloca i64, align 8 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store { i64, [0 x i64] }* %0, { i64, [0 x i64] }** %"2_0", align 8 17 | %"2_01" = load { i64, [0 x i64] }*, { i64, [0 x i64] }** %"2_0", align 8 18 | %1 = getelementptr inbounds { i64, [0 x i64] }, { i64, [0 x i64] }* %"2_01", i32 0, i32 0 19 | %2 = load i64, i64* %1, align 4 20 | store i64 %2, i64* %"4_0", align 4 21 | %"4_02" = load i64, i64* %"4_0", align 4 22 | store i64 %"4_02", i64* %"0", align 4 23 | %"03" = load i64, i64* %"0", align 4 24 | ret i64 %"03" 25 | } 26 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/collections/snapshots/hugr_llvm__extension__collections__static_array__test__static_array_op_codegen@pre-mem2reg@llvm14_3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/collections/static_array.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1({ i64, [0 x i1] }* %0) { 9 | alloca_block: 10 | %"0" = alloca i64, align 8 11 | %"2_0" = alloca { i64, [0 x i1] }*, align 8 12 | %"4_0" = alloca i64, align 8 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store { i64, [0 x i1] }* %0, { i64, [0 x i1] }** %"2_0", align 8 17 | %"2_01" = load { i64, [0 x i1] }*, { i64, [0 x i1] }** %"2_0", align 8 18 | %1 = getelementptr inbounds { i64, [0 x i1] }, { i64, [0 x i1] }* %"2_01", i32 0, i32 0 19 | %2 = load i64, i64* %1, align 4 20 | store i64 %2, i64* %"4_0", align 4 21 | %"4_02" = load i64, i64* %"4_0", align 4 22 | store i64 %"4_02", i64* %"0", align 4 23 | %"03" = load i64, i64* %"0", align 4 24 | ret i64 %"03" 25 | } 26 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__conversions__test__convert_s@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/conversions.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(i32 %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = sitofp i32 %0 to double 14 | ret double %1 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__conversions__test__convert_s@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/conversions.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(i32 %0) { 9 | alloca_block: 10 | %"0" = alloca double, align 8 11 | %"2_0" = alloca i32, align 4 12 | %"4_0" = alloca double, align 8 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store i32 %0, i32* %"2_0", align 4 17 | %"2_01" = load i32, i32* %"2_0", align 4 18 | %1 = sitofp i32 %"2_01" to double 19 | store double %1, double* %"4_0", align 8 20 | %"4_02" = load double, double* %"4_0", align 8 21 | store double %"4_02", double* %"0", align 8 22 | %"03" = load double, double* %"0", align 8 23 | ret double %"03" 24 | } 25 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__conversions__test__convert_u@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/conversions.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(i16 %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = uitofp i16 %0 to double 14 | ret double %1 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__conversions__test__convert_u@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/conversions.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(i16 %0) { 9 | alloca_block: 10 | %"0" = alloca double, align 8 11 | %"2_0" = alloca i16, align 2 12 | %"4_0" = alloca double, align 8 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store i16 %0, i16* %"2_0", align 2 17 | %"2_01" = load i16, i16* %"2_0", align 2 18 | %1 = uitofp i16 %"2_01" to double 19 | store double %1, double* %"4_0", align 8 20 | %"4_02" = load double, double* %"4_0", align 8 21 | store double %"4_02", double* %"0", align 8 22 | %"03" = load double, double* %"0", align 8 23 | ret double %"03" 24 | } 25 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__conversions__test__ifrombool@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/conversions.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8 @_hl.main.1(i1 %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = icmp eq i1 %0, true 14 | %2 = select i1 %1, i8 1, i8 0 15 | ret i8 %2 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__conversions__test__ifrombool@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/conversions.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8 @_hl.main.1(i1 %0) { 9 | alloca_block: 10 | %"0" = alloca i8, align 1 11 | %"2_0" = alloca i1, align 1 12 | %"4_0" = alloca i8, align 1 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store i1 %0, i1* %"2_0", align 1 17 | %"2_01" = load i1, i1* %"2_0", align 1 18 | %1 = icmp eq i1 %"2_01", true 19 | %2 = select i1 %1, i8 1, i8 0 20 | store i8 %2, i8* %"4_0", align 1 21 | %"4_02" = load i8, i8* %"4_0", align 1 22 | store i8 %"4_02", i8* %"0", align 1 23 | %"03" = load i8, i8* %"0", align 1 24 | ret i8 %"03" 25 | } 26 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__conversions__test__itobool@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/conversions.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i8 %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %eq1 = icmp eq i8 %0, 1 14 | %1 = select i1 %eq1, i1 true, i1 false 15 | ret i1 %1 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__conversions__test__itobool@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/conversions.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i8 %0) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca i8, align 1 12 | %"4_0" = alloca i1, align 1 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store i8 %0, i8* %"2_0", align 1 17 | %"2_01" = load i8, i8* %"2_0", align 1 18 | %eq1 = icmp eq i8 %"2_01", 1 19 | %1 = select i1 %eq1, i1 true, i1 false 20 | store i1 %1, i1* %"4_0", align 1 21 | %"4_02" = load i1, i1* %"4_0", align 1 22 | store i1 %"4_02", i1* %"0", align 1 23 | %"03" = load i1, i1* %"0", align 1 24 | ret i1 %"03" 25 | } 26 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__conversions__test__trunc_s@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/conversions.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @0 = private unnamed_addr constant [58 x i8] c"Float value too big to convert to int of given width (32)\00", align 1 9 | 10 | define { i1, { i32, i8* }, i32 } @_hl.main.1(double %0) { 11 | alloca_block: 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | %within_upper_bound = fcmp olt double %0, 0x41DFFFFFFFC00000 16 | %within_lower_bound = fcmp ole double 0xC1E0000000000000, %0 17 | %success = and i1 %within_upper_bound, %within_lower_bound 18 | %trunc_result = fptosi double %0 to i32 19 | %1 = insertvalue { i1, { i32, i8* }, i32 } { i1 true, { i32, i8* } poison, i32 poison }, i32 %trunc_result, 2 20 | %2 = select i1 %success, { i1, { i32, i8* }, i32 } %1, { i1, { i32, i8* }, i32 } { i1 false, { i32, i8* } { i32 2, i8* getelementptr inbounds ([58 x i8], [58 x i8]* @0, i32 0, i32 0) }, i32 poison } 21 | ret { i1, { i32, i8* }, i32 } %2 22 | } 23 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__conversions__test__trunc_u@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/conversions.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @0 = private unnamed_addr constant [58 x i8] c"Float value too big to convert to int of given width (64)\00", align 1 9 | 10 | define { i1, { i32, i8* }, i64 } @_hl.main.1(double %0) { 11 | alloca_block: 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | %within_upper_bound = fcmp olt double %0, 0x43F0000000000000 16 | %within_lower_bound = fcmp ole double 0.000000e+00, %0 17 | %success = and i1 %within_upper_bound, %within_lower_bound 18 | %trunc_result = fptoui double %0 to i64 19 | %1 = insertvalue { i1, { i32, i8* }, i64 } { i1 true, { i32, i8* } poison, i64 poison }, i64 %trunc_result, 2 20 | %2 = select i1 %success, { i1, { i32, i8* }, i64 } %1, { i1, { i32, i8* }, i64 } { i1 false, { i32, i8* } { i32 2, i8* getelementptr inbounds ([58 x i8], [58 x i8]* @0, i32 0, i32 0) }, i64 poison } 21 | ret { i1, { i32, i8* }, i64 } %2 22 | } 23 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__const_float@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret double 3.120000e+00 14 | } 15 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__const_float@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1() { 9 | alloca_block: 10 | %"0" = alloca double, align 8 11 | %"5_0" = alloca double, align 8 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | store double 3.120000e+00, double* %"5_0", align 8 16 | %"5_01" = load double, double* %"5_0", align 8 17 | store double %"5_01", double* %"0", align 8 18 | %"02" = load double, double* %"0", align 8 19 | ret double %"02" 20 | } 21 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fadd@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = fadd double %0, %1 14 | ret double %2 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fadd@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | %"0" = alloca double, align 8 11 | %"2_0" = alloca double, align 8 12 | %"2_1" = alloca double, align 8 13 | %"4_0" = alloca double, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store double %0, double* %"2_0", align 8 18 | store double %1, double* %"2_1", align 8 19 | %"2_01" = load double, double* %"2_0", align 8 20 | %"2_12" = load double, double* %"2_1", align 8 21 | %2 = fadd double %"2_01", %"2_12" 22 | store double %2, double* %"4_0", align 8 23 | %"4_03" = load double, double* %"4_0", align 8 24 | store double %"4_03", double* %"0", align 8 25 | %"04" = load double, double* %"0", align 8 26 | ret double %"04" 27 | } 28 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fdiv@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = fdiv double %0, %1 14 | ret double %2 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fdiv@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | %"0" = alloca double, align 8 11 | %"2_0" = alloca double, align 8 12 | %"2_1" = alloca double, align 8 13 | %"4_0" = alloca double, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store double %0, double* %"2_0", align 8 18 | store double %1, double* %"2_1", align 8 19 | %"2_01" = load double, double* %"2_0", align 8 20 | %"2_12" = load double, double* %"2_1", align 8 21 | %2 = fdiv double %"2_01", %"2_12" 22 | store double %2, double* %"4_0", align 8 23 | %"4_03" = load double, double* %"4_0", align 8 24 | store double %"4_03", double* %"0", align 8 25 | %"04" = load double, double* %"0", align 8 26 | ret double %"04" 27 | } 28 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__feq@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = fcmp oeq double %0, %1 14 | %3 = select i1 %2, i1 true, i1 false 15 | ret i1 %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__feq@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca double, align 8 12 | %"2_1" = alloca double, align 8 13 | %"4_0" = alloca i1, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store double %0, double* %"2_0", align 8 18 | store double %1, double* %"2_1", align 8 19 | %"2_01" = load double, double* %"2_0", align 8 20 | %"2_12" = load double, double* %"2_1", align 8 21 | %2 = fcmp oeq double %"2_01", %"2_12" 22 | %3 = select i1 %2, i1 true, i1 false 23 | store i1 %3, i1* %"4_0", align 1 24 | %"4_03" = load i1, i1* %"4_0", align 1 25 | store i1 %"4_03", i1* %"0", align 1 26 | %"04" = load i1, i1* %"0", align 1 27 | ret i1 %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fge@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = fcmp oge double %0, %1 14 | %3 = select i1 %2, i1 true, i1 false 15 | ret i1 %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fge@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca double, align 8 12 | %"2_1" = alloca double, align 8 13 | %"4_0" = alloca i1, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store double %0, double* %"2_0", align 8 18 | store double %1, double* %"2_1", align 8 19 | %"2_01" = load double, double* %"2_0", align 8 20 | %"2_12" = load double, double* %"2_1", align 8 21 | %2 = fcmp oge double %"2_01", %"2_12" 22 | %3 = select i1 %2, i1 true, i1 false 23 | store i1 %3, i1* %"4_0", align 1 24 | %"4_03" = load i1, i1* %"4_0", align 1 25 | store i1 %"4_03", i1* %"0", align 1 26 | %"04" = load i1, i1* %"0", align 1 27 | ret i1 %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fgt@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = fcmp ogt double %0, %1 14 | %3 = select i1 %2, i1 true, i1 false 15 | ret i1 %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fgt@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca double, align 8 12 | %"2_1" = alloca double, align 8 13 | %"4_0" = alloca i1, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store double %0, double* %"2_0", align 8 18 | store double %1, double* %"2_1", align 8 19 | %"2_01" = load double, double* %"2_0", align 8 20 | %"2_12" = load double, double* %"2_1", align 8 21 | %2 = fcmp ogt double %"2_01", %"2_12" 22 | %3 = select i1 %2, i1 true, i1 false 23 | store i1 %3, i1* %"4_0", align 1 24 | %"4_03" = load i1, i1* %"4_0", align 1 25 | store i1 %"4_03", i1* %"0", align 1 26 | %"04" = load i1, i1* %"0", align 1 27 | ret i1 %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fle@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = fcmp ole double %0, %1 14 | %3 = select i1 %2, i1 true, i1 false 15 | ret i1 %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fle@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca double, align 8 12 | %"2_1" = alloca double, align 8 13 | %"4_0" = alloca i1, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store double %0, double* %"2_0", align 8 18 | store double %1, double* %"2_1", align 8 19 | %"2_01" = load double, double* %"2_0", align 8 20 | %"2_12" = load double, double* %"2_1", align 8 21 | %2 = fcmp ole double %"2_01", %"2_12" 22 | %3 = select i1 %2, i1 true, i1 false 23 | store i1 %3, i1* %"4_0", align 1 24 | %"4_03" = load i1, i1* %"4_0", align 1 25 | store i1 %"4_03", i1* %"0", align 1 26 | %"04" = load i1, i1* %"0", align 1 27 | ret i1 %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__flt@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = fcmp olt double %0, %1 14 | %3 = select i1 %2, i1 true, i1 false 15 | ret i1 %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__flt@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca double, align 8 12 | %"2_1" = alloca double, align 8 13 | %"4_0" = alloca i1, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store double %0, double* %"2_0", align 8 18 | store double %1, double* %"2_1", align 8 19 | %"2_01" = load double, double* %"2_0", align 8 20 | %"2_12" = load double, double* %"2_1", align 8 21 | %2 = fcmp olt double %"2_01", %"2_12" 22 | %3 = select i1 %2, i1 true, i1 false 23 | store i1 %3, i1* %"4_0", align 1 24 | %"4_03" = load i1, i1* %"4_0", align 1 25 | store i1 %"4_03", i1* %"0", align 1 26 | %"04" = load i1, i1* %"0", align 1 27 | ret i1 %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fmul@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = fmul double %0, %1 14 | ret double %2 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fmul@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | %"0" = alloca double, align 8 11 | %"2_0" = alloca double, align 8 12 | %"2_1" = alloca double, align 8 13 | %"4_0" = alloca double, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store double %0, double* %"2_0", align 8 18 | store double %1, double* %"2_1", align 8 19 | %"2_01" = load double, double* %"2_0", align 8 20 | %"2_12" = load double, double* %"2_1", align 8 21 | %2 = fmul double %"2_01", %"2_12" 22 | store double %2, double* %"4_0", align 8 23 | %"4_03" = load double, double* %"4_0", align 8 24 | store double %"4_03", double* %"0", align 8 25 | %"04" = load double, double* %"0", align 8 26 | ret double %"04" 27 | } 28 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fne@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = fcmp one double %0, %1 14 | %3 = select i1 %2, i1 true, i1 false 15 | ret i1 %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fne@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca double, align 8 12 | %"2_1" = alloca double, align 8 13 | %"4_0" = alloca i1, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store double %0, double* %"2_0", align 8 18 | store double %1, double* %"2_1", align 8 19 | %"2_01" = load double, double* %"2_0", align 8 20 | %"2_12" = load double, double* %"2_1", align 8 21 | %2 = fcmp one double %"2_01", %"2_12" 22 | %3 = select i1 %2, i1 true, i1 false 23 | store i1 %3, i1* %"4_0", align 1 24 | %"4_03" = load i1, i1* %"4_0", align 1 25 | store i1 %"4_03", i1* %"0", align 1 26 | %"04" = load i1, i1* %"0", align 1 27 | ret i1 %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fneg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(double %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = fneg double %0 14 | ret double %1 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fneg@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(double %0) { 9 | alloca_block: 10 | %"0" = alloca double, align 8 11 | %"2_0" = alloca double, align 8 12 | %"4_0" = alloca double, align 8 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store double %0, double* %"2_0", align 8 17 | %"2_01" = load double, double* %"2_0", align 8 18 | %1 = fneg double %"2_01" 19 | store double %1, double* %"4_0", align 8 20 | %"4_02" = load double, double* %"4_0", align 8 21 | store double %"4_02", double* %"0", align 8 22 | %"03" = load double, double* %"0", align 8 23 | ret double %"03" 24 | } 25 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fpow@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = call double @llvm.pow.f64(double %0, double %1) 14 | ret double %2 15 | } 16 | 17 | ; Function Attrs: nofree nosync nounwind readnone speculatable willreturn 18 | declare double @llvm.pow.f64(double, double) #0 19 | 20 | attributes #0 = { nofree nosync nounwind readnone speculatable willreturn } 21 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fpow@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | %"0" = alloca double, align 8 11 | %"2_0" = alloca double, align 8 12 | %"2_1" = alloca double, align 8 13 | %"4_0" = alloca double, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store double %0, double* %"2_0", align 8 18 | store double %1, double* %"2_1", align 8 19 | %"2_01" = load double, double* %"2_0", align 8 20 | %"2_12" = load double, double* %"2_1", align 8 21 | %2 = call double @llvm.pow.f64(double %"2_01", double %"2_12") 22 | store double %2, double* %"4_0", align 8 23 | %"4_03" = load double, double* %"4_0", align 8 24 | store double %"4_03", double* %"0", align 8 25 | %"04" = load double, double* %"0", align 8 26 | ret double %"04" 27 | } 28 | 29 | ; Function Attrs: nofree nosync nounwind readnone speculatable willreturn 30 | declare double @llvm.pow.f64(double, double) #0 31 | 32 | attributes #0 = { nofree nosync nounwind readnone speculatable willreturn } 33 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fsub@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = fsub double %0, %1 14 | ret double %2 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__float__test__fsub@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/float.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define double @_hl.main.1(double %0, double %1) { 9 | alloca_block: 10 | %"0" = alloca double, align 8 11 | %"2_0" = alloca double, align 8 12 | %"2_1" = alloca double, align 8 13 | %"4_0" = alloca double, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store double %0, double* %"2_0", align 8 18 | store double %1, double* %"2_1", align 8 19 | %"2_01" = load double, double* %"2_0", align 8 20 | %"2_12" = load double, double* %"2_1", align 8 21 | %2 = fsub double %"2_01", %"2_12" 22 | store double %2, double* %"4_0", align 8 23 | %"4_03" = load double, double* %"4_0", align 8 24 | store double %"4_03", double* %"0", align 8 25 | %"04" = load double, double* %"0", align 8 26 | ret double %"04" 27 | } 28 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__emission@llvm14_idivmod_checked_u_[6].snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @0 = private unnamed_addr constant [24 x i8] c"Attempted division by 0\00", align 1 9 | 10 | define { i1, { i64, i64 }, { i32, i8* } } @_hl.main.1(i64 %0, i64 %1) { 11 | alloca_block: 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | %valid_div = icmp ne i64 %1, 0 16 | %quotient = udiv i64 %0, %1 17 | %remainder = urem i64 %0, %1 18 | %2 = insertvalue { i64, i64 } poison, i64 %quotient, 0 19 | %3 = insertvalue { i64, i64 } %2, i64 %remainder, 1 20 | %4 = insertvalue { i1, { i64, i64 }, { i32, i8* } } { i1 true, { i64, i64 } poison, { i32, i8* } poison }, { i64, i64 } %3, 1 21 | %5 = select i1 %valid_div, { i1, { i64, i64 }, { i32, i8* } } %4, { i1, { i64, i64 }, { i32, i8* } } { i1 false, { i64, i64 } poison, { i32, i8* } { i32 2, i8* getelementptr inbounds ([24 x i8], [24 x i8]* @0, i32 0, i32 0) } } 22 | ret { i1, { i64, i64 }, { i32, i8* } } %5 23 | } 24 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__emission@llvm14_ineg_[2].snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8 @_hl.main.1(i8 %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = sub i8 0, %0 14 | ret i8 %1 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__emission@llvm14_is_to_u_[3].snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @0 = private unnamed_addr constant [33 x i8] c"is_to_u called on negative value\00", align 1 9 | @prelude.panic_template = private unnamed_addr constant [34 x i8] c"Program panicked (signal %i): %s\0A\00", align 1 10 | 11 | define i8 @_hl.main.1(i8 %0) { 12 | alloca_block: 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | %bounds_check = icmp sge i8 %0, 0 17 | br label %panic_if_0 18 | 19 | panic_if_0: ; preds = %entry_block 20 | switch i1 %bounds_check, label %panic [ 21 | i1 true, label %exit 22 | ] 23 | 24 | panic: ; preds = %panic_if_0 25 | %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @prelude.panic_template, i32 0, i32 0), i32 2, i8* getelementptr inbounds ([33 x i8], [33 x i8]* @0, i32 0, i32 0)) 26 | call void @abort() 27 | br label %exit 28 | 29 | exit: ; preds = %panic_if_0, %panic 30 | ret i8 %0 31 | } 32 | 33 | declare i32 @printf(i8*, ...) 34 | 35 | declare void @abort() 36 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__emission@llvm14_iu_to_s_[3].snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @0 = private unnamed_addr constant [31 x i8] c"iu_to_s argument out of bounds\00", align 1 9 | @prelude.panic_template = private unnamed_addr constant [34 x i8] c"Program panicked (signal %i): %s\0A\00", align 1 10 | 11 | define i8 @_hl.main.1(i8 %0) { 12 | alloca_block: 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | %bounds_check = icmp ule i8 %0, 127 17 | br label %panic_if_0 18 | 19 | panic_if_0: ; preds = %entry_block 20 | switch i1 %bounds_check, label %panic [ 21 | i1 true, label %exit 22 | ] 23 | 24 | panic: ; preds = %panic_if_0 25 | %1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @prelude.panic_template, i32 0, i32 0), i32 2, i8* getelementptr inbounds ([31 x i8], [31 x i8]* @0, i32 0, i32 0)) 26 | call void @abort() 27 | br label %exit 28 | 29 | exit: ; preds = %panic_if_0, %panic 30 | ret i8 %0 31 | } 32 | 33 | declare i32 @printf(i8*, ...) 34 | 35 | declare void @abort() 36 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__emission@pre-mem2reg@llvm14_ineg_[2].snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8 @_hl.main.1(i8 %0) { 9 | alloca_block: 10 | %"0" = alloca i8, align 1 11 | %"2_0" = alloca i8, align 1 12 | %"4_0" = alloca i8, align 1 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store i8 %0, i8* %"2_0", align 1 17 | %"2_01" = load i8, i8* %"2_0", align 1 18 | %1 = sub i8 0, %"2_01" 19 | store i8 %1, i8* %"4_0", align 1 20 | %"4_02" = load i8, i8* %"4_0", align 1 21 | store i8 %"4_02", i8* %"0", align 1 22 | %"03" = load i8, i8* %"0", align 1 23 | ret i8 %"03" 24 | } 25 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__iadd@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8 @_hl.main.1(i8 %0, i8 %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = add i8 %0, %1 14 | ret i8 %2 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__iadd@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8 @_hl.main.1(i8 %0, i8 %1) { 9 | alloca_block: 10 | %"0" = alloca i8, align 1 11 | %"2_0" = alloca i8, align 1 12 | %"2_1" = alloca i8, align 1 13 | %"4_0" = alloca i8, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i8 %0, i8* %"2_0", align 1 18 | store i8 %1, i8* %"2_1", align 1 19 | %"2_01" = load i8, i8* %"2_0", align 1 20 | %"2_12" = load i8, i8* %"2_1", align 1 21 | %2 = add i8 %"2_01", %"2_12" 22 | store i8 %2, i8* %"4_0", align 1 23 | %"4_03" = load i8, i8* %"4_0", align 1 24 | store i8 %"4_03", i8* %"0", align 1 25 | %"04" = load i8, i8* %"0", align 1 26 | ret i8 %"04" 27 | } 28 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__ieq@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i8 %0, i8 %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = icmp eq i8 %0, %1 14 | %3 = select i1 %2, i1 true, i1 false 15 | ret i1 %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__ieq@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i8 %0, i8 %1) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca i8, align 1 12 | %"2_1" = alloca i8, align 1 13 | %"4_0" = alloca i1, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i8 %0, i8* %"2_0", align 1 18 | store i8 %1, i8* %"2_1", align 1 19 | %"2_01" = load i8, i8* %"2_0", align 1 20 | %"2_12" = load i8, i8* %"2_1", align 1 21 | %2 = icmp eq i8 %"2_01", %"2_12" 22 | %3 = select i1 %2, i1 true, i1 false 23 | store i1 %3, i1* %"4_0", align 1 24 | %"4_03" = load i1, i1* %"4_0", align 1 25 | store i1 %"4_03", i1* %"0", align 1 26 | %"04" = load i1, i1* %"0", align 1 27 | ret i1 %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__ilt_s@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i8 %0, i8 %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = icmp slt i8 %0, %1 14 | %3 = select i1 %2, i1 true, i1 false 15 | ret i1 %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__ilt_s@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i8 %0, i8 %1) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca i8, align 1 12 | %"2_1" = alloca i8, align 1 13 | %"4_0" = alloca i1, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i8 %0, i8* %"2_0", align 1 18 | store i8 %1, i8* %"2_1", align 1 19 | %"2_01" = load i8, i8* %"2_0", align 1 20 | %"2_12" = load i8, i8* %"2_1", align 1 21 | %2 = icmp slt i8 %"2_01", %"2_12" 22 | %3 = select i1 %2, i1 true, i1 false 23 | store i1 %3, i1* %"4_0", align 1 24 | %"4_03" = load i1, i1* %"4_0", align 1 25 | store i1 %"4_03", i1* %"0", align 1 26 | %"04" = load i1, i1* %"0", align 1 27 | ret i1 %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__inarrow_s_3_2@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @0 = private unnamed_addr constant [25 x i8] c"Can't narrow into bounds\00", align 1 9 | 10 | define { i1, { i32, i8* }, i8 } @_hl.main.1(i8 %0) { 11 | alloca_block: 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | %upper_bounds_check = icmp sgt i8 %0, 7 16 | %lower_bounds_check = icmp slt i8 %0, -8 17 | %outside_range = or i1 %upper_bounds_check, %lower_bounds_check 18 | %inbounds = xor i1 %outside_range, true 19 | %1 = insertvalue { i1, { i32, i8* }, i8 } { i1 true, { i32, i8* } poison, i8 poison }, i8 %0, 2 20 | %2 = select i1 %inbounds, { i1, { i32, i8* }, i8 } %1, { i1, { i32, i8* }, i8 } { i1 false, { i32, i8* } { i32 2, i8* getelementptr inbounds ([25 x i8], [25 x i8]* @0, i32 0, i32 0) }, i8 poison } 21 | ret { i1, { i32, i8* }, i8 } %2 22 | } 23 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__inarrow_u_6_4@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @0 = private unnamed_addr constant [25 x i8] c"Can't narrow into bounds\00", align 1 9 | 10 | define { i1, { i32, i8* }, i16 } @_hl.main.1(i64 %0) { 11 | alloca_block: 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | %upper_bounds_check = icmp ugt i64 %0, 65535 16 | %inbounds = xor i1 %upper_bounds_check, true 17 | %1 = trunc i64 %0 to i16 18 | %2 = insertvalue { i1, { i32, i8* }, i16 } { i1 true, { i32, i8* } poison, i16 poison }, i16 %1, 2 19 | %3 = select i1 %inbounds, { i1, { i32, i8* }, i16 } %2, { i1, { i32, i8* }, i16 } { i1 false, { i32, i8* } { i32 2, i8* getelementptr inbounds ([25 x i8], [25 x i8]* @0, i32 0, i32 0) }, i16 poison } 20 | ret { i1, { i32, i8* }, i16 } %3 21 | } 22 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__isub@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1(i64 %0, i64 %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = sub i64 %0, %1 14 | ret i64 %2 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__isub@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1(i64 %0, i64 %1) { 9 | alloca_block: 10 | %"0" = alloca i64, align 8 11 | %"2_0" = alloca i64, align 8 12 | %"2_1" = alloca i64, align 8 13 | %"4_0" = alloca i64, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i64 %0, i64* %"2_0", align 4 18 | store i64 %1, i64* %"2_1", align 4 19 | %"2_01" = load i64, i64* %"2_0", align 4 20 | %"2_12" = load i64, i64* %"2_1", align 4 21 | %2 = sub i64 %"2_01", %"2_12" 22 | store i64 %2, i64* %"4_0", align 4 23 | %"4_03" = load i64, i64* %"4_0", align 4 24 | store i64 %"4_03", i64* %"0", align 4 25 | %"04" = load i64, i64* %"0", align 4 26 | ret i64 %"04" 27 | } 28 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__iwiden_s_1_6@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1(i8 %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = sext i8 %0 to i64 14 | ret i64 %1 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__iwiden_s_1_6@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1(i8 %0) { 9 | alloca_block: 10 | %"0" = alloca i64, align 8 11 | %"2_0" = alloca i8, align 1 12 | %"4_0" = alloca i64, align 8 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store i8 %0, i8* %"2_0", align 1 17 | %"2_01" = load i8, i8* %"2_0", align 1 18 | %1 = sext i8 %"2_01" to i64 19 | store i64 %1, i64* %"4_0", align 4 20 | %"4_02" = load i64, i64* %"4_0", align 4 21 | store i64 %"4_02", i64* %"0", align 4 22 | %"03" = load i64, i64* %"0", align 4 23 | ret i64 %"03" 24 | } 25 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__iwiden_s_2_3@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8 @_hl.main.1(i8 %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret i8 %0 14 | } 15 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__iwiden_s_2_3@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8 @_hl.main.1(i8 %0) { 9 | alloca_block: 10 | %"0" = alloca i8, align 1 11 | %"2_0" = alloca i8, align 1 12 | %"4_0" = alloca i8, align 1 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store i8 %0, i8* %"2_0", align 1 17 | %"2_01" = load i8, i8* %"2_0", align 1 18 | store i8 %"2_01", i8* %"4_0", align 1 19 | %"4_02" = load i8, i8* %"4_0", align 1 20 | store i8 %"4_02", i8* %"0", align 1 21 | %"03" = load i8, i8* %"0", align 1 22 | ret i8 %"03" 23 | } 24 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__iwiden_u_1_6@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1(i8 %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = zext i8 %0 to i64 14 | ret i64 %1 15 | } 16 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__iwiden_u_1_6@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1(i8 %0) { 9 | alloca_block: 10 | %"0" = alloca i64, align 8 11 | %"2_0" = alloca i8, align 1 12 | %"4_0" = alloca i64, align 8 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store i8 %0, i8* %"2_0", align 1 17 | %"2_01" = load i8, i8* %"2_0", align 1 18 | %1 = zext i8 %"2_01" to i64 19 | store i64 %1, i64* %"4_0", align 4 20 | %"4_02" = load i64, i64* %"4_0", align 4 21 | store i64 %"4_02", i64* %"0", align 4 22 | %"03" = load i64, i64* %"0", align 4 23 | ret i64 %"03" 24 | } 25 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__iwiden_u_2_3@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8 @_hl.main.1(i8 %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret i8 %0 14 | } 15 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__int__test__iwiden_u_2_3@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/int.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i8 @_hl.main.1(i8 %0) { 9 | alloca_block: 10 | %"0" = alloca i8, align 1 11 | %"2_0" = alloca i8, align 1 12 | %"4_0" = alloca i8, align 1 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store i8 %0, i8* %"2_0", align 1 17 | %"2_01" = load i8, i8* %"2_0", align 1 18 | store i8 %"2_01", i8* %"4_0", align 1 19 | %"4_02" = load i8, i8* %"4_0", align 1 20 | store i8 %"4_02", i8* %"0", align 1 21 | %"03" = load i8, i8* %"0", align 1 22 | ret i8 %"03" 23 | } 24 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__logic__test__and@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/logic.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i1 %0, i1 %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = and i1 %0, %1 14 | %3 = select i1 %2, i1 true, i1 false 15 | ret i1 %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__logic__test__and@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/logic.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i1 %0, i1 %1) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca i1, align 1 12 | %"2_1" = alloca i1, align 1 13 | %"4_0" = alloca i1, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i1 %0, i1* %"2_0", align 1 18 | store i1 %1, i1* %"2_1", align 1 19 | %"2_01" = load i1, i1* %"2_0", align 1 20 | %"2_12" = load i1, i1* %"2_1", align 1 21 | %2 = and i1 %"2_01", %"2_12" 22 | %3 = select i1 %2, i1 true, i1 false 23 | store i1 %3, i1* %"4_0", align 1 24 | %"4_03" = load i1, i1* %"4_0", align 1 25 | store i1 %"4_03", i1* %"0", align 1 26 | %"04" = load i1, i1* %"0", align 1 27 | ret i1 %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__logic__test__eq@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/logic.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i1 %0, i1 %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = icmp eq i1 %0, %1 14 | %3 = select i1 %2, i1 true, i1 false 15 | ret i1 %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__logic__test__eq@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/logic.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i1 %0, i1 %1) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca i1, align 1 12 | %"2_1" = alloca i1, align 1 13 | %"4_0" = alloca i1, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i1 %0, i1* %"2_0", align 1 18 | store i1 %1, i1* %"2_1", align 1 19 | %"2_01" = load i1, i1* %"2_0", align 1 20 | %"2_12" = load i1, i1* %"2_1", align 1 21 | %2 = icmp eq i1 %"2_01", %"2_12" 22 | %3 = select i1 %2, i1 true, i1 false 23 | store i1 %3, i1* %"4_0", align 1 24 | %"4_03" = load i1, i1* %"4_0", align 1 25 | store i1 %"4_03", i1* %"0", align 1 26 | %"04" = load i1, i1* %"0", align 1 27 | ret i1 %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__logic__test__not@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/logic.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i1 %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = xor i1 %0, true 14 | %2 = select i1 %1, i1 true, i1 false 15 | ret i1 %2 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__logic__test__not@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/logic.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i1 %0) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca i1, align 1 12 | %"4_0" = alloca i1, align 1 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store i1 %0, i1* %"2_0", align 1 17 | %"2_01" = load i1, i1* %"2_0", align 1 18 | %1 = xor i1 %"2_01", true 19 | %2 = select i1 %1, i1 true, i1 false 20 | store i1 %2, i1* %"4_0", align 1 21 | %"4_02" = load i1, i1* %"4_0", align 1 22 | store i1 %"4_02", i1* %"0", align 1 23 | %"03" = load i1, i1* %"0", align 1 24 | ret i1 %"03" 25 | } 26 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__logic__test__or@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/logic.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i1 %0, i1 %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = or i1 %0, %1 14 | %3 = select i1 %2, i1 true, i1 false 15 | ret i1 %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__logic__test__or@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/logic.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i1 %0, i1 %1) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca i1, align 1 12 | %"2_1" = alloca i1, align 1 13 | %"4_0" = alloca i1, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i1 %0, i1* %"2_0", align 1 18 | store i1 %1, i1* %"2_1", align 1 19 | %"2_01" = load i1, i1* %"2_0", align 1 20 | %"2_12" = load i1, i1* %"2_1", align 1 21 | %2 = or i1 %"2_01", %"2_12" 22 | %3 = select i1 %2, i1 true, i1 false 23 | store i1 %3, i1* %"4_0", align 1 24 | %"4_03" = load i1, i1* %"4_0", align 1 25 | store i1 %"4_03", i1* %"0", align 1 26 | %"04" = load i1, i1* %"0", align 1 27 | ret i1 %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__logic__test__xor@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/logic.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i1 %0, i1 %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = xor i1 %0, %1 14 | %3 = select i1 %2, i1 true, i1 false 15 | ret i1 %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__logic__test__xor@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/logic.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i1 @_hl.main.1(i1 %0, i1 %1) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"2_0" = alloca i1, align 1 12 | %"2_1" = alloca i1, align 1 13 | %"4_0" = alloca i1, align 1 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i1 %0, i1* %"2_0", align 1 18 | store i1 %1, i1* %"2_1", align 1 19 | %"2_01" = load i1, i1* %"2_0", align 1 20 | %"2_12" = load i1, i1* %"2_1", align 1 21 | %2 = xor i1 %"2_01", %"2_12" 22 | %3 = select i1 %2, i1 true, i1 false 23 | store i1 %3, i1* %"4_0", align 1 24 | %"4_03" = load i1, i1* %"4_0", align 1 25 | store i1 %"4_03", i1* %"0", align 1 26 | %"04" = load i1, i1* %"0", align 1 27 | ret i1 %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_barrier@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret i64 42 14 | } 15 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_barrier@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1() { 9 | alloca_block: 10 | %"0" = alloca i64, align 8 11 | %"5_0" = alloca i64, align 8 12 | %"6_0" = alloca i64, align 8 13 | %"6_1" = alloca i64, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i64 42, i64* %"5_0", align 4 18 | %"5_01" = load i64, i64* %"5_0", align 4 19 | %"5_02" = load i64, i64* %"5_0", align 4 20 | store i64 %"5_01", i64* %"6_0", align 4 21 | store i64 %"5_02", i64* %"6_1", align 4 22 | %"6_03" = load i64, i64* %"6_0", align 4 23 | store i64 %"6_03", i64* %"0", align 4 24 | %"04" = load i64, i64* %"0", align 4 25 | ret i64 %"04" 26 | } 27 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_const_external_symbol@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @sym2 = external global { i1, i64, i2 } 9 | @sym1 = external constant i64 10 | 11 | define { i64, { i1, i64, i2 } } @_hl.main.1() { 12 | alloca_block: 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | %sym2 = load { i1, i64, i2 }, { i1, i64, i2 }* @sym2, align 4 17 | %sym1 = load i64, i64* @sym1, align 4 18 | %mrv = insertvalue { i64, { i1, i64, i2 } } undef, i64 %sym1, 0 19 | %mrv5 = insertvalue { i64, { i1, i64, i2 } } %mrv, { i1, i64, i2 } %sym2, 1 20 | ret { i64, { i1, i64, i2 } } %mrv5 21 | } 22 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_const_usize@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret i64 17 14 | } 15 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_const_usize@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1() { 9 | alloca_block: 10 | %"0" = alloca i64, align 8 11 | %"5_0" = alloca i64, align 8 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | store i64 17, i64* %"5_0", align 4 16 | %"5_01" = load i64, i64* %"5_0", align 4 17 | store i64 %"5_01", i64* %"0", align 4 18 | %"02" = load i64, i64* %"0", align 4 19 | ret i64 %"02" 20 | } 21 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_exit@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @0 = private unnamed_addr constant [5 x i8] c"EXIT\00", align 1 9 | @prelude.panic_template = private unnamed_addr constant [34 x i8] c"Program panicked (signal %i): %s\0A\00", align 1 10 | 11 | define { i16, i16 } @_hl.main.1(i16 %0, i16 %1) { 12 | alloca_block: 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | %2 = extractvalue { i32, i8* } { i32 42, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @0, i32 0, i32 0) }, 0 17 | %3 = extractvalue { i32, i8* } { i32 42, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @0, i32 0, i32 0) }, 1 18 | %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @prelude.panic_template, i32 0, i32 0), i32 %2, i8* %3) 19 | call void @abort() 20 | %mrv = insertvalue { i16, i16 } undef, i16 0, 0 21 | %mrv8 = insertvalue { i16, i16 } %mrv, i16 0, 1 22 | ret { i16, i16 } %mrv8 23 | } 24 | 25 | declare i32 @printf(i8*, ...) 26 | 27 | declare void @abort() 28 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_load_nat@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1() { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret i64 42 14 | } 15 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_load_nat@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1() { 9 | alloca_block: 10 | %"0" = alloca i64, align 8 11 | %"4_0" = alloca i64, align 8 12 | br label %entry_block 13 | 14 | entry_block: ; preds = %alloca_block 15 | store i64 42, i64* %"4_0", align 4 16 | %"4_01" = load i64, i64* %"4_0", align 4 17 | store i64 %"4_01", i64* %"0", align 4 18 | %"02" = load i64, i64* %"0", align 4 19 | ret i64 %"02" 20 | } 21 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_make_tuple@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i1, i1 } @_hl.main.1(i1 %0, i1 %1) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %2 = insertvalue { i1, i1 } poison, i1 %0, 0 14 | %3 = insertvalue { i1, i1 } %2, i1 %1, 1 15 | ret { i1, i1 } %3 16 | } 17 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_make_tuple@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i1, i1 } @_hl.main.1(i1 %0, i1 %1) { 9 | alloca_block: 10 | %"0" = alloca { i1, i1 }, align 8 11 | %"2_0" = alloca i1, align 1 12 | %"2_1" = alloca i1, align 1 13 | %"4_0" = alloca { i1, i1 }, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i1 %0, i1* %"2_0", align 1 18 | store i1 %1, i1* %"2_1", align 1 19 | %"2_01" = load i1, i1* %"2_0", align 1 20 | %"2_12" = load i1, i1* %"2_1", align 1 21 | %2 = insertvalue { i1, i1 } poison, i1 %"2_01", 0 22 | %3 = insertvalue { i1, i1 } %2, i1 %"2_12", 1 23 | store { i1, i1 } %3, { i1, i1 }* %"4_0", align 1 24 | %"4_03" = load { i1, i1 }, { i1, i1 }* %"4_0", align 1 25 | store { i1, i1 } %"4_03", { i1, i1 }* %"0", align 1 26 | %"04" = load { i1, i1 }, { i1, i1 }* %"0", align 1 27 | ret { i1, i1 } %"04" 28 | } 29 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_noop@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1(i64 %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | ret i64 %0 14 | } 15 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_noop@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define i64 @_hl.main.1(i64 %0) { 9 | alloca_block: 10 | %"0" = alloca i64, align 8 11 | %"2_0" = alloca i64, align 8 12 | %"4_0" = alloca i64, align 8 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | store i64 %0, i64* %"2_0", align 4 17 | %"2_01" = load i64, i64* %"2_0", align 4 18 | store i64 %"2_01", i64* %"4_0", align 4 19 | %"4_02" = load i64, i64* %"4_0", align 4 20 | store i64 %"4_02", i64* %"0", align 4 21 | %"03" = load i64, i64* %"0", align 4 22 | ret i64 %"03" 23 | } 24 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_panic@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @0 = private unnamed_addr constant [6 x i8] c"PANIC\00", align 1 9 | @prelude.panic_template = private unnamed_addr constant [34 x i8] c"Program panicked (signal %i): %s\0A\00", align 1 10 | 11 | define { i16, i16 } @_hl.main.1(i16 %0, i16 %1) { 12 | alloca_block: 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | %2 = extractvalue { i32, i8* } { i32 42, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @0, i32 0, i32 0) }, 0 17 | %3 = extractvalue { i32, i8* } { i32 42, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @0, i32 0, i32 0) }, 1 18 | %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @prelude.panic_template, i32 0, i32 0), i32 %2, i8* %3) 19 | call void @abort() 20 | %mrv = insertvalue { i16, i16 } undef, i16 0, 0 21 | %mrv8 = insertvalue { i16, i16 } %mrv, i16 0, 1 22 | ret { i16, i16 } %mrv8 23 | } 24 | 25 | declare i32 @printf(i8*, ...) 26 | 27 | declare void @abort() 28 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_print@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @0 = private unnamed_addr constant [14 x i8] c"Hello, world!\00", align 1 9 | @prelude.print_template = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1 10 | 11 | define void @_hl.main.1() { 12 | alloca_block: 13 | br label %entry_block 14 | 15 | entry_block: ; preds = %alloca_block 16 | %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @prelude.print_template, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @0, i32 0, i32 0)) 17 | ret void 18 | } 19 | 20 | declare i32 @printf(i8*, ...) 21 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_print@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | @0 = private unnamed_addr constant [14 x i8] c"Hello, world!\00", align 1 9 | @prelude.print_template = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1 10 | 11 | define void @_hl.main.1() { 12 | alloca_block: 13 | %"5_0" = alloca i8*, align 8 14 | br label %entry_block 15 | 16 | entry_block: ; preds = %alloca_block 17 | store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @0, i32 0, i32 0), i8** %"5_0", align 8 18 | %"5_01" = load i8*, i8** %"5_0", align 8 19 | %0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @prelude.print_template, i32 0, i32 0), i8* %"5_01") 20 | ret void 21 | } 22 | 23 | declare i32 @printf(i8*, ...) 24 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_unpack_tuple@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i1, i1 } @_hl.main.1({ i1, i1 } %0) { 9 | alloca_block: 10 | br label %entry_block 11 | 12 | entry_block: ; preds = %alloca_block 13 | %1 = extractvalue { i1, i1 } %0, 0 14 | %2 = extractvalue { i1, i1 } %0, 1 15 | %mrv = insertvalue { i1, i1 } undef, i1 %1, 0 16 | %mrv6 = insertvalue { i1, i1 } %mrv, i1 %2, 1 17 | ret { i1, i1 } %mrv6 18 | } 19 | -------------------------------------------------------------------------------- /hugr-llvm/src/extension/snapshots/hugr_llvm__extension__prelude__test__prelude_unpack_tuple@pre-mem2reg@llvm14.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/extension/prelude.rs 3 | expression: mod_str 4 | --- 5 | ; ModuleID = 'test_context' 6 | source_filename = "test_context" 7 | 8 | define { i1, i1 } @_hl.main.1({ i1, i1 } %0) { 9 | alloca_block: 10 | %"0" = alloca i1, align 1 11 | %"1" = alloca i1, align 1 12 | %"2_0" = alloca { i1, i1 }, align 8 13 | %"4_0" = alloca i1, align 1 14 | %"4_1" = alloca i1, align 1 15 | br label %entry_block 16 | 17 | entry_block: ; preds = %alloca_block 18 | store { i1, i1 } %0, { i1, i1 }* %"2_0", align 1 19 | %"2_01" = load { i1, i1 }, { i1, i1 }* %"2_0", align 1 20 | %1 = extractvalue { i1, i1 } %"2_01", 0 21 | %2 = extractvalue { i1, i1 } %"2_01", 1 22 | store i1 %1, i1* %"4_0", align 1 23 | store i1 %2, i1* %"4_1", align 1 24 | %"4_02" = load i1, i1* %"4_0", align 1 25 | %"4_13" = load i1, i1* %"4_1", align 1 26 | store i1 %"4_02", i1* %"0", align 1 27 | store i1 %"4_13", i1* %"1", align 1 28 | %"04" = load i1, i1* %"0", align 1 29 | %"15" = load i1, i1* %"1", align 1 30 | %mrv = insertvalue { i1, i1 } undef, i1 %"04", 0 31 | %mrv6 = insertvalue { i1, i1 } %mrv, i1 %"15", 1 32 | ret { i1, i1 } %mrv6 33 | } 34 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__sum__test__build_untag_tag@nofields.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/sum.rs 3 | expression: module.to_string() 4 | --- 5 | define i2 @untag_tag(i2 %0) { 6 | ret i2 -2 7 | } 8 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__sum__test__build_untag_tag@nofields_elided_fields.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/sum.rs 3 | expression: module.to_string() 4 | --- 5 | define i1 @untag_tag(i1 %0) { 6 | ret i1 false 7 | } 8 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__sum__test__build_untag_tag@one_variant_one_field.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/sum.rs 3 | expression: module.to_string() 4 | --- 5 | define i1 @untag_tag(i1 %0) { 6 | ret i1 %0 7 | } 8 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__sum__test__build_untag_tag@one_variant_one_field_elided_fields.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/sum.rs 3 | expression: module.to_string() 4 | --- 5 | define i1 @untag_tag(i1 %0) { 6 | ret i1 %0 7 | } 8 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__sum__test__build_untag_tag@one_variant_two_fields.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/sum.rs 3 | expression: module.to_string() 4 | --- 5 | define { i1, i1 } @untag_tag({ i1, i1 } %0) { 6 | %2 = extractvalue { i1, i1 } %0, 0 7 | %3 = extractvalue { i1, i1 } %0, 1 8 | %4 = insertvalue { i1, i1 } poison, i1 %2, 0 9 | %5 = insertvalue { i1, i1 } %4, i1 %3, 1 10 | ret { i1, i1 } %5 11 | } 12 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__sum__test__build_untag_tag@one_variant_two_fields_elided_fields.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/sum.rs 3 | expression: module.to_string() 4 | --- 5 | define { i1, i1 } @untag_tag({ i1, i1 } %0) { 6 | %2 = extractvalue { i1, i1 } %0, 0 7 | %3 = extractvalue { i1, i1 } %0, 1 8 | %4 = insertvalue { i1, i1 } poison, i1 %2, 0 9 | %5 = insertvalue { i1, i1 } %4, i1 %3, 1 10 | ret { i1, i1 } %5 11 | } 12 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__sum__test__build_untag_tag@two_variant_one_field.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/sum.rs 3 | expression: module.to_string() 4 | --- 5 | define { i1, i1 } @untag_tag({ i1, i1 } %0) { 6 | %2 = extractvalue { i1, i1 } %0, 0 7 | ret { i1, i1 } { i1 true, i1 poison } 8 | } 9 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__sum__test__build_untag_tag@two_variant_one_field_elided_fields.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/sum.rs 3 | expression: module.to_string() 4 | --- 5 | define { i1, i1 } @untag_tag({ i1, i1 } %0) { 6 | %2 = extractvalue { i1, i1 } %0, 0 7 | ret { i1, i1 } { i1 true, i1 poison } 8 | } 9 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__sum__test__build_untag_tag@unit.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/sum.rs 3 | expression: module.to_string() 4 | --- 5 | define {} @untag_tag({} %0) { 6 | ret {} undef 7 | } 8 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__sum__test__build_untag_tag@unit_elided_fields.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/sum.rs 3 | expression: module.to_string() 4 | --- 5 | define {} @untag_tag({} %0) { 6 | ret {} undef 7 | } 8 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__func_type_to_llvm@llvm14_0.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/types.rs 3 | expression: "[Bool] -> []" 4 | --- 5 | "void (i1)" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__func_type_to_llvm@llvm14_1.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/types.rs 3 | expression: "[Unit] -> [[]+[]+[]]" 4 | --- 5 | "i2 ({})" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__func_type_to_llvm@llvm14_2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/types.rs 3 | expression: "[] -> [Unit, Unit]" 4 | --- 5 | "{ {}, {} } ()" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__sum_type_to_llvm@llvm14_0.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/types.rs 3 | expression: ⊥ 4 | --- 5 | "i1" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__sum_type_to_llvm@llvm14_1.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/types.rs 3 | expression: Unit 4 | --- 5 | "{}" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__sum_type_to_llvm@llvm14_2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/types.rs 3 | expression: "[[]+[]+[]+[], Unit]+[Bool, []+[]+[]]" 4 | --- 5 | "{ i1, i2, i1 }" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__sum_type_to_llvm@llvm14_3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/types.rs 3 | expression: Bool 4 | --- 5 | "i1" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__type_to_llvm@llvm14_0.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/types.rs 3 | expression: "int([BoundedNat { n: 0 }])" 4 | --- 5 | "i8" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__type_to_llvm@llvm14_1.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/types.rs 3 | expression: "int([BoundedNat { n: 3 }])" 4 | --- 5 | "i8" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__type_to_llvm@llvm14_2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/types.rs 3 | expression: "int([BoundedNat { n: 4 }])" 4 | --- 5 | "i16" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__type_to_llvm@llvm14_3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/types.rs 3 | expression: "int([BoundedNat { n: 5 }])" 4 | --- 5 | "i32" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__type_to_llvm@llvm14_4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/types.rs 3 | expression: "int([BoundedNat { n: 6 }])" 4 | --- 5 | "i64" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__type_to_llvm@llvm14_5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/types.rs 3 | expression: "[int(2)]" 4 | --- 5 | "i8" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__type_to_llvm@llvm14_6.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/types.rs 3 | expression: "[int(6), Unit]+[Bool, int(2)]" 4 | --- 5 | "{ i1, i8, i64, i1 }" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/snapshots/hugr_llvm__types__test__type_to_llvm@llvm14_7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-llvm/src/types.rs 3 | expression: "[Bool] -> [[]+[]+[]]" 4 | --- 5 | "i2 (i1)*" 6 | -------------------------------------------------------------------------------- /hugr-llvm/src/utils.rs: -------------------------------------------------------------------------------- 1 | //! Module for utilities that do not depend on LLVM. These are candidates for 2 | //! upstreaming. 3 | pub mod fat; 4 | pub mod inline_constant_functions; 5 | pub mod int_op_builder; 6 | pub mod logic_op_builder; 7 | pub mod type_map; 8 | 9 | pub use inline_constant_functions::inline_constant_functions; 10 | pub use int_op_builder::IntOpBuilder; 11 | pub use logic_op_builder::LogicOpBuilder; 12 | -------------------------------------------------------------------------------- /hugr-llvm/src/utils/int_op_builder.rs: -------------------------------------------------------------------------------- 1 | use hugr_core::{ 2 | Wire, 3 | builder::{BuildError, Dataflow}, 4 | extension::simple_op::HasConcrete as _, 5 | std_extensions::arithmetic::int_ops::IntOpDef, 6 | types::TypeArg, 7 | }; 8 | 9 | pub trait IntOpBuilder: Dataflow { 10 | fn add_iadd( 11 | &mut self, 12 | log_width: impl Into, 13 | x1: Wire, 14 | x2: Wire, 15 | ) -> Result { 16 | // TODO Add an OpLoadError variant to BuildError 17 | let op = IntOpDef::iadd.instantiate(&[log_width.into()]).unwrap(); 18 | Ok(self.add_dataflow_op(op, [x1, x2])?.out_wire(0)) 19 | } 20 | 21 | fn add_ieq( 22 | &mut self, 23 | log_width: impl Into, 24 | x1: Wire, 25 | x2: Wire, 26 | ) -> Result { 27 | // TODO Add an OpLoadError variant to BuildError 28 | let op = IntOpDef::ieq.instantiate(&[log_width.into()]).unwrap(); 29 | Ok(self.add_dataflow_op(op, [x1, x2])?.out_wire(0)) 30 | } 31 | } 32 | 33 | impl IntOpBuilder for D {} 34 | -------------------------------------------------------------------------------- /hugr-llvm/src/utils/logic_op_builder.rs: -------------------------------------------------------------------------------- 1 | use hugr_core::{ 2 | Wire, 3 | builder::{BuildError, Dataflow}, 4 | std_extensions::logic::LogicOp, 5 | }; 6 | 7 | pub trait LogicOpBuilder: Dataflow { 8 | fn add_and(&mut self, x1: Wire, x2: Wire) -> Result { 9 | Ok(self.add_dataflow_op(LogicOp::And, [x1, x2])?.out_wire(0)) 10 | } 11 | 12 | fn add_not(&mut self, x1: Wire) -> Result { 13 | Ok(self.add_dataflow_op(LogicOp::Not, [x1])?.out_wire(0)) 14 | } 15 | } 16 | 17 | impl LogicOpBuilder for D {} 18 | -------------------------------------------------------------------------------- /hugr-model/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "hugr-model" 3 | version = "0.20.1" 4 | readme = "README.md" 5 | documentation = "https://docs.rs/hugr-model/" 6 | description = "Data model for Quantinuum's HUGR intermediate representation" 7 | keywords = ["Quantum", "Quantinuum"] 8 | categories = ["compilers"] 9 | rust-version.workspace = true 10 | edition.workspace = true 11 | homepage.workspace = true 12 | repository.workspace = true 13 | license.workspace = true 14 | 15 | [lib] 16 | bench = false 17 | 18 | [dependencies] 19 | base64 = { workspace = true } 20 | bumpalo = { workspace = true, features = ["collections"] } 21 | capnp = { workspace = true } 22 | derive_more = { workspace = true, features = ["display", "error", "from"] } 23 | fxhash.workspace = true 24 | indexmap.workspace = true 25 | itertools.workspace = true 26 | ordered-float = { workspace = true } 27 | pest = { workspace = true } 28 | pest_derive = { workspace = true } 29 | pretty = { workspace = true } 30 | smol_str = { workspace = true, features = ["serde"] } 31 | thiserror.workspace = true 32 | pyo3 = { workspace = true, optional = true, features = ["extension-module"] } 33 | 34 | [features] 35 | pyo3 = ["dep:pyo3"] 36 | 37 | [lints] 38 | workspace = true 39 | 40 | [dev-dependencies] 41 | insta = { workspace = true } 42 | pretty_assertions = { workspace = true } 43 | proptest = { workspace = true } 44 | proptest-derive = { workspace = true } 45 | -------------------------------------------------------------------------------- /hugr-model/src/capnp/mod.rs: -------------------------------------------------------------------------------- 1 | //! This module contains the Cap'n Proto encoding and decoding functions 2 | //! generated from the `.capn` schema. 3 | //! 4 | //! These files **SHOULD NOT** be edited manually. 5 | //! Instead, use `just update-model-capnp` to regenerate them. 6 | 7 | #[allow(warnings)] 8 | #[allow(unknown_lints)] 9 | #[allow(clippy::all)] 10 | #[rustfmt::skip] 11 | pub mod hugr_v0_capnp; 12 | -------------------------------------------------------------------------------- /hugr-model/src/lib.rs: -------------------------------------------------------------------------------- 1 | //! The data model of the HUGR intermediate representation. 2 | //! This crate defines data structures that capture the structure of a HUGR graph and 3 | //! all its associated information in a form that can be stored on disk. The data structures 4 | //! are not designed for efficient traversal or modification, but for simplicity and serialization. 5 | mod capnp; 6 | 7 | pub mod v0; 8 | 9 | // This is required here since the generated code assumes it's in the package root. 10 | use capnp::hugr_v0_capnp; 11 | -------------------------------------------------------------------------------- /hugr-model/src/v0/binary/mod.rs: -------------------------------------------------------------------------------- 1 | //! Binary format based on capnproto. 2 | //! 3 | //! The binary format is optimised for fast serialization and deserialization of 4 | //! hugr modules in the [table] representation. It is the preferred format to 5 | //! communicate hugr graphs between machines. When a hugr module is to be 6 | //! written or read by humans, the [text] format can be used instead. 7 | //! 8 | //! [table]: crate::v0::table 9 | //! [text]: crate::v0::ast 10 | mod read; 11 | mod write; 12 | 13 | pub use read::{ReadError, read_from_reader, read_from_slice}; 14 | pub use write::{WriteError, write_to_vec, write_to_writer}; 15 | -------------------------------------------------------------------------------- /hugr-model/src/v0/scope/mod.rs: -------------------------------------------------------------------------------- 1 | //! Utilities for working with scoped symbols, variables and links. 2 | mod link; 3 | mod symbol; 4 | mod vars; 5 | 6 | pub use link::LinkTable; 7 | pub use symbol::{DuplicateSymbolError, SymbolTable, UnknownSymbolError}; 8 | pub use vars::{DuplicateVarError, UnknownVarError, VarTable}; 9 | -------------------------------------------------------------------------------- /hugr-model/tests/fixtures/model-add.edn: -------------------------------------------------------------------------------- 1 | (hugr 0) 2 | 3 | (mod) 4 | 5 | (define-func 6 | example.add 7 | (core.fn 8 | [(arithmetic.int.types.int 6) (arithmetic.int.types.int 6)] 9 | [(arithmetic.int.types.int 6)]) 10 | (dfg [%0 %1] [%2] 11 | (signature 12 | (core.fn 13 | [(arithmetic.int.types.int 6) (arithmetic.int.types.int 6)] 14 | [(arithmetic.int.types.int 6)])) 15 | ((arithmetic.int.iadd 6) [%0 %1] [%2] 16 | (signature 17 | (core.fn 18 | [(arithmetic.int.types.int 6) (arithmetic.int.types.int 6)] 19 | [(arithmetic.int.types.int 6)]))))) 20 | -------------------------------------------------------------------------------- /hugr-model/tests/fixtures/model-alias.edn: -------------------------------------------------------------------------------- 1 | (hugr 0) 2 | 3 | (mod) 4 | 5 | (declare-alias local.float core.type) 6 | 7 | (define-alias local.int core.type arithmetic.int.types.int) 8 | 9 | (define-alias local.endo core.type (core.fn [] [])) 10 | -------------------------------------------------------------------------------- /hugr-model/tests/fixtures/model-call.edn: -------------------------------------------------------------------------------- 1 | (hugr 0) 2 | 3 | (mod) 4 | 5 | (declare-func 6 | example.callee 7 | (core.fn [arithmetic.int.types.int] [arithmetic.int.types.int]) 8 | (meta (compat.meta_json "title" "\"Callee\"")) 9 | (meta (compat.meta_json "description" "\"This is a function declaration.\""))) 10 | 11 | (define-func example.caller 12 | (core.fn [arithmetic.int.types.int] [arithmetic.int.types.int]) 13 | (meta (compat.meta_json "title" "\"Caller\"")) 14 | (meta (compat.meta_json "description" "\"This defines a function that calls the function which we declared earlier.\"")) 15 | (dfg [%3] [%4] 16 | (signature (core.fn [arithmetic.int.types.int] [arithmetic.int.types.int])) 17 | ((core.call _ _ example.callee) [%3] [%4] 18 | (signature (core.fn [arithmetic.int.types.int] [arithmetic.int.types.int]))))) 19 | 20 | (define-func 21 | example.load 22 | (core.fn [] [(core.fn [arithmetic.int.types.int] [arithmetic.int.types.int])]) 23 | (dfg 24 | [] 25 | [%5] 26 | (signature (core.fn [] [(core.fn [arithmetic.int.types.int] [arithmetic.int.types.int])])) 27 | ((core.load_const _ example.caller) [] [%5]))) 28 | -------------------------------------------------------------------------------- /hugr-model/tests/fixtures/model-cond.edn: -------------------------------------------------------------------------------- 1 | (hugr 0) 2 | 3 | (mod) 4 | 5 | (define-func 6 | example.cond 7 | (core.fn 8 | [(core.adt [[] []]) (arithmetic.int.types.int 6)] 9 | [(arithmetic.int.types.int 6)]) 10 | (dfg [%0 %1] [%2] 11 | (signature 12 | (core.fn 13 | [(core.adt [[] []]) (arithmetic.int.types.int 6)] 14 | [(arithmetic.int.types.int 6)])) 15 | (cond [%0 %1] [%2] 16 | (signature 17 | (core.fn 18 | [(core.adt [[] []]) (arithmetic.int.types.int 6)] 19 | [(arithmetic.int.types.int 6)])) 20 | (dfg [%3] [%3] 21 | (signature 22 | (core.fn [(arithmetic.int.types.int 6)] [(arithmetic.int.types.int 6)]))) 23 | (dfg [%4] [%5] 24 | (signature 25 | (core.fn [(arithmetic.int.types.int 6)] [(arithmetic.int.types.int 6)])) 26 | ((arithmetic.int.ineg 6) [%4] [%5] 27 | (signature 28 | (core.fn 29 | [(arithmetic.int.types.int 6)] 30 | [(arithmetic.int.types.int 6)]))))))) 31 | -------------------------------------------------------------------------------- /hugr-model/tests/fixtures/model-constraints.edn: -------------------------------------------------------------------------------- 1 | (hugr 0) 2 | 3 | (mod) 4 | 5 | (declare-func array.replicate 6 | (param ?n core.nat) 7 | (param ?t core.type) 8 | (where (core.nonlinear ?t)) 9 | (core.fn [?t] [(collections.array.array ?n ?t)])) 10 | 11 | (declare-func 12 | array.copy 13 | (param ?n core.nat) 14 | (param ?t core.type) 15 | (where (core.nonlinear ?t)) 16 | (core.fn 17 | [(collections.array.array ?n ?t)] 18 | [(collections.array.array ?n ?t) 19 | (collections.array.array ?n ?t)])) 20 | 21 | (define-func util.copy 22 | (param ?t core.type) 23 | (where (core.nonlinear ?t)) 24 | (core.fn [?t] [?t ?t]) 25 | (dfg [%0] [%0 %0] 26 | (signature (core.fn [?t] [?t ?t])))) 27 | -------------------------------------------------------------------------------- /hugr-model/tests/fixtures/model-decl-exts.edn: -------------------------------------------------------------------------------- 1 | (hugr 0) 2 | 3 | (mod) 4 | 5 | (declare-ctr array.Array 6 | (param ?t core.type) 7 | (param ?n core.nat) 8 | core.type 9 | (meta (core.meta.description "Fixed size array."))) 10 | 11 | (declare-operation array.Init 12 | (param ?t core.type) 13 | (param ?n core.nat) 14 | (core.fn [?t] [(array.Array ?t ?n)]) 15 | (meta (core.meta.description "Initialize an array of size ?n with copies of a default value."))) 16 | -------------------------------------------------------------------------------- /hugr-model/tests/fixtures/model-entrypoint.edn: -------------------------------------------------------------------------------- 1 | (hugr 0) 2 | 3 | (mod) 4 | 5 | (define-func main 6 | (core.fn [] []) 7 | (meta core.entrypoint) 8 | (dfg [] [] 9 | (signature (core.fn [] [])))) 10 | 11 | (mod) 12 | 13 | (define-func wrapper_dfg 14 | (core.fn [] []) 15 | (dfg [] [] 16 | (signature (core.fn [] [])) 17 | (meta core.entrypoint))) 18 | 19 | (mod) 20 | 21 | (define-func wrapper_cfg 22 | (core.fn [] []) 23 | (dfg [] [] 24 | (signature (core.fn [] [])) 25 | (cfg [] [] 26 | (signature (core.fn [] [])) 27 | (cfg [%entry] [%exit] 28 | (signature (core.fn [(core.ctrl [])] [(core.ctrl [])])) 29 | (meta core.entrypoint) 30 | (block [%entry] [%exit] 31 | (signature (core.fn [(core.ctrl [])] [(core.ctrl [])])) 32 | (dfg [] [%value] 33 | (signature (core.fn [] [(core.adt [[]])])) 34 | ((core.make_adt _ _ 0) [] [%value] 35 | (signature (core.fn [] [(core.adt [[]])]))))))))) 36 | -------------------------------------------------------------------------------- /hugr-model/tests/fixtures/model-lists.edn: -------------------------------------------------------------------------------- 1 | (hugr 0) 2 | 3 | (mod) 4 | 5 | (declare-operation core.call-indirect 6 | (param ?inputs (core.list core.type)) 7 | (param ?outputs (core.list core.type)) 8 | (param ?exts core.ext-set) 9 | (core.fn [(core.fn ?inputs ?outputs ?exts) ?inputs ...] ?outputs ?exts)) 10 | 11 | (declare-operation core.compose-parallel 12 | (param ?inputs-0 (core.list core.type)) 13 | (param ?inputs-1 (core.list core.type)) 14 | (param ?outputs-0 (core.list core.type)) 15 | (param ?outputs-1 (core.list core.type)) 16 | (core.fn 17 | [(core.fn ?inputs-0 ?outputs-0) 18 | (core.fn ?inputs-1 ?outputs-1) 19 | ?inputs-0 ... 20 | ?inputs-1 ...] 21 | [?outputs-0 ... ?outputs-1 ...])) 22 | -------------------------------------------------------------------------------- /hugr-model/tests/fixtures/model-literals.edn: -------------------------------------------------------------------------------- 1 | (hugr 0) 2 | 3 | (mod) 4 | 5 | (define-alias mod.string core.str "\"\n\r\t\\\u{1F44D}") 6 | (define-alias mod.bytes core.bytes (bytes "SGVsbG8gd29ybGQg8J+Yig==")) 7 | (define-alias mod.float core.float -3.141) 8 | -------------------------------------------------------------------------------- /hugr-model/tests/fixtures/model-loop.edn: -------------------------------------------------------------------------------- 1 | (hugr 0) 2 | 3 | (mod) 4 | 5 | (define-func example.loop 6 | (param ?a core.type) 7 | (core.fn [?a] [?a]) 8 | (dfg [%0] [%1] 9 | (signature (core.fn [?a] [?a])) 10 | (tail-loop [%0] [%1] 11 | (signature (core.fn [?a] [?a])) 12 | (dfg [%2] [%3] 13 | (signature (core.fn [?a] [(core.adt [[?a] [?a]])])) 14 | ((core.make_adt 0) [%2] [%3] 15 | (signature (core.fn [?a] [(core.adt [[?a] [?a]])]))))))) 16 | -------------------------------------------------------------------------------- /hugr-model/tests/fixtures/model-params.edn: -------------------------------------------------------------------------------- 1 | (hugr 0) 2 | 3 | (mod) 4 | 5 | (define-func example.swap 6 | ; The types of the values to be swapped are passed as implicit parameters. 7 | (param ?a core.type) 8 | (param ?b core.type) 9 | (core.fn [?a ?b] [?b ?a]) 10 | (dfg [%a %b] [%b %a] 11 | (signature (core.fn [?a ?b] [?b ?a])))) 12 | 13 | (declare-func example.literals 14 | (param ?a core.str) 15 | (param ?b core.nat) 16 | (param ?c core.bytes) 17 | (param ?d core.float) 18 | (core.fn [] [])) 19 | 20 | (define-func example.call_literals 21 | (core.fn [] []) 22 | (dfg [] [] 23 | (signature (core.fn [] [])) 24 | ((core.call 25 | (example.literals "string" 42 (bytes "SGVsbG8gd29ybGQg8J+Yig==") 6.023e23)) 26 | (signature (core.fn [] []))))) 27 | -------------------------------------------------------------------------------- /hugr-model/tests/snapshots/text__declarative_extensions.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-model/tests/text.rs 3 | expression: "roundtrip(include_str!(\"fixtures/model-decl-exts.edn\"))" 4 | --- 5 | (hugr 0) 6 | 7 | (mod) 8 | 9 | (declare-ctr array.Array (param ?t core.type) (param ?n core.nat) core.type 10 | (meta (core.meta.description "Fixed size array."))) 11 | 12 | (declare-operation 13 | array.Init 14 | (param ?t core.type) 15 | (param ?n core.nat) 16 | (core.fn [?t] [(array.Array ?t ?n)]) 17 | (meta 18 | (core.meta.description 19 | "Initialize an array of size ?n with copies of a default value."))) 20 | -------------------------------------------------------------------------------- /hugr-model/tests/snapshots/text__literals.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: hugr-model/tests/text.rs 3 | expression: "roundtrip(include_str!(\"fixtures/model-literals.edn\"))" 4 | --- 5 | (hugr 0) 6 | 7 | (mod) 8 | 9 | (define-alias mod.string core.str "\"\n\r\t\\👍") 10 | 11 | (define-alias mod.bytes core.bytes (bytes "SGVsbG8gd29ybGQg8J+Yig==")) 12 | 13 | (define-alias mod.float core.float -3.141) 14 | -------------------------------------------------------------------------------- /hugr-model/tests/text.rs: -------------------------------------------------------------------------------- 1 | #![allow(missing_docs)] 2 | 3 | use hugr_model::v0::ast; 4 | use std::str::FromStr as _; 5 | 6 | fn roundtrip(source: &str) -> String { 7 | let package = ast::Package::from_str(source).unwrap(); 8 | package.to_string() 9 | } 10 | 11 | #[test] 12 | #[cfg_attr(miri, ignore)] // Opening files is not supported in (isolated) miri 13 | pub fn test_declarative_extensions() { 14 | insta::assert_snapshot!(roundtrip(include_str!("fixtures/model-decl-exts.edn"))); 15 | } 16 | 17 | #[test] 18 | #[cfg_attr(miri, ignore)] // Opening files is not supported in (isolated) miri 19 | pub fn test_literals() { 20 | insta::assert_snapshot!(roundtrip(include_str!("fixtures/model-literals.edn"))); 21 | } 22 | -------------------------------------------------------------------------------- /hugr-passes/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "hugr-passes" 3 | version = "0.20.1" 4 | edition = { workspace = true } 5 | rust-version = { workspace = true } 6 | license = { workspace = true } 7 | readme = "README.md" 8 | documentation = "https://docs.rs/hugr-passes/" 9 | homepage = { workspace = true } 10 | repository = { workspace = true } 11 | description = "Compiler passes for Quantinuum's HUGR" 12 | keywords = ["Quantum", "Quantinuum"] 13 | categories = ["compilers"] 14 | 15 | [lints] 16 | workspace = true 17 | 18 | [lib] 19 | bench = false 20 | 21 | [dependencies] 22 | hugr-core = { path = "../hugr-core", version = "0.20.1" } 23 | portgraph = { workspace = true } 24 | ascent = { version = "0.8.0" } 25 | derive_more = { workspace = true, features = ["display", "error", "from"] } 26 | itertools = { workspace = true } 27 | lazy_static = { workspace = true } 28 | paste = { workspace = true } 29 | thiserror = { workspace = true } 30 | petgraph = { workspace = true } 31 | strum = { workspace = true } 32 | 33 | [dev-dependencies] 34 | rstest = { workspace = true } 35 | proptest = { workspace = true } 36 | proptest-recurse = { version = "0.5.0" } 37 | -------------------------------------------------------------------------------- /hugr-passes/src/lib.rs: -------------------------------------------------------------------------------- 1 | //! Compilation passes acting on the HUGR program representation. 2 | #![expect(missing_docs)] // TODO: Fix... 3 | 4 | pub mod call_graph; 5 | pub mod composable; 6 | pub use composable::ComposablePass; 7 | pub mod const_fold; 8 | pub mod dataflow; 9 | pub mod dead_code; 10 | pub use dead_code::DeadCodeElimPass; 11 | mod dead_funcs; 12 | pub use dead_funcs::{RemoveDeadFuncsError, RemoveDeadFuncsPass, remove_dead_funcs}; 13 | pub mod force_order; 14 | mod half_node; 15 | pub mod linearize_array; 16 | pub use linearize_array::LinearizeArrayPass; 17 | pub mod lower; 18 | pub mod merge_bbs; 19 | mod monomorphize; 20 | pub mod untuple; 21 | 22 | pub use monomorphize::{MonomorphizePass, mangle_name, monomorphize}; 23 | pub mod replace_types; 24 | pub use replace_types::ReplaceTypes; 25 | pub mod nest_cfgs; 26 | pub mod non_local; 27 | pub use force_order::{force_order, force_order_by_key}; 28 | pub use lower::{lower_ops, replace_many_ops}; 29 | pub use non_local::{ensure_no_nonlocal_edges, nonlocal_edges}; 30 | pub use untuple::UntuplePass; 31 | -------------------------------------------------------------------------------- /hugr-persistent/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "hugr-persistent" 3 | version = "0.1.0" 4 | rust-version.workspace = true 5 | edition.workspace = true 6 | homepage.workspace = true 7 | repository.workspace = true 8 | license.workspace = true 9 | 10 | [[test]] 11 | name = "persistent_walker_example" 12 | 13 | [dependencies] 14 | relrc = { workspace = true, features = ["petgraph"] } 15 | hugr-core.path = "../hugr-core" 16 | delegate.workspace = true 17 | derive_more.workspace = true 18 | itertools.workspace = true 19 | petgraph.workspace = true 20 | portgraph.workspace = true 21 | thiserror.workspace = true 22 | 23 | [lints] 24 | workspace = true 25 | 26 | [dev-dependencies] 27 | rstest.workspace = true 28 | lazy_static.workspace = true 29 | semver.workspace = true 30 | -------------------------------------------------------------------------------- /hugr-py/.gitignore: -------------------------------------------------------------------------------- 1 | src/hugr/*.so 2 | -------------------------------------------------------------------------------- /hugr-py/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "hugr-py" 3 | version = "0.1.0" 4 | publish = false 5 | edition = { workspace = true } 6 | rust-version = { workspace = true } 7 | 8 | [lints] 9 | workspace = true 10 | 11 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 12 | [lib] 13 | name = "hugr_py" 14 | crate-type = ["cdylib", "rlib"] 15 | path = "rust/lib.rs" 16 | # This library requires a Python runtime to be tested. 17 | # It is tested by the py tests in the `tests` directory. 18 | doc = false 19 | test = false 20 | bench = false 21 | 22 | [dependencies] 23 | bumpalo = { workspace = true, features = ["collections"] } 24 | hugr-model = { version = "0.20.1", path = "../hugr-model", features = ["pyo3"] } 25 | paste.workspace = true 26 | pyo3 = { workspace = true, features = ["extension-module", "abi3-py310"] } 27 | -------------------------------------------------------------------------------- /hugr-py/docs/.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | -------------------------------------------------------------------------------- /hugr-py/docs/_static/_redirect.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Redirecting to main branch 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /hugr-py/docs/api-docs/.gitignore: -------------------------------------------------------------------------------- 1 | _autosummary 2 | _build 3 | generated 4 | -------------------------------------------------------------------------------- /hugr-py/docs/api-docs/_templates/autosummary/base.rst: -------------------------------------------------------------------------------- 1 | {{ name | escape | underline}} 2 | 3 | .. currentmodule:: {{ module }} 4 | 5 | .. auto{{ objtype }}:: {{ objname }} 6 | -------------------------------------------------------------------------------- /hugr-py/docs/api-docs/_templates/autosummary/class.rst: -------------------------------------------------------------------------------- 1 | .. 2 | Custom class template to make sphinx-autosummary list the full API doc after 3 | the summary. See https://github.com/sphinx-doc/sphinx/issues/7912 4 | 5 | {{ name | escape | underline}} 6 | 7 | .. currentmodule:: {{ module }} 8 | 9 | .. autoclass:: {{ objname }} 10 | :members: 11 | :show-inheritance: 12 | :inherited-members: 13 | 14 | {% block methods %} 15 | {% if methods %} 16 | .. rubric:: {{ _('Methods') }} 17 | 18 | .. autosummary:: 19 | :nosignatures: 20 | {% for item in methods %} 21 | {%- if not item.startswith('_') %} 22 | ~{{ name }}.{{ item }} 23 | {%- endif -%} 24 | {%- endfor %} 25 | {% endif %} 26 | {% endblock %} 27 | 28 | {% block attributes %} 29 | {% if attributes %} 30 | .. rubric:: {{ _('Attributes') }} 31 | 32 | .. autosummary:: 33 | {% for item in attributes %} 34 | ~{{ name }}.{{ item }} 35 | {%- endfor %} 36 | {% endif %} 37 | {% endblock %} 38 | -------------------------------------------------------------------------------- /hugr-py/docs/api-docs/_templates/versioning.html: -------------------------------------------------------------------------------- 1 | {% if versions %} 2 |

{{ _('Versions') }}

3 |
    4 | {%- for item in versions %} 5 |
  • {{ item.name }}
  • 6 | {%- endfor %} 7 |
8 | {% endif %} 9 | -------------------------------------------------------------------------------- /hugr-py/docs/api-docs/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. # noqa: INP001 2 | # See https://www.sphinx-doc.org/en/master/usage/configuration.html 3 | import hugr 4 | 5 | project = "HUGR Python" 6 | copyright = "2025, Quantinuum" 7 | author = "Quantinuum" 8 | 9 | extensions = [ 10 | "sphinx.ext.napoleon", 11 | "sphinx.ext.autodoc", 12 | "sphinx.ext.coverage", 13 | "sphinx.ext.autosummary", 14 | "sphinx.ext.viewcode", 15 | "sphinx.ext.intersphinx", 16 | ] 17 | 18 | html_theme = "furo" 19 | 20 | 21 | html_title = f"HUGR-py v{hugr.__version__} API documentation." 22 | 23 | html_theme_options = { 24 | "sidebar_hide_name": False, 25 | } 26 | 27 | html_static_path = ["../_static"] 28 | 29 | html_logo = "../_static/hugr_logo_no_bg.svg" 30 | 31 | autosummary_generate = True 32 | 33 | templates_path = ["_templates"] 34 | exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "conftest.py"] 35 | 36 | 37 | intersphinx_mapping = { 38 | "python": ("https://docs.python.org/3/", None), 39 | } 40 | 41 | html_show_sourcelink = False 42 | -------------------------------------------------------------------------------- /hugr-py/docs/api-docs/index.rst: -------------------------------------------------------------------------------- 1 | HUGR Python API Documentation 2 | ================================== 3 | 4 | This is the API documentation for the HUGR Python package. 5 | 6 | 7 | .. autosummary:: 8 | :toctree: generated 9 | :template: autosummary/module.rst 10 | :recursive: 11 | 12 | hugr 13 | 14 | .. toctree:: 15 | 16 | Github 17 | HUGR Specification 18 | pypi 19 | 20 | 21 | 22 | Indices and tables 23 | ~~~~~~~~~~~~~~~~~~ 24 | 25 | * :ref:`genindex` 26 | * :ref:`modindex` 27 | * :ref:`search` 28 | -------------------------------------------------------------------------------- /hugr-py/docs/build.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | mkdir build 4 | 5 | touch build/.nojekyll # Disable jekyll to keep files starting with underscores 6 | # copy redirect file 7 | cp ./_static/_redirect.html ./build/index.html 8 | uv run --extra docs sphinx-build -b html ./api-docs ./build 9 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/__init__.py: -------------------------------------------------------------------------------- 1 | """`hugr` is a Python package for the Quantinuum HUGR common 2 | representation. 3 | """ 4 | 5 | from . import model 6 | from .hugr.base import Hugr 7 | from .hugr.node_port import Direction, InPort, Node, OutPort, Wire 8 | 9 | __all__ = [ 10 | "Hugr", 11 | "Node", 12 | "OutPort", 13 | "InPort", 14 | "Direction", 15 | "Wire", 16 | "model", 17 | ] 18 | 19 | # This is updated by our release-please workflow, triggered by this 20 | # annotation: x-release-please-version 21 | __version__ = "0.12.2" 22 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/_hugr/__init__.pyi: -------------------------------------------------------------------------------- 1 | import hugr.model 2 | 3 | def term_to_string(term: hugr.model.Term) -> str: ... 4 | def string_to_term(string: str) -> hugr.model.Term: ... 5 | def node_to_string(node: hugr.model.Node) -> str: ... 6 | def string_to_node(string: str) -> hugr.model.Node: ... 7 | def region_to_string(region: hugr.model.Region) -> str: ... 8 | def string_to_region(string: str) -> hugr.model.Region: ... 9 | def param_to_string(region: hugr.model.Param) -> str: ... 10 | def string_to_param(string: str) -> hugr.model.Param: ... 11 | def symbol_to_string(region: hugr.model.Symbol) -> str: ... 12 | def string_to_symbol(string: str) -> hugr.model.Symbol: ... 13 | def module_to_string(module: hugr.model.Module) -> str: ... 14 | def string_to_module(string: str) -> hugr.model.Module: ... 15 | def module_to_bytes(module: hugr.model.Module) -> bytes: ... 16 | def bytes_to_module(binary: bytes) -> hugr.model.Module: ... 17 | def package_to_string(package: hugr.model.Package) -> str: ... 18 | def string_to_package(string: str) -> hugr.model.Package: ... 19 | def package_to_bytes(package: hugr.model.Package) -> bytes: ... 20 | def bytes_to_package(binary: bytes) -> hugr.model.Package: ... 21 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/_serialization/__init__.py: -------------------------------------------------------------------------------- 1 | """Serialized HUGR objects as pydantic models.""" 2 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/_serialization/testing_hugr.py: -------------------------------------------------------------------------------- 1 | from pydantic import ConfigDict 2 | 3 | from .extension import OpDef 4 | from .ops import OpType, Value 5 | from .ops import classes as ops_classes 6 | from .serial_hugr import VersionField 7 | from .tys import ConfiguredBaseModel, PolyFuncType, SumType, Type, model_rebuild 8 | 9 | 10 | class TestingHugr(ConfiguredBaseModel): 11 | """A serializable representation of a Hugr Type, SumType, PolyFuncType, 12 | Value, OpType. Intended for testing only. 13 | """ 14 | 15 | version: str = VersionField 16 | typ: Type | None = None 17 | sum_type: SumType | None = None 18 | poly_func_type: PolyFuncType | None = None 19 | value: Value | None = None 20 | optype: OpType | None = None 21 | op_def: OpDef | None = None 22 | 23 | @classmethod 24 | def get_version(cls) -> str: 25 | """Return the version of the schema.""" 26 | return cls().version 27 | 28 | @classmethod 29 | def _pydantic_rebuild(cls, config: ConfigDict | None = None, **kwargs): 30 | config = config or ConfigDict() 31 | my_classes = dict(ops_classes) 32 | my_classes[cls.__name__] = cls 33 | model_rebuild(my_classes, config=config, **kwargs) 34 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/build/__init__.py: -------------------------------------------------------------------------------- 1 | """Classes for building HUGRs.""" 2 | 3 | from .base import ParentBuilder 4 | from .cfg import Block, Cfg 5 | from .cond_loop import Case, Conditional, If, TailLoop 6 | from .dfg import DefinitionBuilder, DfBase, Dfg, Function 7 | from .function import Module 8 | from .tracked_dfg import TrackedDfg 9 | 10 | __all__ = [ 11 | "ParentBuilder", 12 | "Cfg", 13 | "Block", 14 | "Case", 15 | "If", 16 | "Conditional", 17 | "TailLoop", 18 | "Function", 19 | "Module", 20 | "TrackedDfg", 21 | "Dfg", 22 | "DefinitionBuilder", 23 | "DfBase", 24 | ] 25 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/build/base.py: -------------------------------------------------------------------------------- 1 | """Base classes for HUGR builders.""" 2 | 3 | from __future__ import annotations 4 | 5 | from typing import ( 6 | Protocol, 7 | cast, 8 | ) 9 | 10 | from hugr.hugr.base import Hugr, OpVar 11 | from hugr.hugr.node_port import ( 12 | Node, 13 | ToNode, 14 | ) 15 | 16 | 17 | class ParentBuilder(ToNode, Protocol[OpVar]): 18 | """Abstract interface implemented by builders of nodes that contain child HUGRs.""" 19 | 20 | #: The child HUGR. 21 | hugr: Hugr[OpVar] 22 | # Unique parent node. 23 | parent_node: Node 24 | 25 | def to_node(self) -> Node: 26 | return self.parent_node 27 | 28 | @property 29 | def parent_op(self) -> OpVar: 30 | """The parent node's operation.""" 31 | return cast(OpVar, self.hugr[self.parent_node].op) 32 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/conftest.py: -------------------------------------------------------------------------------- 1 | """Testing setup.""" 2 | 3 | import pytest 4 | 5 | from hugr import ops, tys, val 6 | from hugr.build import dfg 7 | from hugr.hugr import base as hugr 8 | from hugr.hugr import node_port 9 | 10 | 11 | @pytest.fixture(autouse=True) 12 | def _add_hugr(doctest_namespace): 13 | doctest_namespace.update( 14 | { 15 | "hugr": hugr, 16 | "node_port": node_port, 17 | "dfg": dfg, 18 | "ops": ops, 19 | "tys": tys, 20 | "val": val, 21 | } 22 | ) 23 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/exceptions.py: -------------------------------------------------------------------------------- 1 | """HUGR builder exceptions.""" 2 | 3 | from dataclasses import dataclass 4 | 5 | from .hugr.node_port import NodeIdx 6 | 7 | 8 | @dataclass 9 | class NoSiblingAncestor(Exception): 10 | """No sibling ancestor of target for valid inter-graph edge.""" 11 | 12 | src: NodeIdx 13 | tgt: NodeIdx 14 | 15 | @property 16 | def msg(self): 17 | return ( 18 | f"Source {self.src} has no sibling ancestor of target {self.tgt}," 19 | " so cannot wire up." 20 | ) 21 | 22 | 23 | @dataclass 24 | class NotInSameCfg(Exception): 25 | """Source and target nodes are not in the same CFG.""" 26 | 27 | src: NodeIdx 28 | tgt: NodeIdx 29 | 30 | @property 31 | def msg(self): 32 | return ( 33 | f"Source {self.src} is not in the same CFG as target {self.tgt}," 34 | " so cannot wire up." 35 | ) 36 | 37 | 38 | @dataclass 39 | class MismatchedExit(Exception): 40 | """Edge to exit block signature mismatch.""" 41 | 42 | src: NodeIdx 43 | 44 | @property 45 | def msg(self): 46 | return ( 47 | f"Exit branch from node {self.src} does not match existing exit block type." 48 | ) 49 | 50 | 51 | class ParentBeforeChild(Exception): 52 | """Parent added before child.""" 53 | 54 | msg: str = "Parent node must be added before child node." 55 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/hugr/__init__.py: -------------------------------------------------------------------------------- 1 | """The main HUGR structure.""" 2 | 3 | from .base import Hugr, NodeData 4 | from .node_port import ( 5 | Direction, 6 | InPort, 7 | Node, 8 | OutPort, 9 | Wire, 10 | ) 11 | 12 | __all__ = [ 13 | "Hugr", 14 | "NodeData", 15 | "Direction", 16 | "InPort", 17 | "Wire", 18 | "OutPort", 19 | "Node", 20 | ] 21 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/py.typed: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CQCL/hugr/c3a5c14a6f6838c411ffe03a4adb2f181252fef8/hugr-py/src/hugr/py.typed -------------------------------------------------------------------------------- /hugr-py/src/hugr/qsystem/__init__.py: -------------------------------------------------------------------------------- 1 | """Quantinuum system results and utilities.""" 2 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/std/__init__.py: -------------------------------------------------------------------------------- 1 | """Types and operations from the standard extension set.""" 2 | 3 | import pkgutil 4 | 5 | from hugr._serialization.extension import Extension as PdExtension 6 | from hugr.ext import Extension 7 | 8 | 9 | def _load_extension(name: str) -> Extension: 10 | replacement = name.replace(".", "/") 11 | json_str = pkgutil.get_data(__name__, f"_json_defs/{replacement}.json") 12 | assert json_str is not None 13 | return PdExtension.model_validate_json(json_str).deserialize() 14 | 15 | 16 | PRELUDE = _load_extension("prelude") 17 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/std/_json_defs/README.md: -------------------------------------------------------------------------------- 1 | The files in this directory are generated and copied in, don't edit by hand. See 2 | repository justfile `gen-extensions` command. 3 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/std/_json_defs/arithmetic/float/types.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | "name": "arithmetic.float.types", 4 | "types": { 5 | "float64": { 6 | "extension": "arithmetic.float.types", 7 | "name": "float64", 8 | "params": [], 9 | "description": "64-bit IEEE 754-2019 floating-point value", 10 | "bound": { 11 | "b": "Explicit", 12 | "bound": "C" 13 | } 14 | } 15 | }, 16 | "operations": {} 17 | } 18 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/std/_json_defs/arithmetic/int/types.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | "name": "arithmetic.int.types", 4 | "types": { 5 | "int": { 6 | "extension": "arithmetic.int.types", 7 | "name": "int", 8 | "params": [ 9 | { 10 | "tp": "BoundedNat", 11 | "bound": 7 12 | } 13 | ], 14 | "description": "integral value of a given bit width", 15 | "bound": { 16 | "b": "Explicit", 17 | "bound": "C" 18 | } 19 | } 20 | }, 21 | "operations": {} 22 | } 23 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/std/collections/__init__.py: -------------------------------------------------------------------------------- 1 | """Standard extensions for collection types and operations.""" 2 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/std/float.py: -------------------------------------------------------------------------------- 1 | """Floating point types and operations.""" 2 | 3 | from __future__ import annotations 4 | 5 | from dataclasses import dataclass 6 | 7 | import hugr.model as model 8 | from hugr import val 9 | from hugr.std import _load_extension 10 | 11 | FLOAT_TYPES_EXTENSION = _load_extension("arithmetic.float.types") 12 | 13 | FLOAT_T = FLOAT_TYPES_EXTENSION.types["float64"].instantiate([]) 14 | 15 | 16 | FLOAT_OPS_EXTENSION = _load_extension("arithmetic.float") 17 | 18 | 19 | @dataclass 20 | class FloatVal(val.ExtensionValue): 21 | """Custom value for a floating point number.""" 22 | 23 | v: float 24 | 25 | def to_value(self) -> val.Extension: 26 | name = "ConstF64" 27 | payload = {"value": self.v} 28 | return val.Extension(name, typ=FLOAT_T, val=payload) 29 | 30 | def __str__(self) -> str: 31 | return f"{self.v}" 32 | 33 | def to_model(self) -> model.Term: 34 | return model.Apply("arithmetic.float.const_f64", [model.Literal(self.v)]) 35 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/std/logic.py: -------------------------------------------------------------------------------- 1 | """HUGR logic operations.""" 2 | 3 | from __future__ import annotations 4 | 5 | from dataclasses import dataclass 6 | from typing import TYPE_CHECKING, ClassVar 7 | 8 | from hugr.ops import Command, DataflowOp, RegisteredOp 9 | from hugr.std import _load_extension 10 | 11 | if TYPE_CHECKING: 12 | from hugr import ext 13 | from hugr.ops import ComWire 14 | 15 | 16 | EXTENSION = _load_extension("logic") 17 | 18 | 19 | @dataclass(frozen=True) 20 | class _NotOp(RegisteredOp): 21 | """Logical NOT operation.""" 22 | 23 | const_op_def: ClassVar[ext.OpDef] = EXTENSION.operations["Not"] 24 | 25 | def __call__(self, a: ComWire) -> Command: 26 | return DataflowOp.__call__(self, a) 27 | 28 | 29 | #: Not operation 30 | Not = _NotOp() 31 | -------------------------------------------------------------------------------- /hugr-py/src/hugr/std/prelude.py: -------------------------------------------------------------------------------- 1 | """HUGR prelude values.""" 2 | 3 | from __future__ import annotations 4 | 5 | from dataclasses import dataclass 6 | 7 | from hugr import val 8 | from hugr.std import _load_extension 9 | 10 | PRELUDE_EXTENSION = _load_extension("prelude") 11 | 12 | STRING_T_DEF = PRELUDE_EXTENSION.types["string"] 13 | 14 | STRING_T = STRING_T_DEF.instantiate([]) 15 | 16 | 17 | @dataclass 18 | class StringVal(val.ExtensionValue): 19 | """Custom value for a string.""" 20 | 21 | v: str 22 | 23 | def to_value(self) -> val.Extension: 24 | name = "ConstString" 25 | return val.Extension( 26 | name, 27 | typ=STRING_T, 28 | val=self.v, 29 | ) 30 | 31 | def __str__(self) -> str: 32 | return f"{self.v}" 33 | -------------------------------------------------------------------------------- /hugr-py/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CQCL/hugr/c3a5c14a6f6838c411ffe03a4adb2f181252fef8/hugr-py/tests/__init__.py -------------------------------------------------------------------------------- /hugr-py/tests/serialization/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CQCL/hugr/c3a5c14a6f6838c411ffe03a4adb2f181252fef8/hugr-py/tests/serialization/__init__.py -------------------------------------------------------------------------------- /hugr-py/tests/test_envelope.py: -------------------------------------------------------------------------------- 1 | from hugr import tys 2 | from hugr.build.function import Module 3 | from hugr.envelope import EnvelopeConfig, EnvelopeFormat 4 | from hugr.package import Package 5 | 6 | 7 | def test_envelope(): 8 | mod = Module() 9 | f_id = mod.define_function("id", [tys.Qubit]) 10 | f_id.set_outputs(f_id.input_node[0]) 11 | 12 | mod2 = Module() 13 | f_id_decl = mod2.declare_function( 14 | "id", tys.PolyFuncType([], tys.FunctionType([tys.Qubit], [tys.Qubit])) 15 | ) 16 | f_main = mod2.define_main([tys.Qubit]) 17 | q = f_main.input_node[0] 18 | call = f_main.call(f_id_decl, q) 19 | f_main.set_outputs(call) 20 | package = Package([mod.hugr, mod2.hugr]) 21 | 22 | # Binary compression roundtrip 23 | for format in [EnvelopeFormat.JSON]: 24 | for compression in [None, 0]: 25 | encoded = package.to_bytes(EnvelopeConfig(format=format, zstd=compression)) 26 | decoded = Package.from_bytes(encoded) 27 | assert decoded == package 28 | 29 | # String roundtrip 30 | encoded = package.to_str(EnvelopeConfig.TEXT) 31 | decoded = Package.from_str(encoded) 32 | assert decoded == package 33 | -------------------------------------------------------------------------------- /hugr-py/tests/test_prelude.py: -------------------------------------------------------------------------------- 1 | from hugr.build.dfg import Dfg 2 | from hugr.std.prelude import STRING_T, StringVal 3 | 4 | from .conftest import validate 5 | 6 | 7 | def test_string_val(): 8 | val = StringVal("test") 9 | ext_val = val.to_value() 10 | assert ext_val.name == "ConstString" 11 | assert ext_val.typ == STRING_T 12 | assert ext_val.val == "test" 13 | 14 | dfg = Dfg() 15 | v = dfg.load(val) 16 | dfg.set_outputs(v) 17 | 18 | validate(dfg.hugr) 19 | -------------------------------------------------------------------------------- /hugr-py/tests/test_version.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | import toml # type: ignore[import-untyped] 4 | 5 | import hugr 6 | 7 | 8 | def test_versions_are_in_sync(): 9 | """Checks if the pyproject.toml and package.__init__.py __version__ are in sync.""" 10 | 11 | path = Path(__file__).resolve().parents[1] / "pyproject.toml" 12 | with Path.open(path, "r") as f: 13 | pyproject = toml.loads(f.read()) 14 | pyproject_version = pyproject["project"]["version"] 15 | 16 | package_init_version = hugr.__version__ 17 | 18 | assert package_init_version == pyproject_version 19 | -------------------------------------------------------------------------------- /hugr/assets/LICENCE.md: -------------------------------------------------------------------------------- 1 | HUGR logo (c) by the HUGR team. 2 | HUGR is licensed under a 3 | Creative Commons Attribution-ShareAlike 4.0 International License. 4 | You should have received a copy of the license along with this 5 | -------------------------------------------------------------------------------- /hugr/benches/bench_main.rs: -------------------------------------------------------------------------------- 1 | //! Benchmarks 2 | #![allow(dead_code)] 3 | 4 | mod benchmarks; 5 | 6 | use criterion::criterion_main; 7 | 8 | criterion_main! { 9 | benchmarks::hugr::benches, 10 | benchmarks::subgraph::benches, 11 | benchmarks::types::benches, 12 | } 13 | -------------------------------------------------------------------------------- /hugr/benches/benchmarks/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod hugr; 2 | pub mod subgraph; 3 | pub mod types; 4 | -------------------------------------------------------------------------------- /hugr/benches/benchmarks/types.rs: -------------------------------------------------------------------------------- 1 | // Required for black_box uses 2 | #![allow(clippy::unit_arg)] 3 | use hugr::extension::prelude::{qb_t, usize_t}; 4 | use hugr::ops::AliasDecl; 5 | use hugr::types::{Signature, Type, TypeBound}; 6 | 7 | use criterion::{AxisScale, Criterion, PlotConfiguration, criterion_group}; 8 | use std::hint::black_box; 9 | 10 | /// Construct a complex type. 11 | fn make_complex_type() -> Type { 12 | let qb = qb_t(); 13 | let int = usize_t(); 14 | let q_register = Type::new_tuple(vec![qb; 8]); 15 | let b_register = Type::new_tuple(vec![int; 8]); 16 | let q_alias = Type::new_alias(AliasDecl::new("QReg", TypeBound::Any)); 17 | let sum = Type::new_sum([q_register, q_alias]); 18 | Type::new_function(Signature::new(vec![sum], vec![b_register])) 19 | } 20 | 21 | fn bench_construction(c: &mut Criterion) { 22 | let mut group = c.benchmark_group("types"); 23 | group.plot_config(PlotConfiguration::default().summary_scale(AxisScale::Logarithmic)); 24 | 25 | group.bench_function("construction", |b| { 26 | b.iter(|| black_box(make_complex_type())); 27 | }); 28 | 29 | group.finish(); 30 | } 31 | 32 | criterion_group! { 33 | name = benches; 34 | config = Criterion::default(); 35 | targets = 36 | bench_construction, 37 | } 38 | -------------------------------------------------------------------------------- /hugr/src/hugr.rs: -------------------------------------------------------------------------------- 1 | //! The Hugr data structure, and its basic component handles. 2 | 3 | // Exports everything except the `internal` module. 4 | pub use hugr_core::hugr::{ 5 | DEFAULT_OPTYPE, Hugr, HugrError, HugrView, IdentList, InvalidIdentifier, NodeMetadata, 6 | NodeMetadataMap, OpType, Patch, SimpleReplacement, SimpleReplacementError, ValidationError, 7 | hugrmut, patch, serialize, validate, views, 8 | }; 9 | -------------------------------------------------------------------------------- /resources/test/hugr-0.hugr: -------------------------------------------------------------------------------- 1 | HUGRiHJv?@{ 2 | "modules": [ 3 | { 4 | "version": "v3", 5 | "nodes": [ 6 | { 7 | "parent": 0, 8 | "op": "Module" 9 | }, 10 | { 11 | "parent": 0, 12 | "input_extensions": null, 13 | "op": "Const", 14 | "v": { 15 | "v": "Extension", 16 | "extensions": [ 17 | "arithmetic.float.types" 18 | ], 19 | "typ": { 20 | "t": "Opaque", 21 | "extension": "arithmetic.float.types", 22 | "id": "float64", 23 | "args": [], 24 | "bound": "C" 25 | }, 26 | "value": { 27 | "c": "ConstF64", 28 | "v": 42 29 | } 30 | } 31 | } 32 | ], 33 | "edges": [], 34 | "encoder": null 35 | } 36 | ], 37 | "extensions": [] 38 | } 39 | -------------------------------------------------------------------------------- /resources/test/hugr-1.hugr: -------------------------------------------------------------------------------- 1 | HUGRiHJv?@{ 2 | "modules": [ 3 | { 4 | "version": "live", 5 | "nodes": [ 6 | { 7 | "parent": 0, 8 | "op": "Module" 9 | }, 10 | { 11 | "parent": 0, 12 | "input_extensions": null, 13 | "op": "Const", 14 | "v": { 15 | "v": "Extension", 16 | "extensions": [ 17 | "arithmetic.float.types" 18 | ], 19 | "typ": { 20 | "t": "Opaque", 21 | "extension": "arithmetic.float.types", 22 | "id": "float64", 23 | "args": [], 24 | "bound": "C" 25 | }, 26 | "value": { 27 | "c": "ConstF64", 28 | "v": { 29 | "value": 42.0 30 | } 31 | } 32 | } 33 | } 34 | ], 35 | "edges": [], 36 | "encoder": null 37 | } 38 | ], 39 | "extensions": [] 40 | } 41 | -------------------------------------------------------------------------------- /resources/test/hugr-2.hugr: -------------------------------------------------------------------------------- 1 | HUGRiHJv?@{ 2 | "modules": [ 3 | { 4 | "version": "live", 5 | "nodes": [ 6 | { 7 | "parent": 0, 8 | "op": "Module" 9 | }, 10 | { 11 | "parent": 0, 12 | "input_extensions": null, 13 | "op": "Const", 14 | "v": { 15 | "v": "Sum", 16 | "tag": 1, 17 | "typ": { 18 | "t": "Sum", 19 | "s": "Unit", 20 | "size": 2 21 | }, 22 | "vs": [ 23 | { 24 | "v": "Tuple", 25 | "vs": [] 26 | } 27 | ] 28 | } 29 | } 30 | ], 31 | "edges": [], 32 | "encoder": null 33 | } 34 | ], 35 | "extensions": [] 36 | } 37 | -------------------------------------------------------------------------------- /resources/test/hugr-3.hugr: -------------------------------------------------------------------------------- 1 | HUGRiHJv?@{ 2 | "modules": [ 3 | { 4 | "version": "live", 5 | "nodes": [ 6 | { 7 | "parent": 0, 8 | "op": "Module" 9 | }, 10 | { 11 | "parent": 0, 12 | "input_extensions": null, 13 | "op": "Const", 14 | "v": { 15 | "v": "Sum", 16 | "tag": 1, 17 | "typ": { 18 | "t": "Sum", 19 | "s": "Unit", 20 | "size": 2 21 | }, 22 | "vs": [] 23 | } 24 | } 25 | ], 26 | "edges": [], 27 | "encoder": null 28 | } 29 | ], 30 | "extensions": [] 31 | } 32 | -------------------------------------------------------------------------------- /scripts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CQCL/hugr/c3a5c14a6f6838c411ffe03a4adb2f181252fef8/scripts/__init__.py -------------------------------------------------------------------------------- /specification/schema/.gitattributes: -------------------------------------------------------------------------------- 1 | # Treat schema json files as binary in diffs 2 | *schema*.json -diff 3 | -------------------------------------------------------------------------------- /specification/schema/serialization.md: -------------------------------------------------------------------------------- 1 | # HUGR serialization schema 2 | 3 | This folder contains the schema for the serialization of the HUGR objects 4 | compliant with the [JSON Schema](https://json-schema.org/draft/2020-12/release-notes) 5 | specification. 6 | 7 | The model is generated from the pydantic model in the `hugr` python 8 | package, and is used to validate the serialization format of the Rust 9 | implementation. 10 | 11 | A script `generate_schema.py` is provided to regenerate the schema. To update 12 | the schema, run the following command: 13 | 14 | ```bash 15 | just update-schema 16 | ``` 17 | -------------------------------------------------------------------------------- /specification/std_extensions/arithmetic/float/types.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | "name": "arithmetic.float.types", 4 | "types": { 5 | "float64": { 6 | "extension": "arithmetic.float.types", 7 | "name": "float64", 8 | "params": [], 9 | "description": "64-bit IEEE 754-2019 floating-point value", 10 | "bound": { 11 | "b": "Explicit", 12 | "bound": "C" 13 | } 14 | } 15 | }, 16 | "operations": {} 17 | } 18 | -------------------------------------------------------------------------------- /specification/std_extensions/arithmetic/int/types.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | "name": "arithmetic.int.types", 4 | "types": { 5 | "int": { 6 | "extension": "arithmetic.int.types", 7 | "name": "int", 8 | "params": [ 9 | { 10 | "tp": "BoundedNat", 11 | "bound": 7 12 | } 13 | ], 14 | "description": "integral value of a given bit width", 15 | "bound": { 16 | "b": "Explicit", 17 | "bound": "C" 18 | } 19 | } 20 | }, 21 | "operations": {} 22 | } 23 | --------------------------------------------------------------------------------