Releases: RFingAdam/lineforge
v2.2.0 — Relicense to AGPL-3.0-or-later
License change: GPL-3.0-or-later → AGPL-3.0-or-later.
The AGPL closes the "wrap as a paid SaaS without contributing back" gap that GPL leaves open — GPL's copyleft only triggers on distribution, while AGPL's also triggers on network use. For an engineering calculator that someone could reasonably wrap in a paid SaaS, that distinction matters.
The atlc / atlc2 lineage is preserved. GPL-3.0 → AGPL-3.0 is explicitly permitted by GPL-3.0 §13. Existing GPL-3.0 forks remain valid under their original terms; future commits and the v2.2.0 release are AGPL-3.0-or-later.
Also in this release
- Materials database fix: corrected scalar
er/tan_deltadefaults for Isola 370HR (3.4 → 4.04, 0.005 → 0.021) and Megtron 6 R-5775 (3.0 → 3.71, 0.001 → 0.002) to match canonical datasheet values at 1 GHz. The frequency-resolveder_freqtables were already correct; only the no-frequency-specified fallback was wrong.
No API changes. All 469 tests pass.
See CHANGELOG.md for the full entry.
v2.1.0 — RF pad analytics + path budget + design rules
Five new APIs distilled from real RF design work
This release adds tools developed during the L3 SIG1 stripline and 0.4 mm/0.3 mm/U.FL pad case-study sessions (see examples/09_*, examples/10_*). Each is both a Python function and an MCP tool.
pad_capacitance — finite-pad C with proper fringing
Three methods (parallel-plate, Yamashita-Atsuki, Hammerstad-Jensen) bracket the answer. YA is the default for finite square or near-square pads.
import lineforge
r = lineforge.pad_capacitance("0.4mm", "0.4mm", h="2.73mil", er=3.7)
print(f"C = {r.C_fF:.1f} fF, RL @ 6 GHz = {r.return_loss_dB(6e9):.1f} dB")
# C = 104.6 fF, RL @ 6 GHz = 20.2 dBpad_relief_advisor — rank stackup options against an RL target
advice = lineforge.pad_relief_advisor("0.4mm", "0.4mm",
options=[...], band_max_ghz=6.0, rl_target_dB=30.0)
print(advice.recommendation) # "C: relieve L2+L3 → L4"classify_pad — Category 1 / 2 / 3 decision framework
Codifies "follow reference design vs optimize freely vs standard practice":
- Category 1: Wi-Fi/LTE modules, U.FL/SMA connectors, RF ICs → don't deviate
- Category 2: Your own triplexers, diplexers, matching networks → optimize
- Category 3: DC, low-speed, power pads → standard practice
laminate_lookup — fuzzy name + frequency interpolation
r = lineforge.laminate_lookup("FR4 prepreg") # → εr=3.7
r = lineforge.laminate_lookup("RO4350B", frequency_ghz=10) # interpolatedrf_path_budget — end-to-end RL across source pad + trace + end pad
budget = lineforge.rf_path_budget(
freq_ghz=[0.7, 2.5, 6.0],
source_pad=src_pad, trace=TraceSpec(Z0=56.0), end_pad=ufl_pad,
)
print(f"Worst RL: {budget.worst_rl_dB:.1f} dB")What's new in MCP
All five APIs are now MCP tools, callable from Claude Desktop / Claude Code / any MCP client. Total tools: 21.
Testing
469 tests pass (up from 418). 51 new tests covering all five APIs. Lint clean. No breaking changes.
Migration
None needed — purely additive. All v2.0.0 APIs continue to work unchanged.
See CHANGELOG.md for the full list of changes.
v2.0.0 — atlc3 is now lineforge
atlc3 → lineforge
The project has grown well past being a "successor to atlc/atlc2" into a
programmable, agent-friendly transmission-line platform. v2.0.0 reflects
that scope with a name change.
What's the same
- All function names, geometry models, result fields, solver behavior
- atlc2 BMP / MoreColors.txt / .txt script-file drop-in compatibility
- Every v1.1.0 feature: multi-layer stacks, Touchstone export, optimizer,
three-wire solver, GUI launcher, L3 SIG1 EM validation case study
What's new (the rename)
| Was | Now |
|---|---|
pip install atlc3 |
pip install lineforge |
import atlc3 |
import lineforge |
from atlc3 import … |
from lineforge import … |
atlc3 <subcommand> (CLI) |
lineforge <subcommand> |
atlc3_kernel (Rust crate) |
lineforge_kernel |
.atlc3.json (config) |
.lineforge.json |
Migration
Three find-and-replaces in your project:
import atlc3 → import lineforge
from atlc3 → from lineforge
atlc3 <cmd> → lineforge <cmd>
Why "lineforge"
Picked from a 25-name Monte Carlo simulation (10,000 trials weighted across
memorability, brandability, domain-fit, pronounceability, SEO uniqueness,
length, and spoken cadence). lineforge ranked #1 with a mean score of
69.73 (next-best available was wireforge at 65.70).
Lineage
The atlc3 PyPI package is frozen at 1.1.0 as legacy. All new
development happens under lineforge. The original David Kirkby atlc (2002)
and Brian Beezley atlc2 (2010) attribution remains in the Acknowledgments
and the atlc2-format BMP / MoreColors.txt / .txt script-file compatibility
is preserved unchanged.
See CHANGELOG.md for the full breaking-change list.
v1.1.0 — three-wire solver + GUI launcher + L3 SIG1 EM validation
Highlights
Three-conductor analytical solver (B1 / B2 / B3)
atlc3.analytical.three_wire— closed-form Y-matrix decomposition for three-conductor systemsatlc3.geometry.three_wire—WirePositionmodel andThreeConductorgeometry- Bitmap solver
Laplace.solve_modesextended to the 3-conductor case via Y-matrix factorisation, matching analytical within ~1% - Boundary-weighted floating-conductor BC for faster convergence with one Q-conserving wire
- New theory doc
docs/theory/three_wire.md
GUI ergonomics (C-final, E9)
atlc3 gui— one-command CLI launcher: starts FastAPI backend, opens browseratlc3 gui --reload— backend hot-reload for GUI development (closes #28)examples/08_gui_walkthrough.mdend-to-end walkthrough
Case study: L3 SIG1 openEMS validation
- New
examples/09_l3_sig1_em_validation/directory: four standalone openEMS scripts plus a writeup - Cross-validates atlc3's Wadell closed-form against 3D FDTD on a real RF design point (800 MHz – 6 GHz triplexer common port)
- Microstrip Z₀ matches openEMS MSLPort within ±1.6% across W = 3.15 – 6.9 mil
- Asymmetric stripline Z₀ matches Wadell T → 0 within −2.1% via V/I field probes
- Width-shift physics reproduced within 1 Ω
Compatibility
- All 1.0.0 APIs continue to work unchanged
- No breaking changes
See CHANGELOG.md for the full list of changes.