8.0.1 Windows / current-source Studio review
Package applicability is under review; follow the stated version and platform limits.
Define each die, pad and bond explicitly
Give each die a named $DIE record with its complete layout, process and placement. Put a #link bond-location label on its pad, then use a bond instance whose StartPin and EndPin identify die_name.link. A $BUMPSETUP or $WIREBONDSETUP supplies the bond material and geometry; the instance chooses that setup. These records create a model, so check the actual electrical contacts and current extraction after meshing.
The complete nine-file download supplies facing-pad bump, wedge-to-wedge and ball-and-stitch projects, both die layouts, their process, the one-port RL netlist and two small standard-library Python files. The normal-metal teaching pads are 80 × 50 × 5 µm. Both pad and bond conductivities are 5 × 10⁷ S/m. This is public synthetic geometry, not a calibrated material or fabrication process.
Use an issued licence that permits package modelling. The exercised grant is Super; the reviewed package reader enables bonds for Super/Quantum. A general extraction licence alone does not establish that the bond was included. The current path requires a Gmsh-family mesh; use TETRA for the supplied examples. Cuboid $DIE modelling is rejected.
Place the dies and preserve the unit conventions
For the bump, the lower pad spans z = 0–5 µm and the flipped upper pad spans z = 35–40 µm. Their exposed faces set a 30 µm gap. The source Diameter and MidDiameter are both 20 µm; bump height follows the transformed die surfaces rather than a separate nominal Height field.
The wire cases use two flat dies with the same surface normal, as required by the documented wedge/ball-and-stitch model. The wedge uses a named foot at both ends. The ball-and-stitch setup starts with the named ball and ends with the named wedge. Arbitrary die tilts, measured bond profiles and other package stacks need their own geometry/contact checks.
| Setting | Meaning in these complete inputs |
|---|---|
| Layout XY coordinates | left.ixi and right.ixi use the process Units = 1e-6, so 80 means 80 µm. Each pad has a #link marker and one P1 polarity on its outer edge. |
| $DIE Rotate / Translate | XYZ degrees and translation in metres. The triple follows its keyword. The wire cases place the second flat die at x = 200 µm. The bump flips it by (0,180,0) and translates it by (80e-6,0,40e-6), aligning the two link locations. |
| LDF Sigma = 50 | Conductivity in inverse ohms per process length unit. At Units = 1e-6, 50 S/µm becomes 5 × 10⁷ S/m in the current solver settings. The pad uses finite-conductivity Filmtype R. |
| $MATERIAL Sigma 5e7 | Bond conductivity is already SI S/m; Lambda is metres and MuR is dimensionless. Copying the same numeric Sigma between this LDF and $MATERIAL would be a unit error. |
| Bond dimensions | Diameter, MidDiameter, FootLength, MeshSize, heights and radii in these IXI package records are metres. They do not inherit the LDF’s micrometre coordinate convention. |
Run all three bond families from PowerShell
Extract all nine files into a new writable folder and run this complete command there. Select the actual Python, compatible InductEx® executable and existing issued licence path. Every result directory must be new. The client references that licence in an isolated configuration; it never copies licence contents.
The three bump runs refine both pad segmentation and bump mesh/circumference. The wrapper checks the two finest RL changes against the declared 0.5% study criterion. The wedge and ball-and-stitch runs check current completion, positive finite RL, model fit, intended SI conductivities, both port surfaces and exact shared tetrahedral faces at both bond ends. Their resistance is not accepted as mesh-converged by these checks.
$ErrorActionPreference = 'Stop'
$python = 'python'
$inductex = 'C:\Program Files\SUN Magnetics\InductEx\bin\inductex.exe'
$licence = 'C:\Program Files\SUN Magnetics\Licenses\sm_license.txt'
$receipts = @()
foreach ($level in 0..2) {
$directory = "bump-results-$level"
& $python .\run_package.py --inductex $inductex --licence $licence --results $directory --level $level
if ($LASTEXITCODE -ne 0) { throw 'Bump extraction or its current contact/fit check failed.' }
$receipts += Get-Content -LiteralPath (Join-Path $directory 'receipt.json') -Raw | ConvertFrom-Json
}
$change = @{
L = [Math]::Abs($receipts[2].L1_H / $receipts[1].L1_H - 1)
R = [Math]::Abs($receipts[2].R1_ohm / $receipts[1].R1_ohm - 1)
}
if ($change.L -gt 0.005 -or $change.R -gt 0.005) { throw 'The finest bump pair exceeds the stated 0.5% change criterion.' }
$change | ConvertTo-Json
foreach ($geometry in @('wedge', 'ballstitch')) {
& $python .\run_package.py --inductex $inductex --licence $licence --results "$geometry-results" --geometry $geometry
if ($LASTEXITCODE -ne 0) { throw 'Wire extraction or its current contact/fit check failed.' }
}Inspect and edit the bump in Studio
- Open bump.ixi in the original extracted folder or in a baseline working copy. Keep both die IXI files, process.ldf and package.cir beside it. The main command and each $DIE retain explicit process references.
- On Basic > Review, expand Advanced setup. Use Layout/imports to review the die names, layouts, processes and transforms. Choose Packaging to inspect the BUMPSETUP and BUMP instance. Setup and bond selectors have separate filters; choose the intended row before Apply.
- Keep BondSetup = link_setup, StartPin = left.link and EndPin = right.link. The structured controls preserve raw text; they do not semantically validate that those die or pin names exist. Save deliberate changes before running.
- Choose Check and run, then Run extraction. Read the current Results status and Raw output. The baseline bump completes with L1 about 30.8051 pH and R1 about 11.8957 mΩ. Open its current output/package.msh in the mesh viewer and inspect the actual pad, bond and terminal groups.
- To inspect the facing-pad connector, use Groups > Ghost on the two pad volumes and orbit the view. This changes display only. The image below uses those actual controls; an apparently touching image is still separate from the shared-face and solver continuity checks.
- For the checked shape edit, set BUMPSETUP MidDiameter to 25e-6, choose its Apply button, save and rerun. The convex bump completes at about 30.0005 pH and 11.4781 mΩ. Restore 20e-6, Apply, save and run to recover the baseline. This compares changed models, not a numerical refinement.

