If you find an error in what I’ve made, then fork, fix lectures/l00_my_thoughts.md, commit, push and create a pull request. That way, we use the global brain power most efficiently, and avoid multiple humans spending time on discovering the same error.

Slides

How I see our roles

Professors: Guide students on what is impossible, possible, and hints on what might be possible

Ph.D students: Venture into the unknown and make something (more) possible

Master students: Learn all that is currently possible

Bachelor students: Learn how to make complicated into easy

Industry: Take what is possible, and/or complicated, and make it easy

The world is analog. The laws of behavior are written in the mathematics of calculus 1

\(\oint_{\partial \Omega} \mathbf{E} \cdot d\mathbf{S} = \frac{1}{\epsilon_0} \iiint_{V} \mathbf{\rho} \cdot dV\)
Relates net electric flux to net enclosed electric charge

\(\oint_{\partial \Omega} \mathbf{B} \cdot d\mathbf{S} = 0\) Relates net magnetic flux to net enclosed magnetic charge

\(\oint_{\partial \Sigma} \mathbf{E} \cdot d\mathbf{\ell} = - \frac{d}{dt}\iint_\Sigma \mathbf{B} \cdot d\mathbf{S}\) Relates induced electric field to changing magnetic flux

\(\oint_{\partial \Sigma} \mathbf{B} \cdot d\mathbf{\ell} = \mu_0\left( \iint_\Sigma \mathbf{J} \cdot d\mathbf{S} + \epsilon_0 \frac{d}{dt}\iint_\Sigma \mathbf{E} \cdot d\mathbf{S} \right)\) Relates induced magnetic field to changing electric flux and to current density

The behavior of electrons is written in quantum mechanics

\(\psi(x,t) = Ae^{j(kx - \omega t)}\) Probability amplitude of an electron

\(\frac{1}{2 m} \frac{\hbar}{j^2} \frac{\partial^2}{\partial^2 x}\psi(x,t) + U(x)\psi(x,t) = -\frac{\hbar}{j}\frac{\partial}{\partial t} \psi(x,t)\) Space and time evolution of an electron (Schrödinger equation)

\(n = \int_{E_1}^{E_2}{N(E)f(E)dE}\) Electron density (Density of states)

\(f(E) = \frac{1}{e^{(E_i - E_F)/kT} + 1}\) Relates the average number of fermions in thermal equlilibrium to the energy of a single-particle state (Fermi-Dirac statistics)

