## Digital Logic Simulator

### What you will learn

• Software: Depending on how you architect this, fairly sophisticated! Work with graphs, and best done using OOD.
• Domain: Digital logic circuits, and the sheer exponentiality of 2n2n

This is pretty advanced but will be pretty cool. We will build a digital circuit simulator in this exercise. We will also parallelize it using a pretty cool technique and will add timing analysis and fault simulation as well.

You could do this in python, but if you want to do the parallel simulator, you will need to use C or C++ (maybe Java?)

#### SimSim (Simple Simulator)

We will create a graph to represent the circuit in this part. To start with, we will create nodes and edges connecting nodes. The nodes will have a basic type (NOT, AND, OR, etc.). The nodes will be connected to each other to form a circuit; each node will have a specific number of inputs but can drive multiple other gates. We will have special nodes called Primary Inputs (PIs) and Primary Outputs (POs).

Each node ‘reads’ its inputs — the values on its input edges and determines its output value based on its type. It places this value on its output edge(s).

Create a circuit, apply patterns to the PIs and see if the POs match what you expect. You should be able to cycle through the truth table of your circuit to verify the output.

### FaultSim (Fault Simulator)

A simple fault model is a ‘Stuck-at-‘ model. Tie an edge to a constant 00 or 11 and see if you can detect this at the POs.

Rather than simulating all possible input values, can you figure out a minimal set that can detect all possible faults?

### TimeSim (Timing Simulator)

SimSim calculates the output values directly, it has no notion of gate and propagation delays.

Assign delays to each gate (and what the heck, to each connection as well). For example, an inverter can have a delay of  1 time units, a NAND gate of  2 and a NOR gate of 3 time units (hmm, why these three values?). Now, set up a global clock, and calculate the outputs at each time step. Compared to SimSim, the final value of POs will settle after a few time units.

And they may bounce around before settling! Can you set up a circuit so that you see glitches at the output?

#### ParSim (Parallel Simulator)

This is a unique form of parallelism!

In all of the above simulators, the values are 1 bit at each PI, gate output, and PO. The function evaluation at each gate is also a bitwise operation. However, we could instead treat each of these as a 32 (or longer!) bit int and do the same logical operations on the entire word! This will take exactly the same amount of time as before, but we’ll be running 32 tests in parallel. Do you see what I meant by calling it a unique form of parallelism?

### Generalizations

• Read in a circuit from a file
• Read in inputs and outputs from a file

## RC Circuit Analysis

### What you will learn

• Software: relatively basic constructs. Iterative solver!
• Domain: A better feel for a capacitor charging and discharging and the time constant.

### RC Circuits

Take as input values of R (in Ohms), C (in Farads), and supply voltage (in Volts). Assume that the voltage is applied to a series RC circuits at time t=0t=0, and calculate the voltage across the capacitor at different times. Plot these!

#### Variations:

• Determine how much time it will take to charge the capacitor to a target voltage.
• Vary R to see how the curve shifts. Determine the value of C so that the shift is exactly the same. Which has a larger effect?
• Repeat for discharging the capacitor, rather than charging it

Apply a square wave as input and simulate for a few cycles. Vary the period and duty cycle and see if the behavior matches your intuition

## CMOS Characterization

### What you will learn:

• Software: relatively simple implementation, plus some visualization
• Domain: improve your understanding of how a transistor works

### CMOS Characterization – 1

A CMOS transistor operates in three different regions — cutoff, saturation, and linear. The equations for these are fairly straightforward. Implement these using hard-coded values for parameters that you may need to specify, such as doping concentrations, mobility, etc.

Given input voltages, determine the region of operation and use the appropriate equation to calculate $I_{DS}$

### CMOS Characterization – 2

• Calculate $I_{DS}$ for different values of $V_{GS}$ and $V_{DS}$
• Plot $I_{DS}$ v. $V_{DS}$ for different values of  $V_{GS}$

### CMOS Characterization – 3

• Analyze the differences between N- and P-MOS transistors
• What is the impact of transistor dimensions?
• Read transistor parameters from a file and repeat for different technology nodes.

## Programming for the Electronics Engineering Student

### Motivation

I’ve had a few odd discussions with students from the Electronics branch related to software development. Broadly,

• sniff I’m in electronics, don’t expect me to dabble in ugh software
• We don’t get the subjects that CS students do, so aren’t as prepared for interviews as they are
• eh, I’m just going to do it

There’s so much to unpack here…

Firstly, software (and data structures, and algorithms, and …) is not the domain of any one branch. It is a tool to be used just like any other and a very powerful tool at that. So if you’re being snobbish about not doing any software at the altar of “electronics,” you’re just shooting yourself in the foot. Most electronics is software, and the more comfortable you are with this tool, the better of an electronics engineer you will be. Plus, software can help you understand electronics much more than you otherwise would.

Second, there are a lot of opportunities to develop software skills. The courses that you don’t get to do aren’t all that important, you can learn the core concepts by yourself. There are a few (Databases!) that you won’t get exposure to, but you haven’t really missed much. Read on!

Finally, self-study is the best way to develop these skills. Here’s the big secret:

the only way to learn how to program …. is to program

### The obvious question is: “what do I program?”

This is a series of posts that presents program suggestions, what to look for and what to focus on. If you go through these, you will be a better electronics engineer and a better software developer than 99% of your peers, irrespective of their major. I’ve gone through the typical subjects from the second year onwards, and defined assignments that (i) build on the theory that you learn (ii) expose you to different implementation concepts (iii) improve your understanding of data structures and algorithms

### One last thing: the discipline of programming

• All your implementation should have a reasonable testing strategy in place
• All your code should be instrumented to measure the performance of key parts of the code
• All C and C++ code should be compiled with -Wall
• All code should be valgrind-certified error-free
• All code should be in a version control system

I’ll talk about each of these points in a later post.

now let’s

Shut Up and Code!

Program ideas on:

Search