My teaching interests are in the general field of computer engineering, particularly the area of software. I have been teaching in this area for over 20 years. In recognition of my teaching, I received several awards, including: the first-year engineering teaching award (1997); nine ECE departmental teaching awards (2004-2015), which are given each semester to the top three instructors in ECE courses, as determined by student votes; the Faculty Teaching Award (2008), given annually by the Faculty of Applied Science and Engineering to one professor who has demonstrated outstanding performance in teaching over his/her career; and the Sustained Excellence in Teaching Award (2013), given annually by the Faculty to one professor who has sustained excellence in teaching performance over a long period of time.

Over the years, I have taught courses such as: programming, algorithms and data structures, compiler optimizations, operating systems and computer architecture. The following describes the courses I taught in the recent past.

ECE244: Programming Fundamentals This course introduces students early on in their studies to the fundamental concepts of object-oriented programming using C++. More specifically, the course builds upon the first-year programming course to teach students various C++ constructs for object-oriented programming and how these constructs are useful in building large pieces of software. It covers topics such as classes and objects, information hiding, inheritance, templates, exception handling, fundamental data structures (lists, trees, graphs, etc.), big-O complexity analysis, and testing and debugging. The course also acquaints students with tools used in modern software development.

ECE540: Optimizing Compilers

This course provides students with a solid understanding of the theoretical and practical aspects of building modern optimizing compilers. The lectures cover topics such as: intermediate representations, basic blocks and flow graphs, data flow analysis, full and partial redundancy elimination, loop optimizations, register allocation, instruction scheduling, static single assignment, memory hierarchy optimizations and parallelization. The programming assignments provide an opportunity to implement significant optimizations within the framework of a research compiler.

ECE1754: Parallelizing Compilers This course is a graduate-level introduction to the area of compiler optimization for parallel systems. It covers topics such as: dependence analysis and dependence testing, loop transformations, loop scheduling, optimizations for locality and parallelism and compiling for distributed memory machines. The course has three components. The first is a lecture component where the foundations and the theoretical background for the area are introduced. The second is a seminar component where some of the latest research work in the area are presented and discussed. The third component is a practical one where students use a state-of-the-art open-source parallelizing compiler in several assignments followed by a project.