You know how to write programs in C and specify hardware in Verilog? This course is about how to build software tools -- Optimizing Compilers -- that can shape the mud of assembly language instructions and configurable hardware into useful software/hardware structures that efficiently implement your high-level designs. Optimizing compilers rarely generate truly optimal implementations; understanding what they can and cannot do enables you to be a much more effective engineer, focusing effort where it will pay off and avoiding unpleasant surprises late in the product development cycle.
The midterm exam will be in class on Thursday, March 8. We will review for the exam in class on March 6.
There was no class on Tuesday, January 30 nor on Thursday, February 1 (Professor Dietz as at the Electronic Imaging 2018 conference). Make-up times will be posted here.
Compilers are the software tools that translate high-level language constructs into something that can execute the desired operations. Normally, one thinks of compilers as straightforwardly translating programs written in langauges like C into assembly language code. However, optimizing compilers perform sophisticated analysis and a wide range of complex transformations to generate an efficient implementation of a program. The program may be written in a language like C, or it may be what the author considered to be a hardware design expressed in a language like Verilog. The implementation created by the compiler might be code for a computer supporting various types of parallel execution, gate-level circuits or FPGA configurations, or even a co-designed combination of sopafter and hardware accelerators.
This course presents the concepts needed to understand, design, and implement optimizing compiler "back-ends" that target a variety of computer architectures and digital logic circuitry. You'll not only learn how these things work, but you'll actually extend a simple compiler (provided to you as full C source code) to perform some of the analysis methods and transformations discussed. Topics covered include:
This course is intended for undergraduate (EE599-002) and graduate (EE699-002) students in computer engineering, EE, or CS. The course is particularly well suited for students who have taken EE/CS/CPE480 and a conventional (parsing theory emphasis) compilers course, but only EE/CS/CPE380 and some exposure to programming in C/C++ are required.
The course will meet 3 hours/week in a mostly conventional
lecture format. There is no scheduled lab meeting, and students
are encouraged to use their own computers for the projects, but
students also will be given access to appropriate computers on
campus. Your grade will be determined by performance on the
midterm exam (20%), the final exam (30%), and several projects
(50%). Each of the projects will involve enhancing a compiler,
written in C, to perform specific analysis and
transformations... and thus will require some C programming.
Each project must be accompanied by a short Implementor's Notes
document. The only difference between EE599-002 and EE699-002 will be
that the graduate (EE699-002) projects will incorporate a few more
advanced requirements. Some projects may be done in teams,
depending on course enrollment.
Professor Hank Dietz is usually in the Davis Marksbury Building; see his home page for
complete contact info. He has an "open-door" policy that
whenever his door is open and he's not busy with someone else,
he's available. Alternatively, you also can email firstname.lastname@example.org to make an appointment; please
use "EE599" or "EE699" in the email subject
line for anything related to this course.