Software datapaths and pipelines - page 4 Now, for the grand finale! // A --->+------+ +----+ 10->+----------+ 17->+------+ // |ADDER1|--->|SQRT|----->|MULTIPLIER|----->|ADDER2| ---> C // B --->+------+ +----+ +----------+ +------+ The following code is the exact same set of instructions as the original version, only in reverse order. It requires no latches and no latch registers. adder2 => C // store next output to C multiplier, (17) => adder2 // read mult, start adder2 squareRooter, (10) => multiplier // read sqrt, start mult adder1 => squareRooter // read adder1, start sqrt A , B => adder1 // read inputs, start adder1 counter => repeat // adder2/mult/sqrt/adder1, all running! This code follows the diagram from right to left instead of left to right. When we get to the last line ALL FOUR DEVICES HAVE BEEN STARTED AND ARE RUNNING IN PARALLEL! And as before, the loop will have a data-dependent delay -- a series of zeroes going thru it might go very very quickly -- unlike a clocked hardware pipeline which always operates at worst case speed. Cool, eh?