-
Notifications
You must be signed in to change notification settings - Fork 14
feat: Rewrite for peeling a TailLoop #2290
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #2290 +/- ##
==========================================
+ Coverage 82.08% 82.14% +0.05%
==========================================
Files 243 244 +1
Lines 44091 44270 +179
Branches 39920 40099 +179
==========================================
+ Hits 36193 36365 +172
- Misses 5909 5915 +6
- Partials 1989 1990 +1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
41a1103
to
59f63aa
Compare
59f63aa
to
6d4f4e2
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Logic looks great. Just a small comment about the invalidation set.
pub enum PeelTailLoopError<N = Node> { | ||
/// The specified Node was not a [TailLoop] | ||
#[display("Node to inline {_0} expected to be a TailLoop but actually {_1}")] | ||
NotTailLoop(N, OpType), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: Please use named fields for variants unless that aren't direct wrappers over another error.
derive_more
's Error derive assumes things about where's the source
/ backtrace
in the positional fields of tuple structs. Naming things instead is more readable.
NotTailLoop(N, OpType), | |
#[display("Node to inline {node} expected to be a TailLoop but actually got a {op}")] | |
NotTailLoop { | |
/// The node being inlined. | |
node: N, | |
/// The actual non-tail loop operations. | |
op: OpType, | |
}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ugh, this is the kind of thing that makes me wonder whether we should just use thiserror
instead of derive_more
- IIUC the argument against is just dependencies? This was +10 lines for, IMHO, no gain in readability :-(
However, you are right to flag my display
message - "inline" a TailLoop, oops ;-)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mind you, tuple enums do work fine with derive_more (the special case is only for single element tuples) but named fields give a bit of info and specific docs to their fields (remember they are all public).
It just makes things easier to read from the docs, and avoids confusing error.0
lines (what's 0
?).
fn invalidation_set(&self) -> impl Iterator<Item = N> { | ||
Some(self.0).into_iter() | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need to include other nodes here too?
From the trait definition:
A set of nodes referenced by the rewrite. Modifying any of these nodes will invalidate it.
Twoimpl Rewrite
s can be composed if their invalidation sets are disjoint.
Changing a descendant does not invalidate this rewrite, but applying the patch would invalidate any rewrite that references the tailLoop output node. I think all other nodes are safe to modify.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, excellent spot, thanks @aborgna-q !
However, fixing this turned out to be pretty painful. Neither invalidation_set
nor new
previously took the Hugr (the output node had not been available until verify
/apply
). So I added that to new
. Now it seems that new
needs to fail if the op isn't a Tailloop (or at least, not a dataflow container with an Output node - ok to panic if invalid, but not if we've pointed the rewrite at say a leaf op). So try_new
.
Then apply
really has no error to report (unless the Hugr has changed since the rewrite was constructed - I mean, that could be a panic). For the time being I have kept the error struct, but this is a bit of a PITA; to ease use (clarify errors that should be handled), I am tempted to remove the PeelTailLoopError::NotTailLoop
variant. This leaves PeelTailLoop
empty - well it is non-exhaustive, but it being non-exhaustive means you can't match it away, so I'm then further tempted to change the error type to just Infallible
so we can use something like unwrap_infallible...
What do you think?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ugh, that's quite annoying.
I think try_new
should return the error rather than a random optype, as it gives context about why it failed.
Setting the patch error to Infallible
seems right. Rather than adding a new dependency you can just do an infallible pattern match.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yah....so I've done that. ("Never" gets closer? cool.) Seems a bit off for try_new
to return a non_exhaustive
error but there.
I think this is still not great tho. The right thing to do is probably to make invalidation_set
take the Hugr as argument. Or for this rewrite/PR, we could require the output node to be passed into new
(and then error in verify if it isn't the output node)...I mean obviously not the great user experience we'd like but it might do until we can get through deprecation/change to invalidation_set
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Adding the hugr parameter to invalidation_set
seems reasonable.
We should do a non-breaking bootstrap though, something like
#[deprecated(since = "0.20.2", note = "Implement `invalidation_nodes` instead")]
fn invalidation_set(&self) -> impl Iterator<Item = Self::Node> { }
/// ...
fn invalidation_nodes(
&self,
h: &impl HugrView<Node = Self::Node>,
) -> impl Iterator<Item = Self::Node> {
let _ = h;
#[expect(deprecated)]
self.invalidation_set()
}
add to the docs of invalidation_set
that it will no longer be called directly so new traits should implement the new method instead and ignore the former.
…lacement::invalidation_set (#2358) Currently a Patch(Verification) has to report its `invalidation_set` without being able to see the Hugr on which it will act (and without being able to verify itself against that Hugr - well the set is meaningless if it doesn't verify/apply, but nonetheless). This would be really useful in #2290 for one... So, this PR adds a new method `invalidated_nodes` which is like `invalidation_set` but takes an `&impl HugrView`; and deprecates the old `invalidation_set`. Annoyingly deprecating a method in a trait doesn't flag up *implementations* of the method, only calls to it. So the breaking change follow-up to remove invalidation_set (and *require* an implementation of invalidated_nodes) will be significantly breaking. (If we didn't have the default now, this would be breaking and the follow-up still too, however). For `SimpleReplacement` I've added the method but outside the trait, for use in PersistentHugr. (It looks a little odd but the deprecation warning kicks in only if you call the trait method, and the non-trait method seems to be preferred when both are in scope.)
…lacement::invalidation_set (#2358) Currently a Patch(Verification) has to report its `invalidation_set` without being able to see the Hugr on which it will act (and without being able to verify itself against that Hugr - well the set is meaningless if it doesn't verify/apply, but nonetheless). This would be really useful in #2290 for one... So, this PR adds a new method `invalidated_nodes` which is like `invalidation_set` but takes an `&impl HugrView`; and deprecates the old `invalidation_set`. Annoyingly deprecating a method in a trait doesn't flag up *implementations* of the method, only calls to it. So the breaking change follow-up to remove invalidation_set (and *require* an implementation of invalidated_nodes) will be significantly breaking. (If we didn't have the default now, this would be breaking and the follow-up still too, however). For `SimpleReplacement` I've added the method but outside the trait, for use in PersistentHugr. (It looks a little odd but the deprecation warning kicks in only if you call the trait method, and the non-trait method seems to be preferred when both are in scope.)
Replaces the TailLoop with a DFG containing the body plus a Conditional, inside one Case of which there is a copy of the original TailLoop. (Uses `HugrMut::copy_descendants` to copy incoming edges without copying their sources.) Letting the new DFG take the Node of the old TailLoop allows to preserve all existing wiring (including e.g. order edges for nonlocals). closes #2107
This release includes a long list of changes: - The HUGR model serialization format is now stable, and should be preferred over the old JSON format. - Type parameters and type arguments are now unified into a single `Term` type. - Function definitions can no longer be nested inside dataflow regions. Now they must be defined at the top level module. - Function definitions and declarations now have a `Visibility` field, which define whether they are visible in the public API of the module. - And many more fixes and improvements. --- ## 🤖 New release * `hugr-model`: 0.20.2 -> 0.21.0 (⚠ API breaking changes) * `hugr-core`: 0.20.2 -> 0.21.0 (⚠ API breaking changes) * `hugr-llvm`: 0.20.2 -> 0.21.0 (⚠ API breaking changes) * `hugr-passes`: 0.20.2 -> 0.21.0 (✓ API compatible changes) * `hugr`: 0.20.2 -> 0.21.0 (✓ API compatible changes) * `hugr-cli`: 0.20.2 -> 0.21.0 (⚠ API breaking changes) ### ⚠ `hugr-model` breaking changes ```text --- failure constructible_struct_adds_field: externally-constructible struct adds field --- Description: A pub struct constructible with a struct literal has a new pub field. Existing struct literals must be updated to include the new field. ref: https://doc.rust-lang.org/reference/expressions/struct-expr.html impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/constructible_struct_adds_field.ron Failed in: field Symbol.visibility in /tmp/.tmpEqPTGR/hugr/hugr-model/src/v0/ast/mod.rs:198 field Symbol.visibility in /tmp/.tmpEqPTGR/hugr/hugr-model/src/v0/table/mod.rs:307 --- failure pub_module_level_const_missing: pub module-level const is missing --- Description: A public const is missing or renamed ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/pub_module_level_const_missing.ron Failed in: CORE_CTRL_TYPE in file /tmp/.tmp1p6e1v/hugr-model/src/v0/mod.rs:175 --- failure struct_with_no_pub_fields_changed_type: public API struct with no public fields is no longer a struct --- Description: A struct without pub fields became an enum or union, breaking pattern matching. ref: https://internals.rust-lang.org/t/rest-patterns-foo-should-match-non-struct-types/21607 impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/struct_with_no_pub_fields_changed_type.ron Failed in: struct hugr_model::v0::scope::UnknownVarError became enum in file /tmp/.tmpEqPTGR/hugr/hugr-model/src/v0/scope/vars.rs:147 ``` ### ⚠ `hugr-core` breaking changes ```text --- failure auto_trait_impl_removed: auto trait no longer implemented --- Description: A public type has stopped implementing one or more auto traits. This can break downstream code that depends on the traits being implemented. ref: https://doc.rust-lang.org/reference/special-types-and-traits.html#auto-traits impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/auto_trait_impl_removed.ron Failed in: type Term is no longer UnwindSafe, in /tmp/.tmpEqPTGR/hugr/hugr-core/src/types/type_param.rs:70 type Term is no longer RefUnwindSafe, in /tmp/.tmpEqPTGR/hugr/hugr-core/src/types/type_param.rs:70 --- failure enum_missing: pub enum removed or renamed --- Description: A publicly-visible enum cannot be imported by its prior path. A `pub use` may have been removed, or the enum itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/enum_missing.ron Failed in: enum hugr_core::types::type_param::TypeArgError, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:450 enum hugr_core::hugr::persistent::walker::PinNodeError, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent/walker.rs:333 enum hugr_core::hugr::persistent::serial::SerialCommitData, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent/state_space/serial.rs:11 enum hugr_core::import::ImportError, previously in file /tmp/.tmp1p6e1v/hugr-core/src/import.rs:39 enum hugr_core::import::OrderHintError, previously in file /tmp/.tmp1p6e1v/hugr-core/src/import.rs:82 enum hugr_core::hugr::persistent::InvalidCommit, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent/state_space.rs:474 --- failure enum_no_repr_variant_discriminant_changed: enum variant had its discriminant change value --- Description: The enum's variant had its discriminant value change. This breaks downstream code that used its value via a numeric cast like `as isize`. ref: https://doc.rust-lang.org/reference/items/enumerations.html#assigning-discriminant-values impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/enum_no_repr_variant_discriminant_changed.ron Failed in: variant InterGraphEdgeError::NonCFGAncestor 2 -> 1 in /tmp/.tmpEqPTGR/hugr/hugr-core/src/hugr/validate.rs:795 variant InterGraphEdgeError::MissingOrderEdge 3 -> 2 in /tmp/.tmpEqPTGR/hugr/hugr-core/src/hugr/validate.rs:806 variant InterGraphEdgeError::NoRelation 4 -> 3 in /tmp/.tmpEqPTGR/hugr/hugr-core/src/hugr/validate.rs:817 variant InterGraphEdgeError::NonDominatedAncestor 5 -> 4 in /tmp/.tmpEqPTGR/hugr/hugr-core/src/hugr/validate.rs:827 --- failure enum_variant_added: enum variant added on exhaustive enum --- Description: A publicly-visible enum without #[non_exhaustive] has a new variant. ref: https://doc.rust-lang.org/cargo/reference/semver.html#enum-variant-new impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/enum_variant_added.ron Failed in: variant TypeBound:Linear in /tmp/.tmpEqPTGR/hugr/hugr-core/src/types.rs:138 --- failure enum_variant_missing: pub enum variant removed or renamed --- Description: A publicly-visible enum has at least one variant that is no longer available under its prior name. It may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/enum_variant_missing.ron Failed in: variant PackageEncodingError::RuntimeExtensionResolution, previously in file /tmp/.tmp1p6e1v/hugr-core/src/envelope/package_json.rs:77 variant Term::Type, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:67 variant Term::Type, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:158 variant Term::Sequence, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:180 variant Term::Type, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:158 variant Term::Sequence, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:180 variant TypeBound::Any, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types.rs:136 variant InterGraphEdgeError::ValueEdgeIntoFunc, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/validate.rs:766 variant ValidationError::ExtensionError, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/validate.rs:714 variant ValidationError::ExtensionError, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/validate.rs:714 --- failure function_missing: pub fn removed or renamed --- Description: A publicly-visible function cannot be imported by its prior path. A `pub use` may have been removed, or the function itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/function_missing.ron Failed in: function hugr_core::types::type_param::check_type_arg, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:384 function hugr_core::types::type_param::check_type_args, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:437 --- failure inherent_method_missing: pub method removed or renamed --- Description: A publicly-visible method or associated fn is no longer available under its prior name. It may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/inherent_method_missing.ron Failed in: Term::max_nat, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:100 Term::bounded_nat, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:108 Term::as_type, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:275 Term::as_type, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:275 --- failure method_parameter_count_changed: pub method parameter count changed --- Description: A publicly-visible method now takes a different number of parameters. ref: https://doc.rust-lang.org/cargo/reference/semver.html#fn-change-arity impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/method_parameter_count_changed.ron Failed in: hugr_core::hugr::patch::simple_replace::SimpleReplacement::linked_replacement_output now takes 4 parameters instead of 3, in /tmp/.tmpEqPTGR/hugr/hugr-core/src/hugr/patch/simple_replace.rs:134 hugr_core::hugr::patch::simple_replace::SimpleReplacement::linked_replacement_inputs now takes 4 parameters instead of 3, in /tmp/.tmpEqPTGR/hugr/hugr-core/src/hugr/patch/simple_replace.rs:221 hugr_core::hugr::patch::SimpleReplacement::linked_replacement_output now takes 4 parameters instead of 3, in /tmp/.tmpEqPTGR/hugr/hugr-core/src/hugr/patch/simple_replace.rs:134 hugr_core::hugr::patch::SimpleReplacement::linked_replacement_inputs now takes 4 parameters instead of 3, in /tmp/.tmpEqPTGR/hugr/hugr-core/src/hugr/patch/simple_replace.rs:221 hugr_core::hugr::SimpleReplacement::linked_replacement_output now takes 4 parameters instead of 3, in /tmp/.tmpEqPTGR/hugr/hugr-core/src/hugr/patch/simple_replace.rs:134 hugr_core::hugr::SimpleReplacement::linked_replacement_inputs now takes 4 parameters instead of 3, in /tmp/.tmpEqPTGR/hugr/hugr-core/src/hugr/patch/simple_replace.rs:221 hugr_core::SimpleReplacement::linked_replacement_output now takes 4 parameters instead of 3, in /tmp/.tmpEqPTGR/hugr/hugr-core/src/hugr/patch/simple_replace.rs:134 hugr_core::SimpleReplacement::linked_replacement_inputs now takes 4 parameters instead of 3, in /tmp/.tmpEqPTGR/hugr/hugr-core/src/hugr/patch/simple_replace.rs:221 --- failure module_missing: pub module removed or renamed --- Description: A publicly-visible module cannot be imported by its prior path. A `pub use` may have been removed, or the module may have been renamed, removed, or made non-public. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/module_missing.ron Failed in: mod hugr_core::hugr::persistent, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent.rs:1 mod hugr_core::hugr::persistent::walker, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent/walker.rs:1 mod hugr_core::hugr::persistent::serial, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent.rs:769 --- failure struct_missing: pub struct removed or renamed --- Description: A publicly-visible struct cannot be imported by its prior path. A `pub use` may have been removed, or the struct itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/struct_missing.ron Failed in: struct hugr_core::hugr::persistent::PatchNode, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent/state_space.rs:28 struct hugr_core::hugr::persistent::walker::PinnedWire, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent/walker/pinned.rs:30 struct hugr_core::hugr::persistent::PinnedWire, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent/walker/pinned.rs:30 struct hugr_core::hugr::persistent::PersistentHugr, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent.rs:274 struct hugr_core::hugr::persistent::serial::SerialCommitStateSpace, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent/state_space/serial.rs:54 struct hugr_core::types::type_param::TypeArgVariable, previously in file /tmp/.tmp1p6e1v/hugr-core/src/types/type_param.rs:236 struct hugr_core::hugr::persistent::walker::Walker, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent/walker.rs:87 struct hugr_core::hugr::persistent::Walker, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent/walker.rs:87 struct hugr_core::hugr::persistent::PointerEqResolver, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent/resolver.rs:11 struct hugr_core::hugr::persistent::CommitStateSpace, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent/state_space.rs:64 struct hugr_core::hugr::persistent::Commit, previously in file /tmp/.tmp1p6e1v/hugr-core/src/hugr/persistent.rs:108 --- failure trait_method_missing: pub trait method removed or renamed --- Description: A trait method is no longer callable, and may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#major-any-change-to-trait-item-signatures impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/trait_method_missing.ron Failed in: method define_function of trait Container, previously in file /tmp/.tmp1p6e1v/hugr-core/src/builder/build_traits.rs:92 ``` ### ⚠ `hugr-llvm` breaking changes ```text --- failure trait_method_requires_different_generic_type_params: trait method now requires a different number of generic type parameters --- Description: A trait method now requires a different number of generic type parameters than it used to. Calls or implementations of this trait method using the previous number of generic types will be broken. ref: https://doc.rust-lang.org/reference/items/generics.html impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/trait_method_requires_different_generic_type_params.ron Failed in: FatExt::fat_root (1 -> 0 generic types) in /tmp/.tmpEqPTGR/hugr/hugr-llvm/src/utils/fat.rs:376 ``` ### ⚠ `hugr-cli` breaking changes ```text --- failure inherent_method_missing: pub method removed or renamed --- Description: A publicly-visible method or associated fn is no longer available under its prior name. It may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/inherent_method_missing.ron Failed in: ValArgs::verbosity, previously in file /tmp/.tmp1p6e1v/hugr-cli/src/validate.rs:53 MermaidArgs::verbosity, previously in file /tmp/.tmp1p6e1v/hugr-cli/src/mermaid.rs:78 --- failure struct_pub_field_missing: pub struct's pub field removed or renamed --- Description: A publicly-visible struct has at least one public field that is no longer available under its prior name. It may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/struct_pub_field_missing.ron Failed in: field other_args of struct ValArgs, previously in file /tmp/.tmp1p6e1v/hugr-cli/src/validate.rs:24 field other_args of struct MermaidArgs, previously in file /tmp/.tmp1p6e1v/hugr-cli/src/mermaid.rs:36 --- warning enum_missing: pub enum removed or renamed --- Description: A publicly-visible enum cannot be imported by its prior path. A `pub use` may have been removed, or the enum itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/enum_missing.ron Failed in: enum hugr_cli::CliArgs, previously in file /tmp/.tmp1p6e1v/hugr-cli/src/lib.rs:78 --- warning struct_missing: pub struct removed or renamed --- Description: A publicly-visible struct cannot be imported by its prior path. A `pub use` may have been removed, or the struct itself may have been renamed or removed entirely. ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.41.0/src/lints/struct_missing.ron Failed in: struct hugr_cli::OtherArgs, previously in file /tmp/.tmp1p6e1v/hugr-cli/src/lib.rs:122 ``` <details><summary><i><b>Changelog</b></i></summary><p> ## `hugr-model` <blockquote> ## [0.21.0](hugr-model-v0.20.2...hugr-model-v0.21.0) - 2025-07-09 ### Bug Fixes - Model import should perform extension resolution ([#2326](#2326)) - [**breaking**] Fixed bugs in model CFG handling and improved CFG signatures ([#2334](#2334)) - [**breaking**] Fix panic in model resolver when variable is used outside of symbol. ([#2362](#2362)) - Order hints on input and output nodes. ([#2422](#2422)) ### New Features - [**breaking**] Added float and bytes literal to core and python bindings. ([#2289](#2289)) - better errors using metadata from generator ([#2368](#2368)) - [**breaking**] Add Visibility to FuncDefn/FuncDecl. ([#2143](#2143)) - [**breaking**] hugr-model use explicit Option<Visibility>, with ::Unspecified in capnp ([#2424](#2424)) </blockquote> ## `hugr-core` <blockquote> ## [0.21.0](hugr-core-v0.20.2...hugr-core-v0.21.0) - 2025-07-09 ### Bug Fixes - Fixed two bugs in import/export of function operations ([#2324](#2324)) - Model import should perform extension resolution ([#2326](#2326)) - [**breaking**] Fixed bugs in model CFG handling and improved CFG signatures ([#2334](#2334)) - Use List instead of Tuple in conversions for TypeArg/TypeRow ([#2378](#2378)) - Do extension resolution on loaded extensions from the model format ([#2389](#2389)) - Make JSON Schema checks actually work again ([#2412](#2412)) - Order hints on input and output nodes. ([#2422](#2422)) ### New Features - [**breaking**] No nested FuncDefns (or AliasDefns) ([#2256](#2256)) - Add serial data types for SimpleReplacement and PersistentHugr ([#2300](#2300)) - [**breaking**] Split `TypeArg::Sequence` into tuples and lists. ([#2140](#2140)) - [**breaking**] Added float and bytes literal to core and python bindings. ([#2289](#2289)) - [**breaking**] More helpful error messages in model import ([#2272](#2272)) - Add MermaidFormatter to replace RenderConfig ([#2275](#2275)) - [**breaking**] Better error reporting in `hugr-cli`. ([#2318](#2318)) - *(core)* builder pattern for EnvelopeConfig ([#2330](#2330)) - *(core, llvm)* add array unpack operations ([#2339](#2339)) - [**breaking**] Merge `TypeParam` and `TypeArg` into one `Term` type in Rust ([#2309](#2309)) - *(persistent)* Add serialisation for CommitStateSpace ([#2344](#2344)) - Deprecate invalidation_set, add invalidated_nodes and SimpleReplacement::invalidation_set ([#2358](#2358)) - Rewrite for peeling a TailLoop ([#2290](#2290)) - Create Module/FunctionBuilders from existing Hugrs ([#2359](#2359)) - add TryFrom impls for TypeArg/TypeRow ([#2366](#2366)) - better errors using metadata from generator ([#2368](#2368)) - use `core.` prefixes for generator metadata keys ([#2371](#2371)) - Add `MakeError` op ([#2377](#2377)) - Open lists and tuples in `Term` ([#2360](#2360)) - Call `FunctionBuilder::add_{in,out}put` for any AsMut<Hugr> ([#2376](#2376)) - Add Root checked methods to DataflowParentID ([#2382](#2382)) - Add PersistentWire type ([#2361](#2361)) - Add `BorrowArray` extension ([#2395](#2395)) - [**breaking**] Rename 'Any' type bound to 'Linear' ([#2421](#2421)) - [**breaking**] Add Visibility to FuncDefn/FuncDecl. ([#2143](#2143)) - *(per)* [**breaking**] Support empty wires in commits ([#2349](#2349)) - [**breaking**] hugr-model use explicit Option<Visibility>, with ::Unspecified in capnp ([#2424](#2424)) ### Refactor - [**breaking**] move PersistentHugr into separate crate ([#2277](#2277)) - *(types.rs)* rm incorrect comment and unnecessary allow-unused ([#2340](#2340)) - [**breaking**] remove deprecated runtime extension errors ([#2369](#2369)) - [**breaking**] Reduce error type sizes ([#2420](#2420)) ### Testing - Check hugr json serializations against the schema (again) ([#2216](#2216)) </blockquote> ## `hugr-llvm` <blockquote> ## [0.21.0](hugr-llvm-v0.20.2...hugr-llvm-v0.21.0) - 2025-07-09 ### New Features - [**breaking**] No nested FuncDefns (or AliasDefns) ([#2256](#2256)) - [**breaking**] Split `TypeArg::Sequence` into tuples and lists. ([#2140](#2140)) - [**breaking**] More helpful error messages in model import ([#2272](#2272)) - *(core, llvm)* add array unpack operations ([#2339](#2339)) - [**breaking**] Merge `TypeParam` and `TypeArg` into one `Term` type in Rust ([#2309](#2309)) - Add `MakeError` op ([#2377](#2377)) ### Refactor - *(llvm)* replace HashMap with BTreeMap ([#2313](#2313)) </blockquote> ## `hugr-passes` <blockquote> ## [0.21.0](hugr-passes-v0.20.2...hugr-passes-v0.21.0) - 2025-07-09 ### Bug Fixes - update CallGraph and remove_dead_funcs for module-only FuncDefns ([#2336](#2336)) - DeadFuncElimPass+CallGraph w/ non-module-child entrypoint ([#2390](#2390)) ### New Features - [**breaking**] No nested FuncDefns (or AliasDefns) ([#2256](#2256)) - [**breaking**] Split `TypeArg::Sequence` into tuples and lists. ([#2140](#2140)) - [**breaking**] Merge `TypeParam` and `TypeArg` into one `Term` type in Rust ([#2309](#2309)) - [**breaking**] Rename 'Any' type bound to 'Linear' ([#2421](#2421)) ### Refactor - [**breaking**] Reduce error type sizes ([#2420](#2420)) </blockquote> ## `hugr` <blockquote> ## [0.21.0](hugr-v0.20.2...hugr-v0.21.0) - 2025-07-09 ### Bug Fixes - update CallGraph and remove_dead_funcs for module-only FuncDefns ([#2336](#2336)) - DeadFuncElimPass+CallGraph w/ non-module-child entrypoint ([#2390](#2390)) - Fixed two bugs in import/export of function operations ([#2324](#2324)) - Model import should perform extension resolution ([#2326](#2326)) - [**breaking**] Fixed bugs in model CFG handling and improved CFG signatures ([#2334](#2334)) - Use List instead of Tuple in conversions for TypeArg/TypeRow ([#2378](#2378)) - Do extension resolution on loaded extensions from the model format ([#2389](#2389)) - Make JSON Schema checks actually work again ([#2412](#2412)) - Order hints on input and output nodes. ([#2422](#2422)) ### Documentation - Hide hugr-persistent docs ([#2357](#2357)) ### New Features - Add serial data types for SimpleReplacement and PersistentHugr ([#2300](#2300)) - [**breaking**] Split `TypeArg::Sequence` into tuples and lists. ([#2140](#2140)) - [**breaking**] Added float and bytes literal to core and python bindings. ([#2289](#2289)) - [**breaking**] More helpful error messages in model import ([#2272](#2272)) - Add MermaidFormatter to replace RenderConfig ([#2275](#2275)) - [**breaking**] Better error reporting in `hugr-cli`. ([#2318](#2318)) - *(core, llvm)* add array unpack operations ([#2339](#2339)) - [**breaking**] Merge `TypeParam` and `TypeArg` into one `Term` type in Rust ([#2309](#2309)) - *(persistent)* Add serialisation for CommitStateSpace ([#2344](#2344)) - Deprecate invalidation_set, add invalidated_nodes and SimpleReplacement::invalidation_set ([#2358](#2358)) - Rewrite for peeling a TailLoop ([#2290](#2290)) - Create Module/FunctionBuilders from existing Hugrs ([#2359](#2359)) - add TryFrom impls for TypeArg/TypeRow ([#2366](#2366)) - better errors using metadata from generator ([#2368](#2368)) - use `core.` prefixes for generator metadata keys ([#2371](#2371)) - Add `MakeError` op ([#2377](#2377)) - Open lists and tuples in `Term` ([#2360](#2360)) - Call `FunctionBuilder::add_{in,out}put` for any AsMut<Hugr> ([#2376](#2376)) - Add Root checked methods to DataflowParentID ([#2382](#2382)) - Add PersistentWire type ([#2361](#2361)) - Add `BorrowArray` extension ([#2395](#2395)) - [**breaking**] Add Visibility to FuncDefn/FuncDecl. ([#2143](#2143)) - *(per)* [**breaking**] Support empty wires in commits ([#2349](#2349)) - [**breaking**] hugr-model use explicit Option<Visibility>, with ::Unspecified in capnp ([#2424](#2424)) - [**breaking**] No nested FuncDefns (or AliasDefns) ([#2256](#2256)) - *(core)* builder pattern for EnvelopeConfig ([#2330](#2330)) - [**breaking**] Rename 'Any' type bound to 'Linear' ([#2421](#2421)) ### Refactor - *(types.rs)* rm incorrect comment and unnecessary allow-unused ([#2340](#2340)) - [**breaking**] remove deprecated runtime extension errors ([#2369](#2369)) - [**breaking**] Reduce error type sizes ([#2420](#2420)) - [**breaking**] move PersistentHugr into separate crate ([#2277](#2277)) ### Testing - Check hugr json serializations against the schema (again) ([#2216](#2216)) </blockquote> ## `hugr-cli` <blockquote> ## [0.21.0](hugr-cli-v0.20.2...hugr-cli-v0.21.0) - 2025-07-09 ### New Features - [**breaking**] Better error reporting in `hugr-cli`. ([#2318](#2318)) - *(cli)* convert sub-command for converting envelope formats ([#2331](#2331)) </blockquote> </p></details> --- This PR was generated with [release-plz](https://github.com/release-plz/release-plz/). --------- Co-authored-by: Agustín Borgna <agustin.borgna@quantinuum.com>
Replaces the TailLoop with a DFG containing the body plus a Conditional, inside one Case of which there is a copy of the original TailLoop. (Uses
HugrMut::copy_descendants
to copy incoming edges without copying their sources.)Letting the new DFG take the Node of the old TailLoop allows to preserve all existing wiring (including e.g. order edges for nonlocals).
closes #2107