The main problem for me here is that this is embedding some kind of DSL in an existing programming language. You can see the shortcomings really clearly with amaranth. A ton of things that you would expect to be just an operator are function calls. Literally if you want to write an conditional statement you have an if method. You mark states as Strings. you want to append some bytes? Cat instead of just python ++. When you are writing amaranth you are really writing two languages at once. You are writing the amaranth DSL while writing python.
There are however better takes. Clash, Spade, Silice are such much better in this regard. But I'd still take Amaranth over the big three.
[Not a language designer or anything, but] I dunno, keeping some distinction between Python and the DSL seems useful, and probably makes it simpler to reason about. Too much syntactic sugar, and I can imagine it becomes easier to confuse "thing that is generating the RTL" from "the RTL".
I think of Amaranth as "a way of using Python to organize/generate/simulate RTL." Being embedded in Python is part of the utility behind it!
To me it would be equivalent of saying "Yeah C sucks and is verbose, Let's make a C generator using python. Look ma I can even make generic data structures and function".
That is to say I think the generator approach is a dead end. A local optimum before we move to real languages. Sure it's a lot better than bare Verillog/SV/VHDL but that bar is very low. I believe gaving native language contructs that supports designing and simulating hardware is much more powerful.
There are however better takes. Clash, Spade, Silice are such much better in this regard. But I'd still take Amaranth over the big three.