Skip to content

Releases: MicrosystemsLab/PiezoD

v0.13.0

29 Apr 22:17

Choose a tag to compare

What's Changed

  • New optimization framework. optimize_performance and
    optimize_performance_from_current perform joint geometry +
    process-variable optimization across all five cantilever subclasses
    (CantileverEpitaxy, CantileverDiffusion, CantileverImplantation,
    CantileverPoly, CantileverPiezoelectric). Mirrors the MATLAB
    optimization framework: declarative state vars, parameter and metric
    constraints, named goal factories (force_resolution_goal,
    displacement_resolution_goal, force_noise_density_goal,
    surface_stress_resolution_goal, plus voltage/charge variants for
    piezoelectric).

  • Major cantilever-module bug fixes. The finite-difference
    temperature solver (calculateTempProfile), the actuator-stress and
    deflection chain (calculateDeflection, tipDeflection,
    calculateActuatorStress), and several standalone methods (d31,
    calculateEquivalentThickness, film_intrinsic_stress) had unported
    MATLAB-isms (1-indexed loops, column-vector shape mismatches,
    function-call vs. indexing syntax, scipy API misuse). All fixed so
    Python now matches MATLAB behaviour. print_performance(),
    plot_noise_spectrum(), and force_noise_density() now run
    end-to-end.

  • Re-licensed under MIT OR Apache-2.0 (was Apache-2.0 alone). Both
    license texts ship with the wheel.

  • MATLAB implementation marked unmaintained. Python is the primary
    supported path. Tutorials and READMEs reflect this.

  • Internal: 458 tests (was 341), CI broadened to lint the entire
    Python tree, GitHub Actions bumped to Node 24-compatible versions.

v0.12.0

29 Apr 03:52

Choose a tag to compare

What's Changed

  • Relicensed from GPL-3.0 to Apache-2.0. The new license adds an explicit patent grant.
  • Refreshed DopeDealer ion-implant lookup table (ionImplantLookupTable_dopedealer.h5, generated from DopeDealer commit 66df37d):
    • All 12,096 cases now solve cleanly. The previous LUT (shipped in v0.11.0) had 21 NaN cells across every metric (Xj, Rs, Nz, Nz_total, Beta1, Beta2); the new LUT has zero.
    • Specifically fixed: P at 5e15 cm^-2 / 20 keV / 1100 C / inert (all 7 anneal times), As at 2e16 / 30 keV / 950 C / dry O2 (all 7 times), and As at 5e16 / 50 keV / 1100 C / dry O2 (all 7 times). These were FBDF-unstable cases caused by a Hermite-cap C^1 Jacobian discontinuity; DopeDealer's FullPhysics solver now defaults to KenCarp47 with FBDF retry as a fallback.
    • Grid coverage is unchanged (no axes added or removed): 3 dopants (B, P, As) x 12 doses (1e13 to 5e16 cm^-2, 1-2-5 per decade) x 6 energies (10, 20, 30, 50, 80, 120 keV) x 4 temps (900, 950, 1000, 1100 C) x 7 times (15, 30, 45, 60, 90, 120, 150 min) x 2 ambients (inert, dry O2) = 12,096 cases.
    • Wet O2 remains omitted pending OED recalibration; queries for that ambient still return NaN.

v0.11.0

27 Apr 05:07

Choose a tag to compare

What's Changed

  • DopeDealer ion-implant lookup table regenerated with full B / P / As coverage (3 dopants x 12 doses x 6 energies x 4 temps x 7 times x 2 ambients).
  • Default optimizer bounds for lookup_source="dopedealer" updated: anneal temp 900-1100 C (was 850), implantation dose 1e13-5e16 cm^-2 (was up to 8e16), anneal time extended to 150 min.
  • wet_o2 anneal option removed for dopedealer; the new LUT only includes inert and dry_o2.
  • Lookup-table loader now fills NaN cells (failed simulator runs) at load time with a harmonic Laplace extension restricted to the same dopant-and-ambient sub-cube. Fixes a class of optimizer crashes where interpn(linear) returned NaN at queries that merely brushed a hole.

v0.10.3

26 Apr 19:45

Choose a tag to compare

What's Changed

  • Add substrate_background_cm3 (default 1e15 cm^-3) to Cantilever and PiezoresistorFromProfile so users can set the counter-doped substrate concentration.
  • doping_profile() now returns total_doping floored at the substrate so plotting shows the implant peak rolling into a visible substrate floor across all sources (TSUPREM, DopeDealer, diffusion, epitaxy).
  • Subtract the TSUPREM-4 lookup table's baked-in 1.36e15 cm^-3 substrate at table-load time so the tsuprem4 and dopedealer sources share the same dopant convention.
  • Internal carrier integrals (Nz, sheet_resistance, beta, RSheetProfile) use net active carriers and naturally truncate at the junction; lattice strain in calculateDopantBending switched to total dopant (per-atom).
  • New plot_doping_profile() helper on Cantilever and PiezoresistorFromProfile for a quick total + net active overlay with the junction marked.

v0.10.2

