How to Build Programmable Multi-Core Chips