Hardware Software Co-design