Jack Draak wrote
One thing I did early-on, and which I believe wasn't technically required, was to make a "Splitter" chip to help me with my decoding; I feed the IN:instruction bits to Splitter16, and can make natural labels for it's decode output, i.e. a=jg, b=je, c=jl, where abc are the jump bits of the c-instruction. As I say, I don't feel it was required, but the use of natural wire labels was a boon to my ability to grok the rest of my design implementation as I was building it.
Yes, as in software, it is best to have wire names that mean something.
Multiplexors can do lots of things besides just selecting data. You can combine the two ideas you developed, named control signals and instruction-type enabling of those control signals, using a Mux16.
Not (in=instruction[15], out=aInst);
Not (in=aInst, out=cInst);
Mux16 (sel=cInst, a=false, b=instruction,
...
out[2]=jmpLt, out[1]=jmpEq, out[0]=jmpGt);
If you want to, email me your working CPU and I'll reply with comments and one of mine that shows how to use a multiplexor to great advantage in the conditional jump circuit.
--Mark