Quantum Dot Cellular Automata Qca Bistable Cell Landauer Clocking Logic Gate Qca

# Quantum-Dot Cellular Automata (QCA): Cell Polarization Kinetics, Coulombic Interactions, and Ultra-Low-Power Reversible Nanocomputing

## 1. Introduction: QCA Beyond CMOS

Quantum-Dot Cellular Automata (QCA) represents a paradigm shift in nanocomputing: information is encoded in the polarization state of cells (arrangements of quantum dots), and computation proceeds via Coulombic interactions between neighboring cells. Unlike CMOS, where power dissipation scales with frequency, QCA potentially approaches the Landauer limit of reversible computing: negligible energy dissipation (approaching kT ln 2 per logic operation at room temperature).

Each QCA cell consists of four quantum dots arranged in a 2×2 array, with two electrons confined to the dots. The cell polarization P ∈ {-1, +1} represents whether the electrons prefer the left or right diagonal pair of dots—a bistable system robust against thermal noise and disorder.

## 2. QCA Cell Polarization and Bistability

### Cell Geometry and Ground State

A QCA cell contains four tunnel-coupled quantum dots arranged as:

1 --- 2
|     |
4 --- 3

Two electrons are introduced via doping. At equilibrium, electrons minimize Coulomb repulsion by occupying opposite corners of the cell. Two degenerate configurations exist:

Configuration P = +1: Electrons at dots (1,3) — primary diagonal
Configuration P = -1: Electrons at dots (2,4) — secondary diagonal

The polarization is defined as:

$$P = \frac{(q_1 + q_3) - (q_2 + q_4)}{\sum_{i=1}^{4}q_i}$$

where q_i is the charge occupation. Fully polarized: P ∈ {-1, +1}; unpolarized: P ≈ 0.

### Hartree-Fock Hamiltonian

The single-cell Hamiltonian in the two-electron subspace (rotating wave approximation) is:

$$H_{\text{cell}} = \begin{pmatrix} -E_k/2 & -\gamma \\ -\gamma & E_k/2 \end{pmatrix}$$

where:
- E_k = U_{14} - U_{23}: Coulomb energy difference between ground state configurations
- γ: Interdot tunnel coupling strength
- U_ij: Coulomb repulsion energy between dots i and j

The two eigenstates are:

$$|\psi_+\rangle = \frac{1}{\sqrt{2}}(|1,3\rangle + |2,4\rangle), \quad E_+ = \sqrt{E_k^2/4 + \gamma^2}$$
$$|\psi_-\rangle = \frac{1}{\sqrt{2}}(|1,3\rangle - |2,4\rangle), \quad E_- = -\sqrt{E_k^2/4 + \gamma^2}$$

The ground state (lowest energy) has polarization ±1 depending on whether E_k is positive or negative.

## 3. Cell-Cell Interactions and Coulombic Coupling

Two neighboring QCA cells interact via Coulomb repulsion. For cells A and B with separation r, the interaction Hamiltonian is:

$$H_{\text{AB}} = \sum_{i \in A, j \in B} \frac{e^2}{4\pi\epsilon_0 \epsilon_r |r_i - r_j|}$$

In the polarization basis (P_A, P_B ∈ {-1, +1}), the cell-cell coupling simplifies to:

$$E_{\text{interaction}} = -\alpha P_A P_B$$

where α (coupling strength) depends on interdot spacing and geometry. For QCA to function, α must be:
- Strong enough (α >> γ) for robust signal transmission
- Not too strong (α comparable to Coulomb energy scale ~meV) to avoid unwanted interactions

The net cell potential becomes:

$$E_{\text{cell}} = E_k P + \sum_{\text{neighbors}} \alpha_i P P_i$$

## 4. QCA Logic: Majority Gate and Inverter

### Majority Gate (3-Input)

The majority gate computes M(A,B,C) = AB + BC + AC, fundamental to universal computation. In QCA:

$$E_{\text{output}} \propto -[P_A P_B + P_B P_C + P_A P_C] P_{\text{output}}$$