Run wedge and ball-and-stitch bonds
- Open wedge.ixi and inspect its two $DIE placements, $WEDGE foot, $WIREBONDSETUP and $WIREBOND. The setup uses wedge feet at both ends, a 10 µm wire diameter, 60 µm vertex height and MeshSize 5e-6.
- Save, run extraction and require the current Completed verdict. The supplied wedge run gives L1 about 223.676 pH and R1 about 73.5368 mΩ. Open the mesh created by that run; close an older mesh tab before reopening a path that has been overwritten by another project.
- Open ballstitch.ixi. Its setup uses StartType ball, EndType wedge and matching named foot records, together with the explicit neck/loop parameters. Its $BALL MeshSize and $WIREBONDSETUP MeshSize are different fields; the checked wire setup uses 5e-6.
- Run and inspect its new mesh. The supplied ball-and-stitch run completes at about 237.45 pH and 83.5875 mΩ. Keep the selected family, dimensions, materials and placement with each result; one family’s value is not a reference for another.
- The two wire examples intentionally keep coarse circumference geometry to make the workflow small. A further wedge volume-mesh reduction from 5 µm to 2.5 µm changes resistance by about 11.8%. Refine the wire, foot and cross-section representation before using its resistance as an accepted model quantity.


Distinguish completion, fit, refinement and design agreement
The bump meshes contain 2,182, 9,912 and 44,441 tetrahedra. Their L1 values are approximately 30.80508, 30.75240 and 30.78916 pH; R1 values are 11.8957, 11.7381 and 11.6941 mΩ. The finest-pair changes are about 0.120% in L and 0.375% in R. The coarser pair does not meet the same 0.5% resistance-change criterion.
The client’s 0.1% relative model-fit limit and the wrapper’s 0.5% successive-change limit are declared controls for this simple study. They measure different things and do not supply independent physical accuracy. Shared tetrahedral faces establish contact topology, while the solver’s current verdict and numerical data establish what was actually calculated.
package.cir retains initial design targets of 100 pH and 0.05 Ω. These model results do not meet those targets: the displayed design differences are real, not a failed parser. For an actual designed inductance, compare the supported extracted quantity against its independent intended value and target less than 10% deviation, preferably less than 5%, alongside numerical refinement. Do not rewrite a design value to equal the result and call it validation.
These are complete one-port package RL models with their pad contributions. They do not isolate an intrinsic bond inductance or establish a real package return path. Include the intended signal/return geometry, ports, material properties and frequency range when extending the model. Wire-bond capacitance is not supported by the cited package contract, and the separate EQS numerical hold remains in force.
Recover a missing pin or a coarse missing contact
To reproduce the coarse-wire diagnostic deliberately, add --geometry wedge --coarse-wire to a new client invocation, or use ballstitch with the same flag. The checked client returns 2 and leaves a failed receipt. For recovery, omit --coarse-wire and use a new result directory; the maintained source inputs remain unchanged.
Reversing the coarse wedge moves the missing contact to the other die, and raising one die does not repair it. Finer geometry succeeds in this example, but wire resistance still needs further refinement. Keep that unresolved limit with any downstream model or support report.
| Current condition | Action and checked boundary |
|---|---|
| Pin right.absent cannot be identified | Correct EndPin to the real right.link marker and save. Both CLI and native correction recover the baseline bump. A pin name accepted by the structured text field is not proof that it exists in the layout. |
| Path between component’s positive and negative terminals not found | KB-PACKAGE-001: in these wire examples, MeshSize 10e-6 omits the ending volume contact. Retain the failed files, inspect both contacts and test a finer foot mesh. Returning the wire setup to 5e-6 recovers the checked CLI/native runs. This is a bounded recovery, not a general minimum mesh size or product repair. |
| Studio reports Failed - Exception / TTH exited with code 1 | The checked native Raw output is less specific than the CLI failure. Preserve the failed generation and current task status; use the CLI reproduction and permitted current solver logs to recover the detailed cause. Do not infer success from a mesh preview or an older elements.txt. |
| No material defined for wirebond. Default material assigned. | Reject the warning fallback and correct the named $MATERIAL. The disposable run returns zero exit and the same apparent RL values, but the supplied client deliberately rejects it. Matching numbers alone do not establish the intended material assignment. |
| Die not supported when cuboid meshing is used | Select the compatible Gmsh-family mesh and retain complete die processes/layouts. The supplied examples use TETRA; cuboid package modelling is not qualified. |
| Missing process file or licence does not permit package modelling | Restore the exact referenced per-die process, or select an existing issued grant that permits the required feature. Never accept ignored bonds or substitute an unrelated process. |
Save ballstitch.ixi
* Public complete two-die ball-and-stitch teaching project
$COMMAND
MeshFile "package.msh"
MeshType TETRA
Mode MQS
Frequency 1e6
Process "process.ldf"
Netlist "package.cir"
$END
$DIE
Name "left"
Layout "left.ixi"
Process "process.ldf"
Rotate
(0,0,0)
Translate
(0,0,0)
$END
$DIE
Name "right"
Layout "right.ixi"
Process "process.ldf"
Rotate
(0,0,0)
Translate
(200e-6,0,0)
$END
$WEDGE
Name "stitch"
FootLength 20e-6
ThickRatio 0.5
SpreadRatio 2
$END
$BALL
Name "ball"
PadDiameter 15e-6
BallHeight 15e-6
BallDiameter 20e-6
BallSegments 8
MeshSize 10e-6
$END
$WIREBONDSETUP
Name "link_setup"
StartType "ball"
EndType "wedge"
StartBond "ball"
EndBond "stitch"
Material "wire_metal"
CircumferenceSections 8
MeshSize 5e-6
VertexHeight 60e-6
Diameter 10e-6
TopLength 30e-6
BendRadius 20e-6
h1 60e-6
alpha 85
beta 20
$END
$MATERIAL
Name "wire_metal"
Sigma 5e7
Lambda 0
MuR 1
$END
$WIREBOND
BondSetup "link_setup"
StartPin "left.link"
EndPin "right.link"
$ENDSave bump.ixi
* Public complete two-die facing-pad bump teaching project
$COMMAND
MeshFile "package.msh"
MeshType TETRA
Mode MQS
Frequency 1e6
Process "process.ldf"
Netlist "package.cir"
$END
$DIE
Name "left"
Layout "left.ixi"
Process "process.ldf"
Rotate
(0,0,0)
Translate
(0,0,0)
$END
$DIE
Name "right"
Layout "right.ixi"
Process "process.ldf"
Rotate
(0,180,0)
Translate
(80e-6,0,40e-6)
$END
$BUMPSETUP
Name "link_setup"
Material "wire_metal"
CircumferenceSections 12
MeshSize 5e-6
Diameter 20e-6
MidDiameter 20e-6
$END
$MATERIAL
Name "wire_metal"
Sigma 5e7
Lambda 0
MuR 1
$END
$BUMP
BondSetup "link_setup"
StartPin "left.link"
EndPin "right.link"
$ENDSave left.ixi
* Public left pad in local micrometre layout coordinates
$STRUCT
Name left_pad
$POLY
Layer PAD
XY
(0,-25)
(80,-25)
(80,25)
(0,25)
(0,-25)
$END
$PATH
Layer TERM
Text "P1+ PAD"
XY
(0,-25)
(0,25)
$END
$TEXT
Layer TEXT
Text "#link"
XY
(60,0)
$END
$ENDSave mesh_check.py
"""Inspect exact tetrahedral contacts in these public package teaching meshes.
This small ASCII MSH 2.2 reader is specific to the checked first-order output.
Shared faces demonstrate mesh topology; they do not establish material accuracy.
"""
import itertools
import math
import re
def inspect(path):
lines=path.read_text(encoding='ascii').splitlines()
def section(name):
start=lines.index('$'+name)+1
return lines[start:lines.index('$End'+name,start)]
if section('MeshFormat')!=['2.2 0 8']:
raise ValueError('This teaching check requires first-order ASCII MSH 2.2.')
raw=section('PhysicalNames');physical={}
if int(raw[0])!=len(raw)-1:raise ValueError('Incomplete physical-name section.')
for row in raw[1:]:
m=re.fullmatch(r'(\d+)\s+(\d+)\s+"([^"]+)"',row)
if not m or int(m[2]) in physical:raise ValueError('Unsupported physical-name record.')
physical[int(m[2])]={'dimension':int(m[1]),'name':m[3]}
raw=section('Nodes');nodes={}
if int(raw[0])!=len(raw)-1:raise ValueError('Incomplete node section.')
for row in raw[1:]:
v=row.split();identifier=int(v[0]);point=[float(x) for x in v[1:]]
if identifier in nodes or len(point)!=3 or not all(math.isfinite(x) for x in point):raise ValueError('Invalid node.')
nodes[identifier]=point
raw=section('Elements');faces={};groups={};counts={};terminals={}
if int(raw[0])!=len(raw)-1:raise ValueError('Incomplete element section.')
for row in raw[1:]:
v=[int(x) for x in row.split()];kind,tags=v[1:3]
if tags!=2 or kind not in (1,2,4):raise ValueError('Unsupported element layout/order.')
ids=v[5:];p=physical[v[3]];name=p['name']
if len(ids)!={1:2,2:3,4:4}[kind] or not all(i in nodes for i in ids):raise ValueError('Invalid element connectivity.')
if kind==2 and name in ('p1+','p1-'):terminals[name]=terminals.get(name,0)+1
if kind!=4:continue
if p['dimension']!=3:raise ValueError('Volume element has the wrong physical dimension.')
groups.setdefault(name,set()).update(ids);counts[name]=counts.get(name,0)+1
for face in itertools.combinations(ids,3):faces.setdefault(tuple(sorted(face)),set()).add(name)
shared={}
for owners in faces.values():
for a,b in itertools.combinations(sorted(owners),2):shared[a+' <-> '+b]=shared.get(a+' <-> '+b,0)+1
bounds={name:[[min(nodes[i][axis] for i in ids),max(nodes[i][axis] for i in ids)] for axis in range(3)] for name,ids in groups.items()}
return {'tetrahedra':counts,'shared_faces':shared,'bounds_m':bounds,'terminal_triangles':terminals}Save package.cir
* Public one-port series RL teaching topology; values are initial design targets
P1 1 0
R1 1 2 0.05
L1 2 0 1e-10Save process.ldf
* Public single-metal package teaching process; no calibrated technology
$Parameters
Units = 1e-6
SegmentSize = 10
AbsMin = 0.025
ProcessHasGroundPlane = FALSE
TermLayer = 19
TextLayer = 18
TerminalInRange = 1
UnitL = 1
$End
$Layer
Number = 5
Name = PAD
Thickness = 5
Order = 0
Mask = 1
Filmtype = R
Lambda = 0
Sigma = 50
HFilaments = 1
$EndSave right.ixi
* Public right pad in local micrometre layout coordinates
$STRUCT
Name right_pad
$POLY
Layer PAD
XY
(0,-25)
(80,-25)
(80,25)
(0,25)
(0,-25)
$END
$PATH
Layer TERM
Text "P1- PAD"
XY
(80,-25)
(80,25)
$END
$TEXT
Layer TEXT
Text "#link"
XY
(20,0)
$END
$ENDSave run_package.py
"""Run a complete public package model in a fresh private result directory.
The supplied bump, wedge and ball-and-stitch inputs have checked contacts.
The optional coarse-wire variant reproduces the separately documented missing
contact in the checked Windows 8.0.1 runtime; failure is never success.
"""
import argparse
import hashlib
import json
import math
import os
from pathlib import Path
import re
import shutil
import subprocess
import sys
from mesh_check import inspect
INPUTS=('bump.ixi','wedge.ixi','ballstitch.ixi','left.ixi','right.ixi','process.ldf','package.cir')
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
def main():
p=argparse.ArgumentParser(description=__doc__)
p.add_argument('--inductex',type=Path,required=True)
p.add_argument('--licence',type=Path,required=True)
p.add_argument('--results',type=Path,required=True)
p.add_argument('--geometry',choices=('bump','wedge','ballstitch'),default='bump')
p.add_argument('--level',type=int,choices=(0,1,2),default=0)
p.add_argument('--coarse-wire',action='store_true',help='Reproduce the known coarse-foot failure; wire models only.')
a=p.parse_args();source=Path(__file__).resolve().parent;work=a.results.absolute()
try:
core,licence=[x.resolve(strict=True) for x in (a.inductex,a.licence)]
if not core.is_file() or not licence.is_file():raise ValueError('Select existing InductEx and issued-licence files.')
if work.exists() or not work.parent.is_dir():raise ValueError('Select a new result directory under an existing parent.')
if a.level and a.geometry!='bump':raise ValueError('The supplied refinement is qualified for the facing-pad bump only.')
if a.coarse_wire and (a.geometry=='bump' or a.level):raise ValueError('Coarse-wire reproduction requires a wire model at level zero.')
original={n:sha(source/n) for n in INPUTS}
work.mkdir()
for n in INPUTS:shutil.copyfile(source/n,work/n)
if a.coarse_wire:
path=work/(a.geometry+'.ixi');text=path.read_text()
if text.count('MeshSize 5e-6')!=1:raise ValueError('Review the exact wire setup before reproducing the coarse mesh.')
path.write_text(text.replace('MeshSize 5e-6','MeshSize 10e-6'),encoding='utf-8')
if a.level:
process=(work/'process.ldf').read_text()
project=(work/'bump.ixi').read_text()
if process.count('SegmentSize = 10')!=1 or project.count('MeshSize 5e-6')!=1 or project.count('CircumferenceSections 12')!=1:
raise ValueError('Review the supplied refinement contract before changing the mesh.')
factor=2**a.level
(work/'process.ldf').write_text(process.replace('SegmentSize = 10','SegmentSize = '+str(10/factor)),encoding='utf-8')
(work/'bump.ixi').write_text(project.replace('MeshSize 5e-6','MeshSize '+str(5e-6/factor)).replace('CircumferenceSections 12','CircumferenceSections '+str(12*factor)),encoding='utf-8')
generation={n:sha(work/n) for n in INPUTS}
home=work/'private-home/.sunmagnetics';home.mkdir(parents=True)
(home/'ixcfg.ini').write_text('[General]\nLicenseFileName='+licence.as_posix()+'\n',encoding='utf-8')
env=os.environ.copy();env['USERPROFILE']=str(home.parent);env['PATH']=str(core.parent)+';'+env.get('PATH','')
receipt={'status':'running','geometry':a.geometry,'level':a.level,'coarse_wire':a.coarse_wire,'inputs':original,'working_inputs':generation,
'scope':'Public geometry/continuity and numerical sanity control; no device calibration or accepted design-target comparison.'}
def save():(work/'receipt.json').write_text(json.dumps(receipt,indent=2)+'\n',encoding='utf-8')
save()
result=subprocess.run([str(core),a.geometry+'.ixi'],cwd=work,env=env,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,timeout=180,
**({'creationflags':subprocess.CREATE_NO_WINDOW} if os.name=='nt' else {}))
(work/'private-run.log').write_bytes(result.stdout)
receipt['exit_code']=result.returncode
mesh=work/'output/package.msh'
if mesh.exists():receipt['mesh']=inspect(mesh)
log=result.stdout.decode('utf-8',errors='replace')
if result.returncode!=0 or re.search(r'(?im)^\s*(ToolEngine error|Unexpected exception|Warnings?\b)|CONVERGENCE FAILED|Not successful',log):
raise RuntimeError('Package extraction failed or requires warning review; retain the private current diagnostic.')
values={}
for row in (work/'output/elements.txt').read_text(encoding='ascii').splitlines():
name,value=row.split();values[name]=float(value)
if set(values)!={'L1','R1'} or not all(math.isfinite(v) and v>0 for v in values.values()):raise ValueError('Current positive finite RL results are missing.')
if not all(receipt['mesh']['shared_faces'].get('BOND_0_link_setup <-> '+n,0)>0 for n in ('T1_0_pad','T2_0_pad')):
raise ValueError('The bond does not share tetrahedral faces with both intended pad volumes.')
if not all(receipt['mesh']['terminal_triangles'].get(n,0)>0 for n in ('p1+','p1-')):raise ValueError('A current terminal surface is missing.')
fit=re.search(r'Relative error \(\|\|A\*x - b\|\|/\|\|b\|\|\):\s*([-+0-9.Ee]+)%',log)
if not fit or not math.isfinite(float(fit[1])) or float(fit[1])>=.1:raise ValueError('The teaching RL model fit does not meet its stated 0.1% fit criterion.')
settings=json.loads((work/'output/settings_package.json').read_text(encoding='utf-8'))
materials=settings['MATERIALS']
if not all(materials[n]['SIGMA']==5e7 for n in ('T1_0_pad_COND','T2_0_pad_COND','wire_metal')):
raise ValueError('The current pad/wire conductivity differs from the intended SI value.')
if not all(sha(source/n)==h for n,h in original.items()) or not all(sha(work/n)==h for n,h in generation.items()):
raise ValueError('An input changed during the calculation.')
receipt.update(status='passed',L1_H=values['L1'],R1_ohm=values['R1'],fit_relative_error_percent=float(fit[1]),
core_sha256=sha(core),inputs_preserved=True)
save();print(json.dumps({'status':'passed','L1_H':values['L1'],'R1_ohm':values['R1'],'level':a.level}));return 0
except (OSError,ValueError,RuntimeError,KeyError,subprocess.TimeoutExpired) as error:
if 'receipt' in locals():receipt.update(status='failed',reason=str(error));save()
print(str(error),file=sys.stderr);return 2
if __name__=='__main__':raise SystemExit(main())Save wedge.ixi
* Public complete two-die wedge bond teaching project
$COMMAND
MeshFile "package.msh"
MeshType TETRA
Mode MQS
Frequency 1e6
Process "process.ldf"
Netlist "package.cir"
$END
$DIE
Name "left"
Layout "left.ixi"
Process "process.ldf"
Rotate
(0,0,0)
Translate
(0,0,0)
$END
$DIE
Name "right"
Layout "right.ixi"
Process "process.ldf"
Rotate
(0,0,0)
Translate
(200e-6,0,0)
$END
$WEDGE
Name "foot"
FootLength 20e-6
ThickRatio 0.5
SpreadRatio 2
$END
$WIREBONDSETUP
Name "link_setup"
StartType "wedge"
EndType "wedge"
StartBond "foot"
EndBond "foot"
Material "wire_metal"
CircumferenceSections 8
MeshSize 5e-6
VertexHeight 60e-6
Diameter 10e-6
$END
$MATERIAL
Name "wire_metal"
Sigma 5e7
Lambda 0
MuR 1
$END
$WIREBOND
BondSetup "link_setup"
StartPin "left.link"
EndPin "right.link"
$ENDKeep a reproducible and shareable package record
Retain all layouts, processes, bond setup/instance records, netlist topology, actual executable versions, placements, mesh settings, current verdicts and raw numerical units with each result. The receipt distinguishes maintained source hashes from the deliberately refined working generation. It never turns a failed generation into a successful one.
Raw logs, settings and receipts may contain private paths or licence metadata. Review them before sharing and use this public example when reporting a generic failure. Physical OS pickers, all GUI editing branches, full restart, broader tiers/platforms, real process calibration and final distributed-package acceptance remain separate pending work.
Sources and verification details
Recorded inputs/builds only. Complete walkthrough and final-package acceptance remain separate.
VAL-047 · Windows InductEx® 8.0.1 / TetraHenry® 1.1.50 and frozen current-source Studio
Licensed Windows catalog InductEx® 8.0.1/TetraHenry® 1.1.50, complete public facing-pad bump at 1 MHz with three mesh densities, working wedge/ball-and-stitch inputs, explicit material units, shared volume faces and failed input recovery. Coarse-wire variants reproduce missing end contacts, with actual finer-mesh recovery. Wire resistance refinement remains unresolved. The stated 0.5% successive-change and 0.1% fit criteria belong to this teaching study; no independent device accuracy, accepted design target or final-package qualification Actual browser-downloaded nine-input package ZIP and complete PowerShell 7 article/README command with only Python/InductEx® executable selections changed. Fresh folder with spaces, three bump densities and both working wire families; exact contacts and current numerical results reproduced. No independent device accuracy, accepted design target, full GUI or final-package qualification
Complete public geometry only. Wire resistance refinement, independent physical accuracy, accepted design targets, capacitance, full operator route and final-package qualification remain open.
VAL-048 · Windows InductEx® 8.0.1 / TetraHenry® 1.1.50 and frozen current-source Studio
Frozen current-source licensed Windows Studio/Core 8.0.1: actual bump MidDiameter Apply/save/run/restore, three current bond-family meshes, missing-pin recovery and both coarse-wire failures with finer-mesh correction. Native Raw output reports a generic TTH exited with code 1; the explicit continuity cause is established separately by CLI and exact mesh faces. Native pad Ghost is display-only. File selections enter at the dialog boundary; no physical picker, full restart, independent device accuracy, product repair or final-package acceptance
Complete public geometry only. Wire resistance refinement, independent physical accuracy, accepted design targets, capacitance, full operator route and final-package qualification remain open.
studio-package-bump
Windows current-source Studio/Core 8.0.1 native scenario, reviewed 4 November 2026
Actual generated geometry and production viewer presentation; exact contacts/current run verdict and numerical refinement are checked separately. No physical picker or final-package acceptance.
studio-package-wedge
Windows current-source Studio/Core 8.0.1 native scenario, reviewed 4 November 2026
Actual generated geometry and production viewer presentation; exact contacts/current run verdict and numerical refinement are checked separately. No physical picker or final-package acceptance.
studio-package-ballstitch
Windows current-source Studio/Core 8.0.1 native scenario, reviewed 4 November 2026
Actual generated geometry and production viewer presentation; exact contacts/current run verdict and numerical refinement are checked separately. No physical picker or final-package acceptance.
- inductex:docs/manual/ix_offchip.tex · Package modelling; wedge, ball-and-stitch and bump bonds
- inductex:docs/manual/ix_layoutinput.tex · DIE, bond setup/instance and material records
- inductex:docs/manual/ix_ldf.tex · LDF units and conductivity
- inductex:docs/manual/studio_projects.tex · Basic, retained Advanced setup, Packaging, current Results and mesh viewing
- validation:package-bonds-windows-20261104 · VAL-047/048; complete public families, actual contacts, bump refinement and coarse-wire recovery
- Wire resistance remains refinement-sensitive; design targets are not met. Capacitance, full physical operator route and final release acceptance remain open.
