GUY STEIFF

Reveal hidden structure in ADC & High-Speed IO validation data

ENOB drift, jitter instability, and nonlinear validation effects are often invisible in standard analysis — but become clear when data is decomposed correctly.

Do you have validation data, but no clear explanation for what actually drives it?

Drag & drop your CSV / XLSX file

or click to browse

Instant structural analysis of validation data

Raw measurement data → structural decomposition → decision clarity

Validation datasets that take weeks to interpret — reduced to structured insight in minutes

Most validation issues are not isolated failures — they are multivariate interaction effects hidden in your data.

Post-silicon validation | ADC | High-speed IO

Raw Data Pipeline β

Process multiple raw files with analysis plugins and send the assembled results directly to the interactive chart — all in your browser.

SINL — Sine INL/DNL#1
Sample Col
ℹ plugin info

Sine-histogram INL/DNL for clipped (saturated) sine waves — not for ENOB.

Version: 1.0.0

Author: Guy Steiff

Category: signal

Parameters:

sampleColumn : column-selectCSV column containing raw ADC codes or voltages.
inputMode : text"codes" (default) or "voltage" — if voltage, min/max code are used to normalise.
minCode : numberTheoretical minimum code (default 0) or minimum voltage.
maxCode : numberTheoretical maximum code (e.g. 2047 for 11-bit) or maximum voltage.
avoidanceRadius : numberPeak search radius for truncation (default 40).
minSizeBin : numberMin samples for a code to count as reachable (default 2).
missingThreshold : numberDNL threshold below which a code is missing (default -0.9).
📖 plugin docs

sinlPlugin.tsx — SINL: Sine INL/DNL Analysis

Plugin ID: sinl

Category: Signal / ADC Characterisation

Author: Guy Steiff

Version: 1.0.0


What It Does

Measures Integral Nonlinearity (INL) and Differential Nonlinearity (DNL) from ADC captures driven by a clipped (saturated) sine wave — the classic Okawara-T method. Designed for ADCs where the input signal clips at the rails, making standard histogram methods invalid.

> Not for ENOB. Use SMEAS for spectral metrics (SNR/SNDR/ENOB/THD/SFDR).

> Use SINL for static linearity: INL/DNL, missing codes, truncation zone.


Algorithm: Okawara-T (Truncated Sine Histogram)

Port of inl_tool.py. The algorithm:

1. Histogram raw ADC samples into 2^adcRes bins

2. Find `intMinbin` / `intMaxbin`: first/last bin with ≥ minSizeBin samples — defines the reachable code range

3. Truncation search: within ±avoidanceRadius codes of each rail, find the peak of the U-shaped PDF — this is the truncation boundary (intTruncLow / intTruncHigh). The saturation peak inflates those bins; truncating there avoids bias

4. PDF / CDF / cos(CDF): normalize histogram → cumulative → apply cos(π·CDF) to linearize the sine-wave distribution

5. DNL: −d(cosCdf)/codeSizeOverAmp − 1 over the active zone; zero-padded outside

6. INL: cumulative sum of the linearized CDF, referenced to the truncation boundary; zero-padded outside

7. 3rd-order polynomial fit to INL for smooth trend extraction and p2p metric

Key insight: the cos(CDF) transform converts the sine-wave PDF into a locally-linear function; its derivative directly gives the code-width deviation (DNL), and its integral gives the accumulated offset (INL).


Inputs

ParameterKeyTypeDefaultDescription
Sample ColumnsampleColumncolumn-select*(auto)*CSV column with raw ADC codes or voltages
Input ModeinputModeoptionscodescodes = integer codes; voltage = normalise via min/max range
Min CodeminCodenumber0Theoretical minimum code (or minimum voltage in voltage mode)
Max CodemaxCodenumber2047Theoretical maximum code — ADC resolution derived as ⌈log₂(max−min+1)⌉
Avoidance RadiusavoidanceRadiusnumber40Search window (codes) around each rail for the U-shape saturation peak
Min Bin SizeminSizeBinnumber2Minimum sample count for a code to count as reachable
Missing ThresholdmissingThresholdnumber-0.9DNL below this value is flagged as a missing code