The output cell Q polarizes to match the majority polarization of input cells A, B, C:
- If two or more inputs are P = +1, Q → +1
- If two or more inputs are P = -1, Q → -1

Proof: The energy is minimized when P_Q aligns with the majority direction.

### Inverter (NOT Gate)

An inverter flips the input polarization:

A → [Clock/Drive] → Q

A driver cell in a phase-dependent clock field forces Q to anti-align with A:

$$E_{\text{drive}} = -P_Q \cos(\phi(t))$$

When the clock phase reaches φ = π, the energy minimum switches from P_Q = +A to P_Q = -A, implementing bit inversion.

## 5. Four-Phase Clocking Scheme

QCA computation uses a four-phase adiabatic clock (Switch, Hold, Release, Relax) to propagate polarization states through the circuit:

### Phase Breakdown

1. Switch (0–π/2):
- Clock voltage ramps up from 0 → V_max
- Cell energy landscape shifts; polarization becomes unstable
- Driven cells' polarizations flip to align with driver cell
- Undriven cells retain previous polarization

2. Hold (π/2–π):
- Clock plateaus at V_max
- Cells strongly polarized in their new state
- Information propagates via Coulombic coupling to neighbors

3. Release (π–3π/2):
- Clock voltage ramps down from V_max → 0
- Cells settle into stable ground states
- Polarizations "frozen" to their values

4. Relax (3π/2–2π):
- Clock at zero; cells quiescent
- Allows thermal relaxation and timing alignment
- Circuit ready for next clock cycle

Key advantage: Adiabatic (slow) switching minimizes energy dissipation. Energy dissipated per cycle: ~E_gap × δt^{-1}, where E_gap is the energy gap and δt is switching time. As δt → ∞, dissipation → 0 (reversible computing limit).

## 6. QCA Cellular Automaton: Rule Updating

Each cell's state at time t+1 depends on its current state and neighbors' polarizations (local rules). This satisfies the cellular automaton definition:

$$P_i(t+1) = f_i(P_i(t), P_{i-1}(t), P_{i+1}(t))$$

where f_i is the local rule (majority for standard QCA). The circuit layout itself encodes the computation rule via nearest-neighbor coupling topology.

## 7. Polarization Dynamics: Monte Carlo and Hamiltonian Simulations

### Monte Carlo Simulation of Polarization Switching

Polarization switching under thermal noise follows stochastic dynamics. At temperature T, a cell with energy difference ΔE between P=+1 and P=-1 states switches with probability:

$$P_{\text{switch}} = \frac{1}{1 + \exp(2\Delta E / k_B T)}$$

Monte Carlo algorithm:
1. Initialize cell polarizations randomly
2. Each update step: calculate energy difference for flipping each cell
3. Flip with probability above; otherwise retain state
4. Repeat for N_steps to reach equilibrium or steady state

### Hartree-Fock Self-Consistency

For deterministic simulations, solve the self-consistent Hartree-Fock equations:

$$P_i = \tanh\left(\frac{1}{2k_B T} \left[E_{k,i} + \sum_j \alpha_{ij} P_j\right]\right)$$

Iterate until convergence to find stable polarization configuration.

## 8. Numerical Solver: QCA Majority Gate Simulation

We implement a QCA majority gate simulator:

import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import eigh
from scipy.integrate import odeint

def qca_cell_hamiltonian(P_drive, E_k, gamma):
    """
    Single QCA cell Hartree-Fock Hamiltonian in polarization basis.
    
    H = [[E_k/2 + energy_drive, gamma],
         [gamma, -E_k/2 + energy_drive]]
    """
    H = np.array([[E_k/2, gamma], [gamma, -E_k/2]])
    return H

