Hardware/Software Co-Design: Principles and Practice