Using Multiple Levels of Abstractions in Embedded Software Design