26 Apr 04:04

Choose a tag to compare

What's Changed

  • New pi_longitudinal() / pi_transverse() on Cantilever returning signed Smith/Kanda low-doping coefficients for the configured crystal_orientation (defaults to <100> for n-Si, <110> for boron).
  • New dr_over_r(sigma_l, sigma_t) and dr_over_r_from_tensor(sxx, syy, sxy, theta_rad) methods on Cantilever and the new PiezoresistorFromProfile, both vectorized.
  • New PiezoresistorFromProfile class for computing piezoresistor metrics from a user-supplied (e.g. SIMS) doping profile; returns the same DopingProcessMetrics dataclass as CantileverImplantation.
  • New public helpers exported: CrystalOrientation, pi_low_doping, default_orientation, rotate_in_plane_stress, diffusion_length_cm, hooge_alpha_from_anneal.
  • max_piezoresistance_factor() now returns abs(pi_longitudinal()) using Smith/Kanda exact values; force_sensitivity and surface_stress_sensitivity rewritten in terms of the signed pi coefficients (small numeric shifts of <1%).

v0.10.1

25 Apr 18:26

Choose a tag to compare

What's Changed

  • Added hard derived-metric constraints to ion-implant doping optimization. optimize_doping_for_hooge_noise(metric_constraints=...) accepts inequality bounds on sheet_resistance, Nz, beta, beta1, beta2_um, alpha_h, junction_depth_m, peak_concentration_cm3, and retained_dose_cm2. Mirrors the MATLAB PiezoD fmincon nonlcon pattern: parameter bounds plus nonlinear constraints on derived metrics.
  • New public types DopingMetric and MetricConstraint exported from piezod.
  • Switches automatically to SLSQP when metric constraints are supplied; rejects method="L-BFGS-B" in that case because it cannot enforce nonlinear constraints.
  • Multi-start selection now requires both convergence success and constraint feasibility; raises RuntimeError when no start produces a feasible solution rather than silently returning an infeasible optimum.
  • Breaking: CantileverImplantation.optimize_doping() is renamed to optimize_doping_for_hooge_noise() to make explicit that the default objective is the Hooge-noise-limited force-resolution figure of merit log(alpha_h) - log(Nz) - 2*log(|beta|). Pass a custom objective to optimize for other criteria.

v0.10.0

25 Apr 04:26

Choose a tag to compare

What's Changed

New

  • Added CantileverImplantation.doping_process_metrics() so users can inspect process-level metrics including alpha_h, Nz, Beta1, Beta2, combined beta, sheet resistance, junction depth, peak concentration, and retained dose.
  • Added CantileverImplantation.optimize_doping() for process-only optimization of anneal time, anneal temperature, implant energy, and implant dose using PiezoD's lookup tables, bounds, beta definition, and default noise/sensitivity objective.
  • Exported DopingProcessMetrics and DopingOptimizationResult from piezod for downstream code.

Fix

  • Implant lookup temperature conversion now uses K - 273.15 consistently, matching Celsius lookup axes and allowing exact 1100 + 273.15 boundary states.
  • Log-dose optimization returns physical dose values and handles exact dose-bound round trips without interpolation out-of-bounds failures.

v0.9.0

24 Apr 04:52

Choose a tag to compare

What's Changed

New

  • New lookup table source: CantileverImplantation(lookup_source="dopedealer") selects a 40,320-case DopeDealer-generated table covering doses 1e13-8e16 cm^-2, energies 10-120 keV, temps 850-1100 C, 15-120 min anneals, and dry O2 / wet O2 / inert ambients. TSUPREM remains the default.
  • Symmetric naming for bundled data files: ionImplantLookupTable_tsuprem.h5 and ionImplantLookupTable_dopedealer.h5.

Breaking

  • Bundled file rename: ionImplantLookupTable.h5 -> ionImplantLookupTable_tsuprem.h5. No impact on the Python API; only affects code that opened the h5 path directly.

Fix

  • CantileverImplantation.Nz() docstring corrected: units are 1/m^2, consistent with MATLAB and with number_of_carriers = Nz * resistor_area[m^2]. The returned value was already correct; only the doc string was wrong.

Internal

  • lookupTableGeneration/ contains the archived FLOOXS TCAD evaluation (concluded not viable as a TSUPREM replacement). No impact on the production piezod package.
  • AGENTS.md now documents the release flow: /release skill + CI trusted publishing; never local uv publish.

v0.8.3

01 Feb 23:12

Choose a tag to compare

What's Changed

  • Fix: Bundled lookup table now included in wheel: The ionImplantLookupTable.h5 file was missing from the 0.8.2 release due to a timing issue with the release process

v0.8.2

01 Feb 23:06

Choose a tag to compare

What's Changed

  • Ion implantation lookup table now bundled: CantileverImplantation automatically loads the lookup table data - no more manual load_lookup_table() calls required
  • Added h5py dependency: Lookup tables stored as compressed HDF5 for efficient bundling
  • MATLAB lookup table renamed: lookupTable.mationImplantLookupTable.mat for clarity