Hardware Software Co-Design