|
|
---
|
|
|
license: mit
|
|
|
tags:
|
|
|
- pytorch
|
|
|
- safetensors
|
|
|
- threshold-logic
|
|
|
- neuromorphic
|
|
|
- arithmetic
|
|
|
---
|
|
|
|
|
|
# threshold-halfadder
|
|
|
|
|
|
Adds two 1-bit inputs, producing sum and carry. The building block for all multi-bit adders.
|
|
|
|
|
|
## Circuit
|
|
|
|
|
|
```
|
|
|
a b
|
|
|
β β
|
|
|
βββββ¬ββββ€
|
|
|
β β β
|
|
|
βΌ β βΌ
|
|
|
βββββββββββββββββ
|
|
|
β OR βββ NAND β
|
|
|
βββββββββββββββββ
|
|
|
β β β
|
|
|
βββββΌββββ
|
|
|
βΌ a b
|
|
|
ββββββββ β β
|
|
|
β AND β βββ¬ββ
|
|
|
ββββββββ βΌ
|
|
|
β ββββββββ
|
|
|
βΌ β AND β
|
|
|
sum ββββββββ
|
|
|
β
|
|
|
βΌ
|
|
|
carry
|
|
|
```
|
|
|
|
|
|
The sum output uses XOR (2 layers), the carry uses AND (1 layer).
|
|
|
|
|
|
## Truth Table
|
|
|
|
|
|
| a | b | sum | carry |
|
|
|
|---|---|-----|-------|
|
|
|
| 0 | 0 | 0 | 0 |
|
|
|
| 0 | 1 | 1 | 0 |
|
|
|
| 1 | 0 | 1 | 0 |
|
|
|
| 1 | 1 | 0 | 1 |
|
|
|
|
|
|
Binary: a + b = (carry Γ 2) + sum
|
|
|
|
|
|
## Components
|
|
|
|
|
|
| Output | Function | Neurons | Layers |
|
|
|
|--------|----------|---------|--------|
|
|
|
| sum | XOR(a, b) | 3 | 2 |
|
|
|
| carry | AND(a, b) | 1 | 1 |
|
|
|
|
|
|
**Total: 4 neurons, 12 parameters**
|
|
|
|
|
|
## Arithmetic
|
|
|
|
|
|
The half adder computes a + b where a, b β {0, 1}:
|
|
|
|
|
|
- 0 + 0 = 0 (sum=0, carry=0)
|
|
|
- 0 + 1 = 1 (sum=1, carry=0)
|
|
|
- 1 + 0 = 1 (sum=1, carry=0)
|
|
|
- 1 + 1 = 2 (sum=0, carry=1)
|
|
|
|
|
|
The carry represents the 2s place.
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
```python
|
|
|
from safetensors.torch import load_file
|
|
|
import torch
|
|
|
|
|
|
w = load_file('model.safetensors')
|
|
|
|
|
|
def half_adder(a, b):
|
|
|
inp = torch.tensor([float(a), float(b)])
|
|
|
|
|
|
# XOR for sum
|
|
|
or_out = int((inp @ w['xor.layer1.or.weight'] + w['xor.layer1.or.bias']).sum() >= 0)
|
|
|
nand_out = int((inp @ w['xor.layer1.nand.weight'] + w['xor.layer1.nand.bias']).sum() >= 0)
|
|
|
xor_inp = torch.tensor([float(or_out), float(nand_out)])
|
|
|
sum_out = int((xor_inp @ w['xor.layer2.weight'] + w['xor.layer2.bias']).sum() >= 0)
|
|
|
|
|
|
# AND for carry
|
|
|
carry_out = int((inp @ w['carry.weight'] + w['carry.bias']).sum() >= 0)
|
|
|
|
|
|
return sum_out, carry_out
|
|
|
```
|
|
|
|
|
|
## Files
|
|
|
|
|
|
```
|
|
|
threshold-halfadder/
|
|
|
βββ model.safetensors
|
|
|
βββ model.py
|
|
|
βββ config.json
|
|
|
βββ README.md
|
|
|
```
|
|
|
|
|
|
## License
|
|
|
|
|
|
MIT
|
|
|
|