metadata
license: mit
tags:
- pytorch
- safetensors
- threshold-logic
- neuromorphic
- prefix
- parallel
threshold-prefix-or
4-bit parallel prefix OR operation. Computes running OR from MSB to each position. Used in leading-one detection and any-ones-above detection.
Circuit
x3 x2 x1 x0
β β β β
βΌ βΌ βΌ βΌ
βββββ βββββ βββββ βββββ
βy3 β βy2 β βy1 β βy0 β
β>=1β β>=1β β>=1β β>=1β
βββββ βββββ βββββ βββββ
β β β β
βΌ βΌ βΌ βΌ
(x3) (x3|x2) (x3|x2|x1) (all)
Function
prefix_or(x3, x2, x1, x0) -> (y3, y2, y1, y0)
y3 = x3
y2 = x3 OR x2
y1 = x3 OR x2 OR x1
y0 = x3 OR x2 OR x1 OR x0
Each output yi is the OR of all inputs from x3 down to xi.
Truth Table (selected)
| x3 x2 x1 x0 | y3 y2 y1 y0 | Meaning |
|---|---|---|
| 0 0 0 0 | 0 0 0 0 | All zeros |
| 0 0 0 1 | 0 0 0 1 | Only LSB set |
| 0 0 1 0 | 0 0 1 1 | First one at pos 1 |
| 0 1 0 0 | 0 1 1 1 | First one at pos 2 |
| 1 0 0 0 | 1 1 1 1 | First one at MSB |
| 1 1 1 1 | 1 1 1 1 | All ones |
| 1 0 1 0 | 1 1 1 1 | Mixed pattern |
Mechanism
Single-layer parallel implementation:
| Output | Condition | Weights | Bias |
|---|---|---|---|
| y3 | x3 >= 1 | [1,0,0,0] | -1 |
| y2 | x3 + x2 >= 1 | [1,1,0,0] | -1 |
| y1 | x3 + x2 + x1 >= 1 | [1,1,1,0] | -1 |
| y0 | x3 + x2 + x1 + x0 >= 1 | [1,1,1,1] | -1 |
All use bias -1 (fires when at least one relevant input is 1).
Parameters
| Inputs | 4 |
| Outputs | 4 |
| Neurons | 4 |
| Layers | 1 |
| Parameters | 20 |
| Magnitude | 14 |
Applications
- Leading-one detection: Transition from 0β1 in output marks MSB position
- Any-bit-set prefix: y_i = 1 means some bit from MSB to position i is set
- Carry kill detection: In adders, prefix-OR of "kill" signals
Usage
from safetensors.torch import load_file
import torch
w = load_file('model.safetensors')
def prefix_or(x3, x2, x1, x0):
inp = torch.tensor([float(x3), float(x2), float(x1), float(x0)])
y3 = int((inp @ w['y3.weight'].T + w['y3.bias'] >= 0).item())
y2 = int((inp @ w['y2.weight'].T + w['y2.bias'] >= 0).item())
y1 = int((inp @ w['y1.weight'].T + w['y1.bias'] >= 0).item())
y0 = int((inp @ w['y0.weight'].T + w['y0.bias'] >= 0).item())
return y3, y2, y1, y0
print(prefix_or(0, 0, 1, 0)) # (0, 0, 1, 1)
print(prefix_or(1, 0, 0, 0)) # (1, 1, 1, 1)
License
MIT