Hello Lucas,
The really short answer is that when you're only passing clocks, resets and enables down to functions, implicit parameters save you a lot of boilerplate; but when actually doing things with clocks, resets and/or enables, it's usually better to switch to explicit functions from Clash.Explicit. Clocks, resets and enables are just arguments to a function, and enables are really not that different from a Signal dom Bool.
How enable signals propagate is clearly apparent when using Clash.Explicit. And the implicit version is mainly meant to save you from constantly passing arguments around without operating on those arguments directly. Due to technicalities regarding the monomorphism restriction among others, it can even lead to unintended results when there are multiple different Enable signals in one implicit function definition; Clash might route the wrong enable to your function as it "monomorphises" the HiddenEnable constraint.
Finally, I should note that I expect your getAlphaLoop function to actually have a hidden enable, but since you're using withEnable, that "incoming" hidden enable is ignored for those functions invoked with withEnable. So if the whole getAlphaLoop has its enable de-asserted, that does not propagate to the subfunctions with withEnable. You probably want Clash.Explicit.Signal.enable to AND the enables together. Or if you're going explicit anyway, drop the incoming enable if you know it won't be used. If the incoming enable is in practice always asserted, the ANDing will not introduce additonal logic.
By coincidence, I intend to continue on PR#1849 today, giving people a bit more options to work with enables in implicit notation. I will rename the fuction from mergeEnable to enable though, to fall in with the existing explicit function. Still, my gut feeling is that when you're dealing so extensively with enables as you are here, it's better to go explicit. My intention for the new function is to avoid all the explicit/implicit conversions I had to do here (variant1 under The variants of the pipeline from my second mail:, you will have to click the three dots to expand, Google just keeps messing up my mails and hiding the interesting parts. Thank you, Google!).
I also slightly improved some documentation in that PR; for a while, the improved documentation of hidden arguments is available as a CI artifact for that PR at https://clash-lang.gitlab.io/-/clash-compiler/-/jobs/1336109331/artifacts/hadocs/clash-prelude/Clash-Signal.html.
HTH,
Peter.