Best ways to use billions of devices on a chip - Error predictive, defect tolerant and error recovery designs