Computing is an integral part of daily life. We encounter two types of computing devices everyday: desktop-based computing devices and embedded computer systems. Desktop-based computing systems encompass traditional “computers,” including personal computers, notebook computers, workstations, and servers. Embedded computing systems are ubiquitous—they run the devices hidden inside a vast array of everyday products and appliances, such as smartphones, toys, intelligent sensors as part of Internet-of-Things (IoT), surveillance cameras, and autonomous vehicles. Both types of computing devices use programmable components, such as processors, co-processors, and memories, to execute the application programs. These programmable components are also referred as programmable accelerators. Figure 12.1 shows an example of an embedded system with 302programmable accelerators. Depending on the application domain, the embedded system can have application-specific accelerators, interfaces, controllers, and peripherals. The complexity of the programmable accelerators is increasing at an exponential rate due to technological advances as well as demand for the realization of ever more complex applications in communication, multimedia, networking, and entertainment. Shrinking time-to-market coupled with short product lifetimes create a critical need for design automation of increasingly sophisticated and complex programmable accelerators.