whitequark[cis] changed the topic of #amaranth-lang to: Amaranth hardware definition language · weekly meetings: Amaranth each Mon 1700 UTC, Amaranth SoC each Fri 1700 UTC · code https://github.com/amaranth-lang · logs https://libera.irclog.whitequark.org/amaranth-lang · Matrix #amaranth-lang:matrix.org
Degi has quit [Ping timeout: 255 seconds]
Degi has joined #amaranth-lang
josuah has quit [Remote host closed the connection]
Xesxen has quit [Ping timeout: 246 seconds]
Xesxen has joined #amaranth-lang
jjsuperpower has joined #amaranth-lang
Guest22 has joined #amaranth-lang
jjsuperpower has quit [Ping timeout: 240 seconds]
Guest22 has quit [Quit: Client closed]
Guest51 has joined #amaranth-lang
notgull has quit [Ping timeout: 258 seconds]
notgull has joined #amaranth-lang
<whitequark[cis]> yeah; this needs to be in the docs
GenTooMan has quit [Ping timeout: 240 seconds]
<galibert[m]> Catherine: do you expect a meeting to happen today? Need to adjust my schedule depending
<galibert[m]> Not a problem either way, would just be useful to know
<whitequark[cis]> galibert: there will be a meeting today.
<galibert[m]> Cool, thanks
GenTooMan has joined #amaranth-lang
Guest51 has quit [Ping timeout: 245 seconds]
<_whitenotifier-f> [amaranth-lang/amaranth] github-merge-queue[bot] pushed 3 commits to gh-readonly-queue/main/pr-895-05cb82b8fc3ac53518d5bd07c5d474ae21522099 [+0/-0/±3] https://github.com/amaranth-lang/amaranth/compare/bfd62569c847^...d27681b15720
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark bfd6256 - vendor.GowinPlatform: improve oscillator frequency diagnostic.
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark 47851c2 - vendor.GowinPlatform: fix fencepost error in oscillator range.
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark d27681b - vendor.GowinPlatform: account for rouding error in frequency calculation.
<_whitenotifier-f> [amaranth] github-merge-queue[bot] created branch gh-readonly-queue/main/pr-895-05cb82b8fc3ac53518d5bd07c5d474ae21522099 - https://github.com/amaranth-lang/amaranth
<_whitenotifier-f> [amaranth-lang/amaranth] github-merge-queue[bot] pushed 3 commits to main [+0/-0/±3] https://github.com/amaranth-lang/amaranth/compare/05cb82b8fc3a...d27681b15720
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark bfd6256 - vendor.GowinPlatform: improve oscillator frequency diagnostic.
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark 47851c2 - vendor.GowinPlatform: fix fencepost error in oscillator range.
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark d27681b - vendor.GowinPlatform: account for rouding error in frequency calculation.
<_whitenotifier-f> [amaranth] whitequark closed pull request #895: vendor.GowinPlatform: oscillator improvements - https://github.com/amaranth-lang/amaranth/pull/895
<_whitenotifier-f> [amaranth-lang/amaranth] github-merge-queue[bot] deleted branch gh-readonly-queue/main/pr-895-05cb82b8fc3ac53518d5bd07c5d474ae21522099
<_whitenotifier-f> [amaranth] github-merge-queue[bot] deleted branch gh-readonly-queue/main/pr-895-05cb82b8fc3ac53518d5bd07c5d474ae21522099 - https://github.com/amaranth-lang/amaranth
<_whitenotifier-f> [amaranth-lang/amaranth-lang.github.io] whitequark pushed 1 commit to main [+0/-0/±32] https://github.com/amaranth-lang/amaranth-lang.github.io/compare/2922d6ccff93...c38dc9771279
<_whitenotifier-f> [amaranth-lang/amaranth-lang.github.io] github-merge-queue[bot] c38dc97 - Deploying to main from @ amaranth-lang/amaranth@d27681b15720220460bb7e7ab36407b7305cc960 🚀
mindw0rk has quit [Ping timeout: 252 seconds]
mindw0rk has joined #amaranth-lang
benreynwar_ has joined #amaranth-lang
yuriks_ has joined #amaranth-lang
esden_ has joined #amaranth-lang
Abhishek__ has joined #amaranth-lang
oter_ has joined #amaranth-lang
yuriks has quit [*.net *.split]
ovf has quit [*.net *.split]
benreynwar has quit [*.net *.split]
Abhishek_ has quit [*.net *.split]
esden has quit [*.net *.split]
oter has quit [*.net *.split]
yuriks_ is now known as yuriks
benreynwar_ is now known as benreynwar
esden_ is now known as esden
Abhishek__ is now known as Abhishek_
oter_ is now known as oter
oter has quit [Remote host closed the connection]
oter has joined #amaranth-lang
ovf has joined #amaranth-lang
phire has quit [Ping timeout: 240 seconds]
phire has joined #amaranth-lang
<_whitenotifier-f> [amaranth] whitequark opened pull request #913: Miscellaneous fixes, mostly found via pylance - https://github.com/amaranth-lang/amaranth/pull/913
<_whitenotifier-f> [amaranth] whitequark edited pull request #913: Miscellaneous fixes, mostly found via pylance - https://github.com/amaranth-lang/amaranth/pull/913
<_whitenotifier-f> [amaranth-lang/amaranth] github-merge-queue[bot] pushed 3 commits to gh-readonly-queue/main/pr-913-d27681b15720220460bb7e7ab36407b7305cc960 [+0/-0/±6] https://github.com/amaranth-lang/amaranth/compare/e6ec0be88922^...04b542a626f8
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark e6ec0be - examples,docs: ensure amaranth-boards is available as a dev dependency.
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark 57933b9 - ast: fix pylance's type inference on Value._rhs_signals(). NFC
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark 04b542a - vendor._gowin: fix typo.
<_whitenotifier-f> [amaranth] github-merge-queue[bot] created branch gh-readonly-queue/main/pr-913-d27681b15720220460bb7e7ab36407b7305cc960 - https://github.com/amaranth-lang/amaranth
<_whitenotifier-f> [amaranth-lang/amaranth] github-merge-queue[bot] pushed 3 commits to main [+0/-0/±6] https://github.com/amaranth-lang/amaranth/compare/d27681b15720...04b542a626f8
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark e6ec0be - examples,docs: ensure amaranth-boards is available as a dev dependency.
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark 57933b9 - ast: fix pylance's type inference on Value._rhs_signals(). NFC
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark 04b542a - vendor._gowin: fix typo.
<_whitenotifier-f> [amaranth-lang/amaranth] github-merge-queue[bot] deleted branch gh-readonly-queue/main/pr-913-d27681b15720220460bb7e7ab36407b7305cc960
<_whitenotifier-f> [amaranth] whitequark closed pull request #913: Miscellaneous fixes, mostly found via pylance - https://github.com/amaranth-lang/amaranth/pull/913
<_whitenotifier-f> [amaranth] github-merge-queue[bot] deleted branch gh-readonly-queue/main/pr-913-d27681b15720220460bb7e7ab36407b7305cc960 - https://github.com/amaranth-lang/amaranth
<_whitenotifier-f> [amaranth-lang/amaranth-lang.github.io] whitequark pushed 1 commit to main [+0/-0/±34] https://github.com/amaranth-lang/amaranth-lang.github.io/compare/c38dc9771279...465118283e50
<_whitenotifier-f> [amaranth-lang/amaranth-lang.github.io] github-merge-queue[bot] 4651182 - Deploying to main from @ amaranth-lang/amaranth@04b542a626f81f07333bda1dc976b6b7d3db26ca 🚀
pepijndevos[m] has joined #amaranth-lang
<pepijndevos[m]> Does Amaranth aim to have LiteX-like support for assembling SoC or is it a more generic/low-level thing? Since LiteX is built on top of classic Migen and in no hurry to upgrade
<jfng[m]> the latter at the moment, while we are working our way towards a full blown SoC builder
Guest46 has joined #amaranth-lang
<galibert[m]> Is there information on how to go about proving stuff in amaranth. Like the arbiter enhancement I’m working on?
<whitequark[cis]> not really at the time
<charlottia> there's the amaranth-exercises by robert someone, which worked as a tutorial for me.
<whitequark[cis]> the formal interface has been in a bit of a flux; I've gotten more clarity on it earlier this year so I think I know what its final form could/should be
<whitequark[cis]> ah yeah, Robert Baruch?
<charlottia> yepyep. It is indeed targeting the current API (with Rose/Fell etc.), so it'll be out of date soon.
<galibert[m]> Ok, interesting, thanks
<galibert[m]> I think eventually some interfaces in -soc could provide the needed formal description for things like initiators and targets on a bus
<galibert[m]> That could become really powerful
<whitequark[cis]> yep, that would be nice; however it is extraordinarily difficult to do so
<galibert[m]> It is? Damn
<galibert[m]> Not that surprised, formal is hard, but damn
<whitequark[cis]> yeah, I've seen Diego put so much effort into this, I don't think it's tractable for someone working in their spare time
<Guest46> I’m renew around here and I’ve been looking at documentation. Collecting it that is
<Guest46> Since I last looked, about 3 years ago, I can say that there’s a lot more of it around than there used to be
<Guest46> and that it is higher in overall quality than it once was
<whitequark[cis]> we're workin' on it!
<whitequark[cis]> all of the additions are covered with documentation by policy before they're signed off as complete, so that helps
<Guest46> I am working my way through it and trying to make sense of it at the moment but I do have a couple of screens worth of interesting links
catlosgay[m] has joined #amaranth-lang
<catlosgay[m]> im down to potentially contribute somewhat to how formal looks in amaranth at somepoint (timeline depending a bit cos i do that for a job with the commercial tools atm and ndas, but that may not be the case soonish)
<catlosgay[m]> but you are right that creating good quality VIP for buses etc can be a lot of work
<Guest46> I have an aspiration to add to the useful pile of documents around Amaranth. I found Divio’s Documentation System post really helpful when thinking about what is necessary.
Guest46 has quit [Quit: Client closed]
<cr1901> jfng[m]: All of the wb test cases in amaranth-soc instantiate interface objects subclassed from amaranth.lib.wiring.Interface: https://github.com/amaranth-lang/amaranth-soc/blob/main/tests/test_wishbone_bus.py#L503C2-L504 1/2
<cr1901> Suppose you have my_initiator with a .bus attribute that is wishbone.Signature. Is the intended connection sequence connect(m, flipped(intr_1), my_initiator.bus)?
<cr1901> Or in "real world code" are you always expected to do "dut.add(my_initiator.bus)"?
<cr1901> I like the decoupling of the former approach, but I'm not sure that's a very ergonomic use of "flipped" (it's not forwarding an inner module to an outer one)
<jfng[m]> my_initiator.bus would be an interface and not a signature, right ?
<cr1901> Yes, I'm sorry.
<jfng[m]> cr1901: i think so, for bus primitives like decoders etc
<cr1901> So the latter case is always what you intended?
<cr1901> (dut.add(my_initiator.bus))
<jfng[m]> but for example, when wiring a bus arbiter to a decoder for a shared interconnect, one would connect()
<jfng[m]> cr1901: .. i think so ?
<cr1901> Okay, I think I have a better way to ask the question I'm actually trying to ask (sorry for the XY problem)
<jfng[m]> right now, the idea is just that we have replaced records with lib.wiring primitives
<jfng[m]> but the bus interfaces are more or less used the same way
<cr1901> https://github.com/amaranth-lang/amaranth-soc/blob/main/amaranth_soc/wishbone/bus.py Within this file, when I grep for "flip", there are exactly 0 matches. This means that every usage of wishbone.Signature/wishbone.Interface within the bus module is a non-flipped signature. How do you use "connect()" with to e.g. connect an Arbiter to a Decoder without using flipped()?
<galibert[m]> William D. Jones: remember that In() flips
<galibert[m]> Rest state of an interface is Out
<cr1901> https://github.com/amaranth-lang/amaranth-soc/blob/main/amaranth_soc/wishbone/bus.py#L454-L461 self.bus of an Arbiter is Out()/Rest state. That's fine
<cr1901> self.bus of a Decoder is... also Out()/Rest state. So AFAICT, you can't connect() them together https://github.com/amaranth-lang/amaranth-soc/blob/main/amaranth_soc/wishbone/bus.py#L332-L336
<cr1901> Maybe I should actually test this tho :P
<jfng[m]> by default, the bus interface is directed from the initiator's point of view
<jfng[m]> so you would do something like connect(m, arbiter.bus, flipped(decoder.bus))
<galibert[m]> jfng: shouldn’t a decoder be a target?
<cr1901> ^was my follow up q
<jfng[m]> perhaps the decoder's bus interface should be flipped by default
<jfng[m]> yes
<galibert[m]> Yeah it should
<cr1901> galibert[m]: I guess the rationale for decoder not being flipped was to be able to pass an initiator bus straight to one of Decoder's methods, but...
<cr1901> and connect straight to initiator bus*
<cr1901> but there's no way to do that, AFAICT :P
<galibert[m]> Plus you should get rid of the weird resizing but you agree with that already
<cr1901> I feel like flipped() has more utility than forwarding interfaces, so indeed I'm starting to be glad that the name bikeshed settled on flipped() for somewhat parity with Signature.flip
<jfng[m]> in this case, Decoder.add() should probably also require a flipped bus interface
<jfng[m]> hmm, not sure about that actually
<jfng[m]> yes, it must be flipped
<jfng[m]> that stuff just gives me headaches..
<cr1901> wishbone.FlippedInterface?
<cr1901> jfng[m]: Directionality is hard. I desperately with it wasn't, but it is
Guest46 has joined #amaranth-lang
<cr1901> or wishbone.DeviceInterface and "wishbone.InitiatorInterface = wishbone.Interface"
<cr1901> Unfortunately I will not be here for Friday's meeting :.
<cr1901> (prior engagement)
Guest46 has quit [Client Quit]
<whitequark[cis]> you cannot inherit from FlippedInterface, it is a final class
<cr1901> you don't have to
<whitequark[cis]> and if you need to, that sounds indicative of a deeper issue in Amaranth
<cr1901> call "flipped(self) within the DeviceInterface constructor"
<whitequark[cis]> huh?
<cr1901> Incomplete thought, ignore
<cr1901> Why is "wishbone.DeviceInterface = flipped(wishbone.InitiatorInterface)" wrong?
<jfng[m]> i prefer having only wishbone.Interface, and use flipped(wishbone.Interface) when necessary
<jfng[m]> e.g. the Decoder.bus property would return a flipped wishbone interface
<cr1901> jfng[m]: That's fine. I'm just worried that I'm using flipped() to go beyond it's intended purpose of forwarding (as described in RFC 2). I certainly don't _mind_ doing this tho.
<cr1901> And if this is a bad use of flipped(), I'd rather be told now rather than later. (You also would need to know that buses you add via decoder.add() are flipped)
<cr1901> (and error out otherwise?)
<jfng[m]> <cr1901> "(and error out otherwise?)" <- i'm starting to think that `Decoder.add` should just accept both, as it depends on the context
<jfng[m]> as it does currently
<cr1901> yes. You could add another initiator to a decoder
<cr1901> (although you can also have two different WB buses for that... one for the initiator side, one for the device side)
<cr1901> >as it does currently <-- wait, how does it accept both?
<jfng[m]> cr1901: no, it is a target in any case, from the perspective of the bus
<jfng[m]> its direction depends on whether you are looking at it from the decoder side, or the peripheral side
<jfng[m]> yes, it doesn't use connect() internally
<cr1901> Right, that was my follow-up q. So the current usage of not needing flipped() is correct. It just took a conversation w/ you to make me realize it's correct :P
<cr1901> not needing flipped() inside Decoder.add()*
<galibert[m]> A target (decoder included) should have .signature = { "bus": In(wishbone.Signature) } and you're done
<_whitenotifier-f> [YoWASP/runtime] whitequark pushed 1 commit to develop [+0/-0/±1] https://github.com/YoWASP/runtime/compare/68a33e6521c3...97b6f08bea2d
<_whitenotifier-f> [YoWASP/runtime] whitequark 97b6f08 - [autorelease] Update Python version requirement to ~=3.8.
<galibert[m]> Also there's a possible discussion to be had on whether on arbiter/decoder .add() you either should pass a bus or instead it returns a bus you connect() to
<galibert[m]> since the latter is now sane
<_whitenotifier-f> [YoWASP/runtime] whitequark pushed 1 commit to develop [+0/-0/±2] https://github.com/YoWASP/runtime/compare/97b6f08bea2d...ea1a1adea0bc
<_whitenotifier-f> [YoWASP/runtime] whitequark ea1a1ad - [autorelease] Update Python version requirement to ~=3.8.
<_whitenotifier-f> [YoWASP/runtime] whitequark pushed 1 commit to develop [+0/-0/±2] https://github.com/YoWASP/runtime/compare/ea1a1adea0bc...70ec9ccdd92a
<_whitenotifier-f> [YoWASP/runtime] whitequark 70ec9cc - [autorelease] Update Python version requirement to ~=3.8.
<cr1901> Yes, see: https://libera.irclog.whitequark.org/amaranth-lang/2023-09-24#1695595580-1695595611;. I was experimenting w/ using Interface objects yesterday in some local code. I decided against it (for now), but you may want a FlippedInterface object to play with.
<cr1901> (capital "I" in Interface is intentional. Contrast to the concept of "interface objects")
<_whitenotifier-f> [YoWASP/runtime] whitequark pushed 4 commits to release [+1/-0/±3] https://github.com/YoWASP/runtime/compare/dca6661862d5...70ec9ccdd92a
<_whitenotifier-f> [YoWASP/runtime] whitequark f8fabbb - [skip ci] Add sponsor button.
<_whitenotifier-f> [YoWASP/runtime] whitequark 2d89db4 - [autorelease] Update wasmtime version requirement from <13 to <14.
<_whitenotifier-f> [YoWASP/runtime] whitequark 68a33e6 - [autorelease] Rebuild for wasmtime-py 13.0.1.
<_whitenotifier-f> [YoWASP/runtime] whitequark 70ec9cc - [autorelease] Update Python version requirement to ~=3.8.
<jfng[m]> <galibert[m]> "A target (decoder included..." <- agreed, but first we need to sort out the current situation, where `memory_map` is assigned to an interface _after_ its creation
<jfng[m]> this prevents us from just calling `create()` on a wishbone.Signature for a decoder bus interface
<jfng[m]> (whereas it is straightforward for arbiters, like your PR does)
<galibert[m]> Not sure where the memory map goes in the interface? I didn’t see that interaction in rfc#2
<galibert[m]> (My lap has been taken over by the cat, I can’t open the pc)
<jfng[m]> this problem is specific to amaranth-soc, and the solution (for me) should be to stop doing that
<whitequark[cis]> good afternoon. it is time for our regular Monday meeting for the Amaranth language and standard library
<galibert[m]> Yay
<jfng[m]> oh, right
<whitequark[cis]> today we have two nominated items but only one item on the agenda; I've had quite a busy day so I'll have to punt on some of the nominated ones
<galibert[m]> I’m here but encumbered
<whitequark[cis]> the item on the agenda is: https://github.com/amaranth-lang/amaranth/pull/908 Elaboratable does not need ABCMeta as its metaclass
<whitequark[cis]> I think this is the right change to do and it would probably not have negative downstream effects, but as it is technically breaking I'd like to hear any objections from those present
<cr1901> I'm basically useless wrt to metaclasses. So I wasn't actively using that functionality within my code. No objections from me.
<jfng[m]> i have never relied on this for anything, iirc
<jfng[m]> merge
<galibert[m]> Will you still detect unused Elaboratable?
<jfng[m]> perhaps it was intended to make elaborate() an abstract method at some point ?
<whitequark[cis]> cr1901: this means if you ever relied on @abstractmethod you will need to define metaclass on your own
<cr1901> Nope, never used @abstractmethod
<whitequark[cis]> jfng: I honestly don't remember. hm.
<whitequark[cis]> we don't really have a clear position on whether we use @abstractmethod or not... in case of ValueCastable for example there's a different mechanism being used
<whitequark[cis]> part of the problem is that you can't make a class method an abstractmethod
<jfng[m]> it seems you can
<whitequark[cis]> ValueCastable is actually a slightly more appropriate place for using ABCMeta since ABCMeta was developed for a similar use case (collections.Iterable, etc) than Elaboratable, which just needs a method not implemented by default
<whitequark[cis]> interesting
<charlottia> (I will note at this point that the approach taken in https://github.com/amaranth-lang/amaranth/pull/830 has to actually remove ABCMeta from ValueCastable, heh.)
<charlottia> (so even though it may be more appropriate, it ends up being quite limiting, too.)
<whitequark[cis]> this code does not raise an error
<whitequark[cis]> yeah; ABCMeta being limiting is why I think we're better off just not using it at all
<charlottia> whitequark[cis]: it does on `B()`, though.
<charlottia> B.f(), on the other hand, does not.
<whitequark[cis]> but that doesn't matter if B() is never called, e.g. B is used as a shape
<charlottia> yeah, this is a bit silly.
<whitequark[cis]> we're literally better off defining a dummy implementation raising NotImplementedError, in no small part because that works better with typecheckers like pyright than pass at the end (I just fixed a related issue)
<whitequark[cis]> the manual check in __init_subclass__ would have to be adjusted to check for a change from our base method rather than no method at all
<whitequark[cis]> but that's it
<charlottia> (that could be refactored with several other places, too.)
<charlottia> looks like there's no real objection, and any actual presumably-rare breakage is easily addressed.
<galibert[m]> So, merge? I'll abstain, I really don't have enough clue to have a decent pov
<whitequark[cis]> I think so yeah
<_whitenotifier-f> [amaranth] whitequark commented on pull request #908: Elaboratable does not need ABCMeta as its metaclass - https://github.com/amaranth-lang/amaranth/pull/908#issuecomment-1734165783
<_whitenotifier-f> [amaranth-lang/amaranth] github-merge-queue[bot] pushed 1 commit to gh-readonly-queue/main/pr-908-04b542a626f81f07333bda1dc976b6b7d3db26ca [+0/-0/±1] https://github.com/amaranth-lang/amaranth/commit/fcafad1f70fb
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark fcafad1 - hdl.ir: Elaboratable does not need ABCMeta as its metaclass.
<_whitenotifier-f> [amaranth] github-merge-queue[bot] created branch gh-readonly-queue/main/pr-908-04b542a626f81f07333bda1dc976b6b7d3db26ca - https://github.com/amaranth-lang/amaranth
<whitequark[cis]> thanks everyone, I clicked the button
<cr1901> All in a day's work :)
<cr1901> Was that the meeting (fine w/ me, just asking)?
<whitequark[cis]> yes
<_whitenotifier-f> [amaranth-lang/amaranth] github-merge-queue[bot] pushed 1 commit to main [+0/-0/±1] https://github.com/amaranth-lang/amaranth/compare/04b542a626f8...fcafad1f70fb
<_whitenotifier-f> [amaranth-lang/amaranth] whitequark fcafad1 - hdl.ir: Elaboratable does not need ABCMeta as its metaclass.
<_whitenotifier-f> [amaranth-lang/amaranth] github-merge-queue[bot] deleted branch gh-readonly-queue/main/pr-908-04b542a626f81f07333bda1dc976b6b7d3db26ca
<_whitenotifier-f> [amaranth] github-merge-queue[bot] deleted branch gh-readonly-queue/main/pr-908-04b542a626f81f07333bda1dc976b6b7d3db26ca - https://github.com/amaranth-lang/amaranth
<_whitenotifier-f> [amaranth] whitequark closed pull request #908: Elaboratable does not need ABCMeta as its metaclass - https://github.com/amaranth-lang/amaranth/pull/908
<_whitenotifier-f> [amaranth-lang/amaranth-lang.github.io] whitequark pushed 1 commit to main [+0/-0/±32] https://github.com/amaranth-lang/amaranth-lang.github.io/compare/465118283e50...9399367b08ee
<_whitenotifier-f> [amaranth-lang/amaranth-lang.github.io] github-merge-queue[bot] 9399367 - Deploying to main from @ amaranth-lang/amaranth@fcafad1f70fb6cd949902d1956cc42547ebb59ee 🚀
josuah has joined #amaranth-lang
Wanda[cis] has quit [Quit: Idle timeout reached: 172800s]