Rather than having to manually fly all around your world setting inputs everywhere for input1, input2, the register to write to, and the opcode, what if we started creating machine language or instructions for our CPU to set everything at once? We can then expand upon this to create as many unique instructions as we want! And when we create a program, it can iterate through different instructions.
We can create 16-bit instructions! Note, our assembler could instead process a smaller instruction bit size, but we'll keep it at 16 for simplicity.
Essentially, after construction, you will be able to query the instruction memory for an address, and the rest of your CPU will set all inputs accordingly to produce some output. You will need to pay careful attention to wiring the correct inputs to the control ROM.
For example:
add 3 1 2 1001 0011 0001 0010 (r3 = r1 + r2)