def qca_majority_gate(P_A, P_B, P_C, alpha_coupling=0.05, gamma=0.01, E_k_sweep=None):
    """
    Simulate QCA majority gate output.
    
    Majority gate: M(A,B,C) = AB + BC + AC
    Output polarization determined by majority rule.
    """
    if E_k_sweep is None:
        # Static calculation
        E_coulomb = alpha_coupling * (P_A*P_B + P_B*P_C + P_A*P_C)
        
        # Output cell driven by input Coulomb energy
        # Output polarizes to minimize: -P_out * E_coulomb
        P_output = np.sign(E_coulomb) if E_coulomb != 0 else 0
        return P_output
    else:
        # Dynamic switching under time-varying E_k (clock)
        P_outputs = []
        for E_k in E_k_sweep:
            H = qca_cell_hamiltonian(0, E_k, gamma)
            evals, evecs = eigh(H)
            
            # Ground state: eigenvector of lowest eigenvalue
            psi_ground = evecs[:, 0]
            P_ground = (np.abs(psi_ground[0])**2 - np.abs(psi_ground[1])**2)
            
            P_outputs.append(P_ground)
        return np.array(P_outputs)

def qca_circuit_cascade(inputs, circuit_layers, alpha_coupling=0.05):
    """
    Simulate multi-layer QCA majority gate cascade.
    
    inputs: List of input polarizations
    circuit_layers: Number of majority gate stages
    
    Returns: Output polarization(s)
    """
    P = np.array(inputs, dtype=float)
    
    for layer in range(circuit_layers):
        P_new = []
        for i in range(len(P) - 2):
            # Three consecutive cells form majority gate
            P_out = qca_majority_gate(P[i], P[i+1], P[i+2], alpha_coupling)
            P_new.append(P_out)
        P = np.array(P_new)
    
    return P

def qca_switching_trajectory(P_in, alpha_coupling=0.05, gamma=0.01, E_k_max=0.2, n_clock_steps=100):
    """
    Simulate output polarization during four-phase clock cycle.
    
    Clock modulation: E_k(φ) = E_k_max * sin(φ)
    """
    phi_array = np.linspace(0, 2*np.pi, n_clock_steps)
    P_output_array = np.zeros(n_clock_steps)
    
    for idx, phi in enumerate(phi_array):
        E_k_clock = E_k_max * np.sin(phi)
        
        # Majority gate with additional clock-driven E_k
        E_coulomb = alpha_coupling * (P_in * P_in)  # Self-coupling (simplified)
        E_total = E_k_clock + E_coulomb
        
        # Ground state polarization
        H = qca_cell_hamiltonian(0, E_total, gamma)
        evals, evecs = eigh(H)
        psi_ground = evecs[:, 0]
        P_output = np.abs(psi_ground[0])**2 - np.abs(psi_ground[1])**2
        
        P_output_array[idx] = P_output
    
    return phi_array, P_output_array

def energy_dissipation_qca(P_initial, P_final, T_kelvin, switching_time_ns=1.0):
    """
    Estimate energy dissipation during adiabatic switching.
    
    E_dissipated ≈ (ΔE/τ) where ΔE is state energy difference, τ is switching time
    Minimum dissipation: ~k_B T ln(2) per irreversible operation
    """
    k_B_eV = 8.617e-5  # eV/K
    Delta_E_est = 0.1  # eV (typical Coulomb energy scale in QCA)
    tau_s = switching_time_ns * 1e-9
    
    E_dissipated = Delta_E_est / tau_s if tau_s > 0 else 0
    E_landauer_limit = k_B_eV * T_kelvin * np.log(2)
    
    efficiency_factor = E_landauer_limit / (E_dissipated + 1e-30)
    
    return E_dissipated, E_landauer_limit, efficiency_factor

# Main execution
print("=" * 70)
print("QUANTUM-DOT CELLULAR AUTOMATA (QCA): LOGIC AND SWITCHING DYNAMICS")
print("=" * 70)

# QCA Parameters
alpha = 0.05  # Coulomb coupling strength (eV)
gamma = 0.01  # Interdot tunnel coupling (eV)
E_k_0 = 0.1   # Coulomb energy scale (eV)

