update repo
5 files changed
tree: 078e11627160d80bb9406373cc1006db265e8fcd
  1. .github/
  2. def/
  3. docs/
  4. gds/
  5. lef/
  6. lib/
  7. mag/
  8. maglef/
  9. mpw_precheck/
  10. openlane/
  11. sdc/
  12. sdf/
  13. signoff/
  14. spef/
  15. spi/
  16. tapeout/
  17. verilog/
  18. .gitignore
  19. LICENSE
  20. Makefile
  21. README.md
README.md

Universal gates

It is quite well known that any logic circuit can be built using only NAND gates. For instance, an XNOR gate is equivalent to the following construction:

XNOR gate composed from 5 NAND gates

Such gates are called universal. Any Boolean function with 2 inputs and 1 output can be built from at most 5 NAND gates.

We can also define a gate U21 that is universal in a stricter sense, such that any Boolean function with 2 inputs and 1 output is realized with just a single copy of U21. This gate would obviously need more than 2 inputs, but it's usually still more economical than the 2k inputs and k outputs used from a set of NAND chips (1≤k≤5).

U21(a,b,c,d)=(a&~b)^c^d

As an example, this is how we get the NAND of p and q and the XNOR of p and q by wiring up U21's four inputs a, b, c and d to a suitable combination of p, q, 0 and 1:

a=p, b=q, c=p, d=1       a=1, b=q, c=p, d=q

⮟   ⮟   ⮟   ⮟   ⮟   ⮟   ⮟   ⮟   ⮟   ⮟   ⮟

NAND gate       XNOR gate

So U21 stands in for any combinatorial logic with 2 inputs and 1 output. And any Boolean function with 3 inputs and 1 output can be built with at most 3 copies of U21. But that doesn‘t stop us from creating a gate U31 that’s even more universal and does so with a single copy when wired correctly:

U31(a,b,c,d,e,f)=(((a^~b)&c)|(d^e))^((d|~a)&b)^f

This repository contains a chip design with four independent gates U21, U31, U41 and U22 where each Uij can be wired to act as an arbitrary function with i inputs and j outputs. It uses the caravel framework and is hardened for the gf180mcuC technology platform.