The objective of this course is to provide an understanding of the theory of automata, computability theory and theory of complexity. The course introduces different models of computation and provides a comparison of these models. In addition, the course elaborates on formal methods and proof techniques.