Embedded systems are application-specific systems that contain hardware and software tailored for a particular task. Models and architectures are used to represent embedded system designs at different levels of abstraction. Hardware/software partitioning is the process of deciding which functionality is implemented in hardware versus software to meet performance and other constraints. There are various approaches to partitioning including functional decomposition, allocation of components, and using metrics to evaluate different partitions. Specification languages are used to capture system functionality in a way that supports partitioning.