[.table-separator: #000000, stroke-width(1)] [.table: margin(8)]

The abstract digital world is written in the mathematics of boolean algebra2

\(1 = \text{True}\), \(0 = \text{False}\)

A B NOT(A AND B)
0 0 1
0 1 1
1 0 1
1 1 0

All digital processing can be made with the NOT(A AND B) function!

People that design digital circuits can reuse the work of others

People that design analog circuits can learn from others, but need to deal with the real world on their own

Should we do as much as possible in the abstract digital world?



Worlds first commercial ADC

One of the first commerical offerings of a successive approximation analog-to-digital converter 3

There will always be analog circuits, because the real world is analog

Why is reuse of analog circuits hard?

Life of an analog designer: Schematic Design

Life of an analog designer: Layout Design

My journey on “How can I simplify analog design?”

Trigger

Problem

Architecture

Plan

9-bit SAR ADC with 28 nm FDSOI transistors

9-bit SAR ADC with IO voltage (180 nm) FDSOI transistors

How to make multiple SAR ADCs with limited time?

Spend 50% of time for 6 months to develop a tool to make SAR ADCs

Spend 50% of time for 6 months to make the SAR ADCs

16 k Perl lines. Ported to C++ for speed \(\Rightarrow\) ciccreator

A Compiled 9-bit 20-MS/s 3.5-fJ/conv.step SAR ADC in 28-nm FDSOI for Bluetooth Low Energy Receivers

Since then

Measured: 28 nm FDSOI, 55 nm Ported: 22 nm FDSOI, 22 nm, 28 nm, 65 nm, 130 nm

Finally, there is an open source port to skywater 130nm! wulffern/sun_sar9b_sky130nm

Key learnings

Super simple transistor was a good choice for portability

        { "name" : "DMOS_BULKN" ,
          "class" : "Gds::GdsPatternTransistor",
          "abstract" : 1,
          "yoffset": -0.5,
          "widthoffset" : -0.5,
           "fillCoordinatesFromStrings" : [
               [   "OD",
                  "-------------------",
                  "----xxx------------",
                  "----xxx------------",
                  "----xxx------------",
                  "-------------------"
              ],
              ...
              [   "M1",
                  "----------------xxx",
                  "----wDw---------xxx",
                  "----------wGw---xBx",
                  "----wSw---------xxx",
                  "----------------xxx"
              ],
              ...
              [   "NDIFFC",
                  "-------------------",
                  "----LTR------------",
                  "-------------------",
                  "----LTR------------",
                  "-------------------"
              ]
          ]
        }
{ "name" : "DMOS" ,
  "class" : "Gds::GdsPatternTransistor",
  "yoffset": -0.5,
  "type": "pch",
  "widthoffset" : -1,
  "fillCoordinatesFromStrings" : [
   [  "OD",
      "------------------xxxx",
      "----xxK-----------xCxC",
      "----xxx-----------xxxx",
      "----xxK-----------xCxC",
      "------------------xxxx"
   ],
   [  "PO",
      "-mmmmmmmmmmmmm--------",
      "----------------------",
      "-mmmmmmmmmmcxc--------",
      "----------------------",
      "-mmmmmmmmmmmmm--------"
   ],
   [  "M1",
      "------------------xxxx",
      "----wDww----------xxxx",
      "-----------wGww---xBxx",
      "----wSww----------xxxx",
      "------------------xxxx"
   ]
  ],
  "afterNew" : {
    "copyColumns" :[
      { "count" : 0, "offset" : 4,"length" : 4}
    ]
  }
}

2016 (Perl compiler)

{ "name": "SARCMPHX1_CV",
  "description" : "Half a strong-arm comparator",
  "class" : "Layout::LayoutDigitalCell",
  "setYoffsetHalf" :  "" ,
  "rows" : 7,
  "beforeRoute" : {
    "addDirectedRoutes" : [ ["PO","VMR","MN6:G-MP6:G"],
                            ["M1","VMR","MP4:G||MP6:G"],
                            ["M1","CI","MN1:G||MN5:G"],
                            ["M1","N2","MN1:D,MN3:D,MN5:D-|--MP1:D"],
                            ["M1","N1","MN0:D,MN2:D|-MN4:D"],
                            ["M1","N1","MN0:D-|--MP0:S"],
                            ["M1","CO","MP3:D,MP5:D--|-MN6:D"],
                            ["PO","CK","MN0:G-MP0:G"],
                            ["M1","CK","MP0:G,MP1:G-|MP3:G"],
                            ["M4","NC","MP2$:D--|--MP2:G"]
                          ]
    },
    "afterRoute" : {
    "addPortOnRects" : [ ["AVDD","M4" ],
       ["N1","M1","MN4:D"],
       ["N2","M1","MN5:D" ]]
 }
}

2022 (C++ compiler)

{ "name": "SARCMPHX1_CV",
  "description" : "Half a strong-arm comparator",
  "class" : "Layout::LayoutDigitalCell",
  "setYoffsetHalf" :  1 ,
  "rows" : 7,
  "meta" : {
       "noSchematic" : true
  },
  "decorator" : [
     {"ConnectSourceDrain" : ["M1","||",""]}
  ],
  "beforeRoute" : {
    "addDirectedRoutes" : [ ["PO","VMR","MN6:G-MP6:G"],
                            ["M1","VMR","MP4:G||MP6:G"],
                            ["M1","CI","MN1:G||MN5:G"],
                            ["M1","N2","MN1:D,MN3:D,MN5:D-|--MP1:D"],
                            ["M1","N1","MN0:D,MN2:D|-MN4:D"],
                            ["M1","N1","MN0:D-|--MP0:S"],
                            ["M1","CO","MP3:D,MP5:D--|-MN6:D"],
                            ["PO","CK","MN0:G-MP0:G"],
                            ["M1","CK","MP0:G,MP1:G-|MP3:G"],
                            ["M4","NC","MP2$:D-|--MP2:G"]
                          ]
    },
    "afterRoute" : {
              "addPortOnRects" : [["BULKP","M1"],
                  ["BULKN","M1"],
                  ["AVDD","M4" ],
                  ["N1","M1","MN4:D"],
                  ["N2","M1","MN5:D" ]]
    }
}

Usage is hard, requires a new type of analog designer/programmer

wulffern/aicex

  1. Maxwell’s equations 

  2. Boolean algebra 

  3. https://www.analog.com/media/en/training-seminars/tutorials/mt-021.pdf