Releases: MicrosystemsLab/PiezoD
v0.13.0
What's Changed
-
New optimization framework.
optimize_performanceand
optimize_performance_from_currentperform 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(), andforce_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
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 commit66df37d):- 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.
- All 12,096 cases now solve cleanly. The previous LUT (shipped in v0.11.0) had 21 NaN cells across every metric (
v0.11.0
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_o2anneal option removed for dopedealer; the new LUT only includesinertanddry_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
What's Changed
- Add
substrate_background_cm3(default 1e15 cm^-3) toCantileverandPiezoresistorFromProfileso users can set the counter-doped substrate concentration. doping_profile()now returnstotal_dopingfloored 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
tsuprem4anddopedealersources 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 incalculateDopantBendingswitched to total dopant (per-atom). - New
plot_doping_profile()helper onCantileverandPiezoresistorFromProfilefor a quick total + net active overlay with the junction marked.
v0.10.2
What's Changed
- New
pi_longitudinal()/pi_transverse()onCantileverreturning signed Smith/Kanda low-doping coefficients for the configuredcrystal_orientation(defaults to <100> for n-Si, <110> for boron). - New
dr_over_r(sigma_l, sigma_t)anddr_over_r_from_tensor(sxx, syy, sxy, theta_rad)methods onCantileverand the newPiezoresistorFromProfile, both vectorized. - New
PiezoresistorFromProfileclass for computing piezoresistor metrics from a user-supplied (e.g. SIMS) doping profile; returns the sameDopingProcessMetricsdataclass asCantileverImplantation. - 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 returnsabs(pi_longitudinal())using Smith/Kanda exact values;force_sensitivityandsurface_stress_sensitivityrewritten in terms of the signed pi coefficients (small numeric shifts of <1%).
v0.10.1
What's Changed
- Added hard derived-metric constraints to ion-implant doping optimization.
optimize_doping_for_hooge_noise(metric_constraints=...)accepts inequality bounds onsheet_resistance,Nz,beta,beta1,beta2_um,alpha_h,junction_depth_m,peak_concentration_cm3, andretained_dose_cm2. Mirrors the MATLAB PiezoDfminconnonlconpattern: parameter bounds plus nonlinear constraints on derived metrics. - New public types
DopingMetricandMetricConstraintexported frompiezod. - 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
RuntimeErrorwhen no start produces a feasible solution rather than silently returning an infeasible optimum. - Breaking:
CantileverImplantation.optimize_doping()is renamed tooptimize_doping_for_hooge_noise()to make explicit that the default objective is the Hooge-noise-limited force-resolution figure of meritlog(alpha_h) - log(Nz) - 2*log(|beta|). Pass a customobjectiveto optimize for other criteria.
v0.10.0
What's Changed
New
- Added
CantileverImplantation.doping_process_metrics()so users can inspect process-level metrics includingalpha_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
DopingProcessMetricsandDopingOptimizationResultfrompiezodfor downstream code.
Fix
- Implant lookup temperature conversion now uses
K - 273.15consistently, matching Celsius lookup axes and allowing exact1100 + 273.15boundary states. - Log-dose optimization returns physical dose values and handles exact dose-bound round trips without interpolation out-of-bounds failures.
v0.9.0
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.h5andionImplantLookupTable_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 are1/m^2, consistent with MATLAB and withnumber_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 productionpiezodpackage.- AGENTS.md now documents the release flow:
/releaseskill + CI trusted publishing; never localuv publish.
v0.8.3
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
What's Changed
- Ion implantation lookup table now bundled:
CantileverImplantationautomatically loads the lookup table data - no more manualload_lookup_table()calls required - Added h5py dependency: Lookup tables stored as compressed HDF5 for efficient bundling
- MATLAB lookup table renamed:
lookupTable.mat→ionImplantLookupTable.matfor clarity