Scope: all parameters are global (shared across all files in a batch). sampleColumn is a column-select with defaultScope: 'global' — auto-seeded to the column with the most unique values when files are loaded.


Outputs (CSV row per file)

ColumnDescription
filenameSource file name
inl_codes_p2pINL peak-to-peak from 3rd-order polynomial fit (LSB)
inl_maxMaximum INL (LSB)
code_inl_maxADC code at maximum INL
inl_minMinimum INL (LSB)
code_inl_minADC code at minimum INL
missing_codes_thresholdThreshold used for missing code detection
missing_codes_countNumber of codes where DNL < threshold
dnl_maxMaximum DNL (LSB)
code_dnl_maxADC code at maximum DNL
dnl_minMinimum DNL (LSB)
code_dnl_minADC code at minimum DNL
dnl_rmsRMS DNL across active code range (LSB)
code_minFirst reachable code (intMinbin)
code_maxLast reachable code (intMaxbin)
code_trunclowTruncation boundary — low end
code_trunchighTruncation boundary — high end
lsb_codes_over_code_ampInternal scale factor (codeSizeOverAmp) — diagnostic

Figures (per file, interactive)

All figures are Recharts React components. Opened via the Plot button in the file table.

1. PDF — Probability Density Function

Shows the sine-wave U-shaped PDF histogram across all codes.

Annotations:

🟡 Shaded zone: peak-search window around codeMin (low rail)

🟣 Shaded zone: peak-search window around codeMax (high rail)

Gray dashed: minbin and maxbin boundary lines

Gray dashed: +r / −r radius markers (edge of avoidance window)

Red solid: trunclow and trunchigh — final truncation boundaries

Layout note: all label offsets use PDF_CHART_H * fraction expressions (not magic px numbers) so label placement scales proportionally if the chart height changes.

2. DNL — Differential Nonlinearity per code

Line plot of DNL [LSB] vs code index over the active range (outside truncation zone shown as null, not plotted).

Annotations:

y=0 reference line

Red dashed: minimum DNL with code label

Green dashed: maximum DNL with code label

Y-axis domain computed from finite data (immune to stale singulars).

3. INL + 3rd-order polynomial

Line plot of measured INL [LSB] vs code index, with the 3rd-order polynomial fit overlay.

Annotations:

y=0 reference line

Red dashed: minimum INL

Green dashed: maximum INL

Amber dashed: polynomial overlay (legend: "3rd-order poly")

Polynomial is restricted to the active code range — no extrapolation blowup outside the truncation zone.


Debug Tables (downloadable)

TableContents
inl_dnl_seriesPer-code series: code, pdf, cdf, cos_cdf, dnl, inl, inl_polynomial

Download via the Debug button in the file table → CSV or JSON.


Error Handling

ConditionError thrown
File has fewer than 2 linesFile has fewer than 2 lines.
Column not foundColumn "X" not found. Available: ...
No numeric samplesNo numeric samples found in the specified column.

Errors surface per-file in the pipeline status column — other files in the batch continue processing.


Cohabitation Notes (running alongside SMEAS)

sampleColumn uses key sampleColumn — distinct from SMEAS's targetColumn. No conflict.

Output keys (inl_max, dnl_max, etc.) are all SINL-specific — no overlap with SMEAS outputs.

Both plugins can be active simultaneously; results are merged into one CSV row per file.


Python Twin

FieldValue
pythonModulesinl_tool
pythonFunctionrun_sinl

When the platform's "Export as Python script" feature is available, it will generate:

# Auto-generated by image_site
from sinl_tool import run_sinl
import pandas as pd, glob

params = dict(
    sample_column='ADC sample [LSB]',
    input_mode='codes',
    min_code=0,
    max_code=2047,
    avoidance_radius=40,
    min_size_bin=2,
    missing_threshold=-0.9,
)

rows = [run_sinl(pd.read_csv(f), **params) for f in glob.glob('data/*.csv')]
pd.DataFrame(rows).to_csv('results.csv', index=False)

File

app/components/plugins/sinlPlugin.tsx — fully self-contained (~800 lines):

Algorithm + CSV parsing + Recharts figures + manifest + plugin export. No external dependencies beyond recharts.

No files selected yet.