print(f"\nQCA Cell Parameters:")
print(f"  Coulomb coupling α: {alpha:.4f} eV")
print(f"  Tunnel coupling γ: {gamma:.4f} eV")
print(f"  Coulomb energy E_k: {E_k_0:.4f} eV")

# Test majority gate
print(f"\nMajority Gate Truth Table:")
print(f"
  A | B | C | M(A,B,C)")
print(f"  " + "-" * 20)

for A in [-1, 1]:
    for B in [-1, 1]:
        for C in [-1, 1]:
            M = qca_majority_gate(A, B, C, alpha)
            print(f"  {'+' if A>0 else '-'} | {'+' if B>0 else '-'} | {'+' if C>0 else '-'} | {'+' if M>0 else '-'}")

# Switching dynamics under four-phase clock
print(f"\nFour-Phase Clock Switching Dynamics:")
P_in_test = 1  # Input polarization
phi_range, P_out_range = qca_switching_trajectory(P_in_test, alpha, gamma, E_k_max=0.2, n_clock_steps=200)

print(f"  Output polarization oscillates during clock phases")
print(f"  Phase 1 (Switch, 0–π/2): |P_out| increases")
print(f"  Phase 2 (Hold, π/2–π): P_out fully polarized")
print(f"  Phase 3 (Release, π–3π/2): |P_out| decreases")
print(f"  Phase 4 (Relax, 3π/2–2π): P_out relaxes to ~0")

# Energy dissipation estimate
T_300K = 300
E_diss, E_landauer, eff_factor = energy_dissipation_qca(1, -1, T_300K, switching_time_ns=1.0)

print(f"\nEnergy Dissipation Analysis (T=300 K, τ_switch=1 ns):")
print(f"  Estimated dissipation: {E_diss:.3e} eV/operation")
print(f"  Landauer limit: {E_landauer:.3e} eV/operation")
print(f"  Efficiency factor (E_L / E_actual): {eff_factor:.2e}")

# Plotting
fig, axes = plt.subplots(2, 2, figsize=(14, 11))

# Panel 1: Majority gate truth table (visual)
ax = axes[0, 0]
truth_table = np.array([
    [1, -1, -1, 1, -1, 1, 1, 1]  # M output for ABC combinations
]).reshape(2, 2, 2).astype(float)
truth_labels = []
for a in [1, -1]:
    for b in [1, -1]:
        for c in [1, -1]:
            truth_labels.append(f"({a:+d},{b:+d},{c:+d})")

ax.text(0.5, 0.9, 'Majority Gate Logic Function', ha='center', fontsize=12, fontweight='bold', transform=ax.transAxes)
truth_output_text = """
Truth Table: M(A,B,C) = AB + BC + AC

A    B    C  | Output
+1  +1  +1  | +1
+1  +1  -1  | +1
+1  -1  +1  | +1
+1  -1  -1  | -1
-1  +1  +1  | +1
-1  +1  -1  | -1
-1  -1  +1  | -1
-1  -1  -1  | -1
"""
ax.text(0.1, 0.5, truth_output_text, ha='left', va='center', fontsize=9, family='monospace', transform=ax.transAxes)
ax.axis('off')

# Panel 2: Switching trajectory during clock cycle
ax = axes[0, 1]
ax.plot(phi_range, P_out_range, 'b-', linewidth=2.5)
ax.fill_between(phi_range, P_out_range, alpha=0.2, color='blue')
ax.axvspan(0, np.pi/2, alpha=0.1, color='green', label='Switch')
ax.axvspan(np.pi/2, np.pi, alpha=0.1, color='blue', label='Hold')
ax.axvspan(np.pi, 3*np.pi/2, alpha=0.1, color='yellow', label='Release')
ax.axvspan(3*np.pi/2, 2*np.pi, alpha=0.1, color='red', label='Relax')
ax.set_xlabel('Clock Phase φ (radians)', fontsize=11)
ax.set_ylabel('Output Polarization P_out', fontsize=11)
ax.set_title('QCA Output During Four-Phase Clock Cycle', fontsize=12, fontweight='bold')
ax.set_xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi])
ax.set_xticklabels(['0', 'π/2', 'π', '3π/2', '2π'])
ax.grid(True, alpha=0.3)
ax.legend(fontsize=9, loc='upper right')

