Hardware/software co-design (HSCD) aims at automating the design of complex embedded systems with functionality in both hardware and software. The central task of HSCD is hardware/software partitioning, i.e., deciding which components of the system to implement in hardware and which ones in software. During partitioning, the conflicting requirements on performance, costs, energy consumption, etc., have to be taken into account. This book addresses the hardware/software partitioning problem from an algorithmic point of view. It proposes a novel formal framework for the definition of different variants of the problem. Most variants are shown to be NP-hard, but there are also important cases that can be solved optimally in polynomial time. Furthermore, the book describes three new heuristics for the NP-hard versions of the problem: a genetic algorithm, an adaptation of the Kernighan-Lin heuristic, and a completely new algorithm based on the combinatorial properties of the hardware/software partitioning problem. It is demonstrated with empirical results how the three algorithms can cope with industrial benchmarks as well as large random problem instances.