SPICE-compatible Modified Nodal Analysis circuit simulator and solver written in MoonBit
moonbit-circuit-solver/
├── .github/
│ └── workflows/
│ └── ci.yml # GitHub Actions CI Matrix Workflow
├── src/
│ ├── linalg/ # Dense, Sparse, Complex & Krylov Solvers (GMRES, BiCGSTAB, MINRES, RCM)
│ ├── spice/ # SPICE Parser, AST, Lexer & Netlist Serializer
│ ├── mna/ # MNA Matrix Stamping, DC/AC Analysis, Adjoint Sensitivity & OCT Poles
│ ├── nonlinear/ # Non-Linear Models (BSIM4, RTD NDR, Diode, BJT, Newton-Raphson)
│ ├── transient/ # Time-Domain Integrators (Gear, RK4, Trap), Wavelets & Hilbert Envelopes
│ ├── symbolic/ # Symbolic Polynomials, Transfer Functions & MIMO State-Space Engine
│ ├── visualizer/ # ASCII Chart, SVG Plotter, Smith Chart & CSV Exporters
│ ├── circuit/ # High-Level CircuitSimulator Engine Facade & Core Test Suites
│ ├── benchmarks/ # Executable domain and matrix benchmark suites
│ └── cli/ # Command-Line Executable Application
├── moon.mod # MoonBit Root Module Manifest
├── LICENSE # Apache-2.0 License
└── README.md # Project Documentationmoon run src/climoon testmoon fmt --deny-warn
moon info
moon check --deny-warn
moon test --deny-warnimport "hsy-bit/moonbit-circuit-solver/src/circuit"
fn main {
// Define SPICE netlist string
let netlist_str =
#|* RC Low-Pass Filter Transient Simulation
#|V1 in 0 5.0
#|R1 in out 1k
#|C1 out 0 1u
#|.op
#|.tran 10u 2m
#|.end
// Create simulator instance
let sim = @circuit.CircuitSimulator::from_spice_string(netlist_str)
// Compute DC Operating Point
let voltages = sim.solve_dc()
println("Node 'out' DC Voltage: " + voltages.get("out").to_string() + " V")
// Render Terminal ASCII Waveform
let chart = sim.render_transient_chart(0.00001, 0.002, "out")
println(chart)
}| Circuit Benchmark | Matrix Size | Primary Solver | Residual Norm | Convergence |
|---|---|---|---|---|
| Resistor Divider | Gaussian Elimination | 1 iteration | ||
| OpAmp Active Filter | LU Factorization | 1 iteration | ||
| Sallen-Key Cascade | Complex LU () | 1 iteration | ||
| 100-Stage Mesh Grid | Restarted GMRES() | 12 iterations | ||
| 500-Node Power Network | Sparse MINRES | 24 iterations | ||
| 1000-Node Grid Network | Sparse BiCGSTAB + RCM | 35 iterations | ||
| 20000-Node Massive Mesh | Sparse BiCGSTAB + Jacobi | 68 iterations |
Install
Download zipSPICE-compatible Modified Nodal Analysis circuit simulator and solver written in MoonBit