# Panel 3: Energy landscape
ax = axes[1, 0]
E_k_range = np.linspace(-0.2, 0.2, 100)
E_plus = np.sqrt(E_k_range**2/4 + gamma**2)
E_minus = -E_plus

ax.plot(E_k_range, E_plus, 'r-', linewidth=2.5, label='E₊ (|+⟩ state)')
ax.plot(E_k_range, E_minus, 'b-', linewidth=2.5, label='E₋ (|-⟩ state)')
ax.axhline(y=0, color='gray', linestyle='--', alpha=0.5)
ax.axvline(x=0, color='gray', linestyle='--', alpha=0.5)
ax.fill_between(E_k_range[E_k_range<0], E_plus[E_k_range<0], E_minus[E_k_range<0], alpha=0.2, color='red')
ax.set_xlabel('Coulomb Energy Difference E_k (eV)', fontsize=11)
ax.set_ylabel('Eigenstate Energy (eV)', fontsize=11)
ax.set_title('QCA Cell Energy Landscape', fontsize=12, fontweight='bold')
ax.grid(True, alpha=0.3)
ax.legend(fontsize=10)

# Panel 4: Energy dissipation vs switching time
ax = axes[1, 1]
tau_range = np.logspace(-9, -6, 50)  # 1 ns to 1 μs
E_diss_array = []
for tau_ns in tau_range * 1e9:
    E_d, _, _ = energy_dissipation_qca(1, -1, 300, tau_ns)
    E_diss_array.append(E_d)

ax.loglog(tau_range*1e9, E_diss_array, 'g-o', linewidth=2.5, markersize=5, label='QCA Dissipation')
ax.axhline(y=E_landauer, color='orange', linestyle='--', linewidth=2, label=f'Landauer Limit (~{E_landauer:.1e} eV)')
ax.set_xlabel('Switching Time τ (ns)', fontsize=11)
ax.set_ylabel('Energy Dissipation per Operation (eV)', fontsize=11)
ax.set_title('Reversible Computing Limit (T=300 K)', fontsize=12, fontweight='bold')
ax.grid(True, alpha=0.3, which='both')
ax.legend(fontsize=10)

plt.tight_layout()
plt.savefig('qca_quantum_dot_cellular_automata.png', dpi=150, bbox_inches='tight')
print(f"\nFigure saved: qca_quantum_dot_cellular_automata.png")
plt.close()

## 9. Decoherence and Thermal Noise Robustness

QCA's polarization bistability provides noise immunity. Energy cost to flip a polarized cell: ~Coulomb energy scale (~meV at room temperature). This is >> k_BT (26 meV at room T), making QCA naturally robust to thermal fluctuations.

However, charge noise from fluctuating dopants and interfacial disorder can shift E_k, reducing polarization contrast. Mitigation strategies:
- Large cells (nm scale) to reduce charge noise impact
- High-quality substrates (crystalline materials)
- Shielding layers to suppress ambient charge noise

## 10. Comparison with CMOS and Spin-Based Systems

FeatureCMOSQCASpin Qubits
Clock speedGHzMHz–GHzMHz–GHz
Power/gate1–100 pJ1 aJ–1 fJ100 aJ–1 fJ
Temperature300 K<100 KmK–K
ComplexityMature (10B transistors)Prototype (<1000 cells)Research

## 11. Future Directions: Molecular QCA and Spin-Based QCA

Molecular QCA: Redox-active molecules (e.g., mixed-valence donors) replacing quantum dots. Advantages: smaller size, potential for room-temperature operation.

Spin-QCA: Magnetic moments (spins) instead of charge polarization. Decouples from electrostatic noise but requires strong magnetic fields or exchange coupling.

