Hardware-Software Co-Design of Embedded Systems