Hardware Software Partitioning in Digital System Design