## 12. Practical QCA Implementation Challenges

  • Fabrication precision: Dot spacing ~ 20 nm; alignment tolerance: ±2 nm
  • Tunneling control: γ must be precisely tuned via heterostructure barriers
  • Clocking: Global clock synchronization across chip while minimizing coupling noise
  • Fan-out: Driving multiple downstream cells from single output

## 13. Cascadable Logic and Universal Computation

QCA majority gates cascaded with inverters form universal gate sets (can implement any Boolean function). Unlike CMOS, power dissipation is independent of frequency in the adiabatic regime, scaling only as (E_gap / τ_switch), making extremely slow, ultra-low-power computation feasible.

## 14. Experimental QCA Demonstrations

First QCA cells demonstrated in 1993 (Lent et al., metallic dots). Modern implementations:
- Metallic dots on silicon/SiO₂: K_coupling ~ 0.1 meV (room T operation challenging)
- Semiconductor heterostructures (GaAs/AlGaAs): Better control, requires <1 K
- Molecular systems: Room-T operation emerging, but lower switching speeds

## 15. Outlook: Hybrid Quantum-Classical QCA

Quantum cellular automata at the quantum limit potentially harness quantum superposition for computation speedup. A quantum QCA cell can exist in superposition of P = ±1 states, enabling quantum parallelism while maintaining classical decoherence immunity.

---

Computational Notes: QCA cell simulations solve the two-state Hartree-Fock Hamiltonian via eigenvalue decomposition. Majority gate logic computed from energy minimization under three-input Coulomb coupling. Four-phase clock switching tracked via time-dependent E_k modulation. Polarization bistability verified by comparing energy minima of P = ±1 states. Thermal switching probability calculated from Boltzmann distribution.

## 16. Consistent Dot Convention and Driven-Cell Hamiltonian

For the circuit model used here, sites 1 and 3 form one diagonal and sites 2 and 4 form the other. With q_i denoting electron occupation magnitude,

$$ P=\frac{(q_1+q_3)-(q_2+q_4)}{\sum_{i=1}^{4}q_i}. $$

Two electrons on diagonal (1,3) give P = +1; occupation of diagonal (2,4) gives P = −1. Partial delocalization produces |P| below unity. This convention must remain fixed across layout, Hamiltonian, and simulator because changing dot order flips the logical state.

In the two diagonal-state basis, with neighbor polarization P_i and model energy scale γ, the requested driven-cell Hamiltonian is

$$ H= \begin{pmatrix} -\frac{1}{2}\gamma P_i & -\gamma\\ -\gamma & \frac{1}{2}\gamma P_i \end{pmatrix}. $$

The off-diagonal term mixes charge configurations and produces an avoided crossing. A more detailed model may use E_k P_i for diagonal electrostatic bias and a separate clock-dependent tunneling energy γ_c off diagonal. Those parameterizations should not be mixed without stating the normalization.

For square cells of side a and center separation d, a point-charge kink-energy estimate is

$$ E_k=\frac{q^2}{4\pi\epsilon_0\epsilon_r} \left(\frac{2}{d}-\frac{2}{\sqrt{d^2+a^2}}\right). $$

E_k sets the inter-cell signal and thermal-robustness scale. Tunneling and clock barriers determine how readily the cell follows that signal.

## 17. Four-Phase Clocking and Majority Logic

The clock controls interdot barriers rather than acting as an ordinary Boolean voltage:

1. Switch: the barrier rises while an upstream neighbor drives the cell toward its instantaneous ground state.
2. Hold: the barrier stays high, suppressing tunneling so the cell drives the next zone.
3. Release: the barrier falls after the downstream zone has latched, reducing polarization.
4. Relax: the barrier remains low and the cell is nearly unpolarized.

Adjacent zones are quarter-cycle shifted. Clock edges must be slow enough to suppress Landau–Zener excitation but not so slow that thermal relaxation or noise erases the state.

The majority function is

$$ M(A,B,C)=AB+BC+AC. $$

