Projects


Please find below a selection of the projects I have completed, both as a part of my degree and independently.
I cover what I did, the motivation behind it, as well as what I learned from completing the project.

This Website



Before I start explaining my larger projects, I thought it would be apt to include this website as an honorable mention. I had very little expereince with web development or website design prior to starting on this website. I was never taught any web development at university or school - and when I decided to create a personal website I had the option to choose a website building tool as this would have been quicker. However, as a developer it didn't seem right to me to use one of those. Therefore, despite my heavy university workload and placement responsibilities, I took the time out to teach myself the basics of HTML, CSS, and JavaScript so that I could code the very website that you are looking at now.

2D Drawing Library for ISSIE


About ISSIE

ISSIE is an open-source intuitive cross-platform hardware design application, written in F#. It is currently used for teaching Digital Electronics and Computer Architecture at Imperial College London, enabling students to design digital circuit schematics and then simulate them. The main code for the application is written in the functional-first language F#, which is transcompiled using Fable to JavaScript. The application runs in an Electron Window.

Project Motivation

ISSIE used the JavaScript Draw2D library to display the components and wires in the schematic. However, it was buggy and would slow down upon the introduction of multiple components and connections. Therefore a pure F# implementation was desired.

The Project

I worked as a part of a team of six to implement the drawing library in F# using the Elmish Model-View-Update (MVU) Framework. The completed library matched and improved on some parts of the existing Draw2D functionality. This included creating, deleting, and manipulating components. Connections are automatically routed as 3 or 5 segment wires upon creation, but the route can be adjusted manually by the user. If desired, more segments can be added to the wire. More detail about the functionality can be found in doc/Features.md in the Drawing Library repository. My focus was on the wire connections - I implemented the automatic and manual routing algorithms, creation/deletion, as well as the code for rendering the wires themselves.

What I learned

  • Improved my ability to code in F# and strengthened my understanding of functional programming concepts.

  • Introduced to the Elmish MVU Framework, which is used for both native and web application programming.

  • Learned to write clear, maintainable code as it was going to be integrated into a larger, open-source codebase.

  • Gained more experience with Git and GitHub, reviewing pull requests, solving merge conflicts and more.

  • Learned how to contribute code to a large project with multiple team members. This involved clear interface definition and strong communication.

  • Creating internal and external interface documents improved my ability to write techinical documentation.

Exploring Deep Learning Algorithms and Architectures

Project Motivation

This exploratory exercise was undertaken as part of the 3rd Year Deep Learning module at Imperial College London. The purpose of this project was to introduce me to common Deep Learning concepts and theories. By writing a report presenting my findings, I showed that I had run experiments and gained enough understanding to evaluate and discuss the trends that I found.

The Project

I first explored Convolutional Neural Networks, proposing my own architectures and training strategies before investigating common CNN architectures. Following this I looked at Recurrent Neural Networks for regression, text embedding, and text generation; with a focus on LSTMs. I then experimented with Autoencoders and VAE-GAN, before briefly covering reinforcement learning.

What I learned

  • Further solidified my ability to code in Python and with Notebooks (Colab) .

  • Introduced me to the TensorFlow and Keras libraries, while increasing my experience with NumPy.

  • Learned about CNNs, RNNs, Autoencoders, RL, and their applications.

  • Honed my report writing skills, presenting my findings in a clear, well structured manner.

Report

SmartSole - an Embedded IOT MedTech Device

GitHub Repository

The Project

Working in a team of 4, we created a prototype for SmartSole, an IOT device built to monitor the state of a diabetic foot ulcer. The Raspberry Pi communicates with the thermopile, presssure and 9DOF sensors using the I2C protocol, and passes information to the web app using MQTT. A step detection algorithm is used to turn the data from the 9DOF sensor into usable step data, and thresholds are pre-set for temperature and pressure.

C Compiler and Python Translator

GitHub Repository

Project Motivation

This project, completed in a pair, was the coursework component for the Language Processors module at Imperial College London, which covered compilers. The purpose of the project was to allow me to apply the theoretical knowledge I had learned about compiler design.

The Project

The delivered program can compile programs written in a subset of C89 (also known as ANSI C) to MIPS Assembly, as well as translate them to Python when compatible C constructs are used. Input C files are lexically analysed using Flex and parsed using GNU Bison. The Bison grammar is self written, but does take cues from the original C89 grammar written for use with Yacc. The Parser generates an Abstract Syntax Tree (AST) of the C program. Each node is represented as a C++ class, with each different construct (e.g. variable, switch case, function declaration) having its own class which inherits from the AST_Node base class. These derived classes each override a pure virtual compilation function (and a Python translation function where required) defined in the base class. By having a parent node call the compilation functions of their children, the tree is traversed and correct MIPS assembly/Python code is generated.

What I learned

  • Reinforced the compiler design theory I had learned during lectures, for example around writing grammars, code generation etc.

  • Allowed me to further hone my C++ coding skills, particularly around OOP concepts.

  • Learned how to use Flex and GNU Bison to write lexers and parsers.

  • As this was the first project I did during the pandemic, I learned how to work with someone remotely on a software project.

MIPS CPU Simulator

GitHub Repository

Project Motivation

This project, completed in a pair, was the coursework associated with the Computer Architecture module at Imperial College London. The purpose of the project was to allow me to apply the knowledge I had learned about the MIPS ISA and how CPUs execute instructions.

The Project

The simulator, which was created from scratch, takes input binaries compliant with the MIPS ISA and runs them as if they were running on a MIPS CPU. This program could potentially allow a developer without access to a MIPS CPU to test if their compiled code would run on one. This program simulates the 5 Stage MIPS execution cycle. After using the fstream library to read the binary and store the instructions in virtualised instruction memory, instructions are fetched from this memory by accessing STL Vector elements and decoded using shifts. The instruction is then executed by the program. Data memory is virtualised using an STL Vector, as are CPU Registers. This allows for memory access and register write back. The size and location of memory is defined by the memory map specified in original-spec.md.