This is something that doesn’t work; you have to pass a Signal proper. the not evaluates its argument (ena in this case). MyHDL will only evaluate that line once; it is the returned generators that do the simulation work, and that are the ones that get converted.
The workaround:
ena_n = Signal(bool(0))
@always_comb
def mknot():
ena_n.next = not ena
ff_1 = dffe(reset, clock, d, q, ena_n)
. . .
return mknot, ff_1, ...