With Boolean inputs, fixing C = 0 produces AND and fixing C = 1 produces OR. With polarization encoding,

$$ P_{\mathrm{out}}=\operatorname{sgn}(P_A+P_B+P_C). $$

Physical inputs are analog and may be unequally weighted by displacement or fringing fields. The analog output margin should therefore be verified before rounding to a bit.

## 18. Python Polarization and Truth-Table Simulator

The following solver diagonalizes the specified Hamiltonian, evaluates P_out(P_in), prints Boolean and polarization truth tables, and constructs the four clock phases.

import itertools
import numpy as np
import matplotlib.pyplot as plt

sigma_z = np.array([[1.0, 0.0], [0.0, -1.0]])

def hamiltonian(P_in, gamma=1.0):
    return np.array([
        [-0.5 * gamma * P_in, -gamma],
        [-gamma, 0.5 * gamma * P_in]
    ])

def polarization(P_in, gamma=1.0, kBT=None):
    values, vectors = np.linalg.eigh(hamiltonian(P_in, gamma))
    expectations = np.array([
        np.real(np.conjugate(vectors[:, j]) @ sigma_z @ vectors[:, j])
        for j in range(2)
    ])
    if kBT is None:
        return float(expectations[np.argmin(values)])
    weights = np.exp(-(values - values.min()) / kBT)
    weights /= weights.sum()
    return float(weights @ expectations)

def majority_bit(A, B, C):
    return int((A and B) or (B and C) or (A and C))

def majority_pol(PA, PB, PC, weights=(1.0, 1.0, 1.0)):
    drive = weights[0]*PA + weights[1]*PB + weights[2]*PC
    return 1 if drive > 0 else -1 if drive < 0 else 0

print("A B C | M")
for A, B, C in itertools.product((0, 1), repeat=3):
    print(A, B, C, "|", majority_bit(A, B, C))

print("\nPA PB PC | Pout")
for PA, PB, PC in itertools.product((-1, 1), repeat=3):
    print(f"{PA:+d} {PB:+d} {PC:+d} | {majority_pol(PA, PB, PC):+d}")

P_in = np.linspace(-1.0, 1.0, 501)
P_ground = np.array([polarization(p) for p in P_in])
P_thermal = np.array([polarization(p, kBT=0.15) for p in P_in])

phase = np.linspace(0.0, 2.0*np.pi, 800, endpoint=False)
quarter = (4.0 * phase / (2.0*np.pi)).astype(int)
local = phase % (np.pi/2.0)
barrier = np.select(
    [quarter == 0, quarter == 1, quarter == 2, quarter == 3],
    [local/(np.pi/2.0), np.ones_like(phase),
     1.0-local/(np.pi/2.0), np.zeros_like(phase)]
)

fig, axes = plt.subplots(1, 2, figsize=(12, 4.5))
axes[0].plot(P_in, P_ground, label="ground state")
axes[0].plot(P_in, P_thermal, "--", label="finite temperature")
axes[0].set(xlabel="Input polarization Pin", ylabel="Output polarization Pout")
axes[0].legend()
axes[1].plot(phase, barrier)
for j, label in enumerate(("Switch", "Hold", "Release", "Relax")):
    axes[1].text((j+0.5)*np.pi/2.0, 0.5, label, ha="center", rotation=90)
axes[1].set(xlabel="Clock phase (rad)", ylabel="Normalized barrier")
for ax in axes:
    ax.grid(alpha=0.3)
plt.tight_layout()
plt.show()

The Landauer quantity k_B T ln 2 is a bound associated with logically irreversible erasure, not a promise that every QCA transition dissipates exactly that energy. Verification must include the minimum eigenenergy gap, Hold-phase polarization margin, weighted-input imbalance, kink probability, clock skew, displaced or missing cells, trapped charge, and the energy used by clock distribution and readout.

Take quantum dot cellular automata QCA bistable cell landauer clocking logic gate QCA further

Ask the copilot about this term, or have our engineers assess it against your process.