Given the following sequence of instructions to be executed on a 5-stage pipelined datapath as described in our textbook:
a. List true dependencies in the given sequence in the format of (register_involved. producer_instruction, consumer_instruction). Use labels to indicate instructions. For example: ($0, I10, I11) means a true dependence between instruction no and Ill: value of register $0 is generated by I10 and used by I11. Do NOT list output or anti-dependences.
b. If there is no forwarding or hazard detection, no reordering allowed, insert nops to ensure correct execution.
c. Repeat b. but allow instruction reordering — nops should be inserted only when a hazard cannot be avoided by reordering instructions. Hint: You could use $1 for register renaming if needed to help reordering instructions; but you must ensure the same values are stored in the relevant memory locations